Cykl, który opisujesz, jest normalny. Sposobem na poprawę rzeczy nie jest unikanie tego cyklu, ale usprawnienie go. Pierwszym krokiem jest zaakceptowanie, że:
- Prawie niemożliwe jest wiedzieć wszystko pierwszego dnia projektu.
- Nawet jeśli w jakiś sposób wiesz wszystko, do czasu ukończenia projektu coś (wymagania klienta, rynek, na którym działa, technologia, z którą pracujesz, życzenia klientów) ulegnie zmianie i nastąpi w przynajmniej część tego, co wiesz, że jest nieprawidłowe lub nieprawidłowe.
Dlatego niemożliwe jest zaplanowanie wszystkiego z góry, a nawet gdybyś mógł, przestrzeganie tego planu doprowadziłoby cię do zbudowania czegoś niedoskonałego lub przestarzałego. Wiedząc o tym, wprowadzamy zmiany do naszego planowania. Spójrzmy na twoje kroki:
- Zacznij od kilku przypadków użycia
- Zacznij kodować
- Uświadom sobie kilka rzeczy, z którymi nie radziłem sobie dobrze i nie pasują dobrze do obecnej bazy kodu.
- Przepisz większą część kodu
To właściwie świetny punkt wyjścia. Oto jak do tego podejdę:
1. Zacznij od kilku przypadków użycia
Dobry. Mówiąc „przypadki użycia”, jesteś koncentrując się na tym, co program jest dla . Mówiąc „kilka”, nie próbujesz wszystkiego odkryć; trzymasz się rozsądnej ilości pracy. Chciałbym tylko dodać im priorytety. Z klientem lub użytkownikiem końcowym opracuj odpowiedź na to pytanie:
Jakie jest najmniejsze, najprostsze oprogramowanie, które mogę ci dać, które poprawiłoby twoją sytuację?
To jest twój minimalny opłacalny produkt - cokolwiek mniejszego nie jest pomocne dla użytkownika, ale cokolwiek większego ryzykuje zbyt wczesne planowanie. Uzyskaj wystarczającą ilość informacji, aby to zbudować, a następnie przejdź dalej. Pamiętaj, że w tym momencie nie będziesz wiedział wszystkiego.
2. Rozpocznij kodowanie.
Wspaniały. Pracujesz jak najszybciej. Dopóki nie napiszesz kodu, Twoi klienci nie uzyskali żadnej korzyści. Im więcej czasu spędzasz na planowaniu, tym dłużej klient spędza na oczekiwaniu bez zwrotu.
Tutaj dodam przypomnienie, aby napisać dobry kod. Zapamiętaj i postępuj zgodnie z ZASADAMI SOLIDNYMI , pisz przyzwoite testy jednostkowe wokół wszystkiego, co kruche lub złożone, rób notatki na temat wszystkiego, o czym prawdopodobnie zapomnisz lub które mogą powodować problemy później. Chcesz uporządkować swój kod, aby zmiana nie powodowała problemów. Aby to zrobić, za każdym razem, gdy podejmujesz decyzję o budowaniu czegoś w ten sposób, zamiast w ten sposób, tak ustrukturyzuj swój kod, aby decyzja miała wpływ na jak najmniej kodu. Ogólnie dobrym sposobem na to jest oddzielenie kodu:
- używaj prostych, dyskretnych komponentów (w zależności od języka i sytuacji, ten komponent może być funkcją, klasą, zespołem, modułem, usługą itp. Możesz także mieć duży komponent zbudowany z mniejszych, takich jak klasa z dużą ilością funkcji lub zestaw z dużą ilością klas).
- każdy element wykonuje jedno zadanie lub zadania związane z jedną rzeczą
- zmiany w sposobie działania jednego komponentu nie powinny powodować zmiany innych komponentów
- Składniki powinny być podane rzeczy, które korzystają lub zależą zamiast pobierania lub tworząc je
- komponenty powinny przekazywać informacje innym komponentom i prosić je o wykonanie pracy, zamiast pobierania informacji i samodzielnego wykonywania pracy
- komponenty nie powinny uzyskiwać dostępu, używać ani zależeć od wewnętrznego działania innych komponentów - należy korzystać wyłącznie z ich publicznie dostępnych funkcji
W ten sposób izolujesz skutki zmiany, aby w większości przypadków naprawić problem w jednym miejscu, a reszta kodu nie zauważy.
3. Napotkać problemy lub niedociągnięcia w projekcie.
To się stanie. Jest to nieuniknione. Zaakceptuj to. Kiedy napotkasz jeden z tych problemów, zdecyduj, jaki to problem.
Niektóre problemy to problemy w kodzie lub projekcie, które utrudniają robienie tego, co oprogramowanie powinno robić. W przypadku tych problemów musisz cofnąć się i zmienić projekt, aby rozwiązać problem.
Niektóre problemy są spowodowane brakiem wystarczającej ilości informacji lub posiadaniem czegoś, o czym wcześniej nie pomyślałeś. W przypadku tych problemów musisz wrócić do użytkownika lub klienta i zapytać, w jaki sposób chcieliby rozwiązać problem. Po uzyskaniu odpowiedzi przejdź do projektu i zaktualizuj go, aby go obsłużyć.
W obu przypadkach powinieneś zwracać uwagę na to, które części kodu musiały się zmienić, a pisząc więcej kodu, powinieneś zastanowić się, które części mogą ulec zmianie w przyszłości. Ułatwia to ustalenie, które części mogą być zbyt powiązane, a które mogą wymagać większej izolacji.
4. Przepisz część kodu
Po ustaleniu, jak należy zmienić kod, możesz przejść i dokonać zmiany. Jeśli dobrze ustrukturyzowałeś swój kod, zwykle będzie to wymagało zmiany tylko jednego komponentu, ale w niektórych przypadkach może również wymagać dodania niektórych komponentów. Jeśli okaże się, że musisz zmienić wiele rzeczy w wielu miejscach, zastanów się, dlaczego tak jest. Czy możesz dodać komponent, który zachowuje cały ten kod w sobie, a następnie pozwolić, aby wszystkie te miejsca po prostu korzystały z tego komponentu? Jeśli możesz, zrób to, a następnym razem, gdy będziesz musiał zmienić tę funkcję, będziesz mógł to zrobić w jednym miejscu.
5. Test
Częstą przyczyną problemów w oprogramowaniu jest niewystarczająca znajomość wymagań. Często nie jest to wina programistów - często też użytkownik nie jest pewien, czego potrzebuje. Najłatwiejszym sposobem rozwiązania tego jest odwrócenie pytania. Zamiast pytać „do czego potrzebujesz oprogramowania?”, Za każdym razem, gdy wykonasz te kroki, daj użytkownikowi to, co zbudowałeś do tej pory i zapytaj: „Zbudowałem to - czy robi to, czego potrzebujesz?”. Jeśli powiedzą tak, zbudowałeś coś, co rozwiązuje ich problem i możesz przestać działać! Jeśli powiedzą „nie”, będą mogli powiedzieć bardziej konkretnie, co jest nie tak z twoim oprogramowaniem, i możesz udoskonalić tę konkretną rzecz i wrócić po więcej informacji.
6. Dowiedz się
Przechodząc przez ten cykl, zwróć uwagę na znalezione problemy i wprowadzane zmiany. Czy są jakieś wzory? Czy możesz poprawić?
Kilka przykładów:
- Jeśli nadal zauważasz, że przeoczyłeś punkt widzenia określonego użytkownika, czy możesz sprawić, by ten użytkownik był bardziej zaangażowany w fazę projektowania?
- Jeśli nadal musisz zmieniać rzeczy, aby były kompatybilne z technologią, czy możesz zbudować coś do interfejsu między twoim kodem a tą technologią, więc wystarczy zmienić interfejs?
- Jeśli użytkownik ciągle zmienia zdanie na temat słów, kolorów, zdjęć lub innych elementów interfejsu użytkownika, czy mógłbyś zbudować komponent, który zapewnia pozostałym aplikacjom je tak, aby wszystkie były w jednym miejscu?
- Jeśli okaże się, że wiele zmian dotyczy tego samego komponentu, czy jesteś pewien, że ten komponent trzyma się tylko jednego zadania? Czy mógłbyś podzielić go na kilka mniejszych kawałków? Czy możesz zmienić ten komponent bez dotykania innych?
Bądź zwinny
To, do czego zmierzasz, to styl pracy zwany zwinnym. Agile nie jest metodologią, to rodzina metodologii obejmująca cały ładunek rzeczy (Scrum, XP, Kanban, by wymienić tylko kilka), ale ich wspólną cechą jest pomysł, że rzeczy się zmieniają, a jako twórcy oprogramowania powinien planować dostosowanie się do zmian zamiast ich unikać lub ignorować. Niektóre z jego podstawowych zasad - w szczególności te, które odnoszą się do Twojej sytuacji - są następujące:
- Nie planuj dalej, niż możesz z pewnością przewidzieć
- Uwzględnij rzeczy, które mogą ulec zmianie w miarę upływu czasu
- Zamiast budować coś dużego za jednym razem, zbuduj coś małego, a następnie stopniowo go ulepszaj
- Zaangażuj użytkownika końcowego w proces i otrzymuj szybką, regularną informację zwrotną
- Sprawdź swoją pracę i postępy i ucz się na własnych błędach