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?
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?
Odpowiedzi:
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.
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.
Zanim minie dziesięć godzin, dostanę pomoc.
Jednym słowem, timebox
ustaw 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.
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.
Mam trzyetapowy plan:
Każdy etap jest eskalacją, jeśli poprzedni krok nie powiódł się. Na etapie 2 prawie zawsze jest coś produktywnego.
Generalnie wykonuję jedną z trzech:
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 :-).
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
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.
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.
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).
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 .
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
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:
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.
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.
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ść.
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).
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.
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.
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ę.
Dodaj oprzyrządowanie do swojego kodu.
Tweet o tym?
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.