Was ist Ihrer Meinung nach die Hauptursache für Softwarefehler (und wie kann man sie minimieren)? [Geschlossen]

14

Ich definiere den Defekt als:

"Etwas innerhalb des Anwendungsdesigns oder Codes, das verhindert, dass es gemäß den Anforderungen funktioniert."

Ich suche nach Ideen zu den Ursachen von Fehlern, z. B. dem Faktor Mensch, fehlenden Tests, fehlenden Prototypen und möglichen Ideen, um diese zu mindern.

Chris Buckett
quelle
5
Ich würde "Anforderungen" durch "Benutzeranforderungen" oder "erwartetes Verhalten" ersetzen, da selbst Anforderungen möglicherweise falsch sind.
Mouviciel
Dass die Anforderungen falsch sind? (und der Code richtig?)

Antworten:

13

Die Hauptursache für Softwarefehler ist die Interpretation.

Die Interpretation eines Merkmals durch den Kunden unterscheidet sich von der Interpretation durch den Designer.

Die Interpretation des Designers unterscheidet sich von der Interpretation des Programmierers.

Die meisten Methoden haben Wege gefunden, um diesem Effekt entgegenzuwirken. Aber am Ende sind wir nur Menschen und wir sind nicht makellos. Außerdem herrscht oft Zeitdruck und die meisten Methoden werden oft übersprungen, wenn sie unter Druck stehen.

Tests können die Probleme nur frühzeitig erkennen. Aber auch Tester sind Menschen, und es ist unmöglich, 100% zu testen. Wenn du loslassen willst, bevor das Universum endet.

Toon Krijthe
quelle
Wenn ich nur dieses verdammte Gedankenlesermodul zum Laufen bringen könnte, wäre alles in Ordnung.
HLGEM
@Gamecat: Und es wird noch schlimmer, wenn man mit Menschen auf der ganzen Welt zusammenarbeitet. Es gibt nicht nur eine Sprachbarriere (häufig spricht mindestens einer der Teilnehmer nicht so gut Englisch), sondern es gibt auch kulturelle Unterschiede.
Matthieu M.
2
Sie haben eines verpasst - "Die Interpretation des Programmierers unterscheidet sich von der Interpretation des Compilers" ...;)
Alex Feinman
@ Alex: Ich weiß, was der Compiler mit dem Code machen wird, den ich schreibe. Dieses Wissen war nicht einfach zu erlangen, aber ich habe es geschafft. Jetzt haben wir meine Interpretation des Codes, den ich nicht geschrieben habe, im Gegensatz zu den Compiler- und Laufzeitdaten.
David Thornley
@David, wenn Sie nicht den Compiler geschrieben und gepflegt haben, ist Ihr Wissen darüber, was die Innards tun, eine Abstraktion dessen, was tatsächlich vor sich geht.
Alex Feinman
8

Ich betrachte die Hauptursache für Softwarefehler als Programmierer.

Das soll nicht nur lustig sein, sondern auch, weil eines der großen Probleme, die ich bei meiner Arbeit festgestellt habe, das Sammeln schlechter Anforderungen ist, verbunden mit einem schlechten Verständnis der Problemdomäne, was zu schwerwiegenden Fehlern und Usability-Problemen im Projekt führt.

Ein Teil davon ist darauf zurückzuführen, dass man nicht bereit ist, die Terminologie des Endbenutzers zu lernen / zu verstehen, was zu Missverständnissen führt.

Ein Teil davon rührt daher, dass zu früh im Prozess über Technologie gesprochen wird, wenn Leute keine Ahnung haben, wovon Sie sprechen oder warum es darauf ankommt.

Das beste Beispiel dafür war, als ich hörte, wie einer der Programmierer versuchte, herauszufinden, wie lange die Fragen / Antworten in Zeichen sein würden ... Ich wusste, dass er versuchte, herauszufinden, welche Feldgröße in der Datenbank verwendet werden sollte, aber das Die Abteilung, die dies anforderte, hatte nicht den geringsten Grund, warum das von Bedeutung war - oder dass Leerzeichen gezählt wurden. Für uns scheint das offensichtlich, aber für sie war es eine echte Offenbarung.

AnonJr
quelle
8

Die Hauptursache für Mängel ist schlechtes Management ;)

Im Ernst, ein Entwickler, der in gutem Zustand arbeitet, der nicht überarbeitet werden muss, der Qualität einschränkt, über geeignete Werkzeuge, ruhige Arbeitsbedingungen usw. verfügt, wird weniger Fehler produzieren als jemand, der unter starkem Druck arbeitet.

