Novinky
Vývoj8 min čtení

Technický dluh ve firemním softwaru: jak ho poznat a splácet

Technický dluh není nadávka na programátory, ale ekonomická veličina. Ukazujeme, jak ho poznáte bez čtení kódu, jak ho prioritizovat podle byznysového rizika a proč je kompletní přepis systému obvykle ta nejhorší možnost.

Firma si objedná úpravu, která před dvěma lety trvala tři dny. Dnes na ni dodavatel dává dva týdny a v nabídce přibyla věta o „nutném zásahu do jádra systému". Navenek se přitom nezměnilo nic — tentýž systém, tentýž typ úpravy, často i tentýž tým. Změnilo se jen to, kolik starých rozhodnutí musí někdo obejít, než se dostane na místo, kam má přidat jedno tlačítko.

Přesně to je technický dluh. Není to nadávka na programátory ani důkaz, že někdo pracoval špatně. Je to rozdíl mezi tím, jak je software postavený dnes, a tím, jak by musel být postavený, aby se v něm dalo pohodlně pracovat zítra. Tento rozdíl vzniká zcela přirozeně — mění se byznys, mění se požadavky, mění se knihovny a platformy pod vámi. Problém nastává až tehdy, když o něm nikdo nevede záznam a jeho úroky se platí potichu, v podobě stále delších odhadů a stále opatrnějších vývojářů.

Vědomý dluh versus hnití

Nejužitečnější rozlišení, které si jako netechnický majitel můžete osvojit, je rozdíl mezi dluhem, který někdo vědomě vzal, a dluhem, který se nikdy nerozhodl vzniknout.

Vědomý dluh je legitimní byznysové rozhodnutí. Potřebujete stihnout sezónu, tak se ceník na tři měsíce zadrátuje přímo do kódu místo konfigurovatelného modulu. Pilot pro jednoho zákazníka běží s ručním exportem místo integrace, protože netušíte, jestli pilot vůbec přežije. To jsou správná rozhodnutí — za předpokladu, že splňují tři podmínky: je to zapsané, má to vlastníka a má to datum splatnosti. Bez těchto tří věcí to není půjčka, ale jen odklad, na který se zapomene.

Náhodné hnití nikdo nerozhodl. Vzniká z odchodů lidí, z přetrvávajícího copy-paste, z knihoven, které tři roky nikdo neaktualizoval, z testů, které se přestaly psát, když byl tlak, a už se nezačaly. Tento typ dluhu je nebezpečnější, protože nemá stopu — nikde není zápis, ve kterém by stálo „vědomě to děláme takhle".

Zkratka: Vědomý dluh je půjčka se splátkovým kalendářem, náhodné hnití je půjčka, o které nevíte, že ji máte — a právě proto ji nikdy nesplácíte.

Příznaky, které vidíte bez toho, abyste četli kód

Nemusíte rozumět architektuře, abyste věděli, že máte problém. Technický dluh se projevuje v číslech a v chování lidí, které máte před očima.

Odhady rostou u srovnatelných úkolů. Ne u nových a složitějších věcí — to je normální. Ale pokud „přidat pole do formuláře" stálo loni dva dny a dnes stojí týden, platíte úroky.

Existuje modul, kterého se všichni bojí. Poznáte ho podle toho, jak o něm tým mluví: „do fakturace bych radši nešel", „to se musí dělat přes víkend". Strach z dotyku je nejspolehlivější indikátor, jaký máte k dispozici.

Po každém vydání se pokazí něco jiného. Pokud oprava v objednávkách rozbije reporty, systém nemá hranice mezi částmi a nemá záchrannou síť. Ta záchranná síť se jmenuje automatizované testy a je to téma, které se vyplatí řešit dřív, než začnete počítat škody — víc k tomu v textu o automatizaci testování softwaru.

Onboarding nového vývojáře trvá nepřiměřeně dlouho. Pokud se nový člověk dostane k prvnímu samostatnému úkolu až po měsících, systém je buď nezdokumentovaný, nebo nekonzistentní — nejčastěji obojí.

