.

Co to jest refaktoring i w którym momencie należy go przeprowadzić?

Utrzymanie już istniejącego kodu jest bardzo ważnym procesem, który nie powinien być bagatelizowany. Niestety często więcej czasu oraz zasobów poświęca się na wdrażanie nowych funkcjonalności, kosztem utrzymania już obecnego kodu. Oczywiście każdemu z nas może nasunąć się pytanie - po co poprawiać coś, co już działa? Jakie to może przynieść korzyści?

Co to jest refaktoring?

Według Wikipedii jest to proces wprowadzania zmian w projekcie/programie, w wyniku których zasadniczo nie zmienia się funkcjonalność. Celem refaktoryzacji jest więc nie wytwarzanie nowej funkcjonalności, ale utrzymywanie odpowiedniej, wysokiej jakości organizacji systemu.

Teraz spróbujmy przetłumaczyć tę definicję tak, aby każdy mógł ją zrozumieć. Do tego celu posłużę się przykładem następującego zdania: Kierowca pojazdu mechanicznego, który w trakcie poruszania się po jezdni jest pojazdem wyprzedzanym przez inny pojazd mechaniczny, winien zaprzestać rozwijania prędkości do czasu zakończenia manewru wyprzedzania.

Zdanie jest długie i skomplikowane, jednak po chwili jesteśmy w stanie zrozumieć jego przekaz. Natomiast zdanie Nie powinniśmy przyśpieszać, jeśli akurat jesteśmy wyprzedzani przez inny pojazd, jest znacznie krótsze, łatwiejsze do zrozumienia, ale jednocześnie nadal przekazuje nam istotną informację.

Zatem tę samą informację możemy przekazać na wiele różnych sposobów, z których jedne będą lepsze, a inne gorsze. Bardzo podobnie jest w programowaniu. Działanie danej funkcjonalności możemy zapisać w postaci kodu w sposób lepszy lub gorszy, ale wynik działania dalej pozostanie bez zmian. I tutaj wracamy do refaktoringu kodu, który jest niczym innym jak zmianą jego treści, bez wpływu na wynik końcowy. Po co zatem zmieniać coś, co działa i jakie to przynosi efekty?

Kiedy należy przeprowadzić refaktoring?

Zanim przejdziemy do wytłumaczenia, po co zmieniać coś, co jest sprawne i rezultatów, jakie taka zmiana przynosi, spójrzmy najpierw na objawy, które może dawać aplikacja wymagająca refaktoringu.

Brak wsparcia lub rychłe zakończenie wsparcia dla CMS-a, na którym bazuje aplikacja

Data zakończenia wsparcia dla CMS-a lub frameworka, na którym bazuje aplikacja jest niczym innym, jak jego terminem przydatności do użycia. Po przekroczeniu tej daty aplikacji nie powinno się już używać. Jest to bardzo ważnie nie tyle z poziomu wydajności aplikacji, co z perspektywy jej bezpieczeństwa. Spójrzmy na poniższą tabelkę z terminami zakończenia wsparcia dla frameworka Laravel.

Tabela z datami zakończenia wsparcia dla różnych wersji frameworka Laravel

Źródło: Laravel.com

Najciekawsza z tej tabelki jest kolumna Security Fixes Until. Jej tytuł oznacza, że po przekroczeniu podanej daty, mimo wykrycia i zgłoszenia luki, nie będą wdrażane już żadne poprawki bezpieczeństwa. Dla atakującego jest to idealna sytuacja, ponieważ jeśli ma do czynienia z niewspieranym już systemem, będzie on dokładnie wiedział, gdzie i jakie luki występują, co znacznie ułatwi atak.

To ile czasu oraz pracy trzeba będzie poświęcić na aktualizację aplikacji, zależy od bardzo wielu czynników. Na przykład migracja z Drupala 7 do Drupala 8 oznacza właściwie całkowite przepisanie aplikacji. Podobnie jest w przypadku niektórych wersji Laravela.

Wolne działanie aplikacji

Jest to bardzo częste zjawisko, którego objawy mogą pojawić się dopiero po kilku latach. Dlaczego tak się dzieje? Początkowe założenia podczas projektowania aplikacji mogły nie uwzględniać wydajności aplikacji, w przypadku wzmożonego ruchu na witrynie lub w przypadku pracy z większą ilością danych. Dane te przechowują informację np. o zarejestrowanych użytkownikach, postach, komentarzach, ustawieniach aplikacji itp. Z biegiem czasu będzie ich coraz więcej i będą powodowały coraz większe problemy.

Należy jednak pamietać, że wolne działanie aplikacji nie zawsze oznacza potrzebę refaktoringu. Czasami aby przyspieszyć jej działanie, koniecznie będą zmiany np. w infrastrukturze. Z tego powodu podjęcie decyzji o refaktoryzowaniu kodu powinno zostać poprzedzone wnikliwą analizą.

Długi czas developmentu

