Bycie pod presją GOTO ciemnej strony

Mamy sytuację, w której programiści pracujący nad starszym (rdzeniowym) systemem są zmuszani do używania poleceń GOTO podczas dodawania nowych funkcji do istniejącego kodu, który jest już zainfekowany kodem spaghetti.

Teraz rozumiem, że mogą być argumenty za używaniem "tylko jednego małego GOTO" zamiast spędzania czasu na refaktoryzacji do bardziej łatwego do utrzymania rozwiązania. Problem w tym, że ten odizolowany "tylko jeden mały GOTO" nie jest tak odizolowany. Przynajmniej raz w tygodniu jest nowy "jeden mały GOTO" do dodania. Ta baza kodowa jest już horrorem do pracy ze względu na kod pochodzący z lub przed 1984 r., pełen Goto, który sprawiłby, że wielu Pastafarian wierzy, że został zainspirowany latającym potworem Spaghetti.

Niestety język, w którym to jest napisane, nie ma żadnych gotowych narzędzi do refaktoryzacji, więc trudniej jest wcisnąć "Refaktor, aby później zwiększyć produktywność", ponieważ krótkoterminowe wygrane są jedynymi wygranymi, na które zwracano uwagę tutaj...

Czy ktoś jeszcze doświadczył tego problemu, w którym wszyscy zgadzają się, że nie możemy dodawać nowych Goto, aby przeskoczyć 2000 linii do losowej sekcji, ale ciągle mają Anaylsts nalegać, aby zrobić to tylko ten jeden raz i że zarząd zatwierdzi to?

Tldr;

Jak można zająć się problemem presji deweloperów (zmuszania ich) do ciągłego dodawania poleceń GOTO (przez add, mam na myśli add, aby przeskakiwać do losowych sekcji wiele linii dalej), ponieważ to 'gets that feature in quicker'?

Zaczynam się obawiać, że przez to możemy stracić cennych programistów na rzecz raptors...

Autor: XKCD

Wyjaśnienie:

Goto here

alsoThere: nie, mówię o takim goto, który przeskakuje 1000 linii z jednego podprogramu do drugiego w połowie pętli while. Goto somewhereClose

there: nie mówiłem nawet o takich gotos, które można rozsądnie przeczytać / align = "left" / Goto alsoThere

somewhereClose: to jest rodzaj kodu, który sprawia, że klopsiki midpoint: If first time here Goto nextpoint detail:(każdy prawie zupełnie inny) Goto pointlessReturn

here: W tym pytaniu nie mówiłem o okazjonalnym korzystaniu z goto. Goto there

tacoBell: i właśnie wrócił do deski kreślarskiej. Goto Jail

elsewhere: kiedy trzeba tygodnie, aby rozszyfrować, co program robi za każdym razem, gdy jest dotykany, coś jest głęboko nie tak z Twoim kodem. W rzeczywistości, jestem do mojego hell:if not up-to-date goto 4 wykonanie spec goto detail pointlessReturn: goto tacoBell

Jail: właściwie to tylko mała aktualizacja z małym zwycięstwem. Spędziłem 4 godziny refaktoryzując część tego konkretnego programu pojedynczą etykietę na raz, zapisując każdą iterację w svn, jak poszedłem. Każdy krok (około 20 z ich) był mały, logiczny i wystarczająco łatwy do goto bypass nextpoint: spontanicznie wyskoczyć z posiłku i na ekranie przez jakiś dziwny rodzaj magnetyzmu spaghetti-klopsiki. Goto elseWhere bypass: rozsądnie zweryfikować, że nie powinno wprowadzać żadnych zmian logicznych. Korzystając z tej nowej, bardziej czytelnej wersji, usiadłem z analitykiem i ukończyłem prawie wszystkie te zmiany. Goto end

4: first * if first time here goto hell, no second if first time here goto hell, No third if first time here goto hell czwarty now up-to-date goto hell

end:

 62
Author: Community, 2010-05-26

10 answers

Ile błędów zostało wprowadzonych z powodu nieprawidłowo napisanego GOTOs? Ile kosztowały firmę? Zmień problem w coś konkretnego, a nie "to źle". Po rozpoznaniu problemu przez osoby odpowiedzialne, przekształć go w politykę typu "Brak nowych funkcji Goto dla czegokolwiek poza uproszczeniem logiki wyjścia dla funkcji" lub "brak nowych funkcji Goto dla funkcji, które nie mają 100% pokrycia testów jednostkowych". Z czasem zaostrzyć politykę.

 28
Author: twk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 04:18:46

GOTOs nie robią dobrego kodu spaghetti, jest wiele innych czynników. ta dyskusja na linuksowej liście dyskusyjnej może pomóc spojrzeć na kilka rzeczy z perspektywy (komentarze Linusa Torvaldsa na temat szerszego obrazu korzystania z gotos).

