Upload
rick-beerendonk
View
417
Download
0
Embed Size (px)
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.
Citation preview
Niet onderhoudbare software in 10 makkelijke stappen Rick Beerendonk (NForza)@[email protected]
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