Všechno důležité ví jeden člověk. Když je odpověď na otázku „kdo tomu rozumí?" vždycky totéž jméno, nemáte dodavatele, máte jednoho člověka s rizikem.

PříznakCo obvykle znamenáJak to zaznamenat
Rostoucí odhady u podobných úkolůZamotané závislosti, chybějící abstrakcePorovnejte odhad a realitu u 5 podobných úkolů za poslední 2 roky
Strach z konkrétního moduluChybějící testy nebo neznámý původní záměrNechte tým označit moduly semaforem (zelená/oranžová/červená)
Regrese po vydáníchNedostatečné pokrytí testy, provázaný kódPočítejte hotfixy do 7 dnů po vydání
Dlouhý onboardingChybějící dokumentace, nekonzistentní vzoryMěřte čas do prvního samostatně dodaného úkolu
Závislost na jednom člověkuNepředané know-howSeznam oblastí s jediným znalcem

Jak dluh zviditelnit a prioritizovat

Technický dluh, který není nikde zapsaný, neexistuje pro nikoho kromě vývojářů — a ti ho v nabídce schovají do odhadu. Prvním krokem je proto registr dluhu: obyčejná tabulka, kde má každá položka čtyři sloupce — čeho se týká, co v byznysu blokuje nebo ohrožuje, co se stane, když neuděláme nic, a odhad nákladu na odstranění.

Druhým krokem je prioritizace. A tady dělá většina firem tutéž chybu: nechá pořadí na vývojářích. Vývojář přirozeně chce nejdřív opravit to, co ho nejvíc dráždí. To nemusí být to, co firmu nejvíc stojí.

Praktické kritérium má tři osy:

  • Frekvence změn. Dluh v modulu, který se mění každý měsíc, generuje úroky. Dluh v modulu, který nikdo tři roky neotevřel, jich negeneruje téměř žádné.
  • Expozice. Co je za tím modulem — tržby, osobní údaje, zákonná povinnost? Dluh v autentizaci nebo ve zpracování plateb má jinou váhu než dluh v interním exportu pro marketing.
  • Cena odkladu. Některý dluh je stabilní a počká. Jiný roste — například neaktualizované závislosti, kterým skončí podpora, nebo platforma, ze které se později migruje výrazně dráž.
Technický dluh se nikdy nesplácí sám. Buď ho splácíte vy vědomě a v rozpočtu, nebo ho splácí každý další odhad — jen se to jmenuje jinak.
Pozor: Pokud dodavatel neumí říct, který konkrétní byznysový proces daná oprava zrychlí nebo zabezpečí, není to priorita — je to preference. Prioritu lze vysvětlit bez technických pojmů.

Strategie splácení a jejich rizikový profil

V praxi existují čtyři realistické způsoby, jak dluh snižovat. První dva se dají kombinovat, poslední dva jsou rozhodnutí, která se dělají jednou a těžko se vracejí.

PřístupJak fungujeKdy dává smyslHlavní riziko
Průběžný refaktoringKaždá změna zanechá dotčenou část v lepším stavu, než v jakém bylaSystém se aktivně rozvíjí, tým je stabilníBez pravidel se vytratí pod tlakem termínů
Vyhrazené procento kapacityFixní podíl kapacity (typicky 10–20 %) jde na dluh podle registruDluh je už viditelný a je třeba ho systematicky snižovatVyžaduje disciplínu a reporting, jinak se procento „půjčí" na features
Postupná náhrada po modulechNová implementace běží vedle staré, provoz se přesouvá po částechZastaralá platforma, ale funkční byznysová logikaDočasná dvojkolejnost, vyšší nároky na integraci
Kompletní přepisNový systém se postaví od nuly a naráz nahradí starýSystém se reálně nedá rozvíjet ani provozovatNejvyšší — dlouhé období bez přínosu a ztráta nezapsaných pravidel

Proč je přepis obvykle nejhorší možnost

Přepis vypadá lákavě, protože slibuje čistý start. Ve skutečnosti má tři systematické problémy.

