Jak radzisz sobie z naprawdę dziwnymi błędami, które sprawiają, że zastanawiasz się przez ponad 10 godzin? [Zamknięte]


29

Znasz je, te błędy, które nie mają sensu. Gdzie wydaje się, że gremlin po prostu wskoczył głęboko w twoje żetony i coś pomieszał. Czy spacerujesz, piszesz rzeczy, wołasz wujka?


3
Twój opis może być poprawny - Uruchom ponownie i spróbuj ponownie!
NoChance

5
opublikuj to na stackoverflow oczywiście :)
William

5
Dlaczego zdecydowałeś się na próg 10 godzin? To zdecydowanie za długo - jeśli nie masz pojęcia, co powoduje nieoczekiwane zachowanie w ciągu godziny lub dwóch, masz kłopoty.
Wektor

5
„Kiedy sytuacja staje się trudna, twarda idzie spać i pozwala podświadomości na nią pracować”. - anon
Michał Wielkanoc

2
1. Poproś kogoś o pomoc. Dwie osoby to konieczność. 2. Zawęź to, używając nadmiernej ilości instrukcji debugowania. Był plik, w którym każda linia była poprzedzona makrem debugowania, aby wskazać ten, który spowodował błąd.
SF.

Odpowiedzi:


9

W przypadku tych naprawdę okropnych problemów moja strategia zwykle wygląda następująco.

  • Eksperymentuj i google. Próbuj rozwiązać problem. Przez większość czasu rozwiązuje to problem w ciągu godziny lub krócej.

  • Więc to nie zadziałało. Zrób sobie przerwę. Napij się kawy, porozmawiaj o czymś niezwiązanym z kolegą. Wyrzuć problem z głowy. Kiedy patrzysz na problem 5 lub 10 minut później, patrzysz na to z nieco innej perspektywy. W większości przypadków to działa.

  • W tym przypadku tak nie było. Spędź więc kolejne 10–30 minut, patrząc na to. Następnie zadzwoń do kolegi. Ale zanim to zrobisz, zrób notatki; chcesz zademonstrować problem, odtworzyć go, a następnie wypróbować rzeczy, które próbowałeś, a co najważniejsze udowodnić, że próbowałeś. Najpierw wykonaj próbę suchą. Ustaw znaczniki książek w kodzie, zamknij wszystkie zbędne otwarte dokumenty itp. W ten sposób możesz rozwiązać problem samodzielnie lub zademonstrować problem, nie tracąc czasu.

  • Poproś kolegę, aby udowodnił wszystkie twoje założenia. czy ten seter faktycznie jest wywoływany? Czy ta metoda naprawdę zwraca to, co twierdzisz? Myślisz, że ten obiekt nie jest zerowy - pokaż im, że nie jest zerowy.

  • Przez większość czasu albo demonstrowanie problemu uświadomi ci, że nie wypróbowałeś wszystkich możliwości, albo twój kolega zobaczy twój błąd.

  • Jeśli to nie zadziała, czas poważnie potraktować. Dokumentuj dokładnie to, co próbujesz zrobić, co próbowałeś i dlaczego to nie zadziałało. Wyślij to do wszystkich swoich współpracowników. Opublikuj na SO. W tym momencie dokument powinien być idealnym pytaniem SO.

  • Czekając na odpowiedzi, google google google. Wypróbuj każdą permutację pytania, które masz. Otwórz kilka kart. Prawdopodobnie nie uzyskasz odpowiedzi w tym momencie, ale szukasz pomysłów, możliwości, różnych sposobów podejścia do problemu.

  • Zrób coś innego, jeśli spędziłeś 5 godzin na problemie, nadszedł czas, aby zostawić go na kolejny dzień. Może otrzymasz użyteczną odpowiedź. Może kiedy zaatakujesz problem następnego dnia, będzie to oczywiste.

  • Jeśli to nie zadziała, czas poszukać innego rozwiązania. Może możesz użyć innej metody, innej technologii. Może powinieneś na razie rozważyć rezygnację z tej funkcji. Czy rozliczasz klienta za godzinę? Czy pracujesz dla firmy w wewnętrznej aplikacji? Musisz przekazać to właścicielowi i powiedzieć: „Spójrz, spędziłem nad tym x godzin i nie zrobiłem żadnego postępu, czy opłacenie jest tego warte?”. Nie chcesz iść do swojego szefa i powiedzieć mu, że spędziłeś 16 godzin na problemie tylko po to, żeby się odwrócili i powiedzieli, że to nie jest tak ważne, pomiń to w tym wydaniu. musisz się tego dowiedzieć wcześniej.

  • A jeśli to nie zadziała? Cóż, jedyne opcje to ciągłe rozwiązywanie problemu lub poszukiwanie specjalistycznej wiedzy branżowej. Zapytaj ekspertów technologicznych na Twitterze. Wyślij wiadomość e-mail do dostawcy technologii.


