Ideální frekvence: půl hodiny. Proti konfliktům i zbytečné dřině funguje trunk-based development
Třetí díl seriálu o agilním řízení, který se zaměřuje na techniky, jež dokážou proměnit velké týmy a složité projekty v efektivní a spolupracující systémy. Jako druhá přichází na řadu metoda trunk-based development.
Běžnou praxí ve vývoji je, že když programátor začíná novou feature, jako první pro ni vytvoří takzvanou feature větev, tedy jakousi alternativní časovou linii kódu. Důvodem je bezpečnost – v této separé větvi si může dělat, co chce, aniž by to ovlivnilo hlavní kód. Velice často se tento přístup používá u open-source softwaru, který několik lidí udržuje a bezpočet lidí z celého světa do něj přispívá.
Tyto programátory neznáte, proto je výhodné, aby své příspěvky vytvářeli odděleně, a když svou funkcionalitu chtějí přidat, vytvoří takzvaný pull request, tedy požadavek na připojení vytvořeného kódu do hlavního. Proběhne kontrola, připomínkování. U open-source to funguje skvěle, protože do něj může přispívat kdokoli.
Zakódovaná panika
Horší je to ale u aplikací vyvíjených in-house. Pokud se na vývoji podílí větší počet programátorů, vzniká takových alternativních realit mnoho najednou. A každý dobrý programátor si do své alternativní reality kontinuálně přibírá tu hlavní větev, aby měl neustále aktuální novinky.
Pokud to však takto funguje několik týdnů, vytratí se přehled o tom, co se v jednotlivých větvích vyvíjí. A ve chvíli, kdy se feature do hlavního kódu připustí, hrozí, že se celá řada věcí rozsype. Dlouho to trvá a dochází ke konfliktům – například se na tomtéž řádku sejdou dva programátoři a musí se dohodnout, který z jejich dvou kódů se použije, protože oba pracovali na tomtéž poslední dva týdny. A dalších deset lidí pracovalo odděleně dva týdny. To skýtá obrovský prostor k chaosu a chybám.
Nezmeškejte žádné novinky ITT
Přitom je to zcela zbytečné. Stačí všechny tyto alternativní reality do hlavního kódu přidávat často, třeba každou půlhodinu či hodinu.
Jinými slovy, alternativní kód leží programátorovi v jeho počítači, kde se o něm nikdo další nedozví, poměrně krátkou dobu. A když se potká víc programátorů nad stejnou obrazovkou, třídou, tabulkou nebo funkčností, což je naprosto běžné, všichni se o tom dozvědí okamžitě. Jistě, v tu chvíli to člověka zdržuje, protože se musí zvednout ze židle, druhého programátora najít a vyřešit to s ním. Ovšem je to daleko efektivnější, než když se potkáme jednou za dva týdny a alternativních kódů je tam celá hromada, kterou několik programátorů vytvořilo za deset dnů práce.
Řešit konflikty jednou za takhle dlouhý čas je neskonale náročnější a zdlouhavější. A právě tohle je trunk-based development. Označení pochází od toho, že hlavní větvi kódu se dříve říkalo trunk, tedy kmen.
Zelený praporek
Jedná se o metodu technicko-sociální. Technická stránka spočívá v tom, že se člověk musí naučit programovat tak, aby si mohl dovolit svůj kód nabízet v takto krátkých (půlhodinových, hodinových) časových intervalech. Sociální prvek představuje nutnost osobního setkávání programátorů nad částmi kódu, jimž se aktuálně věnují.
Ale co když daná feature není hotová – přece do hlavního kódu nemůžeme dávat nedodělané věci? K tomu slouží praporky neboli feature flags, které se používají jako varování pro ostatní: pozor, tady ještě není hotovo.
Jakmile se daný kus dokončí, pouze se praporek přepne a kód je vidět. V trunk-based developmentu stačí většinou jeden praporek. Velké firmy jako Apple, Spotify či Netflix jich ale používají celou řadu, jelikož některým svým zákazníkům dají v jednu chvíli k testování jednu feature, jiným zákazníkům jinou a pak měří jejich zapojení, konverze, jak často danou funkcionalitu používají a podobně.
Trunk-based development používají všechny velké firmy, takže pokud máte na svém telefonu aplikaci Spotify, jistě v jejím hlavním kódu máte i funkcionality, které ještě nejsou úplně hotové, ještě se na nich pracuje, už ale figurují v hlavní větvi kódu. Je to výhodné proto, že pokud na ně narazí někdo z jiného týmu Spotify, ví o nich, vidí, na čem někdo jiný pracuje, a nečeká, až je někdo dodělá a uvolní – a až za pár týdnů dojde ke konfliktu.
Teď, nebo nikdy
U velkých softwarových firem je tento přístup zcela běžný, protože významně šetří čas. Vyžaduje ovšem vysokou automatizaci testování. Kdyby se intenzivně netestovalo, jakmile se do hlavní větve přidá část kódu, nikdo by se nemusel dozvědět o tom, že se něco rozbilo. To platí i pro ty nedodělané části – i ty musejí být pokryty automatickými testy. To je jeden předpoklad. Druhým je pak schopnost psát kód tak, aby snesl nehotové věci. Pokud jsou tyto dva předpoklady splněny, metoda všem zúčastněným významně šetří práci.
Něco se do kódu v poslední (půl)hodině přidalo a nefunguje to? Můžeme to vyřešit okamžitě, což je jistě levnější než se k tomu dostat za dva týdny nebo měsíc. Důvod, proč tato metoda zatím není moc rozšířená, tkví právě v testech. Pokud má firma velké množství kódu, který není pokrytý automatickými testy, celkem oprávněně je k trunk-based developmentu skeptická.
Závěrem ještě jedna výhoda této metody: Programátoři často říkají, že pull request jim slouží i jako revize nově naprogramovaného kódu. To se ale dá dělat jinak. Opět je nutné zvednout se ze židle, sednout si k druhému programátorovi a společně projít, co nového udělal. Rovnou se to zapracuje, vyladí, oba si řeknou připomínky a shodnou se na řešení. Je to lepší než si tam a zpět pinkat komentáře v pull requestu. Navíc se jeden od druhého učí, jak kód psát lépe.