Jak zmodernizować starą stronę lub wewnętrzny system firmowy | POLPROG Skip to content

Baza wiedzy

Jak zmodernizować starą stronę lub wewnętrzny system firmowy

Opublikowano: 10 min czytania POLPROG Modernisation
Płyta drukowana symbolizująca przejście od starszych systemów do nowoczesnych technologii

Systemy legacy częściej wymienia się źle, niż w ogóle. Różnica rzadko leży w technologii, leży w tym, czy zespół modernizował się małymi, ciągłymi krokami, czy próbował zrobić wszystko naraz.

Stare systemy mają dwie wspólne cechy: działają i denerwują wszystkich. Działają, bo lata realnego użycia dopasowały je do faktycznego biznesu. Denerwują, bo nikt nie chce ich dotykać, dokumentacja jest szczątkowa, a jeden z pierwotnych programistów odszedł trzy firmy temu.

Co naprawdę znaczy „legacy”

Nie każdy stary system to legacy. 10-letnia aplikacja na wspieranym stosie, dobrze testowana i aktywnie utrzymywana, to po prostu dojrzała. Legacy zwykle oznacza:

  • Wersje platformy lub frameworka bez wsparcia bezpieczeństwa.
  • Wiedzę skupioną w jednej-dwóch osobach.
  • Strach przed zmianami, bo drobiazg psuje odległe funkcje.
  • Ręczne wdrożenia, ręczne testy, ręczne wszystko.
  • Rosnącą przepaść między potrzebami biznesu a tym, co system potrafi.

Dwie podejścia, które zawodzą

  • Nie ruszać. Ryzyko się kumuluje. W końcu coś krytycznego pęka w najgorszym momencie.
  • Przepisać od zera. Wielki rewrite prawie zawsze trwa dłużej niż planowano, ukryte wymagania wychodzą za późno, a równoległe działanie dwóch systemów ciągnie się tak długo, że zespół się poddaje.

Podejścia, które naprawdę działają, leżą pomiędzy.

Strategia 1: „Strangle the legacy”

Legacy działa dalej, ale nowe funkcje trafiają stopniowo do nowej warstwy. Z czasem w nowym systemie żyje coraz więcej, stary kurczy się, aż wreszcie można go wyłączyć.

Działa dla stron (strona po stronie), narzędzi wewnętrznych (moduł po module) i integracji (nowa brama API, potem przekierowanie wywołań).

Strategia 2: modernizacja w miejscu

Czasem architektura jest OK, za stary jest stos. Wtedy aktualizujemy po warstwie: język/runtime, biblioteki, framework, deployment. Po drodze dopisujemy testy automatyczne, żeby każdy krok dało się zweryfikować. Niegłośne, ale bardzo skuteczne.

Strategia 3: najpierw podzielić, potem modernizować

Duże monolityczne systemy łatwiej modernizuje się kawałkami, gdy widać szwy. Najpierw definiujemy granice w istniejącym kodzie (moduły, bounded contexts), potem wymieniamy moduł po module. Granice mają większe znaczenie niż wybór technologii.

Co zrobić, zanim powstanie jakikolwiek nowy kod

  • Opisać, co system naprawdę dziś robi, nie co miał robić.
  • Zidentyfikować funkcje, na których ludzie polegają codziennie, muszą działać przez całą tranzycję.
  • Zidentyfikować martwe funkcje, często spora część kodu, cicho do wygaszenia.
  • Zinwentaryzować dane, integracje, uprawnienia i eksporty. Właśnie tam projekty modernizacyjne zwykle się wywracają.
  • Zdecydować, co znaczy „skończone” w mierzalny sposób.

Zabezpieczenia, które realnie robią różnicę

  • Kopie zapasowe i przećwiczone odtworzenia, przed jakąkolwiek zmianą.
  • Testy automatyczne na zachowanie, które Was interesuje, stopniowo dokładane.
  • Feature flagi, zmiany do wyłączenia w produkcji bez deployu.
  • Obserwowalność, logi, tracking błędów, kluczowe metryki biznesowe, żeby szybko widzieć regresje.
  • Etapowe wdrażanie: nowy kod dla wewnętrznych, potem mała grupa użytkowników, potem wszyscy.

Wzorzec strangler fig. Zamiast ryzykownego przepisania „na big bang”, ruch trafia przez cienki fasadowy gateway, który stopniowo przekierowuje coraz więcej żądań do nowych usług, a legacy obsługuje resztę, aż zostanie puste.