Próba wprowadzenia "polityki bez goto" tylko po to, aby nie mieć gotos, nie przyniesie niczego na dłuższą metę i nie sprawi, że Twój kod będzie łatwiejszy do utrzymania. Zmiany będą musiały być bardziej subtelne i skupić się na zwiększeniu ogólna jakość kodu, myśl zgodnie z zasadami korzystania z najlepszych praktyk dla platformy / języka, pokrycia testów jednostkowych, analizy statycznej itp.

 12
Author: Igor Zevaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 04:19:36

Rzeczywistość rozwoju jest taka, że pomimo wszystkich kwiecistych słów o robieniu tego we właściwy sposób, większość klientów jest bardziej zainteresowana robieniem tego w szybki sposób. Koncepcja bazy kodu szybko poruszająca się w kierunku implodacji i wynikającego z niej opadu na ich biznesie jest czymś, czego nie mogą pojąć, ponieważ oznaczałoby to konieczność myślenia poza dniem dzisiejszym.

To, co masz, to tylko jeden przykład. To, jak się na tym staniesz, będzie dyktować, jak robisz rozwój w przyszłości. I chyba masz 4 opcje:

  1. Zaakceptuj prośbę i zaakceptuj, że zawsze będziesz to robić.

  2. Zaakceptuj wniosek i natychmiast zacznij szukać nowej pracy.

  3. Odmawiaj i bądź przygotowany do walki, aby naprawić bałagan.

  4. Zrezygnuj.

To, którą opcję wybierzesz, będzie zależeć od tego, jak bardzo cenisz swoją pracę i poczucie własnej wartości.

 4
Author: drekka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 04:22:12

Może możesz użyć boyscout-pattern: zostawić miejsce trochę bardziej czyste niż znalazłeś. Więc dla każdego featurerequest: nie wprowadzaj nowych Goto, ale usuń jeden.

To nie poświęci zbyt wiele czasu na ulepszenia, da więcej czasu na znalezienie nowo wprowadzonych błędów. Może nie kosztowałoby to dużo dodatkowego czasu, jeśli usuniesz goto z części, która chociaż musiała poświęcić czas na zrozumienie i wprowadzenie nowej funkcji.

Argumentować, że refaktoryzacja 2 godzin pozwoli zaoszczędzić 20 razy 15 minut w przyszłości i pozwoli na szybsze i głębsze ulepszenia.

 4
Author: user unknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-03 11:50:27

Powrót do zasad:

  • czy jest czytelny?
  • Czy to działa? Czy można go utrzymać?
 3
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 07:23:38

To klasyczny konflikt "management" vs. "techies".

Pomimo bycia w zespole "techie", przez lata mocno ugruntowałem stronę "zarządzania" tej debaty.

Istnieje wiele powodów tego:

  1. Jest całkiem możliwe, aby mieć dobrze napisane łatwe do odczytania prawidłowo zorganizowane programy z gotos! Zapytaj dowolnego programistę asemblera; warunkowa gałąź i prymitywna pętla do to wszystko, z czym muszą pracować. Tylko dlatego, że "styl" nie jest aktualne i nie znaczy, że nie jest dobrze napisane.

  2. Jeśli jest to bałagan, to będzie to prawdziwy ból, aby wyodrębnić zasady pracy, których będziesz potrzebować, jeśli zamierzasz całkowicie napisać od nowa, lub jeśli robisz techniczną refaktoryzację programu, nigdy nie będziesz pewien, że zachowanie refaktorowanego programu jest "poprawne", tzn. robi dokładnie to, co robi stary program.

  3. Zwrot z inwestycji-trzymanie się oryginalnego stylu programowania i minimalizowanie zmiany będą wymagały minimalnego wysiłku i szybko spełnią oczekiwania klientów. Spędzanie dużo czasu i wysiłku refaktoryzacja będzie droższa i potrwa dłużej.

  4. Ryzyko-przeróbki i refaktoryzacja są trudne do poprawienia, wymagane jest obszerne testowanie kodu refactored i rzeczy, które wyglądają jak "błędy", mogą być" funkcjami", jeśli chodzi o klienta. Szczególny problem z "ulepszaniem" starszego kodu polega na tym, że użytkownicy biznesowi mogą mieć dobrze ugruntowaną pracę arounds, które zależą od błędu jest tam, lub, wykorzystać existense błędów do zmiany procedur biznesowych bez informowania działu IT.

Więc w sumie kierownictwo stoi przed decyzją -- "dodaj jednego małego goto" przetestować zmianę i wprowadzić ją do produkcji w podwójnym szybkim czasie z niewielkim ryzykiem -- lub -- przejść do dużego wysiłku programistycznego i mieć biznes krzyczeć na nich, gdy nowy zestaw błędów pojawia się.

