Mnohdy mi chybí pokora a mám chuť zahodit kód. Samozřejmě cizí kód a to nejlépe celý. Jako terapie slouží již starší článek Things You Should Never Do, Part I, který napsal Joel Spolsky (autor stackoverflow.com). S jeho laskavým svolením jsem text přeložil do češtiny (překlad uvolňuji pod licencí Creative Commons by-nc-sa).

6. dubna 2000

Netscape 6.0 jde konečně do své první veřejné beta verze. Nikdy nebyla verze 5.0. Poslední major release, verze 4.0, byl vydán téměř před třemi lety. Tři roky jsou ve světě Inter­netu hrozně dlouhá doba. Během této doby Netscape bezmocně a nečinně přihlížel, jak jejich podíl na trhu prudce klesá.

Je ode mne trochu troufalé kriti­zo­vat, že s releasem čekali tak dlouho. Udělali to úmyslně, ne?

No ano, udělali. Udělali tu nejhorší strate­gickou chybu, které se může softwa­rová firma dopustit.

Rozhodli se přepsat zdrojový kód úplně od začátku.

Netscape nebyl první firmou, která tuto chybu učinila. Borland se dopustil té samé chyby, když koupil Arago a pokusil se ho přepsat pro dBase. Projekt odsou­zený k záhubě, který trval tak dlouho, že Miscro­soft Access za ně slízl smetanu. Pak chybo­vali znovu, přepi­so­vali Quattro Pro úplně od začátku, přičemž udivili tím, jak málo funkcio­na­lity dodali. Micro­soft udělal málem tu samou chybu. Pokusil se od začátku přepsat Word pro Windows v projektu zvaný Pyramid, ten byl ovšem zasta­ven, zahozen a zameten pod koberec. Naštěstí pro Micro­soft, nikdy nepřes­tali pracovat na původní zdrojovém kódu, takže měli něco, co mohli dodat, čímž došlo jen k finanční pohromě, nikoli strategické.

Jsme programátoři. Programátoři jsou svým srdcem archi­tekti a první věc, kterou chtějí udělat, když přijdou na plac, je srovnat vše se zemí a začít stavět na rovině. Nebaví nás postupné úpravy: opravo­vat, zlepšovat nebo opečovávat květi­nový záhon.

Důvod, proč programátoři vždy chtějí zahodit kód a začít znovu, je zanedba­telný. Myslí si, že starý kód je binec. Zajímavý postřeh: Pravděpo­dobně se mýlí. Myslí si, že starý kód je svinstvo, kvůli elemen­tár­nímu zákonu progra­mování: Je obtížnější kód číst než ho psát.

Proto je znovu­použití kódu tak těžké. Proto každý ve vašem týmu má raději jinou funkci na rozdělení stringu do pole. Napsali si vlastní funkci, protože je to snazší a zábav­nější než zjišťo­vat, jak funguje již existující funkce.

Díky tomuto axiomu se dnes můžete zeptat téměř libovol­ného programátor na kód, na kterém pracuje. „Je to bordel,“ řeknou vám, „nejraději bych to zahodil a začal od začátku.”

Proč je to binec?

„Podívej,“ odpoví, „tahle funkce, jak je dlouhá. Zabírá dvě stránky! Nic z toho sem nepatří! Netuším k čemu je polovina volání tohohle API.“

Philippe Kahn, svérázný zakla­datel Borlandu, byl, před uvedením jejich tabul­kového proce­soru pro Windows, hojně citován v tisku se svým vychloubáním, jak bude Quattro Pro mnohem lepší než Micro­soft Excel, protože ho píšou od začátku. Vše nový kód! Jako by kód rezivěl.

Myšlenka, že nový kód je lepší než starý, je očividně absurdní. Starý kód byl používaný a testo­vaný. Bylo nalezeno mnoho chyb, které byly opraveny. Na tom není nic špatného. Kód nechytí chyby od toho, že jen tak sedí na vašem pevném disku. Naopak! Je software jako starý Dodge Dart, rezne v garáži? Je snad jako plyšový medvídek ošklivý proto, že není vyrobený z nejnovějších materiálů?

Zpět k oné funkci na dvě stránky. Ano, já vím, bývala to jedno­duchá funkce na jednu obrazovku, ale nějak narostla a nikdo neví proč. Povím vám proč: Jsou to opravy chyb. Jedna z oprav se týká chyby, kdy se Jana pokoušela nainsta­lovat program na počítač, kde nebyl Internet Explo­rer. Jiná oprava se zase týká chyby, která se objevuje při nedostatku operační paměti. Další záplata opravuje chybu, když je soubor na externí disku a uživatel ho vytrhne upros­třed práce. Tohle volání LoadLib­rary je ošklivé, ale zaruč­uje, že to poběží na staré verzi Windows 95.