79

Porzucić. Nie, nie twoja praca! Po prostu wstań i idź do domu. Skończyłeś na dzień lub weekend. 19 razy na 20, kiedy wrócisz do problemu, rozwiązanie pojawi się w ciągu godziny.


17
Możesz również spróbować go z gumy. pl.wikipedia.org/wiki/Rubber_duck_debugging
Dave Nay

2
19 z 20, tak. Moje najgorsze nigdy nie zostało rozwiązane, tylko działało. Żadne środowisko testowe nigdy tego nie pokazało, tylko działające pełne środowisko produkcyjne - nie mogliśmy go nawet odtworzyć po godzinach.
Loren Pechtel

3
Ucieczka od czegoś, co irytuje, może być naprawdę trudna - ale przez lata odkryłem, że zawsze jest to najlepsza rzecz do zrobienia. Podświadomość może rozwiązać problem podczas jedzenia, snu, odpoczynku, oglądania telewizji ... a następnego dnia (lub pojutrze) wszystko idzie lepiej. Jedno słowo ostrzeżenia: zbierz informacje, zanim odejdziesz ... Odejście to nie to samo, co zignorowanie go i udawanie, że go nie ma. Nadal potrzebujesz ciężkiej pracy!
szybko_now

1
Nie wiem o godzinie. Większość problemów tego typu rozwiązuję pod prysznicem, kiedy wstaję rano. Drugim najczęściej występującym będzie, kiedy prawie śpię w nocy i wreszcie pozwolę sobie przestać o tym myśleć.
SoylentGray

3
Był fascynujący NOVA Science NOW prowadzony przez Neila deGrasse Tysona, który mówił o nauce snu. W tym omówiono zjawisko godzinnego uderzania głową w problem, kładzenia się spać, budzenia się i rozwiązywania go od razu. Kiedy śpimy, nasz mózg nieustannie zmienia wydarzenia naszego dnia, analizując je z wielu różnych punktów widzenia. To, co pozostawia, to nowe ścieżki neuronowe, które mogą nam pomóc podświadomie spojrzeć na problem w zupełnie nowy sposób, a następnie rozwiązać problem. Dość niesamowite.
Byrne Reese,

44

Zanim minie dziesięć godzin, dostanę pomoc.

  1. Opisz problem komuś innemu, każdemu innemu, nawet twojej gumowej kaczce .
  2. Poproś kogoś innego, aby spojrzał na kod lub przejrzał go razem z nim.
  3. Izoluj to. Usuń kilka rzeczy, a następnie przywróć je krok po kroku, aż problem pojawi się ponownie.
  4. Prześpij się!

12
+1 za usunięcie wszystkiego, dopóki problem nie zniknie.
Jonasz

4
Powinieneś zrobić jedną z tych rzeczy przed upływem 1 godziny. Im więcej się gapisz, tym mniej prawdopodobne jest, że osiągniesz swoje objawienie. Zwykle rozwiązuję problem, po prostu rozmawiając z kimś.
Ben

