Przejdź do treści

Refaktoryzacja czy przepisanie od zera? Jak zdecydować

Dla CTO i programistówDecyzje CTO

Filip PapranecZałożyciel Digitaliko

Refaktoryzacja czy przepisanie? Decyduje to, co robi kod. Ilustracja: okno ze starym kodem i dwie drogi wyjścia, refaktoryzacja krok po kroku i przepisanie od zera.Refaktoryzacja czy przepisanie? Decyduje to, co robi kod. Ilustracja: okno ze starym kodem i dwie drogi wyjścia, refaktoryzacja krok po kroku i przepisanie od zera.

Refaktoryzacja to zmiana kodu, która poprawia jego strukturę, nie zmieniając tego, co robi oprogramowanie. Refaktoryzacja czy przepisanie od zera to decyzja o tym, ile miesięcy roadmapy są Państwo gotowi zatrzymać. Refaktoryzacja małymi krokami zwykle wygrywa, bo produkt w tym czasie nadal zarabia.

Przepisanie od zera ma sens w trzech przypadkach: kod robi niewłaściwą rzecz, nie należy do Państwa albo działa na technologii bez wsparcia. Poniżej znajdą Państwo tabelę decyzyjną i sposób na refaktoryzację bez zatrzymywania roadmapy.

Trzy drogi dla starego kodu: refaktoryzacja małymi krokami, gdy kod robi właściwą rzecz źle, wymiana jednej części, gdy jeden moduł spowalnia wszystko, i przepisanie od zera, gdy kod robi niewłaściwą rzecz albo nie należy do Państwa. Każda z przykładem i podejściem.Trzy drogi dla starego kodu: refaktoryzacja małymi krokami, gdy kod robi właściwą rzecz źle, wymiana jednej części, gdy jeden moduł spowalnia wszystko, i przepisanie od zera, gdy kod robi niewłaściwą rzecz albo nie należy do Państwa. Każda z przykładem i podejściem.

Większość naszego kodu pisze AI. Senior przegląda każdą zmianę i odpowiada za produkcję. Przez lata rozwijaliśmy SaaS, z którego codziennie korzystało 60 000+ osób. Nigdy nie został przepisany od zera. Zmieniał się dzięki małym, przejrzanym zmianom, bezpośrednio w działającym produkcie.

Dlaczego duże przepisanie prawie zawsze kosztuje więcej, niż się wydaje?

Przepisanie wygląda czysto, bo nowy kod nie ma jeszcze historii. Ale tej historii Państwo potrzebują. Za każdym dziwnym warunkiem w starym kodzie zwykle stoi czyjaś reklamacja.

Najczęstsze powody, dla których przepisanie robi się drogie:

Przepisanie od zera

  • Tracą Państwo poprawki. Stary kod zawiera lata drobnych poprawek, a klienci znowu trafiają na błędy.
  • Płacą Państwo za dwa systemy. Dopóki przepisanie nie jest gotowe, stary system nadal wymaga utrzymania i nowych funkcji.
  • Roadmapa staje. Sprzedaż czeka na funkcje, a nowy system na starcie potrafi mniej.
  • Cel się przesuwa. Zanim przepisanie dogoni stary system, ten ma już nowe funkcje.

Żadnego z tych kosztów

Refaktoryzacja małymi krokami

  • Produkt nadal działa i zarabia.
  • Klienci niczego nie zauważają.
  • Każdą zmianę można cofnąć.
  • Nowe funkcje wychodzą równolegle z refaktoryzacją.

Kiedy refaktoryzować, a kiedy przepisać: tabela decyzyjna

SytuacjaCo zalecamyDlaczego
Kod robi właściwą rzecz, ale trudno go zmienićRefaktoryzacjaChcą Państwo zachować zachowanie i zmienić tylko kształt kodu.
Nie ma testówNajpierw testy, potem refaktoryzacjaBez testów nie wiadomo, co się zepsuło.
Jedna część spowalnia całą resztęWymienić tę część, resztę refaktoryzowaćJeden moduł za stabilnym interfejsem da się opanować.
Kod robi niewłaściwą rzecz, biznes się zmieniłPrzepisać tę częśćNie ma sensu utrzymywać zachowania, którego Państwo nie chcą.
Kod nie należy do Państwa albo nie mają Państwo do niego dostępuNowy system i przeniesienie danychNie ma czego refaktoryzować.
Technologia nie ma wsparcia ani poprawek bezpieczeństwaStopniowa migracjaPrzenosić część po części, nie wszystko naraz.
Nikt w zespole nie rozumie koduNajpierw zrozumieć, potem decydowaćKod, którego nikt nie rozumie, nie jest powodem do przepisania. Jest powodem do napisania testów.

Proszę zwrócić uwagę na ostatni wiersz. „Nikt tego nie rozumie” to najczęstszy argument za przepisaniem. I zarazem najgorszy. Nowy zespół, który nie rozumie starego kodu, przepisze go bez poprawek, które ten kod zawiera.

Przepisanie to też najłatwiejszy upsell. Częściej wystarczy kontynuować moduł po module i zacząć od najbardziej ryzykownej części, na przykład logowania i uprawnień.

Jak refaktoryzować bez zatrzymywania roadmapy?

  1. Testy obecnego zachowania

    Najpierw opisać, co system robi dziś, łącznie z błędami. Dopiero potem go zmieniać.

  2. Małe kroki w normalnym trybie pracy

    Żadnej gałęzi, która przez miesiąc czeka na merge. Każda zmiana przechodzi przez code review i CI.

  3. Refaktoryzować tam, gdzie powstaje funkcja

    Kod, którego nikt nie dotyka przez miesiąc, może poczekać.

  4. Budować nową część obok starej

    Przełączać stopniowo, aż starą będzie można wyłączyć.

  5. CI, które naprawdę zatrzyma złą zmianę

    Zielony check bez testów niczego nie dowodzi.

