Netscape, Borland, wiele projektów rządowych na całym świecie – lista firm, które zdecydowały się przepisać działający system od zera i tego pożałowały, jest długa. Joel Spolsky nazwał to kiedyś „najgorszą możliwą decyzją w oprogramowaniu". Mimo to pokusa jest zawsze silna.
Dlaczego? Bo stary kod jest nieznany i przez to przerażający. Nowy – wydaje się prosty i czysty, bo jeszcze nie zderzył się z realiami biznesowymi.
Dlaczego „piszemy od nowa" jest tak kuszące?
Kiedy programista patrzy na stary kod, widzi problemy: złe nazewnictwo, brak testów, skomplikowane zależności, przestarzałe biblioteki, brak dokumentacji. Naturalną reakcją jest chęć zaczęcia od czystej kartki.
Problem w tym, że ten „brzydki" kod zawiera coś bezcennego: lata rozwiązanych problemów biznesowych. Każda dziwna instrukcja if, każdy niezrozumiały warunek – to często efekt napotkanego kiedyś edge case'a, który kosztował klienta kilka godzin straconej pracy. Przepisując, tracisz tę wiedzę.
Stary, „brzydki" kod często rozwiązuje problemy, o których istnieniu nie wiesz – dopóki ich nie przywrócisz pisząc od nowa.
Kiedy modernizacja jest lepszą opcją?
Modernizacja – czyli stopniowe ulepszanie istniejącego systemu – sprawdza się w zdecydowanej większości przypadków. Szczególnie, gdy:
- System działa i jest używany produkcyjnie. Przerwanie ciągłości działania to realne koszty biznesowe. Modernizacja pozwala wprowadzać zmiany bez przestojów.
- Logika biznesowa jest skomplikowana. Im bardziej złożone są reguły działania systemu, tym większe ryzyko, że przy przepisywaniu coś zostanie pominięte lub zrozumiane źle.
- Dokumentacja jest słaba lub brakuje jej całkowicie. Bez wiedzy o tym, co system powinien robić, przepisanie to podróż w nieznane.
- Masz ograniczony budżet i czas. Modernizacja jest tańsza i szybsza – pierwsze efekty widać po tygodniach, nie miesiącach.
- Problemy są konkretne i lokalne. Wolna baza danych, przestarzałe biblioteki, nieczytelny interfejs – to można naprawiać selektywnie.
Kiedy przepisanie od nowa ma sens?
Są sytuacje, gdzie przepisanie jest uzasadnione. Nie jest ich wiele, ale są:
- Technologia jest martwa lub niemożliwa do utrzymania. System napisany w technologii, której już nikt nie zna i nie można zatrudnić programisty – to realny problem. Ale nawet wtedy można migrować stopniowo.
- Architektura jest fundamentalnie zepsuta. Jeśli system nie można skalować, testować ani modyfikować bez ryzyka posypania wszystkiego – i jest to problemem nie do obejścia inkrementalnie.
- Model biznesowy zmienił się radykalnie. Stary system rozwiązuje inny problem niż ten, który firma ma dziś. Modernizowanie go to mozolne dostosowywanie czegoś, co nigdy nie będzie pasować.
- System jest mały. Im mniejszy system, tym mniejsze ryzyko przepisania. Aplikacja z 2000 linii kodu i trzema funkcjami to inny przypadek niż system ERP obsługujący cały łańcuch dostaw.
Jak podejmujemy tę decyzję? Nasze kryteria
Kiedy klient przychodzi z pytaniem „modernizować czy przepisać", zaczynamy od kilku pytań diagnostycznych:
1. Czy system działa poprawnie pod kątem biznesowym?
Jeśli tak – to ogromny argument za modernizacją. Logika biznesowa jest prawidłowa, tylko implementacja wymaga pracy. Dużo łatwiej poprawić implementację niż zrozumieć i odtworzyć logikę od zera.
2. Ile kodu jest „naprawdę złego"?
Często to, co na pierwszy rzut oka wygląda jak katastrofa, po głębszej analizie okazuje się zestawem konkretnych problemów w kilku kluczowych miejscach. Reszta kodu jest zwykła, nudna i działa.
3. Jak długo zajmie przepisanie?
Przepisywanie systemów zawsze trwa dłużej niż szacunki – zwykle 2-3x dłużej. Jeśli szacunek to 6 miesięcy, planuj 12-18. W tym czasie stary system musi być utrzymywany, a firma żyje z opóźnionym nowym systemem.
4. Czy możemy robić to stopniowo?
Często tak. Nawet poważna przebudowa systemu może być podzielona na moduły i robiona inkrementalnie – przy zachowaniu ciągłości działania produkcji. To tzw. strangler fig pattern – nowy system „obudowuje" stary, przejmując funkcje jedna po drugiej.
Nie wiesz, czy Twój system warto modernizować czy przepisywać? Zrobimy bezpłatną ocenę i powiemy Ci wprost, co ma sens.
Zapytaj o ocenę →Wzorzec, który nam się sprawdza: modernizacja ewolucyjna
W praktyce rzadko stajemy przed wyborem zero-jedynkowym. Najczęściej robimy coś pomiędzy: zostawiamy działające jądro systemu i stopniowo wymieniamy lub modernizujemy poszczególne komponenty.
Przykładowe podejście:
- Audyt – identyfikacja najgorzej działających i najbardziej problematycznych elementów
- Priorytetyzacja – które problemy generują największy ból biznesowy?
- Modernizacja iteracyjna – zaczynamy od jednego modułu lub jednej warstwy
- Weryfikacja – każda zmiana jest testowana zanim trafi na produkcję
- Powtórzenie – przechodzimy do następnego elementu
System przez cały czas działa. Zmiana jest kontrolowana. Ryzyko jest minimalne.
Czerwone flagi: kiedy ktoś proponuje Ci przepisanie od zera
Uważaj, gdy słyszysz następujące argumenty za przepisaniem:
- „Ten kod jest tak zły, że szybciej będzie napisać od nowa niż to naprawiać" – zwykle nieprawda
- „Nowa technologia X wszystko rozwiąże" – nowa technologia przynosi nowe problemy
- „W 3 miesiące zrobimy to samo, tylko lepiej" – niemal nigdy tak nie wychodzi
- „Stary system to już nie do utrzymania" – to często opinia, nie fakt; warto ją zweryfikować
Wnioski
Modernizacja jest prawie zawsze lepszą opcją niż przepisanie od zera – szczególnie dla systemów produkcyjnych z historią i złożoną logiką biznesową.
Przepisanie ma sens w wąskich, konkretnych przypadkach: martwa technologia, fundamentalnie zepsuta architektura, mały system, radykalna zmiana modelu biznesowego.
W każdym przypadku decyzja powinna być poprzedzona rzetelnym audytem – nie intuicją programisty, który właśnie spędził tydzień na walce ze starym kodem.