Spot on. Często rozwiązuję problem (lub zbliżam się do niego), najpierw opisując problem. Często zdarza się to podczas pisania opisu problemu dla pytania StackOverflow. Co również wymaga redukcji (izolacji), a następnie jej braku, okresu oczekiwania, w którym
odsuwasz

17

Jednym słowem, timeboxustaw ograniczoną ilość czasu na pracę nad czymś, a jeśli nie zostanie to rozwiązane, przejdź do czegoś innego i wróć do niego następnego dnia z nową perspektywą.

Ten i inny zestaw oczu zawsze jest wart więcej niż jakikolwiek czas, w którym możesz marnować się na coś.

Nigdy nie spędziłbym więcej niż 45 minut do godziny, próbując rozwiązać problem za jednym razem, narusza to prawo malejących zysków.


Dziękuję bardzo - przeczytałem artykuł z timeboxu na wikipedii, bardzo przydatny.
Adel

7

Wyjaśnij problem komuś innemu.

Wyjaśniając problem komuś innemu, musisz go wyjaśnić: często pozwala to zobaczyć rozwiązanie.

(Jeden z brytyjskich profesjonalnych magazynów komputerowych zaproponował kiedyś sprzedaż naturalnej wielkości wycinanek z kartonu starszego programisty specjalnie do tego celu).

Uważam, że zasypianie przy problemach (czasami przez kilka dni) może również pomóc.


1
„Ktoś inny” nie musi być człowiekiem. Czasami tłumaczę kotom różne rzeczy i aha! Znajduję problem.
DarenW

Naprawdę powinienem też kupić kota. Trenowałbym go, żeby drapał się po głowie na żądanie.
Adel

Ktoś naprawdę powinien zrobić tekturowe wycięcie z Jona Skeeta.
Don Roby,

5

Mam trzyetapowy plan:

  1. Zdobądź kawę lub inny smaczny napój.
  2. Pracuj nad czymś innym przez resztę dnia.
  3. „Zadzwoń do znajomego” i rysuj na tablicy.

Każdy etap jest eskalacją, jeśli poprzedni krok nie powiódł się. Na etapie 2 prawie zawsze jest coś produktywnego.


Fajna rada! Cytowany jest więc „Zadzwoń do przyjaciela”, ponieważ powinien on być ograniczony do 60 sekund, jak w Millionaire, tak? Podoba mi się również pomysł na tablicę.
Adel

1
Uważam, że tablica naprawdę pomaga przemyśleć to metodycznie. Cytaty były, ponieważ często przyjaciel jest w tym samym biurze, więc dzwonienie byłoby dziwne. Ale to trochę przypominało linię życia z serialu.
Flexo,

4

Spij nad tym

W przeciwnym razie zadzwoń do kogoś w pobliżu i poproś go o szybkie przejrzenie kodu.

Często błędy, które zajęłoby ci dużo czasu (ponieważ jest to Twój kod), są bardzo łatwe do znalezienia przez innych


3

Możesz zobaczyć, czy wstawanie, spacerowanie i myślenie o problemie pomaga znaleźć rozwiązanie. Niezależnie od tego, czy rzeczywiście stoisz, czy spacerujesz, staraj się uciec od komputera podczas myślenia.


3

Generalnie wykonuję jedną z trzech:

  1. Wybierz się na spacer / przejażdżkę rowerem ... niektóre odciągają Cię od komputera.
  2. Baw się z moim psem lub kotem
  3. Jeśli masz hobby, popracuj nad tym przez chwilę.

Każda z tych trzech osób dobrze odwraca uwagę od sytuacji. Uważam, że rozproszenie pozwala mojej podświadomości na coś żuć przez jakiś czas. Po około godzinie, bam, jest rozwiązanie :-).


3

Zbuduj uprząż testową, aby wycelować dokładnie na tę Usterkę i ją odizolować

Po prostu eliminuj dobry kod .. podczas replikacji wady. Dopóki nie wycelujesz dokładnego fragmentu kodu w błąd. Następnie prześledź kod.

Zalecana lektura: Pragmatyczny programista, a konkretnie rozdział 10: Kule śledzące