Das Management, das schlechte Entwickler einstellt, hilft auch dabei, die Anzahl der Fehler zu erhöhen.

Schlechtes Management .

(Haftungsausschluss: Ich soll Entwickler einstellen und verwalten)


quelle
denke nicht, dass das das Hauptproblem ist, die meisten Entwickler arbeiten unter ruhigen Bedingungen. Ich bin mit AnonJr und Gamecat einverstanden - Unfähigkeit, die Problemdomäne vollständig zu verstehen, nur schnelle Iterationen und Tests können helfen.
Radekg
1
Wie kommt es, dass die meisten Entwickler unter ruhigen Bedingungen arbeiten? In einem Dutzend Unternehmen, die ich im letzten Jahr besucht habe, war keines still.
Gutes Management kann Sie weit bringen, schlechtes Management kann Sie nirgendwo hinbringen!
Chris
+1 in Bezug auf ruhige Arbeitsbedingungen. Jedes Unternehmen, in dem ich jemals gearbeitet habe, war eine Dilbertesque-Kabinenfarm, auf der man ständig Leute hören kann, die einen Meter von einem entfernt sind.
Bobby Tables
5

Ich sehe keine primäre Ursache - aber eine Ursache, die nicht erwähnt wurde, ist die unbeabsichtigte Kopplung mit anderem Code . Das Schreiben von Code mit unsichtbaren Nebenwirkungen, das Durchbrechen von Abstraktionsebenen, die Annahme von Daten (Variablen werden nicht, Konstanten werden nicht und keine Benutzereingaben sind sicher) und das Unmengen von Dingen, die nicht betroffen sein müssen sich mit und so weiter.

Die meisten der von mir untersuchten Entwicklungspraktiken beschränken sich auf das Reduzieren N, da die Komplexität eines Programms zumindest O(N^2)und möglicherweise sehr hoch ist O(k^N). Das Definieren Nist eine Übung für den Leser, aber ich denke hier an Dinge wie die zyklomatische Komplexität. Das Einkapseln von Logik und Daten bewirkt das Reduzieren von N durch Unterteilen des Problems.

Alex Feinman
quelle
4

Die Unfähigkeit, an alles zu denken.

JeffO
quelle
4

Unvollständig sein

Wonko der Vernünftige
quelle
4

Kommunikationslücke. In der Anforderungserfassung. Im Zeitplan. Im Designdokument. In funktionaler Spezifikation. Im Code (Lücke zwischen dem, was der Programmierer will und dem, was er dem Compiler sagt).

Soziale Etikette. Es ist sozial inakzeptabel, jemanden als unfähig zu bezeichnen.

aufather
quelle
3

Anstürmen in Dinge, ohne sie vollständig zu verstehen. Beginnen Sie mit dem Schreiben von Code, ohne die funktionalen Anforderungen oder die technische Architektur vollständig zu verstehen.

Die Programmierung sollte fast automatisch erfolgen, indem nur das notiert wird, was selbstverständlich ist und bereits im Kopf erarbeitet wurde. In der Praxis gibt es viele Fehler im Code, die versuchen, genau zu bestimmen, was der Code tun soll. Ich habe mich selbst oft schuldig gemacht.

Joeri Sebrechts
quelle
Nach vier Monaten in einem neuen Job bin ich immer noch zu einem kleinen Teil damit beschäftigt, irgendetwas "vollständig zu verstehen". Ich werde nicht eilen; Was Sie sagen, ist wahr. Scheiße, so lange unproduktiv zu sein.
DarenW
Es dauerte ein oder zwei Jahre, bis ich mit dem System, an dem ich arbeite (2-Millionen-Linien-System), die volle Geschwindigkeit erreicht hatte. Selbst dann gibt es große Teile davon, die ich einfach nicht kenne.
Joeri Sebrechts
2

Errare humanum est

mouviciel
quelle
2

Zeitplan Druck ist certianly eine starke Quelle.

Eilige Entwickler nehmen sich nicht die Zeit, die Anforderungen vollständig zu spezifizieren oder die Absichten hinter den Anforderungen vollständig zu verstehen oder Alternativen vollständig zu untersuchen, um die beste Lösung zu finden, oder alle Randfälle und Wechselwirkungen der von ihnen vorgenommenen Änderungen vollständig zu überdenken, oder Entwickeln Sie einen vollständigen Satz von Testfällen oder führen Sie den gesamten Komponententest oder einen vollständigen Integrationstest durch oder berücksichtigen Sie Plattformabhängigkeiten vollständig, testen Sie das Installationsprogramm vollständig oder dokumentieren Sie vollständig, was sie getan haben, damit der nächste Entwickler verstehen kann ....

