-

5 problemów w pracy z oprogramowaniem legacy. Jak sobie z nimi radzić?

W dynamicznym świecie technologii obserwujemy coraz większe wyzwanie związane z oprogramowaniem legacy, czyli przestarzałymi systemami i aplikacjami. Przyczyny ich utrzymania są różne – od dużej inwestycji w infrastrukturę, po obawy dotyczące zakłóceń w działalności biznesowej. W artykule przedstawimy znaczenie oprogramowania legacy, wyzwania z nim związane oraz strategie mające na celu zwiększenie wydajności, bezpieczeństwa i elastyczności systemów informatycznych.

Czym jest oprogramowanie legacy?

Termin legacy software odnosi się do przestarzałych systemów lub aplikacji komputerowych, które pozostają w użyciu, mimo wprowadzenia nowszych technologii. Takie oprogramowanie może być oparte na starszych językach programowania, architekturach systemowych lub technologiach, które są trudne do zastąpienia czy zaktualizowania.

Dlaczego oprogramowanie legacy istnieje?

Organizacje często utrzymują oprogramowanie legacy ze względu na poniesione duże inwestycje w infrastrukturę, brak zasobów (np. zespołu odpowiedzialnego za wprowadzenie zmian) lub obawy dotyczące ryzyka biznesowego i zakłóceń w bieżącej działalności.

Proces migracji oprogramowania legacy może obejmować przepisanie aplikacji od nowa, przeniesienie na inną platformę lub stopniowe aktualizacje i ulepszenia istniejącego systemu informatycznego. W każdym z tych wariantów trzeba więc wykonać pewną pracę, dlatego nierzadko firmy pozostają przy istniejącym systemie legacy

Dlaczego warto pracować nad oprogramowaniem legacy?

Migracja lub modernizacja oprogramowania legacy w przedsiębiorstwie to ważny krok. Wykorzystanie nowoczesnych technologii i rozwiązań nierzadko procentuje w postaci zwiększenia efektywności operacyjnej i redukcji kosztów długoterminowych. Warto podjąć działania, aby uniknąć potencjalnych problemów z legacy software oraz doprowadzić do poprawy wydajności, bezpieczeństwa i elastyczności systemu. 

Z perspektywy biznesowej oprogramowanie legacy może generować kilka trudności:

  • może być bardziej podatne na luki w zabezpieczeniach, ponieważ starsze systemy często nie otrzymują regularnych aktualizacji bezpieczeństwa,
  • może być trudne do zrozumienia i utrzymania, zwłaszcza dla nowych programistów, którzy nie są zaznajomieni z przestarzałymi technologiami,
  • może stanowić wyzwanie dla organizacji, które zechcą zintegrować je z nowoczesnymi systemami lub wymienić na nowsze oprogramowanie.

Jakie problemy możesz napotkać w pracy z oprogramowaniem legacy?

Najwięcej problemów legacy software przysparza jednak programistom pracującym nad danym systemem. Przyjrzyjmy się, jakie wyzwania czekają na zespół przy tego rodzaju projekcie.

Oprogramowanie legacy może stwarzać takie problemy jak brak dokumentacji czy możliwości testowania.


1. Brak lub przestarzała dokumentacja

Jednym z głównych wyzwań związanych z oprogramowaniem legacy jest brak dokumentacji kodu, co utrudnia zrozumienie jego działania i prowadzi do wielu konsekwencji.

Przede wszystkim programiści, którzy są odpowiedzialni za rozwój i utrzymanie oprogramowania, muszą polegać na własnych analizach kodu, co jest czasochłonne i trudne. Brak jasnej dokumentacji wydłuża czas reakcji na błędy i utrudnia wprowadzanie niezbędnych zmian lub aktualizacji w systemie.

Ponadto brak dokumentacji sprawia, że deweloperzy stają się zależni od osób, które pracowały nad kodem w przeszłości. Jeśli opuszczą one zespół, ich wiedza i umiejętności przestaną być dostępne dla innych członków. To prowadzi do ryzyka, że w przypadku utraty kluczowych specjalistów, organizacja może mieć trudności w utrzymaniu i rozwijaniu oprogramowania legacy.

Dodatkowo, niejasne lub nieudokumentowane fragmenty kodu mogą być źródłem błędów, które są trudne do zlokalizowania i naprawienia. To z kolei wpływa negatywnie na stabilność i niezawodność danego systemu.

2. Kod bez możliwości testowania 

Niemożność testowania oprogramowania legacy stanowi kolejne źródło zagrożeń dla programistów, którzy starają się wprowadzać nowe funkcjonalności lub rozwiązywać istniejące problemy. Starsze systemy często nie były projektowane z myślą o łatwym testowaniu, a struktura kodu i architektura mogą utrudniać wprowadzanie automatycznych testów.