Dobrze napisana aplikacja powinna dawać możliwość w miarę łatwego wdrażania nowych funkcjonalności oraz zmian. Aby to było możliwe, każdy deweloper podczas pisania kodu powinien stosować się do określonych zasad, takich jak DRY lub SOLID. Niestety rzeczywistość bardzo często wygląda zupełnie inaczej i programiści muszą rozwijać kod, który pierwotnie był tworzony przez osoby nieznające tych zasad. Powoduje to, że czasami dodanie najprostszej funkcjonalności zajmuje absurdalnie dużo czasu.

W takiej sytuacji również trzeba dokonać dokładnej analizy kodu oraz zastanowić się, czy całkowity refaktoring nie będzie bardziej opłacalny od rozwijania obecnego kodu. Jeśli zdecydujemy się na refaktoryzację, należy ją potraktować jako inwestycję. Poświęcony czas oraz środki nie dadzą od razu bezpośrednich efektów, jednak pozwolą zaoszczędzić zasoby w przyszłości.

Częste błędy i częsta konieczność ich naprawy

Ten aspekt jest niejako powiązany z poprzednim. Oczywiście błędy zdarzają się każdej osobie i czasami - mimo najlepszych chęci, masy testów oraz zespołu QA - i tak mogą się pojawić. Jednak jeśli występują one coraz częściej lub wręcz większość czasu pracy programistów zajmuje naprawa błędów, zamiast optymalizacji i rozwoju aplikacji, może to oznaczać konieczność refaktoringu.

Jak wygląda proces refaktoringu?

Jak już wcześniej wspomnieliśmy, podjęcie decyzji o refaktoringu powinno zostać poprzedzone wnikliwą analizą. Jak zatem ona wygląda, na czym polega oraz jak przebiega sam proces refaktorowania kodu?

  1. Zapoznanie się z aplikacją, funkcjonalnościami oraz logiką biznesową. Na początku musimy poznać dokładnie działanie aplikacji, procesów oraz jakie zadanie spełnia.
  2. Sprawdzenie użytych technologii, frameworków lub CMS-ów, pod kątem aktualizacji oraz długości wsparcia. Aplikacje internetowe bardzo często składają się z licznych komponentów, modułów oraz paczek dostarczanych przez osoby trzecie. Należy sprawdzić, czy są jeszcze wspierane lub czy wymagają aktualizacji.
  3. Analiza kodu pod kątem jego jakości, zachowania dobrych praktyk oraz wydajności. Na tym etapie oceniamy, czy dotychczasowy kod nadaje się do wykorzystania i czy dalsze jego rozwijanie nie będzie sprawiało kłopotów.
  4. Określenie przyczyn mających negatywny wpływ na działanie aplikacji. Na podstawie wcześniej zebranych informacji, analizujemy procesy zachodzące w aplikacji i wskazujemy najsłabsze ogniwa, mające wpływ na wydajność.
  5. Określenie rozwiązań, które poprawią działanie aplikacji oraz określenie sposobu ich wdrożenia. Znając już problemy, z jakimi boryka się aplikacja, szukamy rozwiązań, które sprawdzą się w danym przypadku. Każdy problem można rozwiązać na wiele sposobów, dlatego dokładnie rozważamy wszystkie plusy i minusy.
  6. Oszacowanie kosztów, czasu pracy oraz zadań do wykonania. Rozpisujemy w najmniejszych szczegółach plan działania, dzielimy zadania na etapy oraz szacujemy ilość pracy potrzebną do ich zrealizowania. 
  7. Przygotowanie testów automatycznych. Dzięki nim, podczas każdego etapu pracy, będziemy mieć pewność, że aplikacja w czasie całego procesu będzie działać stabilnie i nie pojawią się nieprzewidziane awarie lub inne problemy.
  8. Refaktoryzacja kodu - wdrożenie wcześniej zaplanowanych zmian.

Nie można jednoznacznie określić, jak będzie przebiegał sam refaktoring kodu. Jest to sprawa bardzo złożona i w zależności od sytuacji, cały proces będzie wyglądał inaczej. Jednak najważniejsze jest to, aby podczas całego czasu trwania refaktoringu nie zakłócać działania już uruchomionej aplikacji tak, aby użytkownicy nie doświadczyli żadnych problemów.

Potraktuj refaktoring jako inwestycję

Czasami bardzo trudno jest wytłumaczyć sens refaktoringu. Niełatwo jest także przekonać do wydania, czasami nie małej, sumy pieniędzy na proces, który nie wprowadzi żadnych zmian w aplikacji, widocznych gołym okiem. Pamiętajmy jednak, że refaktoring należy traktować jako inwestycję. Pieniądze wydane teraz nie przyniosą nam natychmiastowego zwrotu, jednak pozwolą zaoszczędzić środki w przyszłości. Natomiast nasza aplikacja będzie bardziej stabilna, bardziej odporna na ataki, a wdrażanie nowych funkcjonalności lub innych zmian będzie przebiegać znacznie szybciej.

Masz aplikację lub stronę internetową w PHP albo w jednym z jego frameworków (Drupalu, Laravelu czy Symfony)? Jako specjaliści od PHP developmentu, możemy przeprowadzić analizę kodu jej kodu, a także - jeśli będzie taka potrzeba - refaktoring.

3. Najlepsze praktyki zespołów programistycznych