Ahelly
quelle
2

Eine andere Sache, die erwähnt werden sollte, ist, keinen Außenseitertest zu haben. Wenn der Entwickler die Tests schreibt und ausführt, testet er nur seine Interpretation, nicht die tatsächliche Anforderung. Während von den Entwicklern geschriebene Komponententests nützlich sind, um einige Fehler zu erkennen, haben die meisten Fehler diese Tests bestanden, entsprechen jedoch nicht den Wünschen oder Bedürfnissen des Benutzers. Jede Software, die nicht von einer anderen Person als dem Entwickler getestet wurde, wird nicht getestet (und damit meine ich nicht, nur die Tests des Entwicklers auszuführen).

HLGEM
quelle
2

Das liegt daran, dass Software-Engineering von Natur aus komplex ist. Der Aufsatz "No Silver Bullet" diskutiert dies.

Ironischerweise berühren viele der anderen Antworten in der Sprache dieses Aufsatzes Themen, die "aus Versehen komplex" sind, während in Wirklichkeit das meiste, was Softwareentwickler tun, "im Wesentlichen komplex" ist Software ist schwierig, Software wird Fehler enthalten, und wir müssen damit umgehen.

Peter Eisentraut
quelle
1

Das Versagen, Software als ein Netzwerk von Zustandsautomaten zu verstehen, die Prinzipien, die ihrem Betrieb zugrunde liegen (Zustände, ihre Bestimmung und Übergänge), und die Wechselwirkungen der Zustandsautomaten.

Huperniketes
quelle
1

Schreiben von Code, der unbemerkt fehlschlägt, im Vergleich zu Code, der alle Fehler meldet.

Björnl
quelle
1

Das Fehlen einer Überprüfung auf Dinge, die "nicht passieren können" oder wahrscheinlich nicht passieren werden, ist ein großes Problem. Manchmal ist das Vollkommene der Feind des Guten. Wenn es sich nicht lohnt, eine gut durchdachte Ausnahmehierarchie zu verwenden, ist eine schnelle und schmutzige Handhabung immer besser als nichts. Ich bin ein RieseFan von schnellem Scheitern, von Asserts und davon, Asserts zu hinterlassen, die einen vernachlässigbaren Einfluss auf die Leistung in Release-Builds haben. Sogar in schnellen und schmutzigen einmaligen Skripten, in denen ich alle Eingabedaten kontrolliere, habe ich eine schnelle / schmutzige Fehlerbehandlung vorgenommen, normalerweise nur mit einer Funktion, die dem Assert entspricht, aber die ganze Zeit aktiv bleibt. Meine Faustregel ist, dass, wenn es nicht wahrscheinlich ist oder Sie denken, dass es nicht passieren kann, es nicht ordnungsgemäß mit einer benutzerfreundlichen Fehlermeldung fehlschlagen muss, aber es sollte zumindest schnell mit einer Fehlermeldung fehlschlagen, die gibt einem Programmierer einige Hinweise, was schief gelaufen ist.

Bearbeiten: Eine nützliche Taktik besteht darin, Asserts als wichtiges Debugging-Tool zu verwenden und sie dort zu belassen, nachdem die Debugging-Sitzung beendet ist. Ab diesem Zeitpunkt verfügt Ihre Codebasis über einige integrierte Sicherheitsprüfungen, die es sehr schwer machen, dass verwandte Fehler jemals wieder auftreten. Dies ist besonders nützlich für Code, der schwer zu unittest ist.

dsimcha
quelle
1

Die Hauptursache für Softwarefehler ist das Schreiben von Code.

Schreib weniger Code und du wirst weniger Bugs haben ;-)

Nlawalker
quelle
0

Auf einer Ebene Management. Aber es ist nicht nur die PHB. Es ist die Verwaltung des Codes selbst, die ein Spiegelbild der Unternehmensführung sein kann oder nicht.

Die Teilnehmer am gesamten "Lebenszyklus" müssen voll in Qualität investieren und ein Produkt herstellen, das einfach nicht stirbt . Software selbst hat das Versprechen, niemals zu brechen, vorausgesetzt, die Abstraktionszuverlässigkeit stimmt. Es ist nur eine Frage, ob die Software-Konstrukteure daran interessiert sind, diese perfekte Operation zu haben.

Paul Nathan
quelle