První: starý systém obsahuje roky nezapsaných rozhodnutí. Ty zvláštní výjimky ve výpočtu slevy, které nikdo neumí vysvětlit, jsou zpravidla reakce na reálné situace. Přepis je mlčky zahodí a vy je objevíte v produkci.

Druhý: během přepisu firma platí dva týmy — jeden udržuje starý systém, druhý staví nový — a dlouhé měsíce nedostává žádnou novou funkcionalitu. To je přesně období, kdy konkurence něco dodá.

Třetí: nový systém začne generovat vlastní dluh od prvního měsíce. Pokud se nezměnil způsob práce, který dluh vytvořil, jste za tři roky na tom stejně. Proto má často větší hodnotu upravit proces dodávky a údržby softwaru po spuštění než technologii samotnou.

Přepis obhájíte tehdy, když platforma ztratila podporu, když na ni neumíte najít lidi, nebo když se byznysový model změnil natolik, že původní datový model už nedává smysl. I tehdy je obvykle bezpečnější postupná náhrada po modulech než výměna naráz.

Jak o tom mluvit s dodavatelem

Technický dluh je téma, na kterém se dá dobře otestovat kvalita dodavatele. Dobrý dodavatel ho pojmenuje sám a v byznysových důsledcích. Slabý ho buď zamlčí, nebo jím vysvětlí každý předražený odhad. Pokud právě vybíráte partnera, vyplatí se projít si checklist pro výběr softwarového dodavatele a doplnit si do něj body níže.

Do smlouvy nebo do rámce spolupráce patří několik konkrétních věcí:

  • Definice hotového. Úkol je hotový tehdy, když má testy a dokumentaci, ne když „to funguje na demo".
  • Vyhrazená kapacita na dluh. Explicitně dohodnuté procento kapacity měsíčně, s reportem, co se za ně udělalo.
  • Aktualizace závislostí jako součást údržby. Ne jako samostatně fakturovaný projekt jednou za tři roky.
  • Pravidelný report stavu. Kvartálně, v jazyce rizika: co se zhoršilo, co se splatilo, co hrozí.
  • Vlastnictví kódu a přístupů. Včetně repozitáře, dokumentace a infrastrukturních přístupů na vaší straně.
  • Předávací doložka. Popis toho, co dostanete, pokud spolupráci ukončíte — je to nejlevnější pojistka proti závislosti.

V INTERFASE řešíme tyto body raději na začátku spolupráce než při prvním konfliktu; podrobnosti k našemu přístupu k vývoji softwaru na míru jsou v samostatné sekci.

Kdy dluh neřešit

Ne každý dluh se vyplatí splácet. Pokud se systém do roka vypíná, pokud modul podporuje produkt, který ještě nemá ověřený odbyt, nebo pokud jde o část kódu, která se mění jednou za dva roky — nechte ji být. Splácení dluhu má význam jen tam, kde platíte úroky. Peníze vložené do vyčištění mrtvé části systému jsou ztracené stejně spolehlivě jako peníze vložené do jejího dalšího zanedbávání.

Shrnutí

Technický dluh je ekonomická veličina, ne technická stížnost. Vědomý a časově ohraničený dluh je normální nástroj řízení; nebezpečný je ten, o kterém nikdo nevede záznam. Jako majitel ho poznáte podle rostoucích odhadů, regresí po vydáních, délky onboardingu a strachu z konkrétních modulů — všechno jsou to věci, které umíte změřit bez čtení kódu.

Prioritizujte podle frekvence změn, expozice a ceny odkladu, ne podle toho, co tým nejvíc dráždí. Splácejte průběžně nebo přes vyhrazené procento kapacity, přepis nechte jako poslední možnost a i tehdy upřednostněte postupnou náhradu po modulech. A hlavně: domluvte si způsob, jakým se o dluhu bude reportovat, ještě předtím, než začne bolet.

Pokud potřebujete nezávislý pohled na stav vašeho systému a odhad, co z dluhu reálně stojí za splacení, ozvěte se nám a projdeme si to spolu.

INTERFASE