Warum decken Schulen Debugger nicht ab? [geschlossen]

12

Nach einer weiteren Hausaufgaben Frage so weiter . Es scheint, dass die große Mehrheit der Studenten keine Ahnung hat, was ein Debugger ist oder wie man einen benutzt. Ich bin der Meinung, dass das Wissen über die Verwendung eines Debuggers fast genauso wichtig ist wie andere Grundlagen der Programmierung.

  • Die Frage ist, ob das Debuggen und die Verwendung moderner Debugging-Tools nicht neben den Programmiergrundlagen vermittelt werden sollten. Wenn nein, warum nicht?
Wiederholung
quelle
2
Ähm ... du sagst, GDB ist ein modernes Debugging-Tool? Es ist kein schlechter Debugger, aber sicherlich nicht auf dem neuesten Stand der Technik.
Billy ONeal
1
Ich würde zustimmen, aber ich habe auch die Frage beantwortet, ob Studenten Visual Studio verwenden und nicht wussten, wie oder warum sie einen Debugger verwenden würden.
Führen Sie den
@rerun: Ähm ... autsch. Sie können nicht die "Play" -Taste auf der IDE drücken? (Übrigens, ich habe +1 gegeben)
Billy ONeal
system.out Druckprotokollierung ist die letzte Bastion des faulen und unfähigen
6
@Jarrod, eine ziemlich breite Verallgemeinerung und vielleicht übertrieben. Manchmal können Sie einfach keinen Debugger in Ihrem Programm verwenden, in dem das Problem auftritt.

Antworten:

7

Es ist nicht so sehr der Fall, dass der Einsatz von Debuggern gelehrt werden muss, sondern die allgemeineren Techniken des Debuggens . Dies würde natürlich auch das Erlernen der Verwendung eines Debuggers einschließen, aber auch verschiedene andere wichtige Techniken, z

  • kritisches Denken
  • teilen und erobern
  • printf debuggen, protokollieren usw
  • Schreibtisch überprüfen
  • Belastbarkeitstest

Als zusätzlicher Vorteil können viele der Techniken auch zur Problemlösung in anderen Bereichen als der Programmierung angewendet werden.

Es gibt ein ziemlich gutes Buch zu diesem Thema, das wahrscheinlich von allen Studenten und jedem, der die Grundlagen des Programmierens lernt, gelesen werden muss: Debugging von David J Agans .

Paul R
quelle
8

Tertiäre Informatikkurse sind , wie Sie bereits erwähnt haben, auf das Unterrichten der Programmiergrundlagen der Schüler zugeschnitten. Diese Konzepte werden den Schülern in der Hoffnung vermittelt, dass sie die erforderlichen Konzepte erlernen und sie auf ein breiteres Spektrum von Programmiersprachen und Problemstellungen anwenden.

Debugging-Tools sind dagegen eine Teilmenge im Implementierungsbereich - jedes Tool ist für jede Sprache unterschiedlich (auch wenn die Konzepte identisch sind). Wir waren mit Debugging-Tools konfrontiert, haben sie aber nie wirklich vertieft. Wenn wir mehr als eine Woche mit dem Debuggen von Tools verbringen würden, würde ich - im Nachhinein - zurückblicken und dies als Zeitverschwendung betrachten. Ich möchte lieber etwas über die BigO-Notation oder den Polymorphismus lernen. Wenn den Schülern die Leistungsfähigkeit eines Debugging-Tools jedoch nicht (erfolgreich) vermittelt wurde, ist dies nicht erforderlich.