Brak testów automatycznych w przypadku oprogramowania legacy ma wiele negatywnych konsekwencji. Po pierwsze, może prowadzić do ryzyka wprowadzania błędów i regresji podczas modyfikacji kodu. Oprócz tego utrudnia wykrywanie i eliminowanie defektów w oprogramowaniu. Każda modyfikacja lub poprawka w systemie musi być przetestowana ręcznie, co jest czasochłonne i podatne na ludzkie błędy. To zwiększa koszty i ogranicza możliwość szybkiego wprowadzania zmian w systemie.

3. Konflikt wersji i brak kompatybilności z nowszymi systemami

Oprogramowanie często łączy się z innymi systemami czy aplikacjami. W przypadku legacy, może to być utrudnione na kilku różnych płaszczyznach.

  • Zależności od bibliotek i modułów: wprowadzenie nowej wersji oprogramowania może wymagać aktualizacji powiązanych bibliotek i modułów. Jeśli istniejące aplikacje lub systemy są oparte na starszych wersjach tych bibliotek, może wystąpić niezgodność, co prowadzi do błędów i niestabilności.
  • Zmiany w składni i funkcjonalności: nowe wersje oprogramowania często wprowadzają zmiany w składni i funkcjonalności, które mogą być niekompatybilne z istniejącym kodem. To może wymagać rewizji i dostosowania istniejącego kodu, aby działał poprawnie z nową wersją.
  • Brak wsparcia dla starszych wersji: oprogramowanie często otrzymuje aktywne wsparcie i aktualizacje bezpieczeństwa, podczas gdy starsze wersje mogą przestać być wspierane. To oznacza, że organizacje korzystające z przestarzałych wersji stają się bardziej podatne na luki w zabezpieczeniach i ataki cybernetyczne.

4. Problemy wg teorii wybitej szyby

W kontekście wyzwań z legacy software warto przywołać teorię wybitej szyby (ang. Broken Windows Theory). To wywodzące się z kryminologii zagadnienie odnosi się do koncepcji w dziedzinie zarządzania oprogramowaniem i rozwoju projektów. Ma na celu zwrócenie uwagi na konsekwencje ignorowania błędów, problemów i niedociągnięć na początkowych etapach projektu. 

Teoria wybitej szyby wskazuje na to, że jeśli w istniejącym kodzie znaleziono błędy, niedociągnięcia lub przestarzałe rozwiązania i nie zostaną one od razu naprawione, to istnieje ryzyko, że kolejne zmiany i nowe funkcjonalności również będą prowadzić do problemów (np. będą powodować degradację jakości kodu). 

Innymi słowy, jeśli nie naprawimy “rozbitych szyb” w naszym kodzie, to będziemy skłonni kontynuować ten sam wzorzec w nowych częściach systemu, a ogólna jakość kodu będzie się pogarszać.

Właśnie dlatego ważne jest, aby nie tylko skupić się na dodawaniu nowych funkcji i rozwiązań, ale również na naprawianiu błędów i poprawie istniejącego kodu. Praca nad legacy code może pomóc w zwiększeniu jakości, zrozumiałości i łatwości utrzymania systemu.

5. Oprogramowanie legacy a utrudniona estymacja projektów

Jak wspomnieliśmy wyżej, legacy software bywa często słabo udokumentowany i trudny do zrozumienia. Może zawierać przestarzałe technologie, nietypowe rozwiązania czy niekonsekwentną strukturę. Taki stan rzeczy może znacząco utrudnić programistom zrozumienie zakresu pracy i oszacowanie czasu potrzebnego na realizację projektu.

Często dochodzi do tego jeszcze brak odpowiednio zautomatyzowanych testów jednostkowych lub integracyjnych, co komplikuje wykrycie i naprawę błędów. W rezultacie, deweloperzy muszą uwzględnić dodatkowy czas na testowanie i rozwiązywanie problemów.

W przypadku oprogramowania legacy istnieje także ryzyko ukrytych problemów, takich jak nieznane zależności czy niewłaściwie zaimplementowane funkcje, które mogą wydłużyć realizację zadania. W rezultacie estymacja takich projektów wymaga dokładniejszej analizy kodu i wymagań, co może zwiększyć trudność i czas trwania projektu. Ważne jest uwzględnienie tych czynników i podejście z ostrożnością, aby uniknąć potencjalnych opóźnień i problemów.

Jak pracować z legacy software?

Praca z oprogramowaniem legacy może być wyzwaniem, ale można podjąć kilka skutecznych kroków, aby efektywnie działać w takim środowisku. 

Ogólne podejście do technologii legacy

