Grug brát T-rex, aspoň T-rex vidět.
Obě tyto informace platí pro drtivou většinu aplikací a dohromady vytvářejí zajímavý paradox. Jeden přidaný řádek kódu totiž působí neškodně a zdánlivě nic nekomplikuje. Postupem času se však takových řádků mohou nahromadit desítky, stovky i tisíce, a vy náhle zjistíte, že váš kód je ve skutečnosti komplikovaný. Krásně to ilustruje rčení death by a thousand paper cuts.
Je důležité znovu připomenout, že nepoužívaný kód jen tak nevidíte a nemůžete udělat jednoduchý refaktoring, kterým ho odstraníte.
Když pak porovnáme legacy systém a nový systém, vypadají nějak takhle:
Legacy systém
Nový systém
Oba ovladače dávají uživateli stejnou nebo velice podobnou funkcionalitu. Starý ovladač ale obsahuje hromadu tlačítek (řádků kódu), které prakticky nikdo nepoužívá.
Refactoring legacy systému pomůže jen částečně. Můžete třeba přidat popisky ke každému tlačítku ovladače (zdokumentovat kód), ale i tak bude výsledek stále horší než u nového systému.
Výsledkem je, že jakákoliv úprava legacy aplikace je mnohem složitější než úprava nové aplikace.
Neexistuje žádné univerzální pravidlo, které bych vám mohl říct. Vše záleží na situaci a kontextu. To nejlepší, co můžu udělat, je vám ukázat několik příkladů, jak nepoužitý kód vzniká, abyste si mohli na tento článek vzpomenout, když se dostanete do podobné situace.
My programátoři máme jistý fetiš pro psaní krásného obecného kódu, který řeší všechny možné i nemožné situace. V praxi je ale potřeba tento fetiš potlačit a psát kód, který je potřeba teď, protože je velice pravděpodobné, že obecnou variantu nikdy nebudeme potřebovat.
V praxi se mi jednou stalo, že programátor dostal zadáno vytvořit input pro vložení telefonního čísla. Programátor si požadavek přebral po svém a implementoval input pro vložení telefonu pro všechny země světa.
Možná si říkáte: „To je dobrý programátor, on přemýšlí dopředu.“ Skutečnost je ale taková, že firma, pro kterou jsme aplikaci vyvíjeli, už existuje asi 8 let a stále nemá ani plán expandovat do jiných zemí. Na druhou stranu obecný input v kódu stále leží a vždy, když je potřeba ho upravit, tak všem komplikuje život.
Nepište obecný kód zbytečně.
Občas se stane, že naimplementujeme něco, co není potřebné. Když tato situace nastane, lidé často argumentují tím, že kód nebudeme mazat, protože se ještě někdy může hodit. Z mé zkušenosti můžu říct, že v drtivé většině případů to dopadne tak, že kód potřeba není.
Osobně se řídím následujícím pravidlem:
Radši kód smažu a po čase ho přidám zpět (pomocí git historie), než abych riskoval, že budu mít v aplikaci nepoužitý kód.
Tento problém se objevuje v mnoha situacích. Výčet některých z nich:
V těchto situacích se vždy řiďte základními pravidly:
Zjistit, že část kódu není používaná, je často heroický úkol. Obvykle máme následující možnosti:
První možností je monitorování feature. Jednoduše nastavíte metriky, které sledují, kolikrát byla feature za poslední den/měsíc/rok použita.
Problémem monitorování je, že některé features mohou být nepoužité celé měsíce, ale stále jsou potřeba. Příkladem mohou být kvartální nebo výroční reporty.
Dalším problémem je, že feature může být sice používaná, ale neznamená to nutně, že jsou používány všechny její části – viz úvodní příklad se čtečkami. Pokud bychom monitorovali pouze, zda jsou používány čtečky čárových kódů, vše vypadá OK, ale už se nedozvíme, že jedna ze čteček už není potřeba. Je tedy důležité a náročné zvolit správnou granularitu monitorování feature.
Dalším způsobem, který je obecně známý, jsou scream testy. Feature jednoduše smažete, a pokud se někdo ozve, že danou funkcionalitu potřebuje, víte, že je potřeba.
Můžete zvolit i méně agresivní přístup – zobrazit hlášku „Tato funkcionalita bude odstraněna.“, přidat bug, který způsobí, že funkcionalita nefunguje, atd. Ve všech případech čekáte, jestli se někdo ozve a oznámí vám, že je potřeba feature obnovit/opravit.
Scream test je poměrně nepříjemný pro uživatele, a proto ho doporučuji používat pouze v nejnutnějších případech.
Pokud je vaše aplikace používaná poměrně malou skupinou uživatelů (interní aplikace nebo jiné aplikace pro firmy), je možné jít za lidmi, kteří aplikaci používají, a sledovat, jak přesně vaši aplikaci používají, a nenápadně se ptát na funkcionalitu, kterou chcete smazat.
Mohlo by vás napadnout, proč se prostě nezeptat, jestli můžete feature smazat. V ideálním světě by to tak fungovalo, ale v realitě se pravděpodobně stane jedna z následujících věcí:
Když dojde na lámání chleba, je potřeba přesvědčit váš tým a také byznys o tom, že by bylo dobré feature smazat. Obvykle je to ale velice náročné.
Obecně je jednoduché vyčíslit, kolik stála implementace nějaké feature. Na druhou stranu je velice těžké vyčíslit, kolik peněz můžete ušetřit jejím smazáním. Na jedné straně tedy máte přesnou částku a na druhé straně máte nepřesné odhady.
Lidé se obecně v této chvíli rozhodnou iracionálně a rozhodnou se feature ponechat. Důvody jsou následující:
Aby diskuse byla o něco racionálnější, je potřeba ve firmě vytvářet kulturu, ve které jsou lidé aktivně podporováni a motivováni k odstraňování nepotřebných věcí.