Czy umiejętności debugowania są ważne, aby zostać dobrym programistą?

24

Czy oprócz innych cech programista powinien mieć dobre umiejętności debugowania? Jeśli mam kandydata, który nie był w stanie znaleźć błędu w danym programie, ale był w stanie rozwiązać wszystkie zagadki i programy, czy powinienem wziąć go pod uwagę?

EDYCJA: - Układanki to normalne czerwone, niebieskie i czerwono-niebieskie kule. Programy są jak wyszukiwanie ciągłych k zer w tablicy. Program debugujący nie działa z powodu warunku, który powinien być> =, ale zamiast tego jest>. Wszystko jest na papierze.

Manoj R.
źródło
13
Czy pozwolono mu uruchomić program, czy też musiał znaleźć błąd, patrząc na kod?
Michael K
9
Możesz kodować tylko tak dobrze, jak potrafisz debugować. obie idą w parze w mojej książce.
Demian Kasier
3
niektórzy są w tym lepsi niż inni. często trudno jest dostrzec błąd w obcym kodzie - szczególnie podczas stresującej rozmowy.
leed25d
6
@ Fanatic: Tylko jeśli pracujesz tylko z własnym kodem. Większość debugowania, które wykonuję w pracy, polega na wykopywaniu błędów innych osób.
Mason Wheeler,
3
@Manoj R, czy jesteś pewien, że możesz znaleźć ten sam problem, biorąc pod uwagę ten sam czas? Czy jesteś pewien, że tylko dlatego, że skarżąca nie znajdzie problemu na papierze w ciągu 20 minut, że nie byłaby w stanie sobie z tym poradzić z Google (Tak, kurwa Google) po swojej stronie i kilkutygodniowym treningiem?
Job

Odpowiedzi:

37

Tak, to bardzo ważne

W przypadku tego konkretnego kandydata możliwe jest, że nie był on wystarczająco obeznany z bazą kodu x, aby go debugować.

Dobry program do rozwiązywania problemów powinien być w stanie debugować, ponieważ wszystko, co zwykle jest wymagane, to bardzo logiczna metoda / podejście.

Ciemna noc
źródło
1
Więcej niż jakakolwiek inna umiejętność programowania, debugowanie ma doświadczenie i ma mniej wspólnego z talentem.
Pieter B
24

Jeśli nie możesz debugować, nie jesteś wcale programistą, nie mówiąc już o dobrym.

Debugowanie to prawdziwe, praktyczne zastosowanie nie tylko umiejętności technicznych, ale także umiejętności analizy i procesów myślowych. W rezultacie oceniłbym to jako znacznie bardziej użyteczny i odpowiedni test niż pytania na tablicy lub w rozmowie kwalifikacyjnej.

O ile praca, którą wykonujesz, polega na całodziennym odpowiadaniu na pytania teoretyczne, potrzebujesz kogoś, kto może zastosować wszystkie posiadane umiejętności.

Musisz jednak zadać sobie pytanie, czy był to uczciwy test zdolności debugowania - czy potrafią uruchomić kod, wprowadzić punkty przerwania i tak dalej, jak w prawdziwym świecie? Jaki to był błąd? Czy jest to coś, co kompilator odebrałby i oflagował (w takim przypadku jest to dość bezcelowe pytanie, ponieważ nigdy nie musieliby go dostrzegać)?

Jeśli został napisany na papierze, to po prostu szczegółowy test czytania i jest to nawet bardziej abstrakcyjna umiejętność niż przeciętne pytanie z wywiadu technicznego, a ja twierdzę, że jest to bezwartościowe.

Jon Hopkins
źródło
2
+1 za „Zadaj sobie pytanie, czy to był uczciwy test zdolności debugowania” - Wygląda na to, że nie był. Test sprawiedliwy byłby uwzględniony kodu runnable z debuggera, czyli umieścić je w naturalnym, normalnym środowisku pracy (biorąc pod uwagę, oni rzadko pracować sans debugger).
doppelgreener
11

Główna zasada zatrudniania - w razie wątpliwości odmawiaj.

Jeśli potrzebujesz taniego zaimplementować dużo nowego kodu - możesz zdobyć tego faceta, ale osobiście kontynuowałbym wyszukiwanie.

BarsMonster
źródło
7
Zatrudniłem wielu ludzi w ciągu moich lat i żałowałem prawie każdego kandydata „Może”, którego zatrudniłem.
JohnFx,
10