JK
quelle
3
+1. Übersetzt: Da nicht jeder MSVS, GCC / GDB, LLVM / CLANG usw. verwendet
Billy ONeal
1
+1 obwohl ich zugeben muss, dass ich mit @rerun einverstanden bin; Ein Kurs (oder ein Teil eines Kurses), der grundlegende Konzepte und Tools behandelt, die in einem Software-Shop verwendet werden, trägt wesentlich dazu bei, dass neue Absolventen produktiv werden. Ich bin auf einige gestoßen, die die Quellcodeverwaltung anscheinend nicht verstanden haben, obwohl sie eine Weile verwendet wurde.
Ken Henderson
Viele der Fähigkeiten, mit denen durchschnittliche Entwickler viel Zeit verbringen, werden in der Schule behandelt. Quellcodeverwaltung, Konfigurationsmanagement im Allgemeinen, Codeexploration, Codelesen, Erstellungsprozesse usw. Obwohl ich verstehe, dass CS-Abschlüsse die theoretischen Aspekte abdecken müssen, denke ich, dass eine Klasse auf Senor-Ebene, in der die Schüler mit einer großen vorhandenen Codebasis arbeiteten, Fehler finden und beheben kann und es in Code einchecken und "implementieren" zu lassen, würde einen neuen Entwickler viel nützlicher machen.
Führen Sie den
3
Ich stimme überhaupt nicht zu. Wenn aktueller Code geschrieben wird (weil das Schreiben von Code eine gute Möglichkeit zum Üben der wissenschaftlichen Konzepte ist), sollten die Schüler Zugang zu guten Methoden zum Schreiben dieses Codes haben, und dazu gehört auch der Einsatz eines Debuggers, falls dies erforderlich ist. Das spart keine Zeit, die für die bigO-Notation aufgewendet werden könnte - es spart Zeit, die viele Schüler aufwenden müssen, um sich durch kleinere Fehler zurechtzufinden. Daraus wird nicht viel gewonnen. Außerdem enthalten viele andere naturwissenschaftliche Kurse (z. B. Physik) praktische Messfähigkeiten als Teil ihres Lehrplans.
Inca
2
Die Verwendung eines Debuggers setzt voraus, dass Sie wissen, wie der Computer funktioniert, und nicht nur den Code. Ich würde dies als eine grundlegende Programmierung betrachten . Ich habe zu viele Studenten getroffen, die einfach keine Ahnung haben, was ihr Computer tatsächlich macht, und das ist kein guter Programmierer.
edA-qa mort-ora-y
2

In den meisten Einführungskursen zum Programmieren ist der Programmstatus so einfach, dass Sie Fehler mit ein paar Druckanweisungen ausmerzen können. Es kann auch vorkommen, dass Schüler gezwungen werden, Dinge von Hand zu tun, um ein Gefühl dafür zu bekommen, wie und wo im Code bestimmte Arten von Fehlern auftreten. Wenn Sie keine Ahnung haben, wo Sie suchen sollen, wird ein Debugger ziemlich nutzlos sein.

davidk01
quelle
4
Ein guter Debugger ist einfacher zu verwenden als print-Anweisungen. Print-Anweisungen erfordern, dass Sie irgendwie eine Möglichkeit haben, Ihre Daten in eine Zeichenfolge zu serialisieren. Dies erfordert einen eigenen (möglicherweise fehlerbehafteten) Code, um die Serialisierung durchzuführen. Beispielsweise ist ein Programm für verknüpfte Listen in einem Debugger leicht zu durchlaufen, aber Druckanweisungen helfen einem Schüler, der versucht, einen Transversalalgorithmus für verknüpfte Listen zu schreiben, nicht weiter - da Sie diesen Algorithmus benötigen, um die richtigen Druckanweisungen zu schreiben .
Billy ONeal
2
@ Billy, wird es ihnen irgendwie helfen, den falschen Code durchzugehen?
Neil Butterworth
1
@ Billi ONeal, du liegst falsch. Ein Debugger, von dem Sie sprechen, existiert nicht. Ein interaktives Durchlaufen des Programms ist nur dann sinnvoll, wenn Sie das Problem mit der Debug-Protokollierung bereits erkannt haben. Nie in meiner Praxis (> 20 Jahre) musste ich einen Debugger mit meinem eigenen Code verwenden - ordnungsgemäße Behauptungen und Protokollierung waren immer ausreichend. Ich benutze diese verdammten Tools nur mit dem Bibliothekscode und den alten Sachen. Übrigens ist es immer eine gute Idee, jede Datenstruktur in etwas Lesbares serialisieren zu können . Einige Sprachen / Umgebungen bieten dies kostenlos an.
SK-logic
1
@ Billy ONeal, wie würden Sie einen Speicher eines Mikrocontrollers durchsuchen, der an eine serielle Schnittstelle angeschlossen ist? Und ich glaube, dass es keine so gute Idee ist, Erstsemester mit Zeigern und anderen Dingen an die niedrigen Sprachen heranzuführen, bevor sie sich mit Datenstrukturen und Algorithmen auskennen. Bis dahin wissen sie, wie man richtig debuggt.
SK-logic
1
@ Billy ONeal, der schwierigste Teil besteht darin, den richtigen Zeitpunkt zu ermitteln, zu dem entweder ein Wert in einem Debugger überprüft werden muss (in den meisten Fällen ist dies immer noch ein Aufruf einer .dump () - Methode, keine direkte Speicherüberprüfung) oder um einen serialisierten Wert zu drucken. Wenn eine geeignete Debug-Protokollierungsinfrastruktur vorhanden ist, wird das Problem auf eine Analyse der Protokolldateien eingegrenzt. In den meisten Fällen greperledigt ein einfacher die Arbeit. Kein Treten, keine bedingten Haltepunkte - nur Grep.
SK-logic
2