wszystko to dobrze i dobrze, ale przyjmuje się za pewnik, że błąd został i można go odtworzyć. Co by było, gdyby 19 godzin spędzonych do tej pory było po prostu ... próbą znalezienia sposobu na odtworzenie problemu w deterministyczny i systematyczny sposób ... co wtedy? Dla mnie TO jest istota pytania tutaj!
Newtopian,

Pragmatic Programmer jest doskonały
Adel

2

Wszystkie te sugestie są świetne. Jednak często używam techniki, o której nie wspomniałem. Twórz listy, aby uporządkować swoje przemyślenia na temat problemu. Jeśli mam szczególnie trudny problem, zwykle piszę wiele list, takich jak: Fakty, Założenia, Pytania, Objawy itp. Często zdarza mi się, że w trakcie organizowania rzeczy w ten sposób odkrywam założenia, o których nie miałem pojęcia ( które często okazują się błędne), pytania, o których nie wiedziałem, że trzeba je zadawać, inne kombinacje, które mogę sprawdzić itp.


2

Edytować:

Krótka odpowiedź:

P: Jak radzisz sobie z naprawdę dziwnymi błędami, które sprawiają, że zastanawiasz się przez ponad 10 godzin?

Odp .: Upewnij się, że nigdy się nie zdarzają: zrozum swój projekt, poznaj swój kod, naucz się korzystać z debuggera.


Wyjaśnienie:

„Gdzie wydaje się, że gremlin po prostu wskoczył głęboko w twoje żetony i coś pomieszał”

To nigdy nie powinno się zdarzyć. Jeśli to twój kod, powinieneś bardzo dobrze wiedzieć, co powoduje błąd, zanim spróbujesz go naprawić.

Ponadto, pisząc kod, powinieneś już wiedzieć, gdzie i dlaczego może się nie powieść.

Powiedziawszy to - pytając rówieśnika, publikując na SO, śledząc i cofając kroki oraz robiąc sobie przerwę - wszystkie powyższe sugestie pomogą.

Po drugie, musisz znać swoje narzędzia - zestaw narzędzi do debugowania. Rejestrowanie wiadomości w podejrzanych punktach kodu, uważne sprawdzanie stosu wywołań, używanie warunkowych punktów przerwania i zegarków itp. Umiejętności debugowania nie są dodatkami - są częścią programowania.


Konieczne jest odtworzenie własnych kroków. Dziękuję Ci!
Adel

> Niezbędne jest odtworzenie własnych kroków. Oprogramowanie SourceControl jest kluczem do przywracania / przywracania. Bądź o tym ANALNY, a jeśli możesz, skonfiguruj ustawienia, aby zmusić Cię do pozostawienia komentarza podczas meldowania.
Wektor

3
Niestety, bez względu na to, jak dobrze znasz kod, czasem problemem jest interakcja z kodem innej osoby (zamknięte źródło).
Nate CK,

2
+1 @Nate CK - bardzo prawdziwe. Najgorsze rodzaje błędów zdarzają się, gdy dostajesz jakiś bełkot z serwisu internetowego, na którym polegasz. Jakiś czas temu miałem dostawcę Saas, który subtelnie zmienił niektóre funkcje bez ostrzeżenia w swoim serwisie internetowym. Musiałem wyjaśnić programistom, jak naprawić własny błąd przez telefon, gdy opisał mi, jak wygląda jego kod.
Morgan Herlocker,

1
Aby ustalić, co? Czy w kodzie innej firmy występuje problem? Ta część jest stosunkowo łatwa. Trudność polega na ustaleniu, jakie warunki go wyzwalają i jak go obejść, gdy nie masz źródła, dostawca nie reaguje i być może nie dzieje się to w twoim systemie testowym. Jeśli uważasz, że znajomość twojego kodu rozwiąże to wszystko za ciebie, sugeruję, że może nigdy nie musiałeś sobie z tym poradzić.
Nate CK,

1

