Jakie metody mogę zastosować, aby zmniejszyć prawdopodobieństwo wprowadzenia nowych błędów w złożonej aplikacji starszej generacji?

10

Tam, gdzie pracuję, często muszę opracowywać (i naprawiać błędy) w starym systemie (.NET 1), w którym kod jest kompletnym spaghetti - bez namysłu nad nazwami zmiennych, strukturą programu i komentarzami.

Z tego powodu wieki zajmuje mi zrozumienie, jakie bity wymagają zmiany, i często „psuję” istniejące oprogramowanie, ponieważ dokonałem modyfikacji. Naprawdę naprawdę chcę spędzić kilka miesięcy (z kolegami) przechodząc przez to do refaktoryzacji, ale zarówno obecni programiści nie widzą potrzeby - ani nie myślę, że jest na to czas (system jest ogromny).

Boję się, że muszę popracować nad jego kodem, ponieważ naprawienie czegoś zajmuje kilka dni, ale okazało się, że zepsułem coś innego. To oczywiście sprawia, że ​​wyglądam na niekompetentnego - więc jak sobie z tym poradzić?

billy.bob
źródło

Odpowiedzi:

16

Zacznij pisać testy części, nad którymi pracujesz. Możesz wypróbować przepływ pracy, który wygląda mniej więcej tak:

  1. Napisz testy dla części, którą zamierzasz zmienić. Pomoże to również zrozumieć, jak zachowuje się istniejący kod.
    • W razie potrzeby popraw kod, aby wesprzeć testowanie, ale możesz chcieć napisać testy jednostkowe, jeśli czas jest krótki.
  2. Przeprowadź testy, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.
  3. Dokonaj zmian. Zmodyfikuj, jeśli to konieczne, w duchu ciągłego ulepszania kodu, ale nie daj się zwieść.
  4. Uruchom ponownie testy, aby upewnić się, że zachowałeś tę samą funkcjonalność.

Jeśli nie wyrzucisz swoich testów, z czasem zbudujesz zestaw testów, który powinien obejmować najważniejsze (i / lub niestabilne) części aplikacji, a wprowadzanie zmian stanie się łatwiejsze i bezpieczniejsze.

Pomocna może być również Efektywna praca ze starszym kodem Michaela Feathersa.

Adam Lear
źródło
1
+1 za „... ale możesz chcieć pisać testy niejednostkowe, jeśli czasu jest mało.”!
Marcie
1
Dobra odpowiedź. @ m.edmondson Podczas refaktoryzacji może się okazać, że niektóre części kodu są „ogromne”, ponieważ wszędzie występuje dublowanie, a po refaktoryzacji staje się on zarówno mniejszy, jak i prostszy.
Alb
6

Lubię śledzić Wujek Bob Martin „s skaut regułę :

„Kiedy masz duży bałagan z przeszłości, musisz zrobić… To, co musisz zrobić, to przestać robić bałagan i zacząć je porządkować.

Nie oznacza to, że wezwiesz swoich menedżerów do sali konferencyjnej i powiesz im, że nie będziesz oferować funkcji przez następne trzy miesiące, gdy zmienisz kod. Nie rób tego! Oznacza to raczej, że przyjmiesz „Regułę zwiadowcy” i sprawdzisz każdy moduł w nieco czystszym stanie niż po sprawdzeniu.

Od iteracji do iteracji oraz od wydania do wydania zamierzacie wyczyścić ten system, jednocześnie dodając do niego nowe funkcje i funkcje. Nie ma innego wyjścia."

Jesse C. Slicer
źródło
2

Możesz wyjaśnić menedżerowi, że poprawki, które powinny zająć godziny, mogą zająć kilka dni ze względu na bałagan w bazie kodu. Inni programiści nie zobaczą potrzeby refaktoryzacji, jeśli są oryginalnymi programistami - będą znali system na wylot, ale kierownictwo powinno wiedzieć, że istnieje ryzyko, że ci programiści kiedykolwiek odejdą i zabiorą ze sobą swoją wiedzę.

