Sie kennen sie, diese Fehler, die keinen Sinn ergeben. Wo es aussieht, als wäre ein Gremlin einfach tief in deine Chips gesprungen und hätte etwas durcheinander gebracht. Gehen Sie spazieren, schreiben Sie Zeug, rufen Sie einen Onkel an?
Sie kennen sie, diese Fehler, die keinen Sinn ergeben. Wo es aussieht, als wäre ein Gremlin einfach tief in deine Chips gesprungen und hätte etwas durcheinander gebracht. Gehen Sie spazieren, schreiben Sie Zeug, rufen Sie einen Onkel an?
Antworten:
Für diese wirklich schrecklichen Probleme lautet meine Strategie normalerweise wie folgt.
Experimentieren und googeln. Versuchen Sie weiter, das Problem zu lösen. Meistens löst dies das Problem in einer Stunde oder weniger.
Das hat also nicht funktioniert. Machen Sie eine Pause. Trinken Sie einen Kaffee, sprechen Sie über etwas, das nichts mit einem Kollegen zu tun hat. Schieben Sie das Problem aus Ihrem Kopf. Wenn Sie sich das Problem 5 oder 10 Minuten später ansehen, sehen Sie es aus einer etwas anderen Perspektive. Meistens funktioniert das.
In diesem Fall nicht. Verbringen Sie also noch 10 - 30 Minuten damit, es sich anzusehen. Dann rufen Sie einen Kollegen an. Machen Sie sich vorher noch ein paar Notizen. Sie möchten das Problem demonstrieren, es reproduzieren, dann eine Liste der Dinge, die Sie ausprobiert haben, und vor allem beweisen, dass Sie sie ausprobiert haben. Machen Sie also zuerst einen Trockenlauf. Setzen Sie Lesezeichen im Code, schließen Sie überflüssige geöffnete Dokumente usw. Auf diese Weise können Sie das Problem entweder selbst lösen, oder wenn Sie das Problem demonstrieren, verschwenden Sie keine Zeit.
Bitten Sie Ihren Kollegen, Sie alle Ihre Annahmen beweisen zu lassen. Wird dieser Setter tatsächlich aufgerufen? Gibt diese Methode wirklich das zurück, was Sie behaupten? Sie denken, dass das Objekt nicht null ist - zeigen Sie, dass es nicht null ist.
Wenn Sie das Problem meistens demonstrieren, werden Sie feststellen, dass Sie nicht alle Möglichkeiten ausprobiert haben, oder Ihr Kollege wird Ihren Fehler bemerken.
Wenn das nicht funktioniert, ist es an der Zeit, ernst zu werden. Dokumentieren Sie genau, was Sie versuchen, was Sie versucht haben und warum es nicht funktioniert hat. Senden Sie dies per E-Mail an alle Ihre Kollegen. Poste es auf SO. Zu diesem Zeitpunkt sollte das Dokument eine perfekte SO-Frage sein.
Während Sie auf Antworten warten, google google google. Versuchen Sie jede Permutation der Frage, die Sie haben. Öffnen Sie eine Reihe von Registerkarten. Sie werden wahrscheinlich zu diesem Zeitpunkt noch keine Antwort erhalten, aber Sie suchen nach Ideen, Möglichkeiten und verschiedenen Wegen, um das Problem anzugehen.
Tun Sie etwas anderes, wenn Sie 5 Stunden für ein Problem aufgewendet haben, um es für einen weiteren Tag zu verlassen. Vielleicht erhalten Sie eine nützliche Antwort. Vielleicht wird es offensichtlich, wenn Sie das Problem am nächsten Tag angreifen.
Wenn nichts davon funktioniert, ist es an der Zeit, nach einer anderen Lösung zu suchen. Vielleicht können Sie eine andere Methode, eine andere Technologie verwenden. Vielleicht sollten Sie überlegen, die Funktion vorerst aufzugeben. Rechnen Sie den Kunden stundenweise ab? Arbeiten Sie für ein Unternehmen an einer internen App? Sie müssen dies an den Eigentümer weiterleiten und ihm mitteilen, "Schauen Sie, ich habe x Stunden damit verbracht und keine Fortschritte erzielt. Lohnt sich der Kostenvorteil?". Sie möchten nicht zu Ihrem Chef gehen und ihm sagen, dass Sie 16 Stunden für ein Problem aufgewendet haben, nur damit er sich umdrehen und sagen kann, dass es nicht so wichtig ist, überspringen Sie es für diese Version. Sie müssen das früher herausfinden.
Und wenn das nicht geht? Nun, Sie haben nur die Möglichkeit, das Problem weiter anzugehen oder sich nach Branchenkenntnissen zu erkundigen. Fragen Sie Technologieexperten auf Twitter. E-Mail an Ihren Technologieanbieter.
Verlassen. Nein, nicht dein Job! Steh einfach auf und geh nach Hause. Du bist für den Tag oder das Wochenende fertig. Wenn Sie das nächste Mal von 20 auf das Problem zurückkommen, wird sich die Lösung innerhalb einer Stunde zeigen.
Vor zehn Stunden würde ich Hilfe bekommen.
Ein Wort, timebox
setzen Sie eine begrenzte Zeit für die Arbeit an etwas, und wenn es nicht gelöst ist, gehen Sie zu etwas anderem über und kommen Sie am nächsten Tag mit einer neuen Perspektive darauf zurück.
Das und ein anderer Satz Augen ist immer mehr wert als jede Zeit, die man damit verschwenden kann, auf etwas zu starren.
Ich würde nie mehr als 45 Minuten bis eine Stunde damit verbringen, etwas in einer Sitzung zu lösen. Das verstößt gegen das Gesetz, die Renditen zu verringern.
Erkläre das Problem jemand anderem.
Indem Sie jemandem das Problem erklären, müssen Sie es klarstellen: So können Sie oft die Lösung sehen.
(Einer der britischen Computerfachzeitschriften schlug einmal vor, Pappausschnitte in Originalgröße eines erfahrenen Programmierers zu verkaufen.)
Ich finde, dass das Schlafen bei einem Problem (manchmal für ein paar Tage) auch helfen kann.
Ich habe einen dreistufigen Plan:
Jede Stufe ist eine Eskalation, wenn der vorherige Schritt fehlgeschlagen ist. Es gibt fast immer noch etwas Produktives, an dem ich auf Stufe 2 arbeiten kann.
Ich mache im Allgemeinen eine der drei:
Jeder der drei lenkt sich gut von der aktuellen Situation ab. Ich finde, die Ablenkungen lassen mein Unterbewusstsein eine Weile auf etwas herumkauen. Nach ungefähr einer Stunde ist die Lösung :-).
Bauen Sie ein Testgeschirr, um genau diesen Fehler zu identifizieren und zu isolieren
Beseitigen Sie einfach weiterhin guten Code, während Sie den Fehler reproduzieren. Bis Sie genau den Code finden, der den Fehler enthält. Verfolgen Sie dann den Code.
Empfohlene Lektüre: Der Pragmatic Programmer Speziell Kapitel 10: Tracer-Aufzählungszeichen
Alle diese Vorschläge sind großartig. Ich verwende jedoch ziemlich oft eine Technik, die ich nicht erwähnt gesehen habe. Machen Sie Listen, um Ihre Gedanken über das Problem zu organisieren. Wenn ich ein besonders schwerwiegendes Problem habe, schreibe ich normalerweise mehrere Listen auf, wie z. das stellt sich oft als falsch heraus), Fragen, von denen ich nicht wusste, dass sie gestellt werden müssen, andere Permutationen, die ich überprüfen kann usw.
Bearbeiten:
Die kurze Antwort:
F: Wie gehen Sie mit wirklich bizarren Fehlern um, die Sie länger als 10 Stunden verwirrt halten?
A: Stellen Sie sicher, dass sie niemals passieren: Verstehen Sie Ihr Design, kennen Sie Ihren Code, lernen Sie den Umgang mit Ihrem Debugger.
Erläuterung:
"Wo es so aussieht, als wäre ein Gremlin tief in deine Chips gesprungen und hätte etwas durcheinander gebracht."
Das sollte niemals passieren. Wenn es sich um Ihren Code handelt, sollten Sie eine gute Vorstellung davon haben, was den Fehler verursacht, bevor Sie versuchen, ihn zu beheben.
Wenn Sie Ihren Code schreiben, sollten Sie außerdem bereits wissen, wo und warum er wahrscheinlich fehlschlägt.
Wenn Sie jedoch einen Kollegen fragen, auf SO posten, Ihre Schritte zurückverfolgen und zurückrollen und eine Pause einlegen, helfen Ihnen alle oben genannten Vorschläge.
Die andere Sache ist, dass Sie Ihre Tools kennen müssen - Ihr Debugging-Toolkit. Protokollieren Sie Nachrichten an verdächtigen Stellen in Ihrem Code, untersuchen Sie Ihren Aufrufstapel sorgfältig, verwenden Sie bedingte Haltepunkte und Überwachungen usw. usw. Debugging-Fähigkeiten sind keine Extras - sie sind Teil der Programmierung.
Ich hatte ein ähnliches Problem, eine offensichtliche Speicherbeschädigung in Objective-C, mit der ich viele Stunden lang zu kämpfen hatte. Aber dann machten ich und meine Kollegen nur einen Spaziergang zum Mittagessen, und ich erklärte das Problem (und insbesondere das Deserialisieren eines Objekts in seiner init-Methode) und erklärte mir im Grunde das gesamte Problem.
(Technische Details: Grundsätzlich habe ich ein Objekt initialisiert und auf etwas anderes als self zurückgegeben. Es gab also zwei Zuweisungen, aber nur ein Objekt wurde zurückgegeben. Der Speicher verschob sich und wurde verrückt, stürzte ab, und der Debugger wusste nicht wirklich, was er tun sollte es auch nicht).
Ein Bad nehmen.
Irgendwelche Rodney McKay Fans?
Im Ernst, wenn es eine Gemeinsamkeit zwischen all diesen Antworten gibt, dann ist es, eine Pause zu machen und etwas anderes zu tun .
Ich stelle es mir gerne als Abstieg des Problems in Ihr Unterbewusstsein vor. Selbst wenn wir es sonst nicht wissen, arbeiten unsere Gedanken (anscheinend) weiter an dem Problem, selbst wenn wir etwas anderes tun, wie zum Beispiel ein Bad zu nehmen .
Eine Kombination von all diesen:
Holen Sie sich für eine Weile davon weg, so dass es auf Ihrem Brenner sitzen kann. Schlafen, ausruhen, essen, spazieren gehen, was auch immer.
Untersuchen Sie das Problem genauer. Was macht es sonst noch falsch? Welche anderen Symptome können Sie feststellen?
Erforsche das Problem und finde heraus, was du finden kannst. Denken Sie daran, verschiedene Stichwörter auszuprobieren
Probieren Sie etwas anderes . Eine Arbeit um. Eine andere Debugging-Technik. Ein Validator. Ein anderer Computer.
Sprich mit jemandem . Selbst wenn sie nicht in der Lage sind zu helfen oder nicht einmal ein Programmierer, löst das Sprechen manchmal die Idee einer Glühbirne aus
Neustart! Versuchen Sie gegebenenfalls, Ihren Computer, den Server usw. neu zu starten. Wenn nichts anderes, können Sie die Zeit zum Nachdenken nutzen.
Fragen Sie StackOverflow! Wir sind hier um zu helfen
Die am häufigsten gewählte Antwort hat mir wirklich nicht gefallen, denn obwohl das manchmal funktioniert, muss man es manchmal nur am selben Tag herausfinden. Ich empfehle also in dieser Reihenfolge:
Bestätige, dass es nicht nur dir passiert. Dies kann Ihnen viel Zeit sparen. Möglicherweise haben Sie eine erforderliche Komponente deinstalliert oder eine Änderung in Ihrer Umgebung vorgenommen, und irgendwo in Ihrem Code wird eine Ausnahme verschluckt. Wenn es nur Ihnen passiert, würde ich ein Umgebungsvergleichstool verwenden. Ich habe kürzlich über eine Software namens Envy gelesen, mit der man genau das machen kann, obwohl es keine Freeware ist, kostet es 10 USD.
Geschehen mit allen? Gut, machen Sie jetzt einen View History für den Code und überprüfen Sie, ob die letzten Änderungen, die den Fehler verursacht haben könnten, direkt oder indirekt stattgefunden haben.
Es gibt keine aktuellen Änderungen? Wenn es sich um einen sehr speziellen Fehler handelt (eine Ausnahme), führen Sie einen Stapelüberlauf durch. Das hört sich nicht besser an als "google it", aber ich fühle mich gut zu sagen, dass ich zuerst nach Stackoverflow für die Programmierforschung suche als nach Google. Wenn es sich um ein wirklich bekanntes Problem handelt, finden Sie hier höchstwahrscheinlich eine Lösung. Wenn nicht, posten Sie eine Frage auf der entsprechenden Stackexchange-Site. Möglicherweise erhalten Sie eine sehr schnelle Antwort, oder selbst wenn Sie dies nicht tun, wird Ihre Frage dort draußen stehen, während Sie weitere Nachforschungen anstellen. Das ist ein Vorteil.
Wenn Sie online keine Antwort gefunden haben oder es sich nicht um einen allgemeinen Fehler handelt, gehen Sie den Code Schritt für Schritt durch und überprüfen Sie, ob die erzielten Ergebnisse der einzelnen Schritte für das erwartete Ergebnis sinnvoll sind. Beginnen Sie mit jeder Methode, um sie zu beenden, und gehen Sie bei einer gestuften Lösung von unten nach oben. (Wenn Sie also Probleme mit der Leistung beheben, beginnen Sie mit dem Code, der die Datensätze abruft. Es ist nicht sinnvoll, in der Benutzeroberfläche zu beginnen, wenn Sie schnell feststellen können, ob der erste Schritt das Problem ist.)
Wenn Sie nach mehrmaligem Durchgehen des Codes immer noch nicht gefunden haben, was nicht stimmt, rufen Sie jemanden an, um darüber zu sprechen. Wie bereits erwähnt, kann ein lautes Sprechen die Glühlampe entzünden. Plus-Pair-Programmierung ist wirklich nützlich.
An diesem Punkt, wenn es machbar ist, gehen Sie entweder für einige Zeit oder für den Tag weg. Ich habe gestern einen sehr wahren Tweet gelesen, in dem stand: "Ich bin ins Bett gegangen und habe darüber nachgedacht, wie es ist, und bin aufgewacht und habe darüber nachgedacht, aber natürlich." So wahr.
Wenn Sie immer noch keine Antwort haben, können Sie versuchen, kleinere Aufgaben / Methoden / Funktionen umzugestalten. Henry Ford sagte etwas wie "Es gibt keine Aufgabe, die so komplex ist, dass man sie nicht in kleinere Aufgaben aufteilen kann". Wenn die Lösung zu komplex ist und Sie es nicht selbst oder mithilfe einer anderen Person herausgefunden haben, können Sie den Code jetzt in kleinere Aufgaben umwandeln. Auch wenn Sie sich nicht dazu verpflichten, kann es Ihnen helfen, den Grund zu finden.
Fügen Sie Ihrem Code Instrumentation hinzu.
Tweete darüber?
Sie müssen zurücktreten. Mein Motto lautet: "Wenn das Problem zu schwer ist, lösen Sie das falsche Problem." Was sind Ihre Annahmen? Vertraue nichts.
Die Konsequenz daraus ist: Je seltsamer das Problem, desto seltsamer die Lösung. Die Stärke des Computers ist seine Logik, so dass Sie nicht mit Logik gewinnen können. Sie haben ein Gehirn und müssen es überdenken.
In der heutigen Zeit gibt es so viele andere Dinge, die auf einem System interagieren - Firewalls, AV, Antispyware, automatische Updates, die jede Nacht stattfinden - Sie müssen sich mit sich bewegenden Zielen befassen.