Varje produkt utvecklas på sitt eget mystiska sätt. Även det erfarna teamet kan inte förutsäga varje vändning i produktens livscykel. Enkla funktioner kan överföras till monstruösa arbetsflöden med flera villkor. Vissa snabbutvecklade sidoscenarier kan bli de mest använda. Till och med produktens popularitet kan orsaka oväntade prestandaproblem. Och det är helt normalt att anpassa mjukvara för marknadens behov. Det enda sättet att få en tillförlitlig och förutsägbar produkt är att reservera lite tid för att fixa tekniska skulder och tillhandahålla en korrekt omstruktureringsprocess.
Det är bättre att inkludera några definitioner av termer i den här artikeln. Teknisk skuld, eller teknisk skuld, är de ackumulerade kompromisser i kodbasen, som kan inträffa under snabb utveckling eller andra fluktuationer. Refaktoreringsprocessen handlar mer om att förbättra produkten i allmänhet. Det kan innebära aktiviteter relaterade till prestanda, bättre kodstruktur och enkelhet i lösningen. Men ibland kan dessa två begrepp vara mycket nära varandra. Till exempel kan ett fåtal funktioner fulla av tekniska skulder kräva ordentlig omstrukturering av hela modulen för att lösa problemet en gång för alla med nya idéer och omimplementering.
Och här är tricket. Generellt sett har bra mjukvaruutvecklare gott om idéer för produktförbättringar. "Okej, vi kan justera några saker under den här funktionen." "Åh, det är inte så viktigt men det skulle vara trevligt att fixa det här i den här sidomodulen". Ändå är det avgörande att ge dina teammedlemmar möjlighet att förbättra kodbasen, eftersom det hjälper till att bygga verkligt involverade team. Men i den här artikeln skulle jag vilja avslöja refaktoreringsprocessen ur en chefsperspektiv. Exemplen ovan har ett problem - de kan vara ogenomskinliga för hela laget utom utvecklare. Medan QA och chefer har sin plan att släppa korrekt och stabil programvara enligt schemat, kan vissa dolda förbättringar skapa oväntade vändningar och nervösa omtester under releasen. Eller till och med nya buggar i produktionen om vissa odokumenterade ändringar går obemärkta under regressfasen. Så kodförbättringar är nödvändiga, men de bör vara hanterbara.
Lösningen är komplex. Agile är vår bästa vän eftersom vanliga principer och ritualer för Agile utvecklingsmetoder täcker problemställen. Du behöver:
Med grooming menar jag kommunikation mellan teammedlemmar före iteration som syftar till att definiera iterationens omfattning, specificera krav, bryta ner uppgifter, uppskatta insatser och prioritera framtida arbetsmoment. Planeringsprocessen är kopplad till den resulterande omfattningen av iterationen. Inte alla gjorda uppgifter kanske inkluderas i iterationen.
Låt oss dyka in i varje ämne.
Det enklaste sättet för varje utvecklare att bygga upp en teknisk skuldstock är att använda "Att göra"-taggar i källkoden. Senare kan du söka i kodbasen, förbättra något och skicka pull-förfrågningar för godkännande. Men det räcker inte. Det hjälper inte teammedlemmarna att planera ordentligt och vara säkra på omfattningen av utgivningen.
Det bättre alternativet till att använda "Att göra" är att skapa en process för att skapa uppgifterna för framtida förändringar. Om utvecklaren hittar någon potentiell problemplats eller har en idé för att förbättra kodbasen, bör de skapa ett arbetsobjekt i biljettsystemet (Jira, Azure DevOps eller vilket system teamet nu använder). Det skulle vara överdrivet att kräva att ingenjörer tillhandahåller en detaljerad beskrivning av sin idé för varje gruppmedlem, men förklaringen bör vara tillräckligt tydlig för att teamledaren ska förstå nyckelpunkten och omfattningen av förändringar. Detta täcker det första steget - hur vi kan skapa en lista över potentiella uppgifter och ge en beskrivning på hög nivå av framtida förändringar.
Steg två är att göra det begripligt för alla. Denna uppgift kan hanteras av utvecklingsteamledaren, releasechefen eller produktchefen, beroende på deras kvalifikationer. Resultatet bör ge följande detaljer:
Om arbetsobjektet har svar på alla dessa frågor hjälper det till att lindra potentiella problem i framtiden. Det räcker dock inte att enbart ha en eftersläpning för en hanterbar omstrukturering. Du måste planera möjliga förändringar, och de bör vara en ständig del av din process. Visst, du kommer att möta trycket från affärsfunktioner och marknadskrav, där frestelsen att utelämna tekniska uppgifter är stor. Men utan ordentligt underhåll kommer du att möta ännu större problem i framtiden.
Rekommendation för den tekniska eftersläpningen är:
I varje iteration måste teamet reservera tid för tekniska förbättringar.
Om det finns någon idé till förbättring bör den formaliseras som ett arbetsobjekt med en korrekt beskrivning.
Arbetsuppgifter bör delta i groomingprocessen och diskuteras av hela teamet tills alla fördelar och risker har identifierats och uppskattningar från alla teammedlemmar har samlats in.
Arbetsobjekt ska planeras till agila iterationer enligt deras uppskattningar.
Teamet bör erkännas för möjlig teknisk skuldvolym i iterationen. Reserverad tid kan ökas vid behov, men bör aldrig vara mindre än det ordinarie beloppet. Detta hjälper till att uppmuntra ingenjörer att skapa nya uppgifter i eftersläpningen och prioritera dem. Alla vet att deras förslag skulle kunna implementeras och eftersläpningen kommer att krympa en dag, inte växa till en enorm demoraliserande lista.
Ibland kan tekniska skulduppgifter avslöjas under diskussion och uppskattning, medan teamet stötte på oväntade hinder som gjorde realiseringen mindre tillförlitlig och flexibel. Till exempel kanske du inser att det finns liknande funktioner och att skapa en helt ny skulle bara förvärra kodbasen. Men de funktionerna innehåller inte den affärsfunktionalitet som krävs i nya. Och det är bättre att skapa en enhetlig tjänst som kopplar ihop alla liknande funktioner för att förenkla underhållet i framtiden. Ändå kan denna förändring påverka och destabilisera gamla funktioner och det är där utmaningen ligger. Kanske finns det ett sätt att utveckla nya funktioner billigt och blunda för brister. Eller kanske just nu är den bästa möjligheten att skapa en enhetlig tjänst medan det bara finns ett fåtal liknande funktioner. Det viktigaste är att etablera en process som hjälper teammedlemmar att fatta ett beslut baserat på avslöjade fakta och korrekt gjorda uppskattningar. Det är avgörande att ha ett system som förhindrar situationer där sådana beslut bör fattas under implementeringsfasen i en engagerad eftersläpning.
Om dina iterationssteg fungerar bra, kommer avslöjandet av sådana ögonblick att ske automatiskt via en ordentlig grooming- och planeringsprocess. Det finns några grundläggande regler och steg som i de flesta fall kan skydda laget från oväntade hinder:
Problematiska eftersläpningsobjekt skulle kunna delas upp i separata uppgifter och planeras enligt prioriteringar. Beslut om implementeringsstrategin kan vara upp till release manager, beroende på risker och deadlines. Men detta tillvägagångssätt hjälper till att dokumentera alla beslut. Även om den tekniska skulduppgiften sköts upp, läggs den fortfarande till eftersläpningen. Senare bör dessa uppgifter ses över och schemaläggas. Denna process fixar scenarier där några bra och nödvändiga idéer glöms bort under en hektisk iteration.
Ändå är det möjligt att stöta på oväntade och tidskrävande hinder under utveckling, även med en väl underhållen teknisk skuldstock och en fungerande skötsel- och planeringsprocess. Programvaruprodukter kan vara komplicerade, särskilt gamla eller innehållande rik funktionalitet.
Att använda agila metoder hjälper till att samla information tidigt och fatta ett korrekt beslut. En av de enklaste lösningarna är dagliga möten.
Om en ingenjör står inför något problem bör det dyka upp under mötet och diskuteras senare. Varje hinder är unikt och kan ta olika lång tid. Det spelar ingen roll om ändringen kommer att implementeras i den aktuella iterationen, istället för en "Nice to have"-funktion, eller kräver en fullständig revidering av iterationens omfattning. Emissionen bör skapas som en typisk teknisk skulduppgift i spårningssystemet, dekomponeras och beskrivs som vilken annan liknande uppgift som helst i tidigare artiklar. Konsekvens är nyckeln, och teamet måste veta hur de ska hantera dessa situationer.
Alla dessa metoder kan verka som ett ytterligare sätt att ta hela lagets tid med värdelös byråkrati. Och det kan vara så om bara frånvaron av strikta och tydliga regler inte skapade svåra tider för alla. Det är OK att inte följa dessa rekommendationer i kortsiktiga projekt eller vid minimalt värdefull produkt (MVP). Att arbeta i produktionen med kvalitetsansvar och stora produkter kräver dock ett väldefinierat internt processsystem. Låt oss gå igenom de vanligaste invändningarna.
Och det är sant. Att beskriva dina uppgifter på naturligt språk kan ibland vara svårare än att fixa koden. Men här är några lösningar:
Kanske. Men det beror på förklaringen. Prioriteten är beskrivningen av vad som kan gå fel och vilken funktionalitet som kan destabiliseras. Det är dock användbart att skriva om effekterna av förändring eftersom det hjälper till att identifiera ytterligare möjligheter och scenarier. Även de mest djupt tekniska idéerna kan beskrivas i enkla meningar med naturligt språk. Om de inte kan det kan det vara något fel med själva idén, och det kan vara en potentiell risk, hela förslaget bör omprövas.
Skriv bara något i stil med:
"Metod "XXX" förbrukar för mycket RAM-minne vid varje samtal. Att skapa en extra cache för den här metoden hjälper till att minska RAM-förbrukningen och påskynda alla API:er. Metoden använder data som ändras sällan, det räcker att släppa cachen vid omstart. Ändringarna är säkra, men kan potentiellt påverka följande funktioner: XXX, XXX, XXX...".
I vissa fall skulle detta vara tillräckligt. I andra kan det här förslaget utlösa diskussionen, eftersom ingenjören kanske glömmer gammal men fortfarande använd funktionalitet där denna cache kan orsaka problem. Under groomingprocessen kommer idén att revideras, och teamet kommer att hitta en kompromiss.
Stabilitet och tillförlitlighet är bättre än några få procentuella förbättringar under vissa funktioners exekveringstid. Ingen kommer att bli besviken över att missa en potentiell prestandaökning, men det är lätt att smutskasta en produkts rykte.
Tanken är att effektivisera processer och hjälpa till att bedöma risker. Ingenjörer bör ha möjlighet att underhålla kodbasen och tillhandahålla vissa förbättringar. För saker som är små och inte destabiliserar hela produkten, är det möjligt att skapa samlade arbetsobjekt som kan slutföras under iteration. Dessa uppgifter måste fortfarande granskas som pull-förfrågningar men det är inte nödvändigt att formellt meddela dem till teamet.
Ständiga produktförbättringar är avgörande för företag och hjälper till att bevara den övergripande kvaliteten. Om du håller den tekniska skulden och nya idéer på hyllan kommer du att fastna med en föråldrad produkt och snart kämpa för att hitta expertingenjörer för att underhålla den.
Å andra sidan konkurrerar dessa uppgifter med affärsfunktioner och andra idéer som kan driva affärer till nya horisonter. Dessa rekommendationer om eftersläpning av tekniska uppgifter kan hjälpa till att avslöja och bedöma betydelsen av dessa uppgifter, inte bara för teammedlemmar utan också för intressenter. De hjälper till att presentera dessa idéer på ett naturligt språk och behålla och skydda tid för implementering. Det belastar ingenjörer med ytterligare åtgärder, men i slutändan hjälper det hela teamet att leverera högkvalitativa och pålitliga produkter. Och chefens ansvar är att välja rätt instrument eller policy för att upprätthålla denna process.