A jeśli zdecydujesz się na refakturowanie w pięciu lata Czas jakiś zasmarkany absolwent college ' u będzie jęczeć, że twój program refactored nie jest już zgodny z buzzwordem i żąda, aby mógł spędzić tygodnie na przepisywaniu go.

If it ain ' t broke dont fix it!

PS: nawet Joel uważa, że to zły pomysł: rzeczy, których nigdy nie powinieneś robić

Update!-

OK jeśli chcesz refaktorować i poprawić kod musisz to zrobić poprawnie.

Podstawowy problem polega na tym, że mówisz klientowi, że "chcę spędzić n tygodni pracując nad tym programem i, jeśli wszystko pójdzie dobrze, zrobi dokładnie to, co teraz." -- to jest trudne do powiedzenia co najmniej.

Musisz zebrać długoterminowe dane na temat liczby awarii i przestojów, czasu poświęconego na analizowanie i programowanie pozornie małych zmian, liczby żądań zmian, które nie zostały wykonane, ponieważ były zbyt trudne, operacji biznesowych utraconych, ponieważ system nie mógł zmienić wystarczająco szybko. Zbierz też trochę acedemic dane na temat kosztów utrzymania dobrze ustrukturyzowanych programów a ich zatopienia.

Jeśli nie masz wodoszczelnej sprawy do przedstawienia beancounters nie dostaniesz budżetu. Naprawdę musisz to sprzedać zarządowi, a nie swoim bezpośrednim szefom.

 2
Author: James Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-01 05:47:04

Ostatnio musiałem popracować nad jakimś kodem, który nie był legacy per se , ale nawyki poprzednich programistów z pewnością były i dlatego GOTO były wszędzie. Nie lubię GOTO; robią ohydny bałagan i robią z debugowania koszmar. Co gorsza, zastąpienie ich normalnym kodem nie zawsze jest proste.

Jeśli nie możesz rozluźnić swoich GOTO, zdecydowanie polecam, abyś już ich nie używał.

 1
Author: LoudNPossiblyWrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-01 04:28:01

Niestety język, w którym to jest napisane, nie ma gotowych narzędzi do refaktoryzacji

Nie masz edytorów z możliwościami makr? Nie masz skryptów powłoki? Zrobiłem mnóstwo refaktoryzacji przez lata, bardzo mało z przeglądarek refaktoryzacji.

 1
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 20:10:18

Podstawowym problemem wydaje się być to, że masz 'analityków', którzy opisują, prawdopodobnie konieczne, zmiany funkcjonalne pod względem dodawania goto do jakiegoś kodu. A potem masz "programistów" , których praca wydaje się ograniczać do wpisywania tej zmiany i narzekania na nią.

Aby cokolwiek się zmieniło, trzeba zmienić dysfunkcyjny podział obowiązków między tymi ludźmi. Istnieje wiele różnych sposobów podziału pracy: klasyczny, konwencjonalny jedną z nich (jest to całkiem prawdopodobne, ale ignorowane, zasady w twojej pracy) jest to, aby analitycy napisali niezależny od implementacji dokument specyfikacji, a programiści wdrożyli go tak konserwacyjnie, jak tylko mogą.

Problem z tym teoretycznym podejściem jest tak naprawdę niewykonalny w wielu typowych sytuacjach. W szczególności zrobienie tego "właściwie" wymaga od pracowników postrzeganych jako junior wygrania kłótni z kolegami, którzy są bardziej starsi, mają lepsze kontakty społeczne w biurowe i bardziej biznesowe. Jeśli argument "goto nie jest niezależny od implementacji, więc jako analityk po prostu nie możesz powiedzieć tego słowa" nie leci w twoim obszarze roboczym, to prawdopodobnie tak jest.

Znacznie lepsze w wielu okolicznościach są alternatywy takie jak:

  1. analitycy piszą kod skierowany do klienta, a deweloperzy piszą infrastrukturę.
  2. analitycy piszą specyfikacje wykonywalne, które są używane jako implementacje referencyjne dla testów jednostkowych.
  3. deweloperzy Utwórz specyficzny dla domeny język, w którym programują analitycy.
  4. / Align = "left" /
 1
Author: soru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 21:03:31

Jeśli zmiana programu wymaga "tylko jednego małego goto", powiedziałbym, że kod jest bardzo łatwy do utrzymania.

Jest to częsty problem w przypadku kodu starszego. Trzymaj się stylu, w którym program został pierwotnie napisany lub "unowocześniaj" kod. Dla mnie odpowiedzią jest zazwyczaj trzymanie się oryginalnego stylu, chyba że masz naprawdę dużą zmianę, która uzasadniałaby całkowite ponowne napisanie.

Należy również pamiętać, że kilka "nowoczesnych" funkcji językowych, takich jak oświadczenie Javy "throw" , lub SQLs "Na Błąd" są naprawdę "przejdź do" S w przebraniu.

 -1
Author: James Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 05:53:44