Lernen, Fehler zu untersuchen [geschlossen]

11

Ich bin mir nicht mal sicher, wie ich diese Schwierigkeit definieren soll. Es erinnert mich an den Test, den einige potenzielle Mitarbeiter an mir durchgeführt haben, bevor ich einen Job bekam. Sie wählten ein Objekt im Raum aus und dann durfte ich Fragen stellen, um herauszufinden, was dieses Objekt ist (ähnlich wie 20 Fragen). Ich war lächerlich gut darin (nein, ich habe nie Höhepunkte für Demut bekommen), also hatte ich angenommen, dass ich wirklich gut darin bin, Fehler zu beheben ...

Aber hier ist die Sache, die ich kürzlich herausgefunden habe. Ich bin in dieser Situation wirklich gut, weil es wirklich einfach ist, alles zu sehen, was sich im Raum befindet, sodass ich mein Problem mit einem Konzept seiner Bestandteile angehen kann. Im Wesentlichen "weiß ich, was ich nicht weiß". Aber beim Programmieren stoße ich auf viele Situationen, in denen das Problem mir völlig unbekannt ist. Ich weiß, dass es kaputt ist, aber ich habe keine Vorstellung davon, wie es kaputt sein könnte. Ich habe alle Anweisungen befolgt, ich kenne die Technologie ziemlich gut ...

Wenn ich ehrlich bin, fällt es mir schwer, mir Dinge vorzustellen, die falsch sein könnten, damit ich sie testen und hoffentlich eine Lösung finden kann.

Wie entwickle ich diese Fähigkeit? Was muss ich tun, um meiner anscheinend eingeschränkten Vorstellungskraft dabei zu helfen, Wege zu finden, wie mein Projekt möglicherweise gebrochen werden könnte? Gibt es Übungen (vielleicht Rätsel?), Die mich dabei verbessern können? Ich bin mir bewusst, dass die wahrscheinlich größte Heilung nur Erfahrung ist ... aber ich hoffe, dass ich helfen kann, den Prozess zu beschleunigen, wenn ich kann. Es macht nicht einmal Spaß, ein paar Stunden lang ausdruckslos auf meinen Computerbildschirm zu starren ...

Jay Carr
quelle
3
Stellen Sie sich vor, wie es Ihrer Meinung nach funktionieren könnte, und arbeiten Sie rückwärts von den Ausgaben zu den Eingaben, um zu untersuchende Pfade zu finden
Steven A. Lowe,
1
Ich werde da draußen einen Link werfen - Wie man ein Programmierer ist - die erste aufgeführte Fähigkeit ist "Learn to Debug".
1
Ich wollte etwas über das "out of the box" -Denken herauswerfen. In Bezug auf Fehler denke ich oft, dass das erste, was zu tun ist, darin besteht, einfach alle interagierenden Systeme aufzulisten und dann anzunehmen, dass ein Teil davon fehlerhaft sein könnte, bis das Gegenteil bewiesen ist. Dann wird Ihre Arbeit einfacher: Nehmen Sie an, dass eine Komponente ausfällt, und finden Sie einen Weg, der dies auch dann tun könnte, wenn dies zunächst unlogisch erscheint ("Ausgabe wird beschädigt" usw.). Beweisen Sie dann, dass Ihre Komponente nicht ausfällt, und beginnen Sie mit den unmittelbarsten Interaktionen. Im Nachhinein kann es wie Einbildung erscheinen, aber oft beginnt es nur mit einer pessimistischen Sichtweise.
J Trana
Schreiben Sie ein printfoder printlnwas auch immer Sie unter jede Codezeile verwenden, um 100% sicher zu sein, dass alles so funktioniert, wie Sie es möchten, haha. Führen Sie dann Ihre Konsolenanwendung aus, und App > out.txtdann kommt der schwierige Teil beim Anzeigen der riesigen Datei. Manchmal sind meine Protokolldateien mehr als ein paar Millionen Zeilen lang und es kann einige Zeit dauern, haha. Natürlich wäre der richtige Weg, einen Debugger und Haltepunkte zu verwenden, aber manchmal ist das nicht möglich.
SSpoke
1
Lesen Sie Pirsigs Zen und die Kunst der Motorradwartung amazon.com/Zen-Art-Motorcycle-Maintenance-Inquiry/dp/0060589469
Jeffrey Kemp