Miałem podobny problem, pozorne uszkodzenie pamięci w Objective-C, z którym zmagałem się przez wiele godzin. Ale potem ja i moi koledzy właśnie poszliśmy na spacer na lunch, a ja wyjaśniłem problem (i konkretny problem związany z deserializacją obiektu w metodzie init) i w zasadzie wyjaśniłem sobie cały problem.

(szczegóły techniczne: w zasadzie zainicjowałem i zwróciłem obiekt na coś innego niż ja, więc były dwa przydziały, ale tylko jeden obiekt powrócił. Pamięć przesunęła się i oszalała, ulega awarii, a debugger tak naprawdę nie wiedział, co zrobić albo).


1
„Zainicjowałem i zwróciłem obiekt na coś innego niż ja” - takie błędy są TOUGH! Możesz na niego spojrzeć ponad 100 razy i go nie złapać. Ale czy nie można zobaczyć dwóch przydziałów przez śledzenie w debuggerze?
Wektor

1

wprowadź opis zdjęcia tutaj

Wziąć kąpiel.

Wszelkie Rodney McKay fanów?

Poważnie jednak, jeśli wśród tych wszystkich odpowiedzi występuje jedna podobieństwo, należy zrobić sobie przerwę i zrobić coś innego .

Lubię myśleć o tym jako o przeniesieniu problemu do twojej podświadomości. Nawet jeśli nie jesteśmy nieświadomi, nasze umysły (zdają się) nadal pracują nad problemem, nawet gdy robimy coś innego, na przykład biorąc kąpiel .


Świetny pomysł ... teraz muszę tylko skłonić szefa do postawienia w biurze pół tuzina moczy.
Dave Nay

Gdyby tylko legion pracowników kabin miał każdy taki pokój.
Adel

1

Krok po kroku, w dół do montażu. Kto nazywa, punkt przerwania w dostępie do pamięci. To zwykle łapie błąd naprawdę szybko.

Jeśli nie, przejdź się.


1

Połączenie tych wszystkich:

  • Odsuń się na chwilę, aby mógł usiąść na palniku. Śpij, odpoczywaj, jedz, spaceruj, cokolwiek.

  • Zbadaj problem jeszcze bardziej, co jeszcze robi źle, jakie inne objawy możesz znaleźć?

  • Zbadaj problem, zobacz, co możesz znaleźć. Pamiętaj, aby wypróbować różne słowa kluczowe

  • Spróbuj czegoś innego . Praca wokół. Inna technika debugowania. Walidator. Inny komputer.

  • Porozmawiaj z kimś . Nawet jeśli nie są w stanie pomóc ani nawet programistom, czasem rozmowa wyzwoli żarówkę pomysłu

  • Uruchom ponownie! W razie potrzeby spróbuj ponownie uruchomić komputer, serwer itp. Jeśli nic więcej, możesz poświęcić czas na przemyślenie.

  • Zapytaj StackOverflow! Jesteśmy tutaj aby pomóc


1

