Debugging: Details darüber verstehen, warum bestimmte Fixes funktionierten? [geschlossen]


12

Beim Debuggen stelle ich manchmal fest, dass ich einige Änderungen vornehme und nicht 100% sicher bin, warum diese Änderungen einen Fehler im Programm korrigieren. Ist es wichtig, jedes einzelne Detail darüber zu verstehen, warum einige Fehler aufgetreten sind und warum bestimmte Änderungen diese Fehler beseitigt haben? Oder ist es unter Entwicklern üblich, das Programm manchmal zum Laufen zu bringen, ohne wirklich zu wissen, warum das Update funktioniert hat?


1
Wie würden Sie sonst jemanden davon überzeugen, dass Sie den Fehler behoben haben?

Verwandte: Bugfixing appproach „ In der Regel, Sie versuchen , für die Fehler , die eigentliche Ursache herauszufinden , auftreten und es dann fix Aber manchmal , was ich tun , wenn ich zu tun , einige der Forschung satt (und nicht geeignet Informationen finden auf. Das Internet) ist nur eine Änderung der Logik, die mir im Vergleich zur anderen Option viel weniger Zeit kostet ... "
gnat

Antworten:


32

Ich würde sagen, dass es wichtig ist, jedes einzelne Detail darüber zu verstehen, warum einige Fehler aufgetreten sind und warum bestimmte Änderungen diese Fehler beseitigt haben, und es ist auch unter Entwicklern üblich, das Programm manchmal zum Laufen zu bringen, ohne wirklich zu wissen, warum das Update funktioniert hat!

Die Kunst, Dinge zu ändern, bis ein Fehler verschwindet, ohne zu verstehen, was sie verursacht hat oder warum die Änderung ihn behoben hat, wird oft als "Voodoo-Programmierung" bezeichnet und ist kein Kompliment. Auf keinen Fall können Sie sicher sein, dass Sie einen Fehler wirklich behoben haben , anstatt ihn für den speziellen Fall, den Sie untersucht haben, teilweise zu beheben, wenn Sie nicht verstehen, was ihn verursacht hat.

Im schlimmsten Fall haben Sie nichts anderes getan, als den Fehler zu beheben: Ich erinnere mich, dass Zeigerfehler aus dem ersten Jahr an der Uni, als viele Schüler C und Zeiger zum ersten Mal lernten, oft aufhörten, sich zu manifestieren, wenn sie Dinge änderten zufällig, da die Änderungen die Datenstrukturen im Speicher so weit neu anordnen würden, dass der Zeigerfehler über ein anderes Speicherbit stapft. Offensichtlich , das hat nicht geholfen überhaupt .

Allerdings ist die kommerzielle Realität des Programmierens oft so, dass es wichtiger ist, den Kunden davon zu überzeugen, dass ein Fehler behoben ist, als sich selbst davon zu überzeugen. Ich würde niemals empfehlen, dass Sie eine Fehlerbehebung deklarieren, wenn Sie keine Ahnung haben, was sie verursacht hat, aber wenn Sie sehen, dass ein Code problematisch ist, und Sie ihn überarbeitet haben, auch wenn Sie "nicht zu 100% sicher" sind, wie dies die Ursache für die Fehlerbehebung ist Fehler zu manifestieren, manchmal müssen Sie nur zum nächsten Fehler übergehen, bevor der Client zu laut über Ihren langsamen Fortschritt schreit.


15

Wenn Sie der Meinung sind, dass ein Kunde wütend ist, dass es zu lange dauert, einen Fehler zu beheben, stellen Sie sich vor, wie wütend er über einen Fehler sein wird, von dem Sie behaupteten, dass er behoben wurde, oder über eine Korrektur, die etwas anderes verschlimmert. Wenn es sich bei Ihrem Fix nur um eine Problemumgehung oder Problembehebung handelt, werden Kunden ihn in der Regel immer noch begrüßen, aber Sie müssen ehrlich sein, was er ist, und Sie müssen so viel Protokollierung durchführen, wie Sie benötigen, um ihn tatsächlich zu beheben.

Wenn Sie sich ziemlich sicher sind, dass Sie das Problem behoben haben, aber nicht wissen, warum das Problem behoben wurde, fragen Sie jemanden. Die meisten Ingenieure, die ich kenne, lieben es , solche Fragen zu stellen, weil das Geheimnis dahinter steckt.


Ich bin damit einverstanden, dass Sie es definitiv nicht als "repariert" bezeichnen sollten, wenn Sie nicht sicher sind, dass es nicht einfach verschoben oder verborgen wurde. Dennoch wird es nicht allzu schrecklich sein, zuzugeben, dass Sie "einen Problembereich in verwandtem Code behoben" haben und nun "den Fehler nicht reproduzieren können" - in der Vergangenheit haben meine Teams diese als "CNR in v <Versionsnummer" protokolliert > "
PeterL