Antworten:

11

Jeder Softwarefehler ist letztendlich auf eine Diskrepanz zwischen Annahmen und Realität zurückzuführen. Heimtückische Fehler sind einfach Diskrepanzen zwischen besonders tiefsitzenden Annahmen und der Realität. Die Fähigkeit, Fehler zu diagnostizieren, hängt von Ihrer Fähigkeit ab, Ihre eigenen Annahmen in Frage zu stellen, und dies erfordert in der Tat das Bewusstsein, dass Sie bestimmte Dinge nicht wissen , Sie haben sie nur angenommen und waren bis jetzt richtig.

Offensichtlich sind die Tools des Handels, Protokolldateien, Debugger usw. hilfreich, um solche Annahmen aufzudecken und Ihr Weltmodell an das tatsächliche System anzupassen. Aber bis Sie bereit sind, die entscheidende Annahme in Frage zu stellen, z. B. "Es kann keine schlechte Eingabe sein, weil wir eine umfassende Eingabeprüfung haben", werden Sie Ihre gesamte Zeit damit verbringen, die falschen Teile des Systems zu überprüfen oder einfach nicht zu wissen, wo Sie sonst suchen müssen an erster Stelle.

Kilian Foth
quelle
3
Ich hasse es, es Killian zu sagen, aber ich denke, du hast den Nagel auf den Kopf getroffen. Ich bin sehr stolz auf mein "Wissen" über die Systeme geworden, die ich im Laufe meiner Zeit hier erworben habe, und ich denke, ich bin mental resistent gegen die Idee, falsch zu liegen. Wie ich vielleicht schon erwähnt habe, habe ich bei Demut nie ein hohes Ergebnis erzielt. Wenn ich Ihrem Rat folgte, meine eigenen Annahmen in Frage zu stellen, konnte ich in einigen Punkten, mit denen ich in meinem eigenen Code konfrontiert war, solide Fortschritte erzielen. Also, danke, ich werde dies in Zukunft berücksichtigen.
Jay Carr
2
@ JayCarr: " mental resistent gegen die Idee, falsch zu liegen " - Was ist, wenn Sie versuchen, Fehler eher als Lernquelle als als Fehler zu sehen? Es ist nichts Falsches daran, falsch zu sein, solange man hier nicht aufhört.
JensG
14

Was muss ich tun, um meiner anscheinend eingeschränkten Vorstellungskraft dabei zu helfen, Wege zu finden, wie mein Projekt möglicherweise gebrochen werden könnte?

In den meisten Fällen würde ich absolut nichts sagen. Sie sollten nicht versuchen, sich Dinge auszudenken, die dazu führen könnten, dass das Programm kaputt geht. Sie sollten systematisch zu bestimmen, was ist es zu brechen verursacht.

Sie sollten mit den folgenden Informationen in den Debugging-Prozess einsteigen:

  • die Schritte, die unternommen wurden, und die Werte, die eingegeben wurden, um den Fehler zu erzeugen;
  • was das Programm sollte tun, wenn diese Schritte und Eingaben gegeben;
  • was das Programm ist zu tun , wenn diese Schritte und Eingaben gegeben.

Wenn eine Fehlermeldung angezeigt wird, erhalten Sie alle Informationen, die Sie dazu erhalten können. Wenn die Fehlermeldung selbst nicht klar ist und Sie nicht wissen, was sie in der Praxis bedeutet (einige Fehlermeldungen sind nicht immer besonders nützlich), verwenden Sie Google, StackOverflow oder eine andere Online-Ressource, um Informationen dazu zu finden .

