Za kilka miesięcy kolega przejdzie do nowego projektu, a ja odziedziczę jeden z jego projektów. Aby się przygotować, zamówiłem już Efektywne działanie Michaela Feathersa przy użyciu starszego kodu .
Ale te książki, jak również większość pytań na temat dotychczasowego kodu, dotyczą dotychczasowego dziedziczenia kodu. Ale w tym przypadku mam dostęp do oryginalnego programisty i mamy trochę czasu na uporządkowane przekazanie.
Niektóre tło fragmentu kodu, który będę dziedziczył:
- Działa: nie są znane żadne błędy, ale wraz ze wzrostem wymagań dotyczących wydajności konieczne będą pewne optymalizacje w niezbyt odległej przyszłości.
- Nieudokumentowane: Istnieje prawie zerowa dokumentacja na poziomie metody i klasy. To, co powinien robić kod na wyższym poziomie, jest jednak zrozumiałe, ponieważ od lat piszę przeciwko jego interfejsowi API (jako czarnej skrzynce).
- Tylko testy integracyjne wyższego poziomu: istnieją tylko testy integracyjne testujące poprawną interakcję z innymi komponentami za pośrednictwem interfejsu API (znowu czarna skrzynka).
- Bardzo niski poziom, zoptymalizowany pod kątem szybkości: Ponieważ ten kod jest kluczowy dla całego systemu aplikacji, wiele z niego zostało zoptymalizowanych kilka razy w ciągu lat i jest bardzo niski poziom (jedna część ma własnego menedżera pamięci dla niektórych struktur /dokumentacja).
- Współbieżne i wolne od blokowania: Chociaż jestem bardzo zaznajomiony z programowaniem współbieżnym i bez blokowania i faktycznie przyczyniłem się do powstania kilku elementów w tym kodzie, dodaje to kolejną warstwę złożoności.
- Duża baza kodu: ten konkretny projekt zawiera ponad dziesięć tysięcy wierszy kodu, więc nie ma mowy, abym mógł wszystko wyjaśnić.
- Napisane w Delphi: Po prostu to tutaj przedstawię, chociaż nie uważam, aby język był istotny dla tego pytania, ponieważ uważam, że ten rodzaj problemu jest niezależny od języka.
Zastanawiałem się, jak najlepiej wykorzystać czas do jego odejścia. Oto kilka pomysłów:
- Zdobądź wszystko, aby zbudować na moim komputerze: mimo że wszystko powinno być sprawdzone pod kontrolą kodu źródłowego, który nie zapomniał raz na jakiś czas pobrać pliku, więc prawdopodobnie powinna to być pierwsza kolejność.
- Więcej testów: chociaż chciałbym więcej testów jednostkowych na poziomie klasy, aby kiedy wprowadzę zmiany, wszelkie wprowadzone przeze mnie błędy mogły zostać wykryte wcześnie, ale kod w obecnej postaci nie jest testowalny (ogromne klasy, długie metody, zbyt wiele wzajemne zależności).
- Co należy udokumentować: Myślę, że na początek najlepiej skoncentrować się na tych obszarach kodu, które w innym przypadku byłyby trudne do zrozumienia, np. Z powodu ich niskiego poziomu / wysoce zoptymalizowanego charakteru. Obawiam się, że jest tam kilka rzeczy, które mogą wyglądać brzydko i wymagają refaktoryzacji / przepisywania, ale w rzeczywistości są to optymalizacje, które zostały tam z dobrego powodu, że mógłbym tęsknić (por. Joel Spolsky, Things You Should Nigdy nie rób, część I )
- Jak dokumentować: Myślę, że najlepsze byłyby niektóre klasowe diagramy architektury i sekwencyjne diagramy funkcji krytycznych, którym towarzyszy proza.
- Kogo dokumentować: Zastanawiałem się, co byłoby lepsze, aby napisał dokumentację lub wytłumaczył mi ją, abym mógł napisać dokumentację. Obawiam się, że rzeczy, które są dla niego oczywiste, ale nie dla mnie, nie zostałyby odpowiednio uwzględnione.
- Refaktoryzacja za pomocą programowania w parach: Może to nie być możliwe ze względu na ograniczenia czasowe, ale może mógłbym zrefaktoryzować część jego kodu, aby był łatwiejszy w utrzymaniu, gdy jeszcze był w pobliżu, aby podać informacje na temat tego, dlaczego rzeczy są takie, jakie są.
Skomentuj i dodaj do tego. Ponieważ nie ma wystarczająco dużo czasu, aby to wszystko zrobić, jestem szczególnie zainteresowany tym, jak postąpisz priorytetowo.
Aktualizacja: Po zakończeniu projektu przekazania rozszerzyłem tę listę o własne doświadczenia w poniższej odpowiedzi .