Przykład: minimalna reguła fasady

Mały gateway może decydować per-ścieżka, czy żądanie trafia do starego monolitu czy do nowej usługi. Neutralnie względem frameworka:

app.use((req, res, next) => {
  if (req.path.startsWith('/api/v2/invoices')) {
    return proxy(req, res, NEW_SERVICE_URL);
  }
  return proxy(req, res, LEGACY_URL);
});

Każdy zmigrowany moduł przenosi jeden prefiks z LEGACY_URL na NEW_SERVICE_URL. Użytkownicy nigdy nie widzą „dnia przełączenia”; zespół dowozi małe, odwracalne kroki.

Częsta pułapka: pisanie nowego systemu tak, jakby od pierwszego dnia miał mieć te same funkcje co stary. Nie musi. Zacznijcie od najmniejszego fragmentu, który ma realną wartość biznesową, udowodnijcie ścieżkę migracji, a potem powtarzajcie.

Najczęstsze błędy

  • Skupienie na wyborze technologii. Fajny nowy stos nie pomaga, jeśli model danych i integracje dalej są tajemnicą.
  • Czekanie na wielki rebranding zamiast naprawienia widocznych problemów. Płacą za to użytkownicy; traci się impet.
  • Zbyt wczesne wyłączanie starego systemu. Dwa systemy równolegle muszą pożyć tyle, ile trzeba, żeby zaufać nowemu.
  • Strata wiedzy instytucjonalnej. Pracujcie w parze z ludźmi, którzy znają system. Ich wiedza to realny majątek.

Realistyczna kolejność

  1. Ustabilizować: backupy, monitoring, łatki bezpieczeństwa, minimum testów.
  2. Zmapować: udokumentować to, co istnieje i co jest realnie używane.
  3. Ustawić priorytety: wybrać kawałek boli dziś i warto go zmodernizować teraz.
  4. Zastąpić: zbudować nową wersję obok starej.
  5. Przełączyć: skierować ruch, obserwować, poprawić błędy.
  6. Wyłączyć: stary kawałek gasimy dopiero wtedy, gdy przez jakiś czas jest „cicho”.
  7. Powtórzyć dla kolejnego kawałka.

Modernizacja się udaje, gdy jest przyrostowa, obserwowalna i związana z konkretną wartością biznesową. Najpierw ustabilizować, zmapować to, co jest, wymieniać po jednym znaczącym kawałku i utrzymywać biznes w ruchu przez cały czas. Nudno bije heroicznie, i to jedyne podejście, które działa niezawodnie.

Legacy Modernisation Refactoring

Najczęściej zadawane pytania

Czy kiedykolwiek warto przepisać od zera?

Rzadko, w małych systemach lub gdy stara platforma jest naprawdę nie do uratowania. W systemach większych i starszych przyrostowa modernizacja, utrzymanie biznesu przy jednoczesnej wymianie części, jest prawie zawsze bezpieczniejsza i tańsza.

Jak zdecydować, co zmodernizować najpierw?

Wybierzcie przecięcie „boli dziś” i „wartościowe do zmiany”. Moduł, który często pęka, blokuje cel biznesowy i jest dobrze znany komuś w zespole, to idealny kandydat. Unikajcie zaczynania od najbardziej skomplikowanego, najmniej zrozumianego obszaru.

A co z migracją danych?

Dane są zwykle najtrudniejszą częścią. Zaplanujcie je jawnie: format eksportu, reguły mapowania, walidacja, próba na realnych danych, plan wycofania. Wiele modernizacji utyka, bo brzegowe przypadki danych wychodzą za późno.

Czy da się to zrobić bez dedykowanego zespołu?

W małych systemach czasem tak. W systemach krytycznych dla biznesu, nie, przynajmniej nie szybko. Modernizacja potrzebuje skupionej uwagi, a nie „godzin między jednym a drugim”. Dlatego właśnie działa podejście przyrostowe, mały zespół dostarcza wartość bez budowania równoległej organizacji.

Czy ten artykuł był pomocny?

Nowe artykuły na e-mail

Jeden krótki e-mail przy każdym nowym artykule. Bez spamu, wypisujesz się jednym kliknięciem.

Wykorzystujemy e-mail wyłącznie do wysyłki nowych artykułów. Bez udostępniania stronom trzecim.

Wróć do bazy wiedzy