O ile deweloper nie może cały czas pisać czystego kodu (absolutnie niemożliwe) i pracować tylko nad projektami „zielonego pola” (nigdy tak nie będzie), to tak, umiejętności debugowania są absolutnie niezbędne. Absolutnie. Mam doświadczenie z programistami, którzy po prostu nie lubili debugowania, więc zrobili się leniwi i przerzucili kod do ściany, aby przetestować QA. Ale ci programiści wcale nie trwają zbyt długo.

Tworzenie oprogramowania to umiejętność rozwiązywania problemów. Problemy te obejmują zarówno problemy biznesowe, jak i problemy z ich kodem (i innymi kodami). Nawiasem mówiąc, wiele projektów konserwacji dotyczy naprawiania błędów, więc debugowanie jest absolutnie niezbędną umiejętnością.

Mark Freedman
źródło
Kolejną rzeczą, którą chcę dodać ... Częścią naszego procesu rozmowy tutaj jest to, że dajemy kandydatowi ćwiczenie zarówno do debugowania aplikacji, jak i dodania do niej kilku drobnych funkcji. Każda część tego procesu jest traktowana jednakowo jako ważna.
Mark Freedman,
7

Pamiętam, że istnieje wiele stron internetowych typu „pytanie do wywiadu” i można się uczyć bardzo wielu pytań i zagadek. Jedną z rzeczy, których nie możesz się uczyć, jest debugowanie kodu, którego nigdy wcześniej nie widziałeś. Albo napisałeś wystarczającą ilość kodu, że umiesz debugować, albo nie. Jeśli jest to pozycja na poziomie podstawowym, nie wykluczyłbym kandydata, ale jeśli twierdzą, że mają doświadczenie w języku i nie mogą w nim debugować kodu, z pewnością wywołuje to czerwoną flagę.

TMN
źródło
5

Główną różnicą, którą widziałem między młodszymi programistami a starszymi programistami, jest ich umiejętność debugowania. Umiejętność debugowania to coś, co pochodzi tylko z praktyki i doświadczenia.

Pomyślmy na przykład o dziwnym błędzie, w którym program Java działa dobrze na konsoli w trybie interaktywnym, ale kończy się niepowodzeniem, gdy próbujesz użyć potoku Unix dla tego samego wejścia. Jeśli napotkałeś już ten problem, możesz sprawdzić, czy new Scanner(System.in)wywoływany jest tylko raz; błąd polega na tym, że zużywa bufor podczas potokowania, ale oczywiście nie w trybie interaktywnym. Spodziewałbym się, że starszy programista szybciej zidentyfikuje ten błąd. Być może dlatego, że doświadczyli tego wcześniej lub mieli inne problemy z buforowaniem w przeszłości.

Jeśli chodzi o rozwiązywanie łamigłówek i pisanie nowego kodu, choć doświadczenie jest ważne, jest to coś, w czym programista na poziomie młodszym może być w stanie równie dobrze, a nawet lepiej niż starszy programista. Oznacza to, że inteligencja i umiejętności mogą mieć większy wpływ, niezależny od doświadczenia.

Jeśli jesteś w stanie zainwestować w młodszego programistę, który może mieć nowe pomysły i może pomóc zespołowi w „żelowaniu” i wydaje się, że dobrze jest pisać nowy kod, śmiało je zatrudnij. Jeśli szukasz programisty na wyższym poziomie, ten brak umiejętności debugowania może być głównym sygnałem ostrzegawczym: mogą mieć dziesięć lat doświadczenia, co sprowadza się tylko do doświadczenia pierwszego roku dziesięć razy.

Na marginesie, istnieją sposoby na lepszą debugowanie bez wcześniejszego 10-letniego doświadczenia. Polecam książkę Andresa Zellera Dlaczego programy nie działają: Przewodnik po systematycznym debugowaniu jako sposób na poznanie zasad naukowych i lepsze zrozumienie, jak odtwarzać, znajdować i naprawiać awarie.

Macneil
źródło
Debugowanie jest więc czymś, co przychodzi przez praktykę i można się go nauczyć, i nie powinno się go przypisywać przy wyborze kandydatów.
Manoj R
1
Żeby było jasne: powinieneś ważyć to dużo dla starszych programistów, ale mniej dla młodszych programistów. Na przykład ktoś po studiach, który rozpoczął programowanie pierwszego roku, może debugować 10 razy dłużej. Ale są dobre powody, aby inwestować w młodszych programistów.
Macneil,
5