Každá z těchto chyb zabrala týdny skuteč­ného používání než byly nalezeny. Programátoři mohli strávit několik dní tím, že se je snažili repro­du­kovat a opravit. Stejně jako mnoho jiných chyb, oprava může být na jeden řádek nebo dokonce na jen pár znaků, ale do těch dvou znaků byla vložena spousta práce a času.

Když zahodíte kód a začnete úplně od začátku, zahazu­jete s tím i všechny tyto znalosti. Všechny sebrané chyby, roky programátorské práce.

Zahazu­jete svou vedoucí pozici na trhu. Dáváte konku­renci dva nebo tři roky náskok a věřte mi, to je v softwa­rovém průmyslu dlouhá doba.

Vysta­vu­jete se nebez­pečné situaci, kdy budete několik let dodávat starou verzi kódu. Neschopni udělat jakékoliv strate­gické změny nebo reagovat na požadavky trhu, protože nemáte kód, který lze dodat. Můžete po tu dobu zavřít krám.

Plýtváte ohromným množstvím peněz na psaní kódu, který již existuje.

Je nějaká alter­na­tiva? Shoda panuje v tom, že starý kód Netscape byl skutečně špatný. Mohl být špatný, ale víte co? Fungoval zatra­ceně dobře na hrozně moc oprav­dových počítač­ových systémech na celém světě.

Pokud programátoři říkají (a vždy říkají), že jejich kód je svinstvo, tak za to můžou násle­dující tři body.

Za prvé se jedná o archi­tek­to­nické problémy. Kód není uspořádán správně. Kód pro síťovou komuni­kaci se objevuje ve vlastním dialo­govém okně upros­třed ničeho; to mělo být vyřešeno v UI kódu. Takové problémy lze vyřešit, jeden po druhém, opatrným přesouváním kódu, refak­to­rováním či změnou rozhraní. Zvládne to jeden programátor pečlivě kontro­lující všechny své změny najed­nou, takže práce nikoho jiného není narušena. I celkem velké archi­tek­to­nické změny mohou být učiněny bez zahazování kódu. Na projektu Juno jsme strávili několik měsíců změnou archi­tek­tury v jediném ohledu: prostém přesouváním věcí, jejich čištěním, vytvářením smyslupl­ných základ­ních tříd a ostrých rozhraních mezi moduly. Ovšem dělali jsme to opatrně a s naším existujícím kódem. Nezanesli jsme žádnou novou chybu a nezaho­dili jsme přitom funkční kód.

Druhým důvodem, proč si programátoři myslí, že je jejich kód binec je neefek­ti­vita. Rende­ro­vací kód v Netscape byl pověstný svou pomalostí. Nicméně to ovlivňo­valo pouze malou část projektu, kterou můžete optima­li­zovat nebo dokonce přepsat. Nemusíte přepi­sovat celek. Při optima­li­zaci na rychlost vám 1% práce přinese 99% užitku.

Za třetí, kód může být sviňsky ošklivý. Pracoval jsem na jednom projektu, který měl skutečně datový typ nazvaný Fucked­St­ring. Jiný projekt přišel s konvencí začínat instanční proměnné podtržít­kem, později přešli na častěji používaný formát “m_”. Takže polovina funkcí začínala “” a polovina “m”, což vypadalo děsně. Upřímně, tohle vyřešíte za pět minut makrem v Emacsu, ne přepsáním celého kódu.

Je důležité si pamato­vat, že když začnete úplně od začátku, není vůbec žádný důvod věřit tomu, že se vám to tentokrát povede lépe než napoprvé. Především asi ani nemáte ten samý tým, který pracoval na první verzi, takže ani nemáte víc zkuše­ností. Prostě se znovu chystáte udělat jednu z nejstarších chyb a zavést nový problém, který v původní verzi nebyl.

Mantra verze jedna k zahození je nebez­pečná, apliku­je­te-li ji na komerční aplikace velkého rozsahu. Píšete-li experi­men­tální kód, můžete chtít, v případě že vymys­líte lepší algorit­mus, roztrhat funkci, kterou jste napsali minulý týden. To je v pořádku. Můžete chtít refak­to­rovat třídu, aby byla lépe použi­telná. To je rovněž v pořádku. Ale zahodit celý program je nebez­pečně hloupé a pokud by Netscape býval měl nějaký dospělý dozor se zkuše­nostmi ze softwa­rového průmyslu, možná by se nestřelil do nohy tak zle.