6

Das Ändern von Sachen, bis der Bug nicht mehr vorhanden ist, ist in der Regel eine schlechte Übung, aber leider eine Realität für einige Leute.

Ich bin der festen Überzeugung, dass Sie niemals Code schreiben sollten, der Sie nicht verstehen, was er tut oder warum er es tut. Wie können Sie sicher sein, dass Sie, obwohl Sie den Fehler behoben haben, den Sie beheben wollten, noch nichts kaputt gemacht haben?

Im Allgemeinen sollten Sie vor dem Beheben eines Problems / Fehlers eine Ursachenbewertung / -analyse durchführen, um festzustellen, warum das Problem auftritt und ob es repliziert werden kann. Dann sollten Sie den Code lesen und verstehen, warum der Code den Fehler verursacht. Sobald Sie dieses Verständnis haben, können Sie sich damit befassen, wie das Problem behoben werden kann, und andere Bereiche bestimmen, auf die sich Ihre Änderung (en) auswirken. Unit-Tests können hier wirklich helfen!

Ich habe eine Reihe von Codeänderungen gesehen, die durchgeführt wurden, um ein Problem zu beheben (was großartig ist), aber es führte leider zu anderen Problemen, da der Entwickler nicht wusste, welche Auswirkungen die Änderungen hatten. Viele dieser "Korrekturen" verschleiern lediglich die zugrunde liegende Ursache des ursprünglichen Problems und führen zu Komplexität und weiteren Fehlern.

Trotzdem habe ich einige Probleme im Code nur durch Assoziationen behoben. Wo ich etwas geändert / überarbeitet / überarbeitet habe und es andere ausstehende Fehler behoben hat. Also, obwohl ich nicht weiß, was sie ursprünglich verursacht hat, habe ich zweifelhaften Code gefunden und "repariert" - was auch passiert ist, um diese Fehler zu beheben. Ich decke solche Änderungen mit Unit- und Integrationstests ab, um die Integrität der geschäftlichen und technischen Anforderungen der Funktion sicherzustellen.


4

Oder ist es unter Entwicklern üblich, das Programm manchmal zum Laufen zu bringen, ohne wirklich zu wissen, warum das Update funktioniert hat?

Es gibt mindestens drei große Probleme damit:

  1. Dies führt zu einer Denkweise der schwarzen Magie, in der Sie die Idee aufgeben, den Code zu verstehen, und stattdessen Teile in der Hoffnung herumzuschieben, dass Probleme verschwinden. Dies ist das Programmieräquivalent zum Herumschieben von Lebensmitteln auf Ihrem Teller, in der Hoffnung, dass Ihr Abendessen so gegessen aussieht, dass Ihre Eltern Sie nicht mehr von Ihrem Gemüse essen lassen.

  2. Sie können nicht wissen, dass der Fehler tatsächlich behoben oder nur durch Ihre Änderung maskiert ist, es sei denn, Sie verstehen a) was das Problem war und b) wie Ihre Änderung das Problem löst.

  3. Der Fehler ist wahrscheinlich nicht behoben und wird Sie in naher Zukunft erneut beißen.


2

Ich sehe zwei Szenarien: Sie haben an etwas anderem gearbeitet und der Fehler ist nicht mehr aufgetreten, solange das andere noch nichts kaputt gemacht hat, müssen Sie das so ziemlich zulassen - Sie haben getan, was gebraucht / gewollt wurde und was war eine unvorhergesehene und unerklärliche positive Nebenwirkung.

Das andere ist, dass Sie an diesem Fehler arbeiten und eine zufällige Änderung dazu führte, dass die Dinge funktionierten. Das ist inakzeptabel. Wenn Sie nicht wissen, was der alte Code falsch gemacht hat, wissen Sie wahrscheinlich nicht, was der neue Code falsch macht.

Ich kann mir keinen guten Grund vorstellen, den zweiten Fall zu überprüfen - wenn es sich um einen kritischen Fehler handelt, ist es wichtig, ihn richtig zu machen. Wenn es sich um einen nicht kritischen Fehler handelt, können Sie zumindest sicher sein, dass Sie mit Ihrem "Fix" keinen kritischen Fehler einführen.


0

Oder ist es unter Entwicklern üblich, das Programm manchmal zum Laufen zu bringen, ohne wirklich zu wissen, warum das Update funktioniert hat?

Ich denke, es ist heutzutage sehr, sehr verbreitet. Das liegt an Google und Stackoverflow. Sie haben ein Problem mit Ihrem Code. Gehen Sie einfach auf Google, suchen Sie nach einer Lösung, beheben Sie das Problem und fahren Sie mit dem nächsten Problem fort.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.