To zależy od twojego środowiska. Jeśli przez cały dzień grasz w sodoku i inne łamigłówki, być może byłby to dobry kandydat.

Jeśli jednak czasami masz błędy w kodzie lub nie zawsze działają one dokładnie tak, jak oczekiwano, sugeruję, abyś znalazł kogoś dobrego w rozwiązywaniu problemów.

Zatrudnij to, czego potrzebujesz, a nie ideał tego, czym powinien być programista.

JohnFx
źródło
3

Czy oprócz innych cech programista powinien mieć dobre umiejętności debugowania?

Tak.

Debugowanie kodu jest częścią rozwiązywania problemów. Nigdy nie spotkałem programisty, który napisał doskonały kod i zero błędów. Deweloper będzie debugował swój kod lub kod innej osoby. To konieczność.

czy powinienem rozważyć go do pracy?

Może to zależy.

Brak możliwości debugowania programu podczas wywiadu prawdopodobnie nie powinien być przełomem, jeśli wnioskodawca był w stanie ukończyć wszystkie inne zagadki i programy podczas wywiadu. To naprawdę zależy od głębi i tchu rozmowy.

Ile debugowania pociąga za sobą pozycja? Jeśli dużo, to być może należy poświęcić więcej uwagi temu, jak dobrze kandydat może odpowiedzieć na pytanie debugujące. Ale skoro wspomniałeś tylko o jednym pytaniu dotyczącym debugowania, nie wydaje się, aby tak było.

gąbka
źródło
2
+1 Aby powtórzyć debugowanie jest konieczne, ale nie może przełamać porozumienia podczas wywiadu.
Gaurav,
3

czy programista powinien mieć dobre umiejętności debugowania?

Tak. To powiedziawszy, poprosiłbym cię o rozważenie metodologii w wywiadzie (tj. Stylu quizu / testu) mniej niż idealnej (w porządku, wadliwej), ponieważ wiele osób uważa kod na papierze za dziwne, nieznane doświadczenie.

Ponieważ debugowanie jest procesem , a nie odpowiedzią lub wynikiem (np . Pomyłką ), sugerowałbym użycie interaktywnego dialogu lub dyskusji jako lepszego sposobu oceny zdolności debugowania kandydatów. Podczas gdy większość osób korzysta z nieformalnego systemu debugowania ad hoc, dobrzy kandydaci będą mieli ogólnie podobny wzór zadawania pytań w celu zrozumienia systemu lub założeń i wymagań, a następnie wyodrębnienia problemu (często dzielenia i podbijania) oraz metodycznego porównywania kod do wymagań i oceniaj oczekiwane dane wejściowe / wyjściowe, a nie chcąc nie chcąc zmieniając kilka rzeczy naraz, dopóki to nie zadziała.

Wyrażam również zastrzeżenia do problemów z łamigłówkami podczas wywiadów, szczególnie w formie pisemnej, tak jakby kandydat nie miał właściwych założeń ram odniesienia ( sztuczka), puzzle mogą być dla nich nierozwiązywalne. Tzn. Wiele łamigłówek ma jedną prawidłową ścieżkę, podczas gdy życie jest skomplikowane, a najbardziej kreatywne są te, które przyjmują zaskakująco nowatorskie podejścia do rozwiązania problemu, który może nie działać z daną gotową układanką, z oczekiwanym rozwiązaniem . To tak, jakby oczekiwać od wszystkich trębaczy grania jazzu. Można temu zaradzić, zadając pytanie jako niekonfrontacyjną (presja może zakłócać kreatywność) interaktywną dyskusję. Ponownie, dla mnie odpowiedź jest drugorzędna, aby zobaczyć proces dobrej myśli. Prawdopodobnie będziesz musiał poprosić ich o przemyślenie na głos, ale z mojego doświadczenia wydaje się to bardziej produktywne.