Pracując z oprogramowaniem legacy, niezależnie od napotkanej technologii, warto wcielić w życie kilka uniwersalnych zasad.

  • Zdobądź wiedzę: zrozumienie zastanego kodu i jego działania jest kluczowe. Warto przeanalizować dostępną dokumentację, jeśli istnieje, oraz przestudiować dostępny kod źródłowy. W trakcie pracy może być konieczne skonsultowanie się z osobami, które wcześniej pracowały nad kodem, aby uzyskać dodatkowe informacje. 
  • Dokumentuj swoje zmiany: w ten sposób można ułatwić zrozumienie wprowadzonych modyfikacji innym programistom. Istotne jest, aby wprowadzać zmiany stopniowo, skupiając się na najważniejszych obszarach systemu.
  • Testuj oprogramowanie: ważne jest weryfikowanie wprowadzanych zmiany, tworząc zestaw testów jednostkowych i integracyjnych.
  • Wprowadzaj refaktoring kodu: dzięki temu uda się ulepszyć jego strukturę i czystość.
  • Poprawiaj kod w oprogramowaniu legacy: warto koncentrować się na poprawie najbardziej krytycznych obszarów, których zmiana przyniesie największą wartość.
  • Korzystaj z narzędzi automatyzujących pracę.

Automatyzacja procesu

To, co można wykonać automatycznie, warto zrealizować właśnie w ten sposób. Istnieją różne narzędzia, które możemy zaimplementować, aby zaoszczędzić w przyszłości dużo czasu i zasobów. Oto kilka przykładów bazujących na pracy w PHP:

  • Testy jednostkowe: tworzenie testów jednostkowych pozwala zweryfikować, czy wprowadzane zmiany nie wpływają negatywnie na istniejący kod. Automatyzacja wykonania testów zapewnia szybkie i skuteczne sprawdzenie, czy wprowadzone modyfikacje nie generują błędów.
Weryfikacja kodu w formie testów jednostkowych to dobre podejście w pracy z oprogramowaniem legacy.


Okno testów w aplikacji PHPUnit 

  • Narzędzia do statycznej analizy kodu: wykorzystanie narzędzi takich jak PHPStan czy Psalm pozwala wykryć potencjalne błędy, niezgodności lub nietypowe użycie funkcji. Automatyczna analiza kodu pomaga identyfikować obszary wymagające poprawy.
  • Systemy CI/CD (ang. Continuous Integration/Continuous Deployment): ich użycie umożliwia automatyczną kompilację, testowanie i wdrażanie zmian. Dzięki temu można szybko sprawdzić, czy wprowadzone modyfikacje nie powodują regresji, a także automatycznie wdrażać zmiany na serwerze produkcyjnym.
  • Narzędzia lintingowe: korzystanie z linterów, takich jak Stylelint, PHPLint czy PHP_CodeSniffer, pozwala na automatyczną weryfikację zgodności z przyjętymi standardami kodowania. Automatyczne sprawdzanie składni i stylu kodu pomaga utrzymać spójność w projekcie.
Stylelint to jedno z automatycznych narzędzi do pracy z kodem, przydatne przy oprogramowaniu legacy.


Przykład błędów zgłaszanych przez narzędzie Stylelint

  • Narzędzia automatyzujące refaktoryzację kodu: np. PHP Rector, czyli biblioteka oparta na PHP-Parser, która umożliwia automatyczne wprowadzanie zmian w istniejącym kodzie, eliminując powtarzalne zadania związane z modernizacją i ulepszaniem kodu.
  • Automatyczne formatowanie kodu: używanie narzędzi takich jak PHP-CS-Fixer lub PHP_CodeSniffer z konfiguracją formatowania kodu pomaga automatycznie dostosować istniejący kod do określonych zasad. To ułatwia utrzymanie spójności i czytelności kodu.
Narzędzie PHP CodeSniffer pozwala utrzymać wysoką jakość i czytelność kodu źródłowego w projekcie.


Widok narzędzia PHP_CodeSniffer do automatycznego formatowania kodu  

  • Automatyczne migracje: w przypadku zmian w bazie danych, można wykorzystać narzędzia do automatycznego zarządzania migracjami, takie jak Doctrine Migrations, które pomagają w aktualizacji schematu bazy danych bezpośrednio z kodu PHP.

Automatyzacja w PHP przy poprawie legacy code może przyspieszyć proces, zwiększyć efektywność i zmniejszyć ryzyko wprowadzania błędów. Automatyczne testowanie, analiza statyczna, linter, systemy CI/CD, automatyczne formatowanie kodu i migracje to przykładowe narzędzia i techniki, które można wykorzystać w tym celu.

Praca z Symfony 

