Niet onderhoudbare software in 10 makkelijke stappen

Post on 09-Jun-2015

417 views 0 download

description

Ontwikkelde software eindigt vaker dan ons lief is in moeilijk te onderhouden code en een minder productieve organisatie. Ondanks goede intenties blijken simpele wensen moeilijker te implementeren dan nodig. Er ontstaan meer problemen dan verwacht. In het begin ging het allemaal nog zo snel, makkelijk en foutloos. Waar ging het mis? In deze sessie gaan we die vraag beantwoorden door onderscheid te maken tussen wat makkelijk lijkt en wat eenvoudig is. We behandelen bewezen technieken alsmede veelbelovende ontwikkelingen. Uiteraard kijken we verder dan het coderen, want software ontwikkeling blijft mensenwerk.

Transcript of Niet onderhoudbare software in 10 makkelijke stappen

Niet onderhoudbare software in 10 makkelijke stappen Rick Beerendonk (NForza)@rickbeerendonkrick@nforza.nl

Wat is ononderhoudbaar?We zijn niet voorbereid op deze situatie

Waarom is onderhoudbare software belangrijk?

Onderhoudbaar==Productief

Maximaliseer bezettingsgraad.

Planning

Maximaliseer bezettingsgraad.Beperk queue-size!Software Development is geen lopende band met 99% betrouwbaarheid/zekerheid.

OnderhoudbaarStap 1

Maximaliseer bezettingsgraad

Wachtrij calculator

M/M/1 wachtrij

Afstemming

Wetenschap neemt een vlucht zodra gekozen wordt voor standaard namen een eenheden.

OnderhoudbaarStap 2

Naamgeving

•Beschrijf wat het doet•Uitspreekbaar•Zoekbaar

Code layout

•Kies er één

Limit yourself!Exchange current flexibility for future flexibility.

Real Options1. Options have value2. Options expire3. Never commit early unless you know why

Technical Debt is a sold option!

Design patterns

Houden opties open

OnderhoudbaarStap 3

“We know brains are brilliant at detecting patterns. So we should be reeeeeallly careful about the patterns we were/are exposed to.”Kathy Sierra

Abstracties

Hoe specifieker de interface hoe generieker het gebruik

OnderhoudbaarStap 4

Abstracties

•Zelfde namen•Zelfde layout•Zelfde volgorde•Single Responsibility

Hoe te herkennen?

Abstracties

var a = [1, 2, 3, 4, 5, 6];

for (var i = 0; i < a.length; i++) { var double = 2 * a[i]; document.write(double);}

a.forEach(function (e) { document.write(e + e); });

Voorbeeld: Moeilijk te vinden

AbstractiesVoorbeeld: Kan specifieker (1)

public interface IEnumerable<out T>{        IEnumerator<T> GetEnumerator();}

AbstractiesVoorbeeld: Kan specifieker (2)

public interface ICollection<T>{    int Count { get; }    void Add(T item);    void Clear();    bool Remove(T item);    (…)}

AbstractiesVoorbeeld: Kan specifieker (3)

public interface ICollection<T>{    int Count { get; }    void Add(T item);    void Clear();    bool Remove(T item);    (…)}

Abstracties

• Investeer tijd in het abstraheren van code. Refactor!

De weg naar flexibeler code die op de toekomst in voorbereid!

Makkelijk

Geriefelijk, geen inspanning kostend(geen leercurve, snelle installatie, bekend)Subjectief

Eenvoudig

Één rol, taak, concept of dimensieObjectief

OnderhoudbaarStap 5

Simple vs EasyEasy: A+B+Cfunction DoAll() { DoA code; DoB code; DoC code;}

DoAll();

Simple: A, B, C, A+B, A+C, B+C, A+B+Cfunction DoA() {}function DoB() {}function DoC() {}

DoA();DoB();DoC();

Immutable state

OO o o o…Feiten veranderen niet. Waarom wel in onze software?

OnderhoudbaarStap 6

Is mutable state eenvoudig?

function change(obj) { obj.test = "No longer hola!";}

var a = { test: "hola"};var b = a;

change(b);document.write(a.test); // result: "No longer hola!"

Mutable exampleusing System;using System.Collections.Generic;using System.Collections.Immutable;using System.Linq;

namespace MutableApp{ class Program { static void Main(string[] args) { ICollection<string> nforza = new List<string> { "Ronald", "Thomas", "Esther", "Hendrika" };

int nforza2012Count = nforza.Count(); IEnumerable<string> nforza2012 = nforza; //.ToList();

nforza.Add("Rick");

Console.WriteLine(nforza2012Count); foreach (var item in nforza2012) { Console.WriteLine(item); } } }}