Nie przeczytałem ani nie oceniłem , dlaczego programy Zellera nie działają , ale mogę polecić debugowanie przez Agans jako krótki, szybki odczyt, który może pomóc zestalić proces debugowania ad hoc w bardziej uporządkowany, konkretny i zorganizowany wysiłek, który może pomóc być bardziej wydajnym w debugowaniu. Wydrukuj także kopię i powieś ją przy swoim kabinie lub obejściu, plakat Reguły debugowania , jest to idealne przypomnienie na te złe dni, w których nic nie idzie dobrze. Mam kilka złych dni i spędzam mniej czasu na aktywnym debugowaniu (czytaj: drapanie w dezorientacji ), próbując podążać za nimi w duchu, jeśli nie w liście.

Mctylr
źródło
Świetna odpowiedź. Dosłownie dni spędziłem na szukaniu najprostszej naprawy błędu i dosłownie wpadłem na naprawę podstępnego błędu w kilka minut. Dobry deweloper powinien mieć rozsądną strategię. I wiele zależy od aplikacji. Powiedz, że twoja aplikacja nie wykazuje problemu, gdy wstawisz kilka instrukcji print / log lub uruchomisz wersję z symbolami. Co wtedy? Wnioskodawca powinien przynajmniej być w stanie sformułować jakąś spójną strategię.
SnoopDougieDoug
2

Powiedziałbym, że debugowanie jest niezbędne, chyba że programista jest tak dobry, że nigdy nie popełnia błędów. Nie jestem przekonany, że jest to niemożliwe, ale nie wyobrażam sobie tego przy obecnych popularnych językach i narzędziach.

Nie podoba mi się koncepcja bycia na miejscu w taki sposób w wywiadzie. Jeśli kandydat jest zdenerwowany (a kto nie), może narysować pustą scenę jako programista, może być w stanie rutynowo poradzić sobie z takimi problemami. Następnie, jeśli był to dobrze znany wywiad lub problem z testem komputerowym, kandydat mógłby znać wynik na pamięć, ale nie byłby w stanie przemyśleć nowego problemu. Również jeśli kandydat nie zna języka, będzie musiał się zmagać. Wiele błędów jest trudnych, ponieważ dobry programista wie, co zamierzał pisać, a jego mózg używa skrótów podczas czytania kodu. Nie mogę znaleźć użycia w stylu C metody = gdzie == powinno być użyte przez kontrolę, ponieważ wiem, co było zamierzone, a mój mózg przeczytałby go podczas analizy.

Omega Centauri
źródło
1

Dobra część programowania rozwiązywania problemów. Aby rozwiązać problem, musisz znać podstawowy problem, a nie tylko objawy lub niespójności. Debugowanie to sztuka identyfikowania podstawowego problemu.

  • zidentyfikować podstawowy problem
  • lepiej w stanie zobrazować przepływ

i wiele więcej.

Srikanth Remani
źródło
1

Dodałbym trochę więcej do sytuacji, wskazując błąd i sprawdzając, jaką reakcję ma ta osoba. Czy są zbyt dramatyczne w stylu „D'oh! Jestem idiotą, to było takie głupie ...”, zbyt apatyczne w obozie „Taa, cokolwiek koleś”, czy też aktywnie słuchali tego, co było pomyliłeś się z przeprosinami lub uwagami, które sugerują, że zrozumieli, że pomieszali coś, co powinni byli rozwiązać? Tylko coś do przemyślenia w przyszłych sytuacjach.

Do debugowania w terminowy sposób jest świetną umiejętnością. Jest to nieco inne niż dawanie komuś problemu, gdy zostanie naprawiony, gdy zostanie naprawiony. Czasami trzeba podjąć agresywne środki, aby uratować system, co należy uznać, ponieważ wyobrażam sobie, że większość firm nie chciałaby wstrzymać sprzedaży na kilka tygodni, podczas gdy ktoś naprawia błąd w oprogramowaniu księgowym, z którego korzysta firma.

JB King
źródło
1

Debugowanie to umiejętność krytyczna. Właściwie powiedziałbym więcej, że rozwiązywanie problemów to umiejętność krytyczna. Ktoś powinien wiedzieć, jak zdefiniować problem (w tym o jakie informacje użytkownika poprosić i jakie dzienniki przejrzeć), jak je odtworzyć, jakie źródła danych ma do diagnozowania problemu i jak debugować, a następnie jak naprawić jedną rzecz bez zepsucia czegoś innego. Jednak ustalenie tego podczas rozmowy jest trudne.

