Warum treten Fehler so häufig auf und was können wir tun, um sie zu vermeiden?


20

Off-by-One-Fehler scheinen einer der häufigsten (wenn nicht sogar der häufigste) Programmierfehler zu sein (siehe /software/109/what-are-common-mistakes-in-coding) und konventionelle Weisheit).

Was ist der Grund, warum diese so häufig sind? Hat das etwas mit der Funktionsweise des menschlichen Gehirns zu tun?
Was können wir tun, um zu verhindern, dass ein Fehler zum Opfer fällt?


8
Sind sie gemeinsam? Ich produziere meinen fairen Anteil an Bugs, aber nur sehr selten treten einzelne Fehler auf. Vielleicht, weil ich meistens Python benutze, dh Iteratoren benutze, anstatt mit Indizes zu jonglieren? (Und: Was sagt uns das?;))

Je weniger Sie darüber nachdenken müssen, desto produktiver sind Sie?
Malfist

@delnan: Ich stimme zu. Off-by-One-Fehler werden normalerweise zuerst beim Codieren erkannt (bevor ich überhaupt in eine offizielle "Testphase" übergehe).
FrustratedWithFormsDesigner

7
Ich hätte fast aus Versehen die vorherige Frage beantwortet ...
DevSolo

> Was können wir tun, um zu verhindern, dass ein Fehler zum Opfer fällt? Verwenden Sie einen Iterator .
Jim G.

Antworten:


18

Es hängt irgendwie damit zusammen, wie das menschliche Gehirn arbeitet. Wir wollen für Aufgaben "gut genug" sein, die normalerweise keine Präzision auf Ingenieurniveau erfordern. Es gibt einen Grund, warum die Fälle, mit denen wir die meisten Probleme haben, "Randfälle" genannt werden.

Der wahrscheinlich beste Weg, um Fehler zu vermeiden, ist die Kapselung. Anstatt beispielsweise eine for-Schleife zu verwenden, die eine Auflistung nach Index durchläuft (von 0 bis count - 1), verwenden Sie eine For-Each-Style-Schleife mit der Logik, an welcher Stelle der Enumerator anzuhalten ist. Auf diese Weise müssen Sie die Schranken beim Schreiben des Enumerators nur einmal richtig stellen, anstatt jedes Mal, wenn Sie die Auflistung durchlaufen.


6
+1 für die Kapselung. Die schlimmsten Fehler, die ich je gesehen habe, sind, wenn ein Teil des Programms 1-basiert und ein Teil 0-basiert ist und bei jeder einzelnen Funktion, die es verwendet, muss man sich merken, welche es war und ob man muss mach den umbau oder nicht und in welche richtung soll das gehen. Vor ein paar Monaten musste ich einen schwierigen Off-by- 2- Fehler ausfindig machen , weil eine schlechte Verkapselung bedeutete, dass jemand an zwei getrennten Verbindungsstellen Off-by-1-Fehler machte. Es gab überall Umrechnungen, die man nicht verfolgen konnte, und ich konnte sie mit einer Methode auf eine Umrechnung reduzieren.
Karl Bielefeldt

2
Ich würde gerne mehr über die Wissenschaft erfahren, wenn jemand mehr Informationen hat. Ich denke auch, dass programmatisches Styling wie CSS aus diesem Grund so frustrierend ist, wenn es um Kanten geht ...
Company Laser

7

Es ist etwas Besonderes, wie das Gehirn mit Grenzen und Kanten umgeht.

Während es für das Gehirn einfacher ist, in Bereichen und Räumen zu denken , scheint die Fokussierung auf eine Kante etwas mehr Aufmerksamkeit zu erfordern. Hier ist, wie es passiert, vorübergehender Aufmerksamkeitsverlust oder ungenügende Konzentration und Sie haben die Grenze verpasst.

Eine weitere leichte zusätzlich zu dem Problem ist , dass verschiedene Programmierumgebungen verschiedene Indexierungssysteme haben entweder 0 oder 1 beginnen , die möglicherweise Verwirrung für die Menschen aktiv an den beiden Arten von Umgebungen ausgesetzt hinzufügen.


4

Ich glaube, es liegt am Kontextwechsel. In unserem täglichen Leben verwenden wir in der Regel 1-basierte Indizes. Aus diesem Grund ist unser Gehirn nicht in der Lage, das richtige Verhalten in das Langzeitgedächtnis einzubrennen.


2
Und dann macht es Spaß, zwischen Programmiersprachen zu wechseln, deren DO-Index bei 1 beginnt (wie z. B. PL / SQL).
FrustratedWithFormsDesigner

3
+1 dafür. Die 1-indizierte Nummerierung beantwortet die Frage "Wie viele gibt es?", Die den meisten Aufgaben der realen Welt genau entspricht. Bei 0-indexiert geht es um "Welche Position haben die einzelnen Elemente?", Was im Meatspace weniger hilfreich ist.
Dan Ray
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.