Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Wzorce do pracy z legacy

Wzorce do pracy z legacy

Chciałbym powiedzieć o kilku wzorcach których możemy użyć w czasie pracy z różnymi projektami tak zwanymi legacy. Wzorce te mam sprawdzone w bojach na różnych projektach więc będę odnosił się do konkretnych przypadków które faktycznie były zaimplementowane.

Leszek Prabucki

October 25, 2024
Tweet

More Decks by Leszek Prabucki

Other Decks in Programming

Transcript

  1. Jak Ja definiuje system legacy? • Brak możliwości aktualizacji: Systemy

    legacy są zazwyczaj starsze i mogą nie być już wspierane przez producenta. Nie są one regularnie aktualizowane, co może prowadzić do problemów z bezpieczeństwem i kompatybilnością. • Krytyczne dla biznesu: Często są kluczowe dla działania firmy, ponieważ przez lata były rozwijane i integrują wiele procesów biznesowych. Ich nagła wymiana byłaby kosztowna i ryzykowna. • Trudne w utrzymaniu: Utrzymanie systemów legacy może być trudne i kosztowne. Często styl ich pisania jest już przestarzały i nie jest czytelny. Zmiany wymagają dużo czasu i debugowania. • Brak elastyczności: Systemy te zazwyczaj nie są elastyczne i trudno je modyfikować lub integrować z nowoczesnymi rozwiązaniami technologicznymi. • Problemy z bezpieczeństwem: Starsze systemy mogą mieć luki bezpieczeństwa, które nie są już naprawiane, co naraża firmę na ryzyko ataków. • Zależność od przestarzałych technologii: Mogą być zależne od technologii, które są już nieużywane lub trudne do zdobycia, co utrudnia ich dalsze utrzymanie i rozwijanie.
  2. Use case 1: Kalkulator ofert leasingowych • Projekt ma ponad

    15 lat (zmigrowany z svn w 2017 roku) • Cześć monolitycznego systemu oparta o PHP która odpowiadała za odpowiednie obliczenia kosztów leasingu dla danych ofert i umów • Problemy z utrzymaniem, struktura zmieniana przez lata, stary nieużywany kod nie był usuwany przez wiele lat. Kontrola wersji przez dziedziczenie + ifkologię • Próby restrukturyzacji i przeniesienia części kodu do Laravela, niestety nie dokończone co spowodowało tylko to że projekt był jeszcze mniej zrozumiały • Brak rozgraniczenia widoków od logiki • Brak sensownego routingu i frameworka • Duże powiązanie wszystkiego ze sobą - zmiany w formularzu mogły zmienić coś w kalkulacji • Dane zapisywane i dostarczane w archaicznej bazie danych (FireBird) • System krytyczny dla działania biznesu - zmiany w systemie czy stawkach muszą być potwierdzone uchwałą zarządu • 1 osoba która jest w stanie utrzymywać system
  3. Use case 1: Kalkulator ofert leasingowych - jak pracowaliśmy nad

    projektem • Audyt (zrobiony przez ludzi z zewnątrz) • Analiza po naszej stronie • Przygotowanie planu migracji, debugowanie obecnego kodu, dokumentacja oraz architektura rozwiązania (między innymi wykresy z C4 model) • Zdecydowaliśmy się (również zgodnie z sugestiami z audytu) na podejście przy użyciu Parallel Models • Oba modele zintegrowane razem, oraz mechanizm porównywania ich rezultatów
  4. Use case 1: Kalkulator ofert leasingowych - Parallel Models Opis

    wzorca: Parallel Models polega na utrzymaniu dwóch modeli (starego i nowego) jednocześnie, aby umożliwić stopniową migrację danych i funkcjonalności bez przerywania działania systemu, lub sprawdzenia działania modeli pod względem jakiś wybranych przez nas metryk • https://martinfowler.com/bliki/ParallelModel. html Dlaczego ten wzorzec? • Możliwość testowania na produkcji poprzez porównanie starych i nowych rezultatów • Możliwość wydzielenia kalkulatora do nowego kontekstu (aplikacji)
  5. Use case 1: Kalkulator ofert leasingowych - Parallel Models Można

    też poczytać o tym podejściu w poście w którym to opisałem https://tinyurl.com/iteo-legacy-calculator
  6. Use case 2: ATS z integracją EBOK • Projekt ma

    ponad 15 lat (zmigrowany z svn w 2015 roku) • Monolityczny system który służył do obsługi agencji HR • Proof of concept tworzony na szybko, przez ludzi bez odpowiedniego doświadczenia • Bardzo trudny w utrzymaniu, tworzenie nowych funkcjonalności trwało długo • System rozwojowy dla biznesu - pełno pomysłów do realizacji, na część pobrane granty z unii • Brak sensownego routingu i frameworka • 1 osoba która jest w stanie utrzymywać system • Nasze zadanie wprowadzenie modułu EBoK ale bez za dużej integracji w obecne rozwiązanie (utrzymuje inna osoba)
  7. Use case 2: ATS z integracją EBOK - jak pracowaliśmy

    nad projektem • Analiza istniejącego kodu i debugowanie istniejącego kodu • Podejście BDD do opisu funkcji EBOK • Identyfikacja miejsc w których możemy podpiąć się integrować z starym systemem przez ACL • Debugowanie i rozumienie starego modelu • Duża warstwa testów funkcjonalnych w ACLu
  8. Use case 2: ATS z integracją EBOK - ACL Opis

    wzorca: Anti-corruption Layer (ACL) tworzy warstwę izolującą stary system od nowego, chroniąc go przed potencjalnym "zanieczyszczeniem" niechcianymi zależnościami i różnicami w modelach danych. (Zobacz też Bubble Context) • https://martinfowler.com/bliki/AntiCorruptionLay er.html • Wzorce projektowe: adapter i repozytorium Dlaczego ten wzorzec? • Możliwość pisania nowego kodu i synchronizacji z starym przez API lub po bazie danych lub kolejkach • Nie trzeba się tak dużo przejmować zmianami w części legacy po za naszym kontekstem
  9. Use case 2: ATS z integracją EBOK Można też poczytać

    o tym podejściu w poście w którym to opisałem https://tinyurl.com/iteo-legacy-acl
  10. Use case 3: Modernizacja API • Projekt ma ponad 7

    lat • BFF - backend for frontend napisany w Symfony • Możliwość dostępu po REST jak i GraphQL • API Platform • Projekt raczej CRUDowy • Duże problemy z wydajnością, trzeba było zaciągnąć varnisha do http proxy cache • Dużo annotacji/atrybutów do sterowania serializacją • System mógł być utrzymywany przez kilka osób • Sporo integracji
  11. Use case 3: Modernizacja API - Strangler Fig Application Opis

    wzorca: Metoda stopniowego zastępowania starego systemu nowym poprzez wycinanie i zastępowanie funkcji. Zapewnia ciągłość działania i minimalizuje ryzyko. W tym wypadku przy użyciu infrastruktury mogliśmy przekierować konkretne RESTowe entrypointy na nową aplikacje Dlaczego ten wzorzec? • Możliwość przepisania części aplikacji webowej bez integracji w obecny system przy uwzględnieniu potrzeb biznesowych (mniejszy koszt) • Mogliśmy zachować kontrakt starej aplikacji
  12. Use case 3: Modernizacja API - Strangler Fig Application Można

    też poczytać o tym podejściu w poście w którym to opisałem https://tinyurl.com/iteo-legacy-strangler
  13. Use case 4: Poprawki w systemie e-commerce związane z deadlockami

    - testy charakteryzacyjne • Projekt ma 4 lata • E-commerce stworzony w Laravelu 5.2 • System aktywnie utrzymywany • Niska jakość kodu • Dużo problemy z wydajnością oraz rzeczami takimi jak deadlocki w czasie składania zamówienia • Nasze zadanie to zlikwidowanie deadlocków
  14. Use case 4: Poprawki w systemie e-commerce związane z deadlockami

    - testy charakteryzacyjne Opis wzorca: Testy charakteryzacyjne są to testy automatyczne które powinny nam sprawdzić aktualne zachowanie kodu legacy W tym przypadku mogliśmy napisać warstwę testów integracyjnych na część aplikacji odnośnie zamówień w której występują deadlocki. Przy użyciu narzędzi do pokrycia kodu z phpunit zapewniliśmy się że pokryliśmy wszystkie istotne miejsca w kodzie. Dlaczego ten wzorzec? • Nie chcemy wprowadzać w regresji • Nie chcemy zmieniać zachowania w aktualnej wersji, tylko chcemy poprawić strukturę (zmniejszyć czas transakcji) oraz wydajność