AI wykonuje tu powolną, nudną część. Testy istniejącego zachowania, przenoszenie kodu, zmiana nazw. Senior decyduje, co się zmienia i w jakiej kolejności. Reguły, które dajemy do tego AI, opisujemy w artykule Reguły dla kodu AI w zespole.

Kiedy masz testy, refaktoryzacja jest łatwa.

Filip Papranec
Filip Papranec
Założyciel Digitaliko

Bez testów i code review AI jedynie szybciej powiększa Państwa dług techniczny. Dlatego mówimy, że agent to model plus harness. Harness to to, co zatrzymuje złą zmianę.

Kiedy przepisanie od zera jest właściwą decyzją?

Gdy kod nie należy do Państwa. Jeśli pierwotny system nie jest Państwa, nie ma czego refaktoryzować: buduje się nowy, a dane się przenosi.

Przepisanie przebiega w tej samej kolejności. Najpierw dane i zrozumienie, co system naprawdę robi. Potem ekran po ekranie, nie wszystko jednego dnia.

Przed decyzją proszę przejść przez sześć punktów. Proszę zaznaczyć to, co jest prawdą w Państwa systemie:

Czwarty punkt waży najwięcej. Jeśli kod robi właściwą rzecz, tylko źle, refaktoryzacja.

Kiedy tego nie zalecamy

  • Mają Państwo seniora, który zna system i ma na to czas. Proszę refaktoryzować samodzielnie. Tabela powyżej wystarczy.
  • System zostanie wyłączony za kilka miesięcy. Nie warto inwestować w kod, który się kończy. Lepiej zainwestować w przeniesienie danych.

Chcą Państwo podjąć decyzję z kimś, kto robi to na co dzień?

Senior od pierwszego dnia pracuje w Państwa repozytorium i pull requestach. Najpierw testy, potem zmiany małymi krokami, a roadmapa idzie dalej. Tak pracujemy jako zewnętrzni programiści dla zespołów produktowych.

Proszę napisać, która część kodu Państwa spowalnia. Odezwiemy się w ciągu dwóch dni roboczych z kilkoma pytaniami o Państwa pracę. Potem ustalimy, co zrobimy najpierw.

Jeśli wolą Państwo najpierw porozmawiać, proszę zarezerwować 15-minutową rozmowę wstępną.

Którą część swojego kodu najchętniej wyrzuciliby Państwo i dlaczego?

W skrócie

  • Refaktoryzacja, gdy kod robi właściwą rzecz źle. Przepisanie, gdy robi niewłaściwą rzecz albo nie należy do Państwa.
  • Duże przepisanie kosztuje roadmapę, poprawki i dwa systemy jednocześnie.
  • Najpierw testy dzisiejszego zachowania, potem małe kroki w normalnym trybie pracy.
  • Nawet przepisanie idzie część po części, nigdy wszystko naraz.

Najczęstsze pytania

Kiedy refaktoryzować, a kiedy przepisać kod od zera?

Refaktoryzacja, gdy kod robi właściwą rzecz, ale trudno go zmienić. Przepisanie, gdy robi niewłaściwą rzecz, kod nie należy do Państwa albo technologia straciła wsparcie. Nawet wtedy przepisuje się po kawałku, nie wszystko naraz.

Czy można refaktoryzować bez testów?

Można, ale to hazard. Najpierw proszę napisać testy obecnego zachowania, łącznie z błędami. Dopiero potem zmieniać kod. Bez testów o błędzie dowiedzą się Państwo od klienta.

Ile trwa refaktoryzacja?

Nie ma stałego końca i to jest w porządku. Odbywa się na bieżąco w zwykłych pull requestach, tam, gdzie i tak Państwo pracują. Osobny projekt refaktoryzacji trwający miesiącami zwykle nigdy się nie kończy.

Czy AI pomaga w refaktoryzacji?

Tak, przy pisaniu testów, przenoszeniu kodu i zmianie nazw. Decyzja, co zmienić i w jakiej kolejności, zostaje przy seniorze. Bez testów i code review AI sprawia jedynie, że błędy pojawiają się szybciej.

Zapytaj AI o ten artykuł

AI przy odpowiedzi wykorzysta też nasze inne artykuły i doświadczenia z prawdziwych projektów.

ChatGPTClaudePerplexity
Engineering

Kolejne artykuły

Decyzje CTO

Dług techniczny: jak go mierzyć i co naprawić najpierw?

Dług techniczny zmierzą Państwo na podstawie historii git i błędów, bez drogiego narzędzia. Najpierw warto naprawić kod, który zmienia się najczęściej i blokuje roadmapę, a nie ten najbrzydszy. Poradnik dla CTO.

Decyzje CTO

Body leasing czy senior w zespole? Jak wybrać

Body leasing daje godziny programisty, którymi zarządzają Państwo sami. Senior w zespole daje zrealizowane zadania i zespół, który uczy się pracy z AI. Porównanie z outsourcingiem i rekrutacją, dla CTO.

Decyzje CTO

Alternatywy dla Vercel: dlaczego używamy Vercel i Cloudflare

Nie zastąpiliśmy Vercel, podzieliliśmy pracę. Strony w Next.js zostają na Vercel, nowe aplikacje działają na Cloudflare Workers i D1, opisane w TypeScript za pomocą Alchemy. Ceny ze źródłami, nasza konfiguracja i zablokowany deploy agenta AI.