Pisząc kod lub podczas projektowania, próbujesz uogólnić problem w pierwszej instancji lub rozwiązać bardzo specyficzny problem.
Pytam o to, ponieważ próba uogólnienia problemu komplikuje rzeczy (co może nie być konieczne), az drugiej strony bardzo trudno będzie rozszerzyć konkretne rozwiązanie, jeśli nastąpi zmiana w wymaganiu.
Myślę, że rozwiązaniem jest znalezienie środkowej ścieżki, którą łatwiej powiedzieć niż zrobić. Jak radzisz sobie z tego rodzaju problemem? Jeśli zaczniesz uogólniać to, w którym momencie wiesz, że taka część uogólnienia jest wystarczająca?
Odpowiedzi:
Zbyt często, gdy próbujesz projektować na przyszłość, twoje przewidywania dotyczące przyszłych potrzeb okazują się błędne. Zwykle lepiej jest zrefaktoryzować, kiedy faktycznie wiesz, jak zmieniły się potrzeby, niż przeprojektować swój system pierwszego dnia. Jednocześnie nie strzelaj też w stopę. Z pewnością jest środek, a wiedza, gdzie to jest, to więcej sztuki niż nauki.
Sprowadzając to do jednej ogólnej zasady: mniej znaczy więcej.
źródło
Czy znasz Agile? Jedną z głównych zasad Agile jest YAGNI . Uważam, że to najlepszy sposób na podejście.
źródło
Jest to prawdopodobnie jedna z najtrudniejszych części tworzenia oprogramowania, ponieważ musisz przejść między „YAGNI” a „PYIAC” (Paint Your Into A Corner).
Łatwo jest powiedzieć „nie pisz funkcji, chyba że jej potrzebujesz”. Trudność polega na zaprojektowaniu kodu, aby można było łatwo dodawać funkcje później, gdy ich potrzebujesz.
Kluczem jest możliwość zaprojektowania architektury rozszerzalnej, w której nie piszesz więcej kodu niż potrzebujesz. Umiejętność zrobienia tego dobrze pochodzi z całego doświadczenia (i bólu).
źródło
Poświęcam trochę czasu na myślenie o ogólnym kierunku projektowania - nie za dużo, ale wystarczająco, aby w zasadzie naszkicować ogólny zarys. Następnie stosuję metodykę zwinną opartą na historii, używając TDD, aby opracować rozwiązania dla poszczególnych historii. Wdrażając za pośrednictwem TDD, pamiętam o moim ogólnym przeglądzie i (a) kieruję moimi konkretnymi implementacjami, aby podążały za ogólnym przeglądem lub (b) refaktoryzowałem (i poprawiałem) moje zrozumienie / kierunek na wysokim poziomie w oparciu o czego uczę się podczas testowania / wdrażania.
Wydaje mi się, że błędem jest nie planować z góry, ale prawdopodobnie jest to zbyt duży problem. Tak bardzo, jak to możliwe, chciałbym pozwolić, aby doświadczenie poprowadziło mnie na dużym obrazie, a następnie pozwól, aby projekt rozwijał się organicznie zgodnie z wytycznymi, które postanowiłem opracować. Korzystając z TDD, stwierdzam, że sam projekt jest zmuszony do przyjęcia lepszych zasad projektowania (oddzielone, pojedyncza odpowiedzialność itp.) I jest bardziej podatny na zmiany w stosunku do zmian, niż gdybym starał się wstępnie wyobrazić sobie całość i dopasować do niej rozwój.
źródło
Dobry projekt uwzględnia przyszłe zmiany i zdecydowanie warto po niego sięgnąć. Rozważ system operacyjny UNIX i jego „wszystko jest filozofią plików”. Ta decyzja projektowa została podjęta nie w celu zaspokojenia pilnej potrzeby, ale z myślą o przyszłych wymaganiach. Drżą na myśl, jak wyglądałby system operacyjny oparty na zwinnej konstrukcji.
źródło
To, z czym próbujesz sobie poradzić, wiąże się z ponownym użyciem (tj. Uogólnieniem problemu, z którym masz teraz do czynienia, abyś mógł ponownie wykorzystać pracę (kod) w przyszłości). Mówiłem to wcześniej i będę odwołują się do niego ponownie.
Wydaje mi się, że słyszałem, jak inni mówią coś na temat:
źródło
Projekt dla „teraz + 1”. Oznacza to, że rozwiąż natychmiastowy problem i zbuduj wystarczającą funkcjonalność, aby następnym razem poprosić o zmianę, już masz ją w połowie (lub więcej) i masz wybór: a) natychmiastowe rozwiązanie problemu i refaktoryzacja później lub b) rozwiązanie „teraz + 1” ponownie (z wykonaniem połowy „teraz”)
To zależy od projektu i, krótko mówiąc, doświadczenie nauczy Cię, czym jest „+1”.
źródło
Filozofię YAGNI , której nie potrzebujesz, można podsumować (z artykułu):
źródło
Jestem wielkim zwolennikiem projektowania danego problemu i nie wysadzam twojego projektu, próbując odgadnąć wszystkie przypadki, które musisz uwzględnić, ponieważ „pewnego dnia możemy go potrzebować”.
Zasadniczo, biorąc pod uwagę listę konkretnych wymagań, zaprojektuj w oparciu o to, nie oznacza to jednak, że nie powinieneś:
Głównym problemem związanym z projektowaniem „możliwych przyszłości” jest to, że zawsze zgadujesz. Być może podejmowanie wykształconych domysłów, ale „kiedy przychodzi do odpychania” to wciąż tylko seria domysłów.
Robiąc to, masz również bardzo realną możliwość ściśnięcia rozwiązania, aby dopasować go do ogólnego przypadku (przypadków), zamiast rozwiązać konkretny problem, o którym mowa w Twoich znanych wymaganiach.
Co to mówi „Gdy wszystko, co masz, to młotek, wszystko zaczyna wyglądać jak gwóźdź”.
Chciałbym mieć funta za każdym razem, gdy słyszę, jak ktoś mówi: „Ale jest to rozwiązanie, które można lepiej dostosować do tych ogólnych przypadków, które możemy zobaczyć w przyszłości”.
źródło