Używam metodyki zwinnej (SCRUM) od około trzech lat i widzę w niej pewne zalety, szczególnie w krótkoterminowych opiniach na wielu poziomach (od klientów mających wczesny dostęp do zaimplementowanych funkcji, od testerów, którzy mogą testować funkcje jako zaraz po ich wdrożeniu, od innych programistów, którzy mogą bardzo wcześnie przekazywać opinie na temat nowego kodu poprzez przegląd itp.)
Z drugiej strony mam dwa otwarte problemy, z których pierwszy spróbuję wyjaśnić w tym pytaniu.
Problem: Trudność z uzyskaniem dobrego projektu
Staram się przeprowadzać refaktoryzację, gdy tylko kod staje się nieuporządkowany, piszę testy jednostkowe tak dużo, jak to możliwe (co pomaga w zapobieganiu błędom w ogóle, a zwłaszcza w refaktoryzacji). Z drugiej strony, opracowanie złożonej funkcji w małych krokach, z codziennymi zatwierdzeniami i ciągłym przemyślaniem kodu, gdy staje się nieustrukturyzowany, nie pozwala mi na stworzenie naprawdę dobrego projektu.
Jedyny dobrze zaprojektowany moduł, który mogłem ostatnio wyprodukować, uzyskałem, stosując inne podejście: analizowałem problem przez kilka dni (właściwie miałem problem przez kilka miesięcy, zanim zacząłem nad nim poważnie pracować) ), przez kilka kolejnych dni naszkicowałem dość szczegółowy projekt wszystkich zaangażowanych klas i ich relacji, a następnie zamknąłem się w moim biurze i spisałem cały kod, pracując bez przerwy przez około trzy tygodnie. Rezultat był najlepszą rzeczą, jaką stworzyłem od jakiegoś czasu, z bardzo małą liczbą błędów, które były dość łatwe do zlokalizowania i naprawy, oraz z bardzo przejrzystym projektem, który od tamtej pory nie wymagał żadnych istotnych zmian.
Do tej pory uważałem, że o wiele skuteczniejsze jest uzyskanie ogólnego obrazu tego, co chcę zrobić wcześniej, niż pisanie kodu małymi krokami w nadziei, że duży obraz pojawi się magicznie w trakcie tego procesu. Z moim wysiłkiem podejście polegające na opracowywaniu małych przyrostów zawsze prowadziło mnie do gorszego projektu.
Pytanie : Czy ktoś miał podobne doświadczenie? Czy stosuję SCRUM w niewłaściwy sposób lub na co powinienem zwrócić uwagę, jeśli chcę się rozwijać w małych krokach i nadal mieć dobrze zaprojektowane oprogramowanie? A może powinienem zaplanować historię projektu przed rozpoczęciem właściwego kodowania? Czy jest to uważane za dobrą praktykę, przynajmniej w przypadku funkcji bardziej złożonych niż średnia?
EDYTUJ NOTATKĘ
Zdaję sobie sprawę z tego, że dobry projekt nie jest czymś absolutnym i sam w sobie nie ma wartości, ale zależy od kontekstu i że należy dążyć do projektu, który jest wystarczająco dobry dla danego problemu.
Na przykład nie dbam (zbytnio) o dobry projekt, jeśli muszę wdrożyć prosty komponent, który (1) musi być gotowy jak najszybciej, (2) zostanie użyty tylko raz, (3) nie jest używane przez inne części systemu (YAGNI).
Dbam o dobry projekt, gdy komponent (1) będzie używany kilka razy, aw kilku różnych wersjach produktu (2) musi być utrzymywany i przedłużany w czasie, (3) ma wiele innych komponentów w zależności od niego .
The only well-designed module I could produce recently I obtained by taking a different approach
- Odpowiedziałeś na swoje pytanie. Nadal potrzebujesz trochę dobrego projektu; nie można oczekiwać, że dobry projekt wyrasta organicznie po refaktoryzacji. To nie działa w ten sposób.