Jako programista jednym z moich głównych zadań jest kontrolowanie złożoności.
Jednak w niektórych projektach moment, w którym poziom złożoności rośnie tak wysoko, że dochodzi do pewnego rodzaju punktu „bez powrotu”. Po tej chwili nigdy nie można przywrócić projektu do akceptowalnego poziomu złożoności w krótszym czasie, niż trzeba wszystko przepisać od nowa.
Czy ten konkretny moment ma nazwę w dialekcie programistów (coś podobnego do prawa trolla Godwina)?
--edytować--
Przepraszam, jeśli nie jestem jasny. Nie sądzę, by ten „moment” miał oficjalną nazwę lub poważny miernik. Myślałem o czymś w duchu „szczytu Ballmera” w xkcd .
terminology
Thibault J
źródło
źródło
Odpowiedzi:
Jest to bardziej kwestia łatwości konserwacji niż złożoności.
Zjawisko to nazywa się „długiem technicznym”, a gdy osiągnie poziom krytyczny, projekt znajduje się na drodze do bankructwa.
Czy o to ci chodziło?
źródło
„Punkt nadmiernej złożoności” jest w języku angielskim nazywany:
O MÓJ BOŻE CO TO JEST ODPADY.
Problem w tym, że może to dotyczyć czegoś, co jest naprawdę proste, ale jest realizowane w tak okropny sposób, że masz taką samą reakcję.
Zatem odróżnienie czegoś bardzo złożonego od czegoś okropnego może być trudne.
JEDNAK: To, co faktycznie dzieje się z każdym oprogramowaniem, jest trochę podobne:
Krok 1: Miej niezłą specyfikację, zrób fajny projekt, zaimplementuj fajne rzeczy. Wszyscy szczęśliwi.
Pod koniec kroku 1: programiści gratulują sobie wspaniałej elegancji swojego projektu i odchodzą szczęśliwi, myśląc „Mam tutaj wspaniałe dziedzictwo dla innych, aby dodać coś w przyszłości, będzie cudownie, a świat będzie lepsze miejsce."
Krok 2: Dokonano pewnych zmian, dodano rzeczy, dodano nowe funkcje. Architektura i struktura z kroku 1 sprawiły, że proces ten był dość bezbolesny. [Ale ups, „współczynnik cruft” nieco się zwiększył.]
Pod koniec kroku 2: programiści gratulują sobie wspaniałej elegancji swojego projektu i odchodzą szczęśliwi myśląc: „Ojej, jestem taki sprytny, że uwzględniłem wszystkie te kroki w kroku 1. Poszło tak dobrze. Mam wspaniałe dziedzictwo tutaj, aby inni mogli dodawać rzeczy w przyszłości, będzie cudownie, a świat będzie lepszym miejscem ”.
Krok 3: Więcej zmian zostaje wprowadzonych, więcej rzeczy zostaje dodanych, więcej nowych funkcji, wiele rzeczy się zmienia, opinie użytkowników są w rzeczywistości słuchane.
Pod koniec kroku 3: programiści gratulują sobie wspaniałej elegancji swojego projektu i odchodzą dość szczęśliwi, myśląc: „Ta architektura jest całkiem dobra, aby pozwolić na tak wiele zmian, aby łatwo się wprowadzić. Ale jestem trochę niezadowolony o X, Y i Z. Można by je teraz trochę posprzątać, ale !!! Achhh! Jestem taki sprytny, że wziąłem pod uwagę wszystkie te kroki w kroku 1. To poszło tak dobrze. Mam tutaj wspaniałe dziedzictwo inni będą dodawać rzeczy w przyszłości, będzie cudownie, a świat będzie lepszym miejscem ”.
Krok 4: podobnie jak krok 3. Z wyjątkiem:
Pod koniec kroku 4: programiści myślą: „To, co było tak dobre, sprawia, że UGLY jest w stanie utrzymać. Naprawdę potrzebuje poważnych zmian. Nie bardzo lubię pracować nad tym. To wymaga refaktoryzacji. Zastanawiam się, co szef powie, kiedy mu powiem, że potrzebuje 6 tygodni, a użytkownicy nie będą mieli nic do zobaczenia na końcu tego ... ale będę miał kolejne 5 lat pysznych przyszłych modyfikacji, robiąc to ... hmmm .. czas iść do pubu na piwo. "
Krok 5: Należy wprowadzić kilka zmian.
I PODCZAS kroku 5 programiści mówią sobie: „Ten kod jest do kitu. Kto to napisał? Powinni zostać zastrzeleni. To okropne. MUSIMY PONOWNIE NAPISAĆ”.
Krok 5 jest śmiertelny. W tym momencie współczynnik cruft jest tak zły, że kod nie może zawierać tylko kilku innych zmian, musi wprowadzić DUŻE zmiany.
Problemem w kroku 5 jest chęć wyrzucenia go i rozpoczęcia od nowa. Powodem, dla którego jest to śmiertelne, jest „The Netscape Factor”. Przejdź do google. Firmy giną w tym momencie, ponieważ rozpoczęcie od nowa oznacza, że zaczniesz od około 50% założeń zamiast faktów, 150% entuzjazmu zamiast wiedzy, 200% arogancji zamiast pokory („Ci goście byli tacy głupi!”). I wprowadzasz całą masę nowych błędów.
Najlepiej zrobić to refaktoryzować. Zmieniaj trochę na raz. Jeśli architektura trochę się męczy, napraw ją. Dodawaj, przedłużaj, ulepszaj. Stopniowo. Na każdym kroku po drodze testuj, testuj i testuj jeszcze więcej. Takie przyrostowe zmiany oznaczają, że 10 lat później obecny i oryginalny kod są jak topór dziadka („miał 10 nowych głów i 3 nowe uchwyty, ale nadal jest toporem dziadka”). Innymi słowy, nie ma wiele wspólnego. Ale stopniowo i ostrożnie przechodziłeś ze starego do nowego. Zmniejsza to ryzyko, a dla klientów zmniejsza czynnik wkurzony.
źródło
Zgadzam się, że ten moment jest trudny do rozpoznania i można go uniknąć dzięki odpowiednim procesom. Pytanie dotyczyło jednak, jak to nazwać. W realnej ekonomii istnieje koncepcja „malejących zysków”: punkt, w którym zwiększenie nakładu na jeden zasób w procesie zmniejsza ogólny zysk na jednostkę. Odnosi się to z pewnością do kodowania, a nawet dobre rzeczy, takie jak abstrakcja, ponowne użycie itp., Mają tak malejący zwrot. Ogólnym terminem specyficznym dla programowania jest „nadinżynieria”. Dla kogoś, kto ma taką skłonność, podoba mi się termin Joela „ astronauta architektury ”.
źródło
Zbyt często dobry kod jest odrzucany pod fałszywym wrażeniem, że nowy zespół z nowymi narzędziami może zrobić to taniej, szybciej i bardziej niezawodnie, tylko po to, aby znaleźć
Być może czas, który opisałeś, nadchodzi z pewnymi podstawami kodu (kiedyś tak myślałem). Nigdy osobiście nie doświadczyłem przypadku starego kodu powodującego upadek projektu lub przepisania kodu w celu zapisania projektu.
Nie uwzględniam w tych przypadkach, w których do identyfikacji konkretnych problematycznych modułów lub projektów wykorzystano mierniki, które następnie zostały ubite i wymienione.
źródło
Prawdziwy problem z tym teoretycznym „momentem” polega na tym, że rozpoznaje się go dopiero po fakcie. O ile twoi koledzy nie są psychopatami, każde zatwierdzenie do bazy kodowej odbywa się z przekonaniem, że jest to poprawa w tej bazie kodowej. Patrzy tylko na powstały bałagan, który widzisz, że minął ten „moment”.
Ale podoba mi się, że możemy nadać temu nazwę. „Panowie”, można by powiedzieć, przyciągając do siebie innych programistów. „Przekroczyliśmy Piekło Utrzymania w Piekle. Wyślij SMS-a do swojej żony i daj jej do zrozumienia, że nie zobaczysz jej jeszcze przez jakiś czas”.
źródło
Nie wiem, czy jest jakaś nazwa, ale jeśli jej nie ma, proponuję nazwać ją „punktem topnienia”
źródło
To nie jest bardzo interesujące pytanie.
Rzeczywiście jest to banalne.
Jest to tak trywialne, że opracowaliśmy wiele sposobów radzenia sobie.
Metodologie wodospadu. Wiele osób spędza dużo czasu na przeglądaniu wymagań i opracowywaniu dokumentów, aby mieć pewność, że złożoność jest zarządzana.
Zwinne metodyki. Mniej osób spędza mniej czasu na omawianiu tego, co ma natychmiastowe zastosowanie, aby rozwiązać czyjś problem i wydać mu oprogramowanie. Złożonością zarządza się, ponieważ wszyscy koncentrują się na wydaniu czegoś.
Jedyny raz, kiedy ktoś zmaga się ze „złożonością”, jest to, że nie przestrzega metodologii i nie zarządza swoim czasem właściwie.
Brak szczegółowego nadzoru w metodyce wodospadu. Nie są zmuszeni do przeglądu produktów do pracy pośredniej pod kątem wymagań, architektury, projektowania na wysokim poziomie lub szczegółowych recenzji projektów.
Brak terminów sprintu i odpowiednich priorytetów przypadków użycia w metodologii Agile. Nie koncentrują się na jak najszybszym udostępnieniu użytkownikowi treści.
Złożoność powinna być ograniczona poprzez ustalanie celów.
Walka ze złożonością oznacza, że cele nie są ustalone lub nie są odpowiednio wynagradzane.
Nie ma „punktu zwrotnego”. Jeśli zarządzanie złożonością jest w jakiś sposób problemem, coś jest już źle organizacyjnie.
źródło
Istnieją metody wizualizacji i monitorowania ryzyka zwiększenia złożoności (dużych) projektów i kodu. Kiedy są stosowane w uzasadniony sposób, mamy nadzieję, że nowa nazwa punktu bez powrotu nie jest potrzebna. (Istnieje powiązany MOOC na openHPI: https://open.hpi.de/courses/softwareanalytics2015/ )
Złożoność strukturalna jest ogólnym problemem projektowym - nie tylko w przypadku projektowania oprogramowania w dużych zespołach. Wizualizacja to pierwszy krok w zarządzaniu złożonością strukturalną. W tym celu można również zastosować macierze i ukierunkowane wykresy.
Niektóre metody zmniejszania złożoności strukturalnej to http://www.buch.de/shop/home/suche/?fq=3540878890 :
Ponadto istnieje koncepcja projektowania aksjomatycznego: https: \ en.wikipedia.org \ wiki \ Axiomatic_design \ Dzięki tej koncepcji można uniknąć problemów z niezawodnością z powodu niepotrzebnej złożoności.
Tak więc dostępnych jest wiele metod. W końcu zawsze chodzi o decyzję, aby o nich pomyśleć, ponieważ projekt staje się wystarczająco duży.
źródło