Es ist nicht so wichtig. Ich benutze so gut wie nie eines und habe es auch nie. Der beste Weg, um Code zu debuggen, ist:

  • schreibe die Bugs nicht an erster Stelle
  • Wenn Sie sie schreiben, beheben Sie sie, indem Sie nachdenken, und nicht indem Sie in den Debugger eintauchen

Und für viele moderne Multithread-Programme haben Debugger den Effekt, Fehler zu verbergen, anstatt sie aufzudecken. Und sie sollten definitiv nicht auf Studienniveau "unterrichtet" werden, genauso wenig wie man unterrichten würde, wie man ein Textverarbeitungsprogramm benutzt.

Neil Butterworth
quelle
6
Ich denke, das hängt davon ab. Wenn Sie sich an das Verhalten einer großen und schlecht dokumentierten Codebasis gewöhnen möchten, die Sie nicht geschrieben haben, ist ein Debugger eine der schnellsten Methoden, um sich an die Funktionsweise der Codebasis zu gewöhnen. Wenn Sie den gesamten Code schreiben, brauchen Sie sicher nicht oft einen Debugger, aber nicht alle von uns sind an diesem Ort. +1
Billy ONeal
1
@ Billy Wir müssen uns einig sein, dass wir uns unterscheiden. Sie versuchen mit einem Debugger einen riesigen MT-Handelsserver kennenzulernen.
Neil Butterworth
@Neil: Ich habe mich noch nie persönlich mit so etwas befasst ... aber ich habe MT-Code vorher ohne Probleme getestet. Vielleicht bin ich von MSVC ++ verwöhnt - die Debugger dort machen es einfach zu zeigen, was die verschiedenen Threads tun. Aber wenn ich in Versionen vor 2008 debuggt habe (ich denke, das wurde hinzugefügt), konnte ich sehen, wie das die Dinge schwieriger machen könnte.
Billy ONeal
@Neil: Versteh mich nicht falsch - ich sage nicht, dass der Debugger ein Ersatz für das Denken ist, oder dass es das Einzige sein sollte, was du dir ansiehst. Ich sage nur, dass es ein Werkzeug ist, das in einigen Fällen das Verständnis erleichtern kann. Wenn ein Debugger mehr Verwirrung stiftet, ist es im Allgemeinen leicht zu erkennen, dass er mehr Verwirrung stiftet (weil Sie mehr Verwirrung stiften). Dann schalten Sie den Debugger aus und probieren etwas anderes aus. Es ist in einigen Fällen hilfreich, aber kein Ersatz dafür, sich Code / Eingabe / Ausgabe anzusehen und darüber nachzudenken, was gerade vor sich geht.
Billy ONeal
2
Ich weiß, dass Sie hier das Gesicht der empfangenen Weisheit fliegen. Aber Sie sind in guter Gesellschaft mit Leuten wie Linus Torvalds, Larry Wall, Brian Kernighan und Rob Pike.
Mittwoch,
0