Wenn im Front-End keine Fehlermeldung angezeigt wird, überprüfen Sie alle Protokolle, in die die Anwendung schreibt, auf Fehlermeldungen während des Zeitraums, in dem Sie den Fehler reproduziert haben. Der Code wurde möglicherweise vollständig ausgeführt, es ist jedoch eine Ausnahme aufgetreten, die auf dem Weg behandelt wird, die das Endergebnis abwirft und einen Eintrag in den Protokollen erzeugt. Suchen Sie nach diesen, machen Sie dasselbe oben und identifizieren Sie genau, was sie bedeuten.

Wenn Stacktraces mit Ausnahmen versehen sind, die von Ihrem Code ausgelöst werden (und dies sollte der Fall sein), sehen Sie sich die genannten Codezeilen an. Die Leitung selbst ist möglicherweise nicht diejenige, die das Problem tatsächlich verursacht. Wenn Sie eine NullPointerException in einem Teil des Java-Codes erhalten, zeigt Ihnen der Stacktrace an, wo Sie versucht haben, etwas zu verwenden, das null war, als Sie erwartet hatten, dass dies nicht der Fall ist. Das zeigt Sie nicht genau auf die Zeile, die das Problem verursacht, aber es sagt Ihnen im Allgemeinen, welche Variable nicht den erwarteten Wert hat, sodass Sie alle Referenzen / Zuweisungen zu dieser Variablen überprüfen können, um den Wert zu bestimmen wird nicht gesetzt oder der Wert wird falsch gesetzt.

Wenn nichts davon geholfen hat, starten Sie Ihren Debugger. Wenn Sie es auf einen Abschnitt des Codes eingegrenzt haben, von dem Sie wissen, dass er das Problem verursacht - aber Sie wissen nicht genau, welche Zeile (n) -, gehen Sie diesen Schritt durch. Wenn nicht, gehen Sie einfach die ganze Sache durch. Hier müssen Sie genau wissen, was das Programm mit bestimmten Eingaben tun soll, da Sie jeden Wert nach jeder Zeile überprüfen und genau bestimmen müssen, wo er von dem abweicht, was Sie von ihm erwarten.

Sie haben noch keine Ahnung, wo das Problem liegt? Bitten Sie jemanden um Hilfe . Ein Mitarbeiter, ein Freund, eine Online-Community. Zeigen Sie ihnen die ganze Arbeit, die Sie gerade getan haben. Zeigen Sie ihnen die Fehlermeldungen, die Stacktraces, erklären Sie, was das Programm allgemein tut (wenn sie es noch nicht wissen), was es in diesem speziellen Fall tun soll (z. B. den Wert 4 zurückgeben), was es tatsächlich tut (z Rückgabe des Wertes 5). Wenn Sie es im Debugger auf einige Codezeilen eingegrenzt haben, sagen Sie "Ich weiß, dass das Problem durch diese Zeilen im Code verursacht wird. Es setzt den Wert auf X, wenn es Y sein sollte, aber ich kann es nicht sehen." warum das passiert ".

Ein paar Stunden damit zu verbringen, ausdruckslos auf Ihren Bildschirm zu starren, macht definitiv keinen Spaß, aber es gibt keinen Grund, warum Sie das tun sollten. Wenn es ein Problem mit Ihrem Code gibt, müssen Sie den Code lesen oder durchgehen.

Anthony Grist
quelle
Vielleicht war es ein bisschen schnell, diese Antwort zu beurteilen, war ein bisschen frustriert, als ich sie las. Guter Rat. Killians Kommentare sprachen mehr über mein Problem, denke ich. Dies ist der einzige Grund, warum dies nicht die ausgewählte Antwort ist.
Jay Carr
4

Bis zu einem gewissen Grad ist es wie die Untersuchung eines Strafverfahrens oder eines umwerfenden Puzzles.

