W mojej karierze trzy razy przeszedłem dość znaczną refaktoryzację. Kod ma tendencję do gnicia, więc jeśli baza kodu jest wystarczająco długa, dużego refaktora praktycznie nie da się uniknąć. Wszystkie moje przykłady były oparte na kodach prywatnych, co może wyjaśniać, dlaczego trudno jest znaleźć przykłady publiczne.
Pierwszy raz była to aplikacja, która - wierzcie lub nie - miała fundamentalną architekturę, dzięki której działała tylko z drukarkami igłowymi. Kiedy moja firma nie mogła już znaleźć dostawcy, który dostarczyłby taśmy, przydzielili mnie do pracy z drukarką laserową.
Drugi raz to migracja kilkuset automatycznych skryptów testowych z C do Javy, częściowo dlatego, że potrzebowaliśmy lepszych możliwości międzyplatformowych, a częściowo dlatego, że trudno było zatrudnić nowych programistów C.
Za trzecim razem jestem jeszcze w środku, co polega na modularyzacji ogromnej monolitycznej aplikacji, aby umożliwić testowanie jednostkowe poprzez redukcję sprzężenia i do celów międzyplatformowych.
Porównuję wysiłek wspinaczki na górę. Masz przed sobą ten ogromny cel, ale nie rozwiązujesz go na poziomie makro. Bierzesz go po jednym uchwycie, zawsze mając bliskie położenie awaryjne, nigdy nie odłączając poprzedniego zabezpieczenia, dopóki nie znajdzie się następne. Zaczynasz po prostu od drobnych przyrostowych ulepszeń, a po chwili odwracasz się i nagle pojawia się ten piękny widok.
Powiedzmy, że masz na przykład 60 000 plików silnie sprzężonego kodu. Chcesz rozpocząć testowanie jednostki, ale zależności uniemożliwiają to. Jak to naprawić? Odłączasz jeden plik. Dodajesz testy automatyczne. Zanim przejdziesz dalej, wrócisz na stabilny teren. Powtórz 59 999 razy.
Jeśli to brzmi prosto, to dlatego, że jest proste. To nie jest łatwe, ale jest proste. Na początku trudno zauważyć jakiekolwiek postępy. Jesteśmy za dwa lata, co wydawało się niemożliwym refaktorem, i prawdopodobnie mamy przed sobą lata, zanim skończymy, ale patrząc wstecz, nagle uświadamiamy sobie, o ile lepszy jest już kod, i byliśmy w stanie nadal dostarczać nową funkcjonalność tymczasem naszym klientom.
Pozostałe dwa razy działały w ten sam sposób. Znajdujesz najmniejszy bezpieczny krok, jaki możesz podjąć, i podejmujesz go, zawsze utrzymując aplikację w stanie roboczym. Martwisz się tylko dużym obrazem, aby upewnić się, że zmierzasz we właściwym kierunku. Wszystkie twoje działania są małe, stabilne i przyrostowe.