Debugging sollte unterrichtet werden, da die Schüler Menschen sind und Menschen alle Arten von Fehlern machen, von denen einige experimentelle Daten (Debugging-Informationen) erfordern, bevor Aufschluss über einen bestimmten Fehler gegeben wird.

Das Debuggen wird nicht gelehrt, da davon ausgegangen wird (möglicherweise von der Mathematikabteilung geerbt), dass Programme vom Design her korrekt sein sollten, möglicherweise sogar nachweislich. Und deshalb sollten die Schüler nicht mit der richtigen Programmierung experimentieren. Dies ignoriert jedoch den realen Herstellungsprozess unvollkommener Menschen, die Software unter Zeitdruck usw. auf sich ändernde Spezifikationen ausschwenken.

hotpaw2
quelle
Hmm .. vielleicht ist meine Schule einfach anders, aber so wird es bei CWRU nicht gemacht.
Billy ONeal
Kommt wahrscheinlich auf den historischen Abteilungsvererbungsbaum des betreffenden Programmierkurses an.
hotpaw2
Ich bin mir nicht sicher, woher du das alles nimmst. In allen Einführungskursen werden einige Vorlesungen zum Aufspüren von Fehlern gehalten.
Davidk01
@ davidk01 - Das erklärt nicht die Beobachtung des OP, die ich gehört habe, nicht oft, aber mehr als einmal zuvor.
hotpaw2
@ hotpaw2: Was erklärt die Beobachtung des OP nicht? Nur weil es den Schülern schwer fällt, das Debuggen von Programmen zu erlernen, heißt das noch lange nicht, dass es nicht gelehrt wird, zu welcher Schlussfolgerung Sie springen. Ich habe mehrere Programmierkurse sowohl als Student als auch als Doktorand belegt. In jeder Klasse hat der Kursleiter mindestens eine Vorlesung durchgeführt, um ein falsches Programm zu durchlaufen und es zu korrigieren, um einige gängige Debugging-Techniken zu demonstrieren.
Davidk01
0

Diese Frage ist mir fremd. An meiner Universität wurde die Verwendung des Debuggers (JDB und der Eclipse-Debugger) bereits im ersten Jahr der Informatik-Sequenz unterrichtet. Die Verwendung von Debuggern und anderen Testwerkzeugen wurde im Kurs über Softwaretests erneut unterrichtet.

Ich persönlich finde es unglaublich schwierig zu glauben, dass in jeder guten Schule, die versucht, die Menschen auf den Eintritt in die Belegschaft vorzubereiten, nicht die richtigen Debugging- und Testtechniken gelehrt werden. Sie können natürlich nicht alle Aspekte abdecken, aber sie können zumindest die Grundlagen im Klassenzimmer vermitteln.

Thomas Owens
quelle
0

Finde es selbst heraus

Ich brauchte und wollte nicht, dass sich ein Professor oder ein TA Zeit nahm, mir etwas beizubringen, was ich leicht selbst herausfinden konnte. Sie sind da, um mir die harten Konzepte beizubringen und das Lernen zu leiten. Sie sind und sollten nicht da sein, damit Sie nicht RTFM müssen.

Lernen Sie, wie man lernt

Im College sollte es darum gehen, zu lernen, wie man lernt, und nicht nur, dass man sich mit der Hand durch jedes Thema bewegt, das man nicht kennt. Wenn Sie Ihre Hand ständig durch diesen Prozess halten, werden Sie in der realen Welt kläglich scheitern.

Auf beiden Wegen bergauf durch den Schnee

Als ich zur Schule ging, haben sie sich auch nicht die Mühe gemacht, dir die Sprache beizubringen. Es wurde von Ihnen erwartet, dass Sie es zu Ihrer eigenen Zeit abholen. Sie würden Ihnen das Projekt und die Einrichtungen geben. Es lag an Ihnen, die Informationen aufzuspüren, die Sie zum Abschluss der Implementierung und zur Einreichung eines Arbeitsprogramms benötigten. Ziemlich ähnlich wie in der realen Welt, außer mit Bürozeiten.

dietbuddha
quelle