gile Software Development Februari 2008, Philippe Dirkse Wie ben ik? 2002: fgestudeerd TU/e 1999-2005: Mondo izzarro, rystal Interactive, Siemens tea 2005 heden: PTS: Leica Microsystems SES/MiPlaza Inhoud Traditionele ontwikkeling/waterval gile Scrum XP (cases) Het waterval model Fouten die in een vroegtijdig stadium van het ontwikkelproces worden gevonden zijn vele malen goedkoper (qua tijd en inzet) op te lossen, dan wanneer ze later aan het licht komen 1
Het waterval model Het waterval model Eisen Ontwerp Implementatie Iedere fase dient 100% compleet te zijn Iedere fase dient 100% correct te zijn Iedere fase wordt geborgd in een document dat als uitgangspunt voor de volgende fase dient Validatie Onderhoud Feiten: Gevolgen: De klant die van te voren precies weet wat hij hebben wil moet nog geboren worden Het ontwerp dat 100% alle problemen afdekt die je tijdens het implementeren tegen gaat komen moet nog gemaakt worden De verkeerde software wordt gemaakt Onjuiste documentatie De klant is niet tevreden 2
Oorzaken: Features worden niet toegevoegd op basis van prioriteit Schatting is commitment Er wordt geen gebruik gemaakt van hetgeen we leren TIJDENS het project gile Gebruik hetgeen je leert tijdens het proces om het proces te verbeteren Geef de klant eerlijke informatie gedurende het proces Lever gedurende het proces continu werkende code op aan de klant Stel jezelf open voor de veranderende wensen van de klant gile Manifesto Individuals and interactions over processes and tools Working software over comprehensive documentation ustomer collaboration over contract negotiation Responding to change over following a plan That is, while there is value in the items on the right, we value the items on the left more. gile methoden extreme Programming Scrum rystal lear daptive Software Development Feature Driven Development gile RUP 3
gile methoden extreme Programming Scrum rystal lear daptive Software Development Feature Driven Development XP @ SRUM Scrum rollen Klant epaalt de prioriteiten epaalt de business value Spreekt met één stem Is beschikbaar Scrum master Team Zelf-organiserend Implementeert de business value, bepaalt de kosten Kan te allen tijde werkende software demonstreren Houdt het proces in de gaten (vorderingen, vertragingen, blokkades) Maakt het proces inzichtelijk (bijhouden scrum board, backlog) User Stories Schrijf IEDERE requirement op als een user story User Stories Schrijf IEDERE requirement op als een user story ls (belanghebbende) Wil ik (requirement) Zodat ik (rechtvaardiging) ls speler Wil ik een hiscores lijst Zodat ik kan zien welke de te verslane score is 4
User Stories Schrijf bij iedere user story een acceptance test User Stories Schrijf bij iedere user story een schatting ls speler Wil ik een ls het hiscores spel is lijst afgelopen verschijnt er Zodat een ik kan tabel zienmet welke daarin de te de verslane 10 beste scores score is plus de namen van de bijbehorende spelers Naam Score Jantje 221000 ls speler Wil ik een hiscores lijst Zodat ik kan zien welke de te verslane score is 24 Schatten Schatten is moeilijk, zeker in het begin, ga er dus van uit dat je er naast kan zitten Schat in story points: deze taak is 2x zoveel werk als die Indien nodig, pas de schattingen aan lleen het team doet de schatting, LT NOOIT DE KLNT MEEDOEN Planning poker Ieder teamlid krijgt een set kaarten met story points Per user story legt iedereen afgedekt zijn schatting neer Draai tegelijkertijd de kaarten om en bespreek de verschillen 5
Lijst met alle op dit moment bekende user stories Geprioritiseerd door de klant Variabel: stories kunnen worden toegevoegd en verwijderd Filter: minder belangrijke stories zinken naar de bodem Sprint Korte periode (1-3 weken) egint met een sprint planning meeting Eindigt met een demonstratie van de afgeronde user stories Sprint planning meeting Klant kiest de user stories uit die hij op dit moment het belangrijkste vindt Team geeft aan hoeveel van deze user stories ze in de komende sprint denken te kunnen realiseren Velocity De velocity van een sprint is de som van de story points van alle user stories die in die sprint zijn afgerond Gebruik de gemiddelde velocity van een aantal sprints als basis voor hoeveel user stories er in een iteratie passen Gebruik de velocity om de voortgang van de sprint te bepalen 6
urn down chart Daily standup meeting 15 10 5 Velocity van de vorige iteratie is 15 Velocity van deze iteratie is 14 1 2 3 4 5 6 7 8 9 10 Vaste tijd, vaste plek Maximaal 15 minuten, iedereen staat Iedereen is welkom, maar alleen team spreekt Ieder teamlid vertelt: Wat heb ik gisteren gedaan? Wat ga ik vandaag doen? Zijn er blokkades? Scrum Scrum board 24 h 1-3 wk backlog sprint backlog sprint software increment 7
Scrum board Scrum board D Scrum board Scrum board D D 8
Scrum board Scrum board D D Scrum board Scrum board D D 9
Scrum board Scrum board D D extreme Programming ls code reviewen goed is, doe het dan altijd ls testen goed is, doe het dan altijd ls ontwerpen goed is, doe het dan altijd ls integreren goed is, doe het dan altijd Pair Programming LLE productiecode (dus niet alleen de moeilijke dingen) wordt door 2 PROGRMMEURS SMEN gemaakt 10
Pair Programming ZZZ SMEN is niet Pair SyntaxProgramming Tests KISS/YGNI SMEN is lgoritme Ontwerp Pair Programming = Kennisdeling Kennisoverdracht (junior/senior) Minder fouten Hogere kwaliteit code Meer plezier! LLE productiecode die stuk kan gaan MOET getest worden 11
Unit testing ontinuous build Test een beetje, codeer een beetje (red->green->refactor) Houdt de tests kort maar bondig (5 minute build) Gebruik een framework: junit, nunit, cppunit, yaffut, Mini case: Stack class [Test] void NewStackHasSize0() Stack<int> stack = new Stack<int>(); ssertequal(0, stack.size); 12
Refactoring public class Stack<T> private int size = 0; public int Size getreturn size;; Intermezzo Verbeteren van de structuur van de code met behoud van functionaliteit en zonder fouten te introduceren Verbeteren van de leesbaarheid van code Verbeteren van de begrijpelijkheid van code Vereenvoudigen van het ontwerp public class Stack<T> private int size = 0; public int Size getreturn size;; [Test] void NewStackHasSize0() Stack<int> stack = new Stack<int>(); ssertequal(0, stack.size); [Test] [ExpectedException(typeof(Exception))] void annotpopfromemptystack() Stack<int> stack = new Stack<int>(); stack.pop(); 13
public class Stack<T> private int size = 0; public int Size getreturn size;; public void Pop() if( size == 0 ) throw new Exception( Empty ); public class Stack<T> private int size = 0; public int Size getreturn size;; public void Pop() if( size == 0 ) throw new Exception( Empty ); [Test] [ExpectedException(typeof(Exception))] void annotpopfromemptystack() Stack<int> stack = new Stack<int>(); stack.pop(); [Test] void PushOntoStackIncreasesSize() Stack<int> stack = new Stack<int>(); stack.push(3); sserttrue(1, stack.size); public class Stack<T> private int size = 0; public int Size getreturn size;; public void Pop() if( size == 0 ) throw new Exception( Empty ); public void Push(T value) ++size; 14
public class Stack<T> private List<T> list = new List<T>(); public int Size get return list.ount; public void Pop() if( Size == 0 ) throw new Exception( Empty ); public void Push(T value) list.dd(t); ode veranderen zonder angst eter ontworpen code egrijpelijkere code YGNI = ollective ode Ownership IEDEREEN kan TE LLEN TIJDE IEDERE regel code aanpassen Wachten hange Request Group Manager hange Owner hange Review Management approval Implementation 15
Wachten Of erger Het hange Request proces kan dagen in beslag nemen hange Requests kunnen verkeerd begrepen worden De verantwoordelijke kan niet (meer) beschikbaar zijn Iemand kan een hange Request voor JOUW code indienen! Own everything!!! Geen wachten of discussies (vooraf) Meer kennis van de code Veiligheid dankzij unit tests!!! ollective code ownership Spreek een coding standard af Ondersteunend versie beheer systeem Geen locks maar mergen (VS, SubVersion, ) 16
ontinuous Integration IEDEREEN dient MEERDERE malen per dag zijn code te INTEGREREN ontinuous Integration Rond een taak af Draai unit tests Integreer ontinuous Integration Hoe langer je wacht met integratie, hoe moeilijker het wordt, dus: odeer Merge / Test / Integreer ommit XP samengevat Iedereen is eigenaar van alle code Regelmatig wisselende pair programmers Eén pair werkt aan één taak Eerst de testen schrijven, dan pas de code Integreer de code Draai de unit tests (100%!!!) ommit 17