O přepisování programů a refaktorizaci

Je to už docela dlouho, co jsem na síti četl dva články o tom, jak je špatné přepisovat fungující programy znovu od začátku. Tendence k tomuto kroku bývá velká – stávající kód je špatně navržený, evolucí se z něj stalo něco podivného, čemu nerozumí ani původní autor (natož někdo jiný) a kde každá oprava způsobí dvě další chyby... Všichni programátoři to jistě dobře znají. Začít opět na zelené louce a "tentokrát to udělat správně" je sen mnoha programátorů, majících podobná monstra na starosti.

Ve velkém procentu případů ale podobná snaha vyjde naprázdno a výsledek je mnohem horší než původní program. Proč, to najdete popsáno ve zmiňovaných článcích. Asi nejviditelnější současné příklady toho, kdy přepis od základu způsobil mnoho problémů, jsou Mozilla (které trvalo 4 roky dospět do úrovně, kdy začala být lepší než starý Netscape) a WinAmp 3.x (Nullsoft v něm přepsal snad úplně všechno, ale výsledkem byl program nenbízející skoro nic nového oproti staré verzi, ale zato podstatně hardwarově náročnější).

Jak tedy zacházet s programy, které jsou "zralé na přepsání"? Joel Spolsky radí refaktorizovat – tedy postupně program procházet, upravovat kód a začišťovat, aniž by se přitom měnila funkčnost. Místo jednoho velkého skoku dosáhnout výsledku (čistý a modulární kód) po malých krůčcích. V jiném svém článku to i ukazuje v praxi na svém vlastním produktu FogBUGZ.

Ve většině případů je takový přístup rychlejší než kompletní přepsání a má navíc jednu velmi podstatnou výhodu – program vždy "rozvrtáte" jen na několik hodin či dnů, během kterých upravujete nějakou malou část. Před i po této úpravě program 100% funguje a vy můžete refaktorizaci kdykoliv přerušit a pustit se například do přidávání nových funkcí a dřívějšího vydání nové verze, pokud se dejme tomu změní situace na trhu vlivem konkurence. (Přesně tady zaspala Mozilla, protože když přišel na svou dobu výborný Internet Explorer 6, neměla co nabídnout – na starém jádru se už nepracovalo a nové bylo teprve v plenkách.)

Sám jsem si postup refaktorizací po malých krůčcích ozkoušel během uplynulých 14 dní na těchto stránkách. Že jste si ničeho nevšimli? Pak je vše přesně tak, jak to má být.

Při nasazení nového redakčního systému před několika týdny jsem sice kompletně vyměnil administrační část stránek (rozhraní ke vkládání článků a dalších věcí), ale do front-endu jsem novou technologii doslova narouboval násilím. Většina PHP kódu stále ještě pocházela (nebo aspoň svým duchem odpovídala) době, kdy jsem se v PHP teprve učil programovat.

Proto jsem se pokusil najít trochu času a v přestávkách mezi učením na zkoušky jsem všechno po malých kouscích předělával. Dnes jsou dynamické části stránek napsány tak, že se za ně nemusím sám před sebou stydět. A pokud jsem něco ponechal napsané ošklivě (protože to prostě fungovalo a nemělo to žádné závislosti okolo, které by mohly funkčnost ohrozit), tak jsem to aspoň zabalil do rozumného rozhraní a uklidil na stranu do pomocné třídy.

Vím, že moje stránky jsou oproti skutečným programům opravdu miniprojekt, ale jsem rád, že už při takovéhle velikosti jsou vidět výhody naznačeného postupu. Cestou "nepřepisuj, ale refaktorizuj" se tedy budu vydávat i nadále a můžu ji všem jen doporučit.