Immutable exampleusing System;using System.Collections.Generic;using System.Collections.Immutable; // NuGet: Microsoft Immutable Collectionsusing System.Linq;

namespace ImmutableApp{ class Program { static void Main(string[] args) { IImmutableList<string> nforza = ImmutableList.Create<string>("Ronald", "Thomas", "Esther", "Hendrika");

int nforza2012Count = nforza.Count(); IEnumerable<string> nforza2012 = nforza;

nforza = nforza.Add("Rick");

Console.WriteLine(nforza2012Count); foreach (var item in nforza2012) { Console.WriteLine(item); } } }}

Mutable state

•Copy strategy•Locking strategy•Thread safe objects•One big fat DB query

“70ies problems solutions”

Neem niks aan

Blijf zelf nadenken

OnderhoudbaarStap 7

Code is niet vanzelfsprekendIs het weloverwogen en doelbewust geschreven?

Eenvoudig?

•State = waarde + tijd (zie “var”)• Alles wat state aanraakt wordt verbonden

•Object = state + identiteit•Methode = functie + state•Overerving = type + type• Imperatieve loops = wat + hoe•Frameworks = jouw code + framework (mogelijk)

Separation of Concerns

Maakt redeneren over code mogelijk.Limiteert de dingen die je moet onthouden.Verkleint de scope.

OnderhoudbaarStap 8

Separation of Concerns

•Gebruik modules•Minimaliseer Coupling•Gebruik Dependency Injection•Gebruik Queues i.p.v. rechtstreekse aanroepen

Tests

Compileert het?Start het programma op?Werkt het zoals bedoeld?

OnderhoudbaarStap 9

Unit tests

•Hebben waarde tijdens wijzigen van code•Kosten veel tijd om te schrijven•Bemoeilijken refactoring• Informatietheorie: Entropie = 0

Genereer tests

public static int Negate(int value){    return -value;}

Voorbeeld

// Int.MaxValue = 2147483647;// Int.MinValue = -2147483648;

Not enough

•Unit testing isn’t enough. You need static typing too.• Static typing isn’t enough. You need contracts too.•Contracts are not enough. You need generative testing too.•Generative testing is not enough. You need simulation testing too.• Simulation testing is not enough. You need fuzzing too.• Fuzzing is not enough. You need luck too.• Luck is not enough. You need user testing too.

In software development, no one thing will save your ass

Bron: http://blog.fogus.me/2012/06/20/not-enough/

Reviews

Bugs vroeg onderkennen.Verbeteren van design.Bevorderen samenwerking.

OnderhoudbaarStap 10

Reviews

•Formeel of informeel•Laat de ontwikkelaar de code uitleggen•Wees aardig

Hoe?

Automatiseer

BuildsDeploymentsContinues Integration

OnderhoudbaarStap 11

Team

Hou ‘t klein.Opt-in, intrinsieke motivatie.Gedrag, accepteer falen.

OnderhoudbaarStap 12

"Productivity is a by-product of feeling good"Daniel Mezick

Team & de buitenwereld

•Heb duidelijke grenzen en bewaak ze•Geef snelle feedback•Wees eerlijk en voorspelbaar•Leg uit wat de dynamiek van software development is

Coaching

OnderhoudbaarStap 13

Coach

•Slechte coach: Verbetert resultaat•Middelmatige coach: Verbetert oorzaak•Goede coach: Verbetert de pupil

Coaching

•Ask (listen), don’t tell•Richt je op mensen, niet op taken•Laat mensen zichzelf coachen en verbeteren

Verbeter jezelf

•Learn software development•Learn how to solve problems•Learn how to be a coach•Teach!

Always remain curious, authentic and creative!

AanpassersFlexibele mensen zijn het best voorbereid op de toekomst.Kick out de betweters.

OnderhoudbaarBonus

Laat ons weten wat u vindt van deze sessie! Vul de evaluatie in via www.techdaysapp.nl en maak kans op een van de 20 prijzen*. Prijswinnaars worden bekend gemaakt via Twitter (#TechDaysNL). Gebruik hiervoor de code op uw badge.

Let us know how you feel about this session! Give your feedback via www.techdaysapp.nl and possibly win one of the 20 prizes*. Winners will be announced via Twitter (#TechDaysNL). Use your personal code on your badge.

* Over de uitslag kan niet worden gecorrespondeerd, prijzen zijn voorbeelden – All results are final, prizes are examples