We frameworku Symfony istnieje możliwość wrapowania istniejącego kodu w ramach struktury tego frameworka i stopniowego przenoszenia go na nowe komponenty. To oznacza, że można wykorzystać funkcjonalności i komponenty Symfony, jednocześnie pozwalając na dalsze działanie zastanego, starszego kodu. Na przykład, można zaimplementować logowanie w Symfony, a reszcie aplikacji nadal pozwolić korzystać ze starego kodu.

Jak to działa w praktyce? Proces polega na stopniowym przenoszeniu routingu z istniejącej aplikacji na nowe komponenty Symfony. Jeśli dany adres URL nie zostanie rozwiązany przez framework, to odwołuje się on do starszego kodu i kontynuuje działanie. To pozwala na kontrolowane przenoszenie funkcjonalności i stopniowe dostosowywanie aplikacji do nowych standardów Symfony.

Takie podejście umożliwia modernizację aplikacji napisanej w Symfony, zachowując jednocześnie integralność i funkcjonalność istniejącego kodu. Dzięki temu, można stopniowo wprowadzać nowe komponenty i funkcje Symfony, jednocześnie korzystając z korzyści i narzędzi, jakie oferuje to framework.

Jest to przydatne rozwiązanie dla projektów z legacy software, które chcą korzystać z zalet Symfony, ale nie mogą lub nie chcą przepisać całej aplikacji od nowa. Daje to możliwość sukcesywnego wprowadzania zmian i modernizacji, a jednocześnie minimalizuje ryzyko zakłóceń w działaniu istniejącej aplikacji.

Praca z Drupalem

Jeśli w pracy z Drupalem mamy do czynienia z oprogramowaniem legacy, jednym z rekomendowanych sposobów na poradzenie sobie z tym stanem rzeczy, jest przejście na wyższą wersję systemu.  

Migracja z Drupala 7 do wyższych wersji

Podczas migracji z Drupala 7 do Drupala 9, można skorzystać z różnych rozwiązań ułatwiających ten proces. Oto przykłady popularnych narzędzi związanych z migracją.

Drupal Upgrade Status 

To narzędzie, które pomaga w ocenie gotowości migracji z Drupala 7 do 9. Skanuje kod, moduły i motywy w celu identyfikacji potencjalnych problemów związanych z migracją. Udostępnia również informacje o aktualizacjach modułów i tematów, które mogą być wymagane podczas migracji.

Drupal 9 Readiness Checker 

Rozwiązanie pomaga w ocenie gotowości modułów i motywów do migracji z Drupala 7 do 9. Weryfikuje, czy moduły są kompatybilne z nową wersją Drupala i dostarcza informacji o możliwych problemach oraz aktualizacjach.

Drupal Rector

To narzędzie do automatycznej konwersji kodu z wersji Drupala 7 na Drupala 8 lub 9, opiera się na narzędziu Rector do automatycznego refaktoryzowania kodu w PHP.

Drupal Rector analizuje kod Drupala 7 i identyfikuje miejsca, w których można zastosować automatyczne przekształcenia, aby kod był zgodny z Drupalem 8 lub 9. Przykładowe przekształcenia obejmują zmiany nazw funkcji, klas i metod, aktualizację sposobu zarządzania konfiguracją, poprawę wersji API i wiele innych.

Dzięki Drupal Rector można przyspieszyć proces migracji, ponieważ wiele manualnych zmian, które normalnie byłyby konieczne, można zautomatyzować. Narzędzie to jest szczególnie przydatne, jeśli mamy dużą ilość kodu Drupala 7 i chcemy szybko dostosować go do nowszej wersji.

Należy jednak pamiętać, że Drupal Rector nie zawsze jest w stanie przekształcić cały kod automatycznie. Często istnieją przypadki niestandardowych rozwiązań, które wymagają ręcznego dostosowania. Dlatego ważne jest przeprowadzenie odpowiednich testów i kontroli jakości po użyciu Drupal Rector.

Problemy z oprogramowaniem legacy - podsumowanie

W artykule opisaliśmy istotę i wyzwania związane z oprogramowaniem legacy, czyli z przestarzałymi systemami lub aplikacjami komputerowymi, które pozostają w użyciu mimo istnienia nowszych technologii. Praca nad takim projektem może być trudna z wielu powodów, takich jak brak dokumentacji kodu czy niemożność przeprowadzenia testów automatycznych.

Dzięki odpowiedniemu podejściu, narzędziom i planowaniu, można jednak skutecznie zarządzać i modernizować legacy software, co pozwala organizacjom uniknąć potencjalnych zagrożeń i dostosować się do zmieniających się wymagań technologicznych. Jeśli w swoim projekcie potrzebujesz pomocy w pracy z oprogramowaniem legacy, np. ze stroną internetową na Drupalu, Symfony czy PHP, nasi programiści służą swoim doświadczeniem.

3. Najlepsze praktyki zespołów programistycznych