Wykonanie pełnego refaktoryzacji zwykle nie jest wykonalne, więc często refaktoryzujesz małe kawałki na raz - kilka metod lub moduł. Cholera, jeśli poprawka zajmie kilka dni, być może możesz w tym samym czasie dołączyć małe refaktoryzowanie problematycznego modułu.

FrustratedWithFormsDesigner
źródło
1
Zgadzam się - w przeszłości dołączyłem te „małe” refaktory, których po prostu potrzebowałem, aby zrozumieć kod - jednak ktoś zwykle pojawia się „całkowicie go zepsułeś” i przywraca go do poprzedniego stanu ...
billy.bob
@ m.edmondson: Ah. Cóż, jeśli mieliby kompleksowy zestaw testów jednostkowych, to po prostu uruchomienie sprawdziłoby, czy refaktor był dobry, czy nie. Z tego, co to brzmi, nie mają tego, więc będziesz musiał sam napisać testy jednostkowe. Wiem, że to nie jest łatwe i nie ma prawdziwej ostatecznej odpowiedzi na ten problem (przynajmniej nie znalazłem, chociaż będę obserwował, aby zobaczyć, co sugerują inni ludzie, ponieważ ja też tam byłem).
FrustratedWithFormsDesigner
2

Czy naprawdę musisz spędzać miesiące na refaktoryzacji kodu? Czy możesz zmienić kod podczas wprowadzania zmian. Na przykład, jeśli stwierdzisz, że metoda Foo wymaga modyfikacji, możesz skorzystać z okazji, aby zrefaktoryzować metodę Foo. A jeśli musisz przejść przez tuzin innych metod, aby dowiedzieć się, że problemem jest Foo, możesz pozostawić komentarze w tych metodach, abyś ty lub ktoś inny w przyszłości wiedział, co powinien zrobić kod. Oczywiście oznacza to, że wciąż jest stos kodu spaghetti, ale możesz przynajmniej przesunąć bazę kodu we właściwym kierunku i ułatwić sobie przejście w dół. Wielomiesięczny czas na kod refaktoryzacyjny będzie wielką sprzedażą, ponieważ oznacza to, że przez cały czas nie dostarczasz niczego, czego chce użytkownik końcowy.

A tworzenie testów jednostkowych (lub, mam nadzieję, rozszerzenie istniejącego pakietu testowego) powinno zmniejszyć prawdopodobieństwo przypadkowego uszkodzenia.

Justin Cave
źródło
0

Kolejna wskazówka. Kiedy robaki się ujawnią, a po nałożeniu bandaża nie poprzestań!

Zapytaj pięć osób, weź czerwoną pigułkę i zobacz, jak głęboko schodzi królicza nora, i napraw pierwotną przyczynę (i ścieżkę na dole).

Dużo się uczysz o systemie. Pomaga ustalić, co należy naprawić i zrefaktoryzować. A po kilku takich wyprawach masz solidne „belki podporowe”, aby wzmocnić monolityczną kupę spaghetti.

Maglob
źródło
0

Możesz również zachować stary kod, dopóki nie będziesz absolutnie pewien, że twoje modyfikacje są dźwiękoszczelne. Wystarczy, jeśli uwzględnisz wszystkie zmiany, abyś mógł je przełączać w czasie wykonywania i szybko wskazać lokalizację nowego błędu regresji:

// old code
...

if (!File.ReadAllText("c:\patch_control.txt").Contains("StrangeUIBugFix=0"))
{
    // new code goes here
    ...
}

// old + new code
int someValue = 
    IsEnabled("StrangeUIBugFix") ? a + b :  // new code
    a * b; // old code
AareP
źródło
0

Jedna sprawa: Never change any existing code if you are not sure what effect change would have on complete application.

Rachel
źródło