Lean development can be summarized by seven principles, very close in concept to lean manufacturing principles:
- Eliminate waste
- Amplify learning
- Decide as late as possible
- Deliver as fast as possible
- Empower the team
- Build integrity in
- Optimize the whole
Eliminate wasteEdit
Lean philosophy regards everything not adding value to the customer as waste (muda). Such waste may include:
- Partially done work
- Extra features
- Relearning
- Task switching
- Waiting
- Handoffs
- Defects
- Management activities
In order to eliminate waste, one should be able to recognize it. If some activity could be bypassed or the result could be achieved without it, it is waste. Partially done coding eventually abandoned during the development process is waste. Extra funktioner som pappersarbete och funktioner som inte ofta används av kunderna är slöseri. Att byta personer mellan olika uppgifter är slöseri. Att vänta på andra verksamheter, team eller processer är slöseri. Omskolning som krävs för att slutföra arbetet är slöseri. Brister och lägre kvalitet är slöseri. Ledningsrelaterade omkostnader som inte ger verkligt värde är slöseri.
För att identifiera slöseri används en teknik för kartläggning av värdeflöden. Det andra steget är att peka ut källor till slöseri och eliminera dem. Avlägsnande av avfall bör ske iterativt tills även till synes väsentliga processer och förfaranden är likviderade.
Förstärk lärandeEdit
Mjukvaruutveckling är en kontinuerlig inlärningsprocess som bygger på iterationer när man skriver kod. Mjukvarudesign är en problemlösningsprocess som involverar de utvecklare som skriver koden och vad de har lärt sig. Mjukvarans värde mäts i lämplighet för användning och inte i överensstämmelse med kraven.
Istället för att lägga till mer dokumentation eller detaljerad planering kan olika idéer prövas genom att skriva kod och bygga. Processen för insamling av användarkrav skulle kunna förenklas genom att presentera skärmar för slutanvändarna och få deras synpunkter. Man bör förhindra att fel ackumuleras genom att köra tester så snart koden är skriven.
Lärandeprocessen påskyndas genom användning av korta iterationscykler – var och en kopplad till refaktorisering och integrationstestning. Ökad återkoppling genom korta återkopplingssessioner med kunderna hjälper till att fastställa den aktuella utvecklingsfasen och justera insatserna för framtida förbättringar. Under dessa korta sessioner lär sig både kundrepresentanter och utvecklingsteamet mer om domänproblemet och tar fram möjliga lösningar för vidareutveckling. På så sätt får kunderna en bättre förståelse för sina behov, baserat på det befintliga resultatet av utvecklingsarbetet, och utvecklarna lär sig hur de bättre kan tillgodose dessa behov. En annan idé i kommunikations- och inlärningsprocessen med en kund är setbaserad utveckling – detta koncentrerar sig på att kommunicera begränsningarna för den framtida lösningen och inte de möjliga lösningarna, och främjar på så sätt att lösningen föds via dialog med kunden.
Bestäm så sent som möjligtRedigera
Då programvaruutveckling alltid är förknippad med en viss osäkerhet bör man uppnå bättre resultat med ett setbaserat eller optionsbaserat tillvägagångssätt, där man fördröjer besluten så långt det är möjligt tills de kan fattas på grundval av fakta och inte på osäkra antaganden och förutsägelser. Ju mer komplext ett system är, desto mer kapacitet för förändring bör byggas in i det, vilket gör det möjligt att skjuta upp viktiga och avgörande åtaganden. Det iterativa tillvägagångssättet främjar denna princip – förmågan att anpassa sig till förändringar och korrigera misstag, som kan bli mycket kostsamma om de upptäcks efter det att systemet släppts.
Med setbaserad utveckling: Om det behövs ett nytt bromssystem för en bil, till exempel, kan tre team utforma lösningar på samma problem. Varje grupp lär sig om problemområdet och utformar en potentiell lösning. När en lösning anses orimlig stryks den. I slutet av en period jämförs de överlevande konstruktionerna och en av dem väljs ut, kanske med vissa ändringar som bygger på lärdomar från de andra – ett utmärkt exempel på att skjuta upp ett åtagande till sista möjliga ögonblick. Programvarubeslut skulle också kunna dra nytta av denna metod för att minimera den risk som en omfattande utformning i förväg medför. Dessutom skulle det då finnas flera genomföranden som fungerar korrekt, men som ändå är olika (genomförandemässigt, internt). Dessa skulle kunna användas för att införa feltoleranta system som kontrollerar att alla in- och utdata är korrekta i alla de olika tillämpningarna samtidigt.
En agil metod för mjukvaruutveckling kan flytta fram byggandet av alternativ tidigare för kunderna, vilket fördröjer vissa viktiga beslut tills kunderna har insett sina behov bättre. Detta gör det också möjligt att senare anpassa sig till förändringar och förhindra kostsamma tidigare teknikbundna beslut. Detta innebär inte att ingen planering bör förekomma – tvärtom bör planeringsverksamheten koncentreras på de olika alternativen och anpassningen till den aktuella situationen, samt klargöra förvirrande situationer genom att upprätta mönster för snabba åtgärder. Att utvärdera olika alternativ är effektivt så snart man inser att de inte är gratis, utan ger den flexibilitet som behövs för sent beslutsfattande.
Leverera så snabbt som möjligtRedigera
I en tid av snabb teknikutveckling är det inte den största som överlever, utan den snabbaste. Ju snabbare slutprodukten levereras utan större fel, desto snabbare kan feedback tas emot och införlivas i nästa iteration. Ju kortare iterationer, desto bättre inlärning och kommunikation inom teamet. Med snabbhet kan besluten skjutas upp. Snabbhet garanterar att kundens nuvarande behov uppfylls och inte vad de krävde igår. Detta ger dem möjlighet att vänta med att bestämma sig för vad de verkligen behöver tills de får bättre kunskap. Kunderna värdesätter en snabb leverans av en kvalitetsprodukt.
Den här idén om just-in-time-produktion skulle kunna tillämpas på programvaruutveckling, med hänsyn till dess specifika krav och miljö. Detta uppnås genom att presentera det nödvändiga resultatet och låta teamet organisera sig och fördela uppgifterna för att uppnå det nödvändiga resultatet för en viss iteration. I början ger kunden den nödvändiga informationen. Detta kan helt enkelt presenteras i små kort eller berättelser – utvecklarna uppskattar den tid som behövs för att genomföra varje kort. På så sätt förändras arbetsorganisationen till ett självdragande system – varje morgon under ett stand-up-möte går varje medlem av teamet igenom vad som har gjorts i går, vad som ska göras i dag och i morgon, och frågar om det behövs några bidrag från kollegor eller kunden. Detta kräver öppenhet i processen, vilket också gynnar kommunikationen i teamet.
Myten som ligger till grund för denna princip är att brådska leder till slöseri. Lean-implementering har dock visat att det är en bra metod att leverera snabbt för att kunna se och analysera resultatet tidigast.
Empower the teamEdit
Det har funnits en traditionell uppfattning i de flesta företag om beslutsfattandet i organisationen – cheferna talar om för arbetstagarna hur de ska göra sitt eget jobb. I en arbetsmetodik är rollerna ombytta – cheferna får lära sig att lyssna på utvecklarna, så att de bättre kan förklara vilka åtgärder som kan vidtas, samt ge förslag till förbättringar. Lean-metoden följer den agila principen ”bygg projekt kring motiverade individer och lita på att de får jobbet gjort”, genom att uppmuntra till framsteg, fånga upp fel och undanröja hinder, men utan att mikroförvalta.
En annan felaktig uppfattning har varit att betrakta människor som resurser. Människor kan vara resurser ur ett statistiskt perspektiv, men i programvaruutveckling, liksom i alla andra organisatoriska verksamheter, behöver människor något mer än bara en lista över uppgifter och en försäkran om att de inte kommer att bli störda under utförandet av uppgifterna. Människor behöver motivation och ett högre syfte att arbeta för – ett syfte som ligger inom den nåbara verkligheten, med en försäkran om att teamet kan välja sina egna åtaganden. Utvecklarna bör få tillgång till kunden; teamledaren bör ge stöd och hjälp i svåra situationer samt se till att skepticismen inte förstör teamets anda. Att respektera människor och erkänna deras arbete är ett sätt att stärka teamet.
Bygg integritet iEdit
Kunden måste få en helhetsupplevelse av systemet. Detta är den så kallade upplevda integriteten: hur det annonseras, levereras, används, nås, hur intuitivt det är att använda det, dess pris och hur väl det löser problem.
Begriplig integritet innebär att systemets separata komponenter fungerar bra tillsammans som en helhet med balans mellan flexibilitet, underhållbarhet, effektivitet och reaktionsförmåga. Detta kan uppnås genom att man förstår problemområdet och löser det samtidigt, inte sekventiellt. Den information som behövs erhålls i små delar – inte i en enda stor del – företrädesvis genom personlig kommunikation och inte genom skriftlig dokumentation. Informationsflödet bör vara konstant i båda riktningarna – från kund till utvecklare och tillbaka, vilket gör att man undviker den stora stressande mängden information efter långvarig utveckling i isolering.
En av de sunda vägarna mot en integrerad arkitektur är refaktorisering. Ju fler funktioner som läggs till den ursprungliga kodbasen, desto svårare blir det att lägga till ytterligare förbättringar. Refactoring handlar om att behålla enkelhet, tydlighet och minsta möjliga antal funktioner i koden. Upprepningar i koden är tecken på dålig koddesign och bör undvikas. Den fullständiga och automatiserade byggprocessen bör åtföljas av en fullständig och automatiserad uppsättning utvecklar- och kundtester som har samma versionering, synkronisering och semantik som systemets nuvarande tillstånd. I slutet bör integriteten verifieras med grundliga tester, vilket säkerställer att systemet gör det som kunden förväntar sig. Automatiserade tester betraktas också som en del av produktionsprocessen, och om de därför inte tillför något mervärde bör de betraktas som slöseri. Automatiserad testning bör inte vara ett mål, utan snarare ett medel för att uppnå ett mål, närmare bestämt att minska antalet defekter.
Optimera helhetenEdit
Moderna mjukvarusystem är inte bara summan av sina delar, utan också produkten av deras interaktioner. Defekter i programvara tenderar att ackumuleras under utvecklingsprocessen – genom att sönderdela de stora uppgifterna i mindre uppgifter och genom att standardisera olika utvecklingsfaser bör grundorsakerna till defekter kunna hittas och elimineras. Ju större systemet är, ju fler organisationer som är involverade i utvecklingen och ju fler delar som utvecklas av olika team, desto viktigare är det att ha väldefinierade relationer mellan olika leverantörer för att kunna producera ett system med smidigt samverkande komponenter. Under en längre utvecklingsperiod är ett starkare underleverantörsnätverk mycket mer fördelaktigt än kortsiktig vinstoptimering, som inte möjliggör relationer som gynnar alla parter.
Lean thinking måste förstås väl av alla medlemmar i ett projekt, innan det genomförs i en konkret, verklig situation. ”Tänk stort, agera smått, misslyckas snabbt; lär dig snabbt” – dessa slogans sammanfattar vikten av att förstå området och lämpligheten av att genomföra lean-principerna längs hela mjukvaruutvecklingsprocessen. Det är först när alla lean-principer genomförs tillsammans, i kombination med ett starkt ”sunt förnuft” när det gäller arbetsmiljön, som det finns en grund för att lyckas med mjukvaruutveckling.