Naprawdę nie podobała mi się najbardziej uprzywilejowana odpowiedź, ponieważ chociaż czasami to działa, czasem musisz to rozgryźć tego samego dnia, więc zalecam w tej kolejności:

  1. Potwierdź, że to nie tylko ci się przytrafia. Pozwala to zaoszczędzić dużo czasu. Być może odinstalowałeś wymagany komponent lub dokonałeś zmiany w swoim środowisku, a gdzieś w kodzie jest połykany wyjątek. Jeśli zdarzy się to tylko tobie, skorzystam z narzędzia do porównywania środowiska. Niedawno przeczytałem o oprogramowaniu o nazwie Envy, które pozwala ci to zrobić, chociaż nie jest to oprogramowanie freeware, kosztuje 10 USD.

  2. Dzieje się wszystkim? Dobrze, zrób teraz historię przeglądania kodu i sprawdź najnowsze zmiany, które mogły spowodować błąd, bezpośrednio lub pośrednio.

  3. Nie ma żadnych ostatnich zmian? Jeśli jest to bardzo konkretny błąd (wyjątek), „stackoverflow it”. Teraz nie brzmi to lepiej niż „google it”, ale mogę powiedzieć, że najpierw przerzucam stos wyszukiwania dla programowania badań niż google. Jeśli jest to naprawdę znany problem, bardzo prawdopodobne jest, że znajdziesz tutaj rozwiązanie. Jeśli nie, opublikuj pytanie na powiązanej stronie wymiany stosów. Możesz uzyskać bardzo szybką odpowiedź, a nawet jeśli nie, twoje pytanie pojawi się podczas dalszych badań. To jest korzyść.

  4. Jeśli nie znalazłeś odpowiedzi online lub nie jest to ogólny błąd, przejdź krok po kroku przez kod, sprawdzając, czy uzyskane wyniki każdego kroku mają sens dla oczekiwanego wyniku. Idź od początku do końca dla każdej metody i od dołu do góry w rozwiązaniu warstwowym. (tzn. jeśli rozwiązujesz problemy z wydajnością, zacznij od kodu, który pobiera rekordy. nie ma sensu uruchamiać się w interfejsie użytkownika, jeśli możesz szybko ustalić, czy problem stanowi pierwszy krok).

  5. Jeśli po kilkukrotnym przejrzeniu kodu nadal nie znalazłeś, co jest nie tak, zadzwoń do kogoś, aby o tym porozmawiał. Jak ktoś już wspomniał, mówienie o tym na głos może zapalić żarówkę. Plus programowanie par jest bardzo przydatne.

  6. W tym momencie, jeśli jest to wykonalne, odejdź na jakiś czas lub na cały dzień. Przeczytałem wczoraj bardzo prawdziwy tweet, który powiedział: „Poszedłem spać, myśląc„ jak kurwa ”i obudziłem się myśląc„ ale oczywiście ””. Tak prawdziwe.

  7. Jeśli nadal nie masz odpowiedzi, odważę się powiedzieć, że możesz spróbować refaktoryzować do mniejszych zadań / metod / funkcji. Henry Ford powiedział coś w stylu: „Nie ma zadania tak złożonego, że nie można go zrealizować, dzieląc je na mniejsze zadania”. W tym momencie, jeśli rozwiązanie jest zbyt złożone i nie wymyśliłeś ani sam, ani z pomocą kogoś innego, przebuduj kod na mniejsze zadania. Nawet jeśli nie popełnisz tego, może to pomóc ci znaleźć przyczynę.

  8. Dodaj oprzyrządowanie do swojego kodu.

  9. Tweet o tym?


1

Musisz się cofnąć. Moje motto brzmi: „jeśli problem jest zbyt trudny, to rozwiązujesz niewłaściwy problem”. Jakie są twoje założenia? nic nie ufaj.

Następstwem tego jest „im dziwniejszy problem, tym dziwniejsze rozwiązanie”. Siłą komputera jest jego logika, więc nie można wygrać z logiką. Masz mózg i musisz to przemyśleć.

W dzisiejszych czasach jest tak wiele innych rzeczy wchodzących w interakcje w systemie - zapory ogniowe, AV, antyspyware, automatyczne aktualizacje odbywające się każdej nocy - musisz radzić sobie z ruchomymi celami.


Tak prawdziwe, że „im dziwniejszy problem, tym dziwniejsze rozwiązanie”
Adel

-1

Wygoogluj to. Stackoverflow to. Opublikuj to na forach. Zasadniczo, jeśli nie możesz rozwiązać tego samodzielnie, poproś ludzi o pomoc.


-1
  1. Zapisz problem.
  2. Pomyśl intensywnie.
  3. Wdrożenie rozwiązania.

Zwięzłe, bardzo dobrze!
Adel

1
Właściwie nie. Zbyt intensywne myślenie na tych samych torach to najgorsza możliwa rzecz, jaką możesz zrobić. „Podważaj, wymieniaj, ponownie odwiedzaj i testuj swoje założenia w systematyczny sposób” - oto rozwiązanie; ludzie omawiają różne taktyki osiągnięcia tego celu.
smci
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.