Zuerst hast du das Opfer. Nachdem Sie sich eine Weile mit dem Fall befasst hatten, identifizierten Sie einige Verdächtige und entwickelten eine Arbeitshypothese, wie genau das Opfer ermordet werden könnte. Sie untersuchen weiter, suchen nach hilfreicheren Informationen und bringen Sie der eigentlichen Ursache des Problems immer näher.

Es kommt vor, dass Sie von Zeit zu Zeit in eine Sackgasse geraten (Wortspiel beabsichtigt). Das ist ein Teil davon, und daran ist nichts auszusetzen, solange Sie es schaffen, sich so schnell wie möglich wieder auf den richtigen Weg zu bringen. Der Schlüssel ist, immer darüber nachzudenken, welche Informationen Sie als Nächstes benötigen, die entweder Ihre Hypothese liefern (und Ihnen weitere Informationen liefern) oder beweisen, dass sie falsch sind. Finden Sie dann einen Weg, um diese Informationen auf effiziente Weise zu erhalten, ziehen Sie Ihre Schlussfolgerungen und fahren Sie fort, bis Sie endlich in der Lage sind, die Schuldigen zu verurteilen.

Und manchmal merkt man, dass alle Fakten und Hinweise, die notwendig sind, um den Täter zu erkennen, bereits vor einer halben Stunde vor Ihnen warteten. Obwohl dies ärgerlich ist, gehört dies zu den interessantesten Teilen, denn wenn Sie Ihre Handlungen und Fehler kritisch überprüfen , können Sie möglicherweise lernen und besser werden . Stellen Sie sich Fragen wie:

  • Wie hätte ich diese Zeitverschwendung vermeiden können?
  • Was habe ich überhaupt übersehen und warum?
  • Auf welche nicht validierten und / oder falschen Annahmen habe ich mich verlassen?

Dies wird Ihre Fähigkeiten trainieren. Es wird auch Ihr entwickeln Bauchgefühl , so im Laufe der Zeit lernen Sie automatisch alle jene minorish Dinge zu bemerken , die allzu leicht übersehen werden, was Sie schneller auf die richtige Antwort. Am Ende dreht sich alles um bewusstes Üben .

Denken Sie nicht zuletzt immer daran, was Sherlock Holmes uns gelehrt hat: Wenn Sie das Unmögliche beseitigt haben, muss alles, was noch so unwahrscheinlich ist, die Wahrheit sein.

JensG
quelle
3

Was muss ich tun, um meiner anscheinend eingeschränkten Vorstellungskraft dabei zu helfen, Wege zu finden, wie mein Projekt möglicherweise gebrochen werden könnte?

Lassen Sie sich von der Geschichte leiten. Wenn Ihr Projekt gut verwaltet wird, sollten Sie eine Datenbank mit allen Fehlern haben, die jemals im Produkt behoben wurden, sowie eine Analyse darüber, wie der Fehler gefunden wurde, wie er reproduziert wurde, wie er analysiert wurde und wie er behoben wurde. Das ist keine schreibgeschützte Datenbank. Lesen Sie die Datenbank , und schon bald werden Ihnen Bug-Taxonomien einfallen.

Das gibt Ihnen einen guten Überblick über die Art von Dingen, die in Ihrem Produkt schief gehen. Wenn Sie allgemeiner daran interessiert sind, was bei allen Arten von Software schief geht, insbesondere bei sicherheitsrelevanten Mängeln, empfehlen wir Ihnen, die CWE-Liste zu lesen: http://cwe.mitre.org/data/index.html

Eric Lippert
quelle
2

