Legacy kod to nie zły kod — to kod, który przeżył kontekst, dla którego został napisany. Biznes na nim działa, nikt go w pełni nie rozumie, a każda zmiana to mały akt odwagi. Refaktoryzujemy i modernizujemy takie systemy bez przepisywania od zera, które trwa rok i nic nie daje.
Jak podchodzimy
- Najpierw audyt — mapujemy, co tam faktycznie jest: zależności, martwy kod, problemy bezpieczeństwa, części, których wszyscy się boją dotknąć.
- Testy charakteryzujące — zanim cokolwiek zmienimy, piszemy testy utrwalające, co kod robi dziś, włącznie z bugami. Zachowanie jest przypięte zanim zostanie zmienione.
- Inkrementalna wymiana — wzorzec strangler: nowe funkcje trafiają do nowego kodu, gorące ścieżki migrują moduł po module, stary system kurczy się, aż można go wyłączyć.
Podejście strangler
public function test_invoice_rounding_is_pinned(): void
{
$legacy = new LegacyInvoiceCalculator();
// Characterization test: pins current behaviour, quirks included.
$this->assertSame(1049.99, $legacy->total($this->fixtureOrder()));
}
Zanim dotkniemy legacy code, przypinamy jego zachowanie testami charakteryzującymi — nawet dziwactwa. Refaktoring może zmienić kod, ale nie obserwowany wynik.
Stare i nowe działają obok siebie na tej samej bazie. Routing decyduje, która funkcja gdzie trafia. Nigdy nie ma momentu, w którym biznes czeka na koniec przepisywania — wartość jest dostarczana ciągle.
Co zazwyczaj znajdujemy
Codebase'y ery PHP 5, spaghetti bez frameworka, porzucone aplikacje Symfony 2/3, strony WordPress trzymane sześćdziesięcioma wtyczkami. Typowe zwycięstwa: aktualizacja do wspieranej wersji PHP, opakowanie istniejącego kodu frameworkiem, wymiana najgorszych zapytań i wdrożenia na szynach, by zmiany przestały straszyć.
Jeśli masz system, który działa, ale nikt nie odważy się go zmieniać — to dokładnie taki kształt projektu obsługujemy. Pokaż nam kod — powiemy, co warto zostawić.