Wydaje się to rzadkie, ale powszechne doświadczenie, że czasami pracujesz nad projektem i nagle coś niespodziewanie się pojawia, rzuca ogromny klucz w prace i bardzo zwiększa złożoność.
Na przykład pracowałem nad aplikacją, która rozmawiała z usługami SOAP na różnych innych komputerach. Wymyśliłem prototyp, który działał dobrze, a następnie opracowałem regularny interfejs i ogólnie wszystko działało w przyjemny, dość prosty i łatwy do naśladowania sposób. Działało świetnie, dopóki nie rozpoczęliśmy testowania w szerszej sieci i nagle strony zaczęły przekraczać limit czasu, ponieważ opóźnienie połączeń i czas wymagany do wykonania obliczeń na zdalnych komputerach spowodowały przekroczenie limitu czasu żądań do usług mydlanych. Okazało się, że musimy zmienić architekturę, aby rozdzielić żądania na ich własne wątki i buforować zwrócone dane, aby można je było stopniowo aktualizować w tle, zamiast wykonywać obliczenia na podstawie żądania na żądanie.
Szczegóły tego scenariusza nie są zbyt ważne - w rzeczywistości nie jest to świetny przykład, ponieważ był dość przewidywalny, a ludzie, którzy napisali wiele aplikacji tego typu dla tego rodzaju środowiska, mogli go przewidzieć - z tym wyjątkiem, że ilustruje sposób, w jaki można zacząć od prostej przesłanki i modelu i nagle do eskalacji projektu dochodzi do eskalacji złożoności.
Jakie masz strategie radzenia sobie z tego rodzaju zmianami funkcjonalnymi, których potrzeba pojawia się - często w wyniku czynników środowiskowych, a nie zmian specyfikacji - później w procesie rozwoju lub w wyniku testowania? Jak zachować równowagę między unikaniem przedwczesnego ryzyka optymalizacji / YAGNI / nadmiernej inżynierii projektowania rozwiązania, które łagodzi potencjalne, ale niekoniecznie prawdopodobne problemy, w przeciwieństwie do opracowywania prostszego i łatwiejszego rozwiązania, które może być tak samo skuteczne, ale nie obejmuje gotowości do każda możliwa ewentualność?
Edycja: odpowiedź Szalonego Eddiego zawiera: „wysysasz to i znajdujesz najtańszy sposób na wdrożenie nowej złożoności”. To sprawiło, że pomyślałem o czymś ukrytym w pytaniu, ale nie podniosłem się specjalnie.
Po uderzeniu w ten guz i wprowadzeniu niezbędnych zmian. Czy robisz coś, co utrzyma projekt tak blisko harmonogramu, jak to możliwe, ale może wpłynąć na łatwość konserwacji, czy wrócisz do swojej architektury i przerobisz ją na bardziej szczegółowym poziomie, który może być łatwiejszy do utrzymania, ale odepchnie wszystko podczas rozwoju?
źródło
Nie zgadzam się z duchem odpowiedzi @ Pétera Töröka, ponieważ zakłada ona, że zespół (lub osoba indywidualna) może koniecznie przewidzieć najbardziej ryzykowne elementy na wczesnym etapie cyklu życia projektu. Na przykład w przypadku PO zespół nie mógł przewidzieć rosnącej złożoności związanej z rozwiązaniem wielowątkowym, dopóki ich plecy nie oprą się o ścianę.Pytanie PO jest dobre i mówi o problemie wielu sklepów z oprogramowaniem.
Oto jak poradziłbym sobie z problemem:
Więcej na temat punktu 3:
źródło
Kod do interfejsów
Pisząc nową funkcjonalność powiązaną z inną funkcjonalnością, stwórz granicę w postaci interfejsu (rodzaju Java), przez który wszystkie przechodzą. To będzie
źródło
Nie zaskakujący.
To jest tworzenie oprogramowania. Jeśli nie wymyślasz czegoś nowego, pobierasz istniejące, sprawdzone rozwiązanie.
Jest mało miejsca na środku.
Jeśli wymyślasz coś nowego, musi istnieć co najmniej jedna funkcja, której nie w pełni rozumiesz. (Aby to w pełni zrozumieć, musisz mieć działającą implementację, której byś po prostu użył).
Jak sobie z tym poradzić?
Miej realistyczne oczekiwania. Wymyślasz coś nowego. Tam musi być częściami nie rozumieją.
Miej realistyczne oczekiwania. Jeśli wydaje się, że działa poprawnie za pierwszym razem, coś przeoczyłeś.
Miej realistyczne oczekiwania. Gdyby to było proste, ktoś inny zrobiłby to pierwszy, a ty po prostu mógłbyś pobrać to rozwiązanie.
Miej realistyczne oczekiwania. Nie można bardzo dobrze przewidzieć przyszłości.
źródło
Projektowanie i kodowanie z myślą o przestarzałości. Załóż, że to, co dziś kodujesz, będzie musiało zostać wycięte i zastąpione jutro.
źródło
Środowisko powinno być częścią specyfikacji. Zatem zmiana środowiska JEST zmianą specyfikacji. Jeśli natomiast oparłeś swój prototyp i projekt na środowisku innym niż to, co było w specyfikacji, popełniłeś głupi błąd. Tak czy inaczej, wysysasz go i znajdujesz najtańszy sposób na wdrożenie nowej złożoności.
źródło
Podobnie jak w przypadku większości problemów programistycznych, to zależy moim zdaniem. Ten problem jest tak nieodłączny w twórczej pracy, że nie należy zapominać, że wystąpią awarie, i to jest w porządku . Programowanie jest nikczemnym problemem i zwykle nie znasz właściwego rozwiązania problemu, dopóki go nie rozwiążesz.
Istnieje jednak szereg lokalnych, specyficznych czynników, które mogą się tutaj znaleźć, takich jak:
Krótko mówiąc, może nie warto zastanowić się nad tym więcej niż wystarczy, aby uruchomić. Refaktoryzacja jest droga i nie tworzy natychmiastowej wartości końcowej dla użytkownika. jednak, nie ma prawie żadnego przypadku, który mógłby wymyślić inne niż absolutnie odrzucone oprogramowanie, w którym jest ono tak krótkotrwałe, że nie warto ulepszać projektu. O wiele ważniejsze jest, aby móc zrozumieć, co zrobiłeś i szybko to naprawić, niż zakończyć teraz. Jeśli będzie to na dłuższą metę, najprawdopodobniej w końcu się spłaci (i być może znacznie wcześniej, niż myśli każdy zaangażowany), lub odwrotnie (nie zrobienie tego spowoduje ból wkrótce zamiast „kiedy musimy go naprawić”). Prawie kusi mnie, by powiedzieć „zawsze znajdź czas, aby to poprawić”, ale są przypadki, w których nie jest to możliwe.
Powinno to mieć ogromny wpływ na twoje decyzje. Twój zespół albo poprze tę decyzję, albo przekaże zasoby do przeprojektowania, albo zażąda szybkiego rozwiązania. Moim zdaniem, jeśli zauważysz, że zespół konsekwentnie popycha cię w złym kierunku, jest to ogromna czerwona flaga. Widziałem takie rzeczy w scenariuszu, w którym trwa ciągłe gaszenie ognia, w którym nigdy nie ma czasu na przeprojektowanie, ponieważ zawsze naprawiasz problemy, które tworzy zły projekt. Może jednak istnieć również środek masy: teraz „duct-tape”, napraw jak najszybciej (ale w rzeczywistości to zrób).
Naprawdę ważne. Zastanów się, jaki jest błąd lub problem i dlaczego tak się dzieje. Tego rodzaju sytuacja jest doskonałą okazją do znalezienia wadliwych (lub brakujących) założeń, ograniczeń i interakcji. Ogólnie rzecz biorąc, zawsze faworyzuj lepsze rozumienie problemu zamiast rozwiązywania obecnego problemu. To prawdopodobnie Twoja największa obrona przed YAGNI / nadinżynierią. Jeśli wystarczająco dobrze zrozumiesz swój problem, rozwiążesz go, a nie inne problemy.
Na koniec spróbuj zbudować rzeczy we właściwy sposób . Nie mówię o błędach i problemach, które napotykasz, gdy albo lepiej rozumiesz problem, albo wrodzony ludzki błąd. Nie mam na myśli: „nie popełniaj błędów i popraw je za pierwszym razem” - to niemożliwe. Mam na myśli, staraj się dobrze zarządzać złożonością w codziennej pracy, naprawiaj uszkodzone okna, staraj się, aby to było tak proste, jak to tylko możliwe, ulepszaj kod i myślenie przez cały czas. W ten sposób, gdy (nie jeśli) zmiana puka do twoich drzwi, możesz powitać je otwartymi ramionami zamiast strzelby.
źródło