Anstatt zu versuchen, einen bestimmten Fehler zu reproduzieren und zu beheben, möchten Sie sich meiner Meinung nach neue Tests ausdenken, mit denen Sie das Produkt untersuchen können, um festzustellen, ob das Produkt unter diesen Umständen funktioniert. Was passiert beispielsweise, wenn ich Sonderzeichen in unser Produkt eingebe? Das Passwort der Anmeldeseite wird abgelegt, oder was passiert, wenn ich das Programm beim Schreiben in die Datenbank zwangsweise schließe? Diese Fälle sind in der Tat schwer zu überlegen.

Die Softwareentwicklung in den letzten 10 Jahren (Agile / XP / TDD usw.) hat sich als wertvoll erwiesen, nur die expliziten Anforderungen zu erfüllen und dann die Funktion für beendet zu erklären und nicht jeden möglichen Weg zu finden, um etwas zu beschädigen (es gibt mögliche Ausnahmen, wenn Sie dies sind für die NASA arbeiten oder White-Hat-Sicherheit betreiben, aber selbst dann gibt es einen Grund, solche Dinge in den Akzeptanzkriterien der User Story herauszustellen.

Wenn in Ihren Funktionen explizit als Akzeptanzkriterien aufgeführt ist, was die Systeme tun müssen, z. B. wie Eingaben, Leistungsmerkmale, Benutzerworkflow-Aktionen usw. verarbeitet werden, haben Sie eine vollständige Liste der Punkte, auf die die Tests prüfen müssen. Es sollten Tests durchgeführt werden, um zu überprüfen, ob die Anforderungen erfüllt wurden. Der beste Weg, dies zu tun, besteht darin, alle Ihre Anforderungen explizit aufzulisten. Schauen Sie sich die Agile Test Quadrants an .

Einige Leute befürworten, dass diese Tests die explizite Erklärung der Anforderungen sind, die vor dem Code geschrieben werden müssen, dh Test First (oder Test Driven Development).

Ich weiß jedoch zu schätzen, dass Sie nicht so klingen, als würden Sie über ein neues Projekt nachdenken, in dem Sie Ihre eigenen Best Practices für die Entwicklung festlegen können, bevor Sie beginnen. Stattdessen kommen Sie herein, nachdem die Software geschrieben wurde und Sie aufgefordert werden, sie zu testen. Dies ist in der Tat schwieriger, aber es gelten dieselben Prinzipien. Sie können es nur testen, wenn Sie wissen, was es tun sollte. Wenn es keine umfassende Liste von Anforderungen gibt, die vom Entwicklungsteam erfüllt wurden, damit Sie arbeiten können, ist es am besten, Fragen zu stellen. Abhängig von Ihrem Team muss dies möglicherweise vorsichtig durchgeführt werden, da Personen, die ihre Anforderungen vor dem Erstellen eines Softwaresystems nicht explizit aufgelistet haben, nicht gerne daran erinnert werden möchten, was sie verpasst haben, aber es ist wichtig, diese Aufgabe gut auszuführen.

Wenn Sie eine Anforderung gefunden haben - sie muss robust / sicher sein -, versuchen Sie, tiefer zu graben und herauszufinden, wie sicher sie sein muss oder wie viel Fehler akzeptabel sind. Es gibt immer eine Grenze, nicht viele Menschen haben einen NSA-Beweis Sicherheitsniveau als Voraussetzung für ihre Anwendung oder würde dafür bezahlen wollen. Je mehr Sie graben, desto klarer sollte es sein, gegen welche Arten von Sicherheitsangriffen Sie sich verteidigen müssen oder welche Benutzerfreundlichkeit Sie anstreben. Einige Domain-Kenntnisse sind dann nützlich, in Bezug auf Sicherheit, Design, Leistung usw. Hier stellen Sie noch mehr Fragen an die Experten, die Sie in Ihrem Team oder hier auf SE oder bei Google / Books finden.

Encaitar
quelle
Nicht ganz die Frage, die ich beantwortet haben wollte, aber trotzdem ein ausgezeichneter Kommentar. Ich stimme dir zu, das ist ein sehr nützlicher Kommentar.
Jay Carr