Dlaczego szkoły nie obejmują debuggerów? [Zamknięte]

12

Po kolejnym pytaniu do pracy domowej na SO. Wygląda na to, że zdecydowana większość studentów nie ma pojęcia, czym jest debugger ani jak go używać. Uważam, że umiejętność korzystania z debuggera jest prawie tak samo ważna, jak inne podstawy programowania.

  • Pytanie brzmi: czy nie należy uczyć debugowania i jak korzystać z nowoczesnych narzędzi do debugowania wraz z podstawami programowania? Jeśli nie to dlaczego nie.
ponownie odtwarzać
źródło
2
Eee ... mówisz, że gdb jest nowoczesnym narzędziem do debugowania? To nie jest zły debugger, ale z pewnością nie jest najnowocześniejszy.
Billy ONeal,
1
Zgadzam się, ale odpowiedziałem również na pytanie, czy studenci korzystają ze studia wizualnego i nie wiedzą, jak i dlaczego używają debugera.
powtórnie
@rerun: Erm .. ouch. Nie mogą nacisnąć przycisku „play” na IDE? (BTW, I +
1'd
rejestracja wydruku system.out to ostatnia bastion leniwych i nieudolnych
6
@Jarrod, dość szerokie uogólnienie i być może zbyt przesadne. Czasami po prostu nie można użyć debugera w programie, w którym występuje problem.

Odpowiedzi:

7

Nie chodzi o to, że należy uczyć korzystania z debuggerów , ale o bardziej ogólne techniki debugowania . Obejmowałoby to oczywiście nauczenie korzystania z debuggera, ale także różne inne ważne techniki, np

  • krytyczne myślenie
  • dziel i rządź
  • debugowanie printf, logowanie itp
  • sprawdzanie biurka
  • test naprężeń

Dodatkową korzyścią jest to, że wiele technik można również zastosować do rozwiązywania problemów w obszarach innych niż programowanie.

Jest całkiem niezła książka na ten temat, która prawdopodobnie powinna wymagać przeczytania dla wszystkich studentów i wszystkich osób uczących się podstaw programowania: Debugowanie autorstwa Davida J Agansa .

Paul R.
źródło
8

Kursy informatyczne trzeciego stopnia są dostosowane do nauczania studentów programowania podstaw , jak wspomniałeś - pojęcia te są uczone w nadziei, że zapoznają się z niezbędnymi pojęciami i zastosują je w szerszej gamie języków programowania i zestawów problemów.

Z drugiej strony narzędzia do debugowania stanowią podzbiór w obszarze implementacji - każde narzędzie jest inne dla każdego języka (nawet jeśli pojęcia są takie same). Byliśmy narażeni na narzędzia do debugowania, ale nigdy tak naprawdę nie obejmowaliśmy ich dogłębnie. Gdybyśmy spędzili ponad tydzień na narzędziach do debugowania, spojrzałbym wstecz - z perspektywy czasu - i uważam to za stratę czasu. Wolałbym dowiedzieć się o notacji BigO lub polimorfizmie. Jeśli jednak moc narzędzia do debugowania nie została (pomyślnie) przekazana uczniom, byłaby to nieobecna konieczność.

JK
źródło
3
+1. Przetłumaczone: Ponieważ nie wszyscy używają MSVS, GCC / GDB, LLVM / CLANG itp.
Billy ONeal
1
+1, chociaż muszę przyznać, że zgadzam się z @rerun; Kurs (lub jego część), który omawia podstawowe koncepcje i narzędzia używane w sklepie z oprogramowaniem, może znacznie przyczynić się do zwiększenia produktywności nowych absolwentów. Natknąłem się na kilka, które wydawały się nie rozumieć kontroli źródła nawet po dłuższym użyciu.
Ken Henderson
wiele Umiejętności, z którymi przeciętni programiści spędzają dużo czasu, jest dostępnych w szkole. Kontrola źródła, zarządzanie konfiguracją ogólnie, eksploracja kodu, czytanie kodu, budowanie procesów itp. Chociaż rozumiem, że stopnie CS muszą obejmować aspekty teoretyczne, myślę, że jedna klasa na poziomie senor, w której uczniowie pracowali z dużą istniejącą bazą kodu, znajdowali i naprawiali błędy i sprawi, że zostanie sprawdzony w kodzie, a „wdrożony” uczyni nowego programistę o wiele bardziej użytecznym.
powtórnie
3
Całkowicie się nie zgadzam. Jeśli pisany jest rzeczywisty kod (ponieważ pisanie kodu jest dobrym sposobem na ćwiczenie pojęć naukowych), uczniowie powinni mieć dostęp do dobrych sposobów pisania tego kodu, a to obejmuje korzystanie z debuggera, jeśli to konieczne. To nie zabiera czasu, który można by poświęcić notacji bigO - to jest czas, który wielu studentów spędza na brutalnym forsowaniu się przez drobne błędy. Z tego niewiele się zyskuje. Poza tym wiele innych kursów przyrodniczych (na przykład fizyki) zawiera praktyczne umiejętności pomiarowe w ramach ich programu nauczania.
Inca
2
Korzystanie z debugera wymaga zrozumienia, jak działa komputer, a nie tylko kodu. Uważam to za fundament programowania . Spotkałem zbyt wielu uczniów, którzy po prostu nie mają pojęcia, co właściwie robi ich komputer, a to nie czyni dobrego programisty.
edA-qa mort-ora-y
2

W większości wprowadzających kursów programowania stan programu jest na tyle prosty, że można usunąć wszelkie błędy za pomocą kilku instrukcji drukowania. Może również występować problem z zmuszaniem uczniów do robienia rzeczy ręcznie, aby mieli pojęcie o tym, jak i gdzie w kodzie występują pewne rodzaje błędów. Jeśli nie masz pojęcia, gdzie szukać, debugger będzie całkiem bezużyteczny.

davidk01
źródło
4
Dobry debugger jest łatwiejszy w użyciu niż drukowanie instrukcji. Instrukcje drukowania wymagają, aby w jakiś sposób szeregować dane w ciąg, co wymaga wykonania własnego serialu (być może pomyłki). Na przykład program listy połączonych jest łatwy do przejścia w debuggerze, ale instrukcje drukowania nie pomogą uczniowi, który próbuje napisać algorytm przekrojowy listy połączonej - ponieważ ten algorytm byłby potrzebny do napisania odpowiednich instrukcji drukowania .
Billy ONeal,
2
@Billy, więc przejście przez zły kod pomoże im w jakiś sposób?
Neil Butterworth,
1
@Billi ONeal, mylisz się. Debuger, o którym mówisz, nie istnieje. Interaktywne przechodzenie przez program jest przydatne tylko wtedy, gdy już zidentyfikowałeś problem z logowaniem debugowania. Nigdy w mojej praktyce (> 20 lat) nie musiałem używać debugera z własnym kodem - odpowiednie stwierdzenia i rejestrowanie zawsze były wystarczające. Używam tylko tych przeklętych narzędzi z kodem bibliotek i starszymi rzeczami. Poza tym możliwość szeregowania dowolnej struktury danych w coś czytelnego jest zawsze dobrym pomysłem. Niektóre języki / środowiska dają to za darmo.
SK-logic
1
@Billy ONeal, jak przeszukasz pamięć urządzenia mikrokontrolera podłączonego do portu szeregowego? I wierzę, że nie jest dobrym pomysłem wystawianie odświeżaczy na języki niskiego poziomu za pomocą wskaźników i innych rzeczy, zanim będą wystarczająco biegłe w strukturach danych i algorytmach. Do tego czasu będą wiedzieć, jak poprawnie debugować.
SK-logic
1
@Billy ONeal, najtrudniejsza jest identyfikacja odpowiedniego momentu, w którym należy albo sprawdzić wartość w debugerze (btw., W większości przypadków nadal jest to coś w rodzaju wywołania metody .dump (), a nie bezpośredniej kontroli pamięci) lub aby wydrukować wartość zserializowaną. Przy odpowiedniej infrastrukturze rejestrowania debugowania problem ogranicza się do analizy plików dziennika. W większości przypadków proste grepzadanie działa. Żadnych kroków, żadnych warunkowych punktów przerwania - po prostu grep.
SK-logic
2

To nie jest takie ważne. Prawie nigdy nie używam i nigdy nie mam. Najlepszym sposobem debugowania kodu jest:

  • nie pisz błędów
  • jeśli je napiszesz, napraw je, myśląc, a nie nurkując w debuggerze

W przypadku znacznie nowoczesnego, wielowątkowego oprogramowania debuggery powodują raczej ukrywanie błędów niż ich wykrywanie. I zdecydowanie nie należy ich „uczyć” na poziomie studiów, tak jak nikt nie nauczyłby obsługiwać edytora tekstu.

Neil Butterworth
źródło
6
Myślę, że to zależy. Jeśli próbujesz przyzwyczaić się do zachowania dużej i słabo udokumentowanej bazy kodu, której nie napisałeś, debugger jest jednym z najszybszych sposobów na zaaklimatyzowanie się z tym, co robi baza kodów. Jeśli piszesz cały kod, na pewno nie będziesz często potrzebował debuggera, ale nie wszyscy z nas są w tym miejscu. +1
Billy ONeal
1
@Billy Musimy wyrazić zgodę na różnice. Próbujesz poznać ogromny serwer transakcyjny MT z debuggerem.
Neil Butterworth,
@ Neil: Nigdy osobiście nie zajmowałem się tego rodzaju sprawami ... ale bez problemu debugowałem kod MT. Być może jestem zepsuty przez MSVC ++ - dostępne tam debuggery pokazują, co robią różne wątki, naprawdę łatwe. Ale jeśli debugowałem w wersjach sprzed 2008 r. (Myślę, że właśnie wtedy to dodano), widziałbym, jak to może utrudnić.
Billy ONeal,
@Neil: Nie zrozum mnie źle - nie mówię, że debugger jest substytutem myślenia lub że powinna być jedyną rzeczą, na którą patrzysz. Mówię tylko, że jest to narzędzie, które w niektórych przypadkach może ułatwić zrozumienie czegoś. Jeśli debugger powoduje więcej zamieszania, ogólnie łatwo jest stwierdzić, że powoduje więcej zamieszania (ponieważ stajesz się coraz bardziej zdezorientowany), i wtedy wyłączasz debuger i próbujesz czegoś innego. W niektórych przypadkach jest to pomocne, ale nie zastępuje patrzenia na kod / wejście / wyjście i myślenia o tym, co się dzieje.
Billy ONeal,
2
Wiem, że lecisz tutaj wokół otrzymanej mądrości. Ale jesteś w dobrym towarzystwie z ludźmi takimi jak Linus Torvalds, Larry Wall, Brian Kernighan i Rob Pike.
btilly,
0

Debugowania należy uczyć, ponieważ uczniowie są ludźmi, a ludzie popełniają wszelkiego rodzaju błędy, z których niektóre wymagają gromadzenia danych eksperymentalnych (informacji debugowania) przed wystąpieniem jakiegokolwiek oświecenia dotyczącego danego błędu.

Debugowanie nie jest nauczane z powodu założenia (być może odziedziczonego po wydziale matematyki), że programy powinny być poprawne z założenia, być może nawet możliwe. Dlatego uczniowie nie powinni „eksperymentować” z programowaniem poprawnie. Ignoruje to jednak rzeczywisty proces produkcji niedoskonałych ludzi rozwijających oprogramowanie do zmieniających się specyfikacji pod presją harmonogramu itp.

hotpaw2
źródło
Hmm ... może moja szkoła jest po prostu inna, ale nie tak się robi w CWRU.
Billy ONeal,
Prawdopodobnie zależy od drzewa dziedziczenia działu historycznego danego kursu programowania.
hotpaw2
Nie jestem pewien, skąd to wszystko bierzesz. Wszystkie zajęcia wprowadzające poświęcają kilka wykładów na temat śledzenia błędów.
davidk01
@ davidk01 - To nie tłumaczy obserwacji OP, o której słyszałem nie często, ale więcej niż raz wcześniej.
hotpaw2
@ hotpaw2: Co nie tłumaczy obserwacji OP? To, że uczniowie mają trudności z nauką debugowania programów, nie oznacza, że ​​nie nauczono się, do którego wniosku należy przejść. Brałem udział w kilku kursach programistycznych zarówno jako student pierwszego roku, jak i doktorant. W każdej klasie instruktor spędził co najmniej jeden wykład, aby przejrzeć nieprawidłowy program i naprawić go, aby zademonstrować niektóre popularne techniki debugowania.
davidk01
0

To pytanie jest mi obce. Na moim uniwersytecie nauczono korzystania z debuggera (JDB i debugera Eclipse) już w pierwszym roku informatyki. Korzystanie z debuggerów i innych narzędzi testowych zostało ponownie nauczone w trakcie testów oprogramowania.

Bardzo trudno mi uwierzyć, że każda dobra szkoła, która próbuje przygotować ludzi do wejścia na rynek pracy, nie uczy o prawidłowych technikach debugowania i testowania. Oczywiście nie są w stanie objąć wszystkich jego aspektów, ale mogą przynajmniej uczyć podstaw w klasie.

Thomas Owens
źródło
0

Sam to wymyśl

Nie potrzebowałem i nie chciałem, aby profesor lub pracownik naukowy poświęcił trochę czasu na nauczenie mnie czegoś, co mógłbym łatwo samemu wymyślić. Są tam, aby nauczyć mnie trudnych koncepcji i prowadzić naukę. Nie ma ich i nie powinno ich tam być, więc nie musisz RTFM.

Dowiedz się, jak się uczyć

Kolegium powinno polegać na nauce uczenia się, a nie tylko na trzymaniu ręki przez każdy nieznany temat. Jeśli przez cały ten czas trzymasz rękę w ręku, poniesiesz żałosną porażkę w prawdziwym świecie.

Pod górę, w obie strony, przez śnieg

Kiedy poszedłem do szkoły, nie zadali sobie trudu, aby nauczyć cię języka. Oczekiwano, że odbierzesz go we własnym czasie. Dadzą ci projekt i udogodnienia. Twoim zadaniem było wyśledzenie informacji potrzebnych do ukończenia wdrożenia i przesłania działającego programu. Całkiem podobny do prawdziwego świata, z wyjątkiem godzin pracy.

dietbuddha
źródło