Dałbym mu prawdziwy problem do znalezienia i możliwość korzystania z dostępnych narzędzi, a następnie zapytałbym, jakie kroki podjął, aby znaleźć problem, lub co jeszcze mógłby zrobić, gdyby nie był w stanie znaleźć problemu w wyznaczonym czasie. Naprawdę szukasz kogoś, kto atakuje problem nieco systematycznie i który ma więcej narzędzi w swoim zestawie narzędzi niż tylko debugger i google (z wyjątkiem na poziomie Junior, kiedy powinien przynajmniej spróbować obu z nich (ktoś, kto nie może myśleć spróbuj tych dwóch rzeczy prawdopodobnie nie jest kompetentny, a przynajmniej nie zaryzykuję go), ale prawdopodobnie nie ma jeszcze wielu zaawansowanych narzędzi do rozwiązywania problemów).

Dałbym większą wagę umiejętnościom rozwiązywania problemów niż odpowiedziom na łamigłówki (no cóż, wcale ich nie pytałem) lub demonstracji umiejętności programowania. Rzadko widuję programistów, którzy potrafią dobrze rozwiązywać problemy, którzy nie potrafią również napisać dobrego kodu lub wykonać niezbędnych poprawek. Widziałem wielu ludzi, którzy potrafią połączyć jakiś kod, aby uzyskać „działający” produkt, ale nie mogliby rozwiązać problemu, gdyby od tego zależało ich życie. Przeważnie dlatego, że nie rozumieją, co robią, ani nie rozumieją problemu, który próbują rozwiązać. Dobrzy awanturnicy wiedzą, jak rozpoznać prawdziwy problem, a nie tylko objaw. Tacy wiedzą, jakie pytania należy zadać, aby zdefiniować problem dotyczący nowego rozwoju.

HLGEM
źródło
1

W każdej pracy jest od 4 do 5 kluczowych umiejętności, a programowanie nie różni się. Na poziomie zawodowym musisz być dobry we wszystkich kluczowych umiejętnościach podstawowych. Jeśli masz 4 na 5, nadal Cię powstrzyma.

Czy możesz sobie wyobrazić sprzedawcę, który może przedstawiać, przekonywać, artykułować, kwalifikować klientów, ale nie może sfinalizować umowy? Są tam i nie chcesz ich w zespole sprzedaży.

Debugowanie jest zdecydowanie podstawową umiejętnością, bez której programista nie może się obejść.

użytkownik39741
źródło
0

Mam taki styl kodowania, który wymaga debugowania miminalnego. Kiedy skończę z 3 liniami kodu, uruchamiam go i testuję, często wypisując kilka zmiennych. W przypadkach, gdy otrzymałem niechciany wynik lub zachowanie, umieszczam wiele zrzutów w kodzie - zamiast debugowania. Używam prawdziwego debuggera bardzo rzadko. Dziwne ale prawdziwe.

ern0
źródło
0

Debugowanie to faza opracowywania oprogramowania, która następuje po przeprowadzeniu pewnego testu oprogramowania i wykryciu błędu. Jest to czynność polegająca na wyszukiwaniu i usuwaniu błędu w oprogramowaniu. W wielu przypadkach znalezienie błędu zwykle wymaga więcej czasu niż naprawienie.

Jest to proces usuwania błędów (luk) nieodłącznie związanych z aplikacją / systemem komputerowym. Jeśli nie zostanie to zrobione, hakerzy mogą skorzystać z błędów i wykonać różne złośliwe działania:

1) Mogą ujawnić podatność użytkowników na ryzyko, prowadząc do utraty przychodów, biznesu i reputacji deweloperów i dostawców.

2) Robaki wyszukują podatne na atak systemy, które mogą wykorzystać, a tym samym kopiują się na te serwery. na przykład. W styczniu 2003 r. Robak Slammer wykorzystał lukę w zabezpieczeniach MS SQL Server.

3) Gdzie wspomniano o robakach, w jaki sposób możemy zapomnieć o wirusach. Wirusy są również tracone przez swoich programistów, którzy wykorzystują błędy występujące w programie głównie w celu nieprzyzwoitego narażenia ...

4) A jeśli programy nie zostaną poprawnie debugowane, konsumenci nigdy nie będą się utrzymywać, jeśli nie uzyskają wartości swoich pieniędzy. W takim przypadku nie potrzebujesz nawet hakera, aby wykonać brudną robotę - równie dobrze możesz zaufać dobrej publiczności.

Shylendra Madda
źródło