© StonePictures/Shutterstock.com
Über den Umgang mit Fehlern in der modernen Softwareentwicklung

Vom Irrtum zum Erfolg


Software ist, abgesehen von wirklich trivialen Programmen, umfassend und komplex zugleich. Das bedeutet auch, dass es nach heutigem Kenntnisstand keine fehlerfreien Anwendungen gibt. Dennoch tun wir uns schwer, mit Fehlern umzugehen, und wir beseitigen sie möglichst schnell und ohne Aufsehen zu erregen. Damit vertun wir eine Möglichkeit, dazuzulernen – und zwar sowohl für uns selbst als auch für das gesamte Entwicklungsteam.

Beginnen wir diesen Artikel mit einem Auszug aus einem Bericht des Portals SPIEGEL ONLINE vom 14. Oktober 2018 [1]. Zitiert wird dort eine Studie der Unternehmensberatung Ernst & Jung. In dieser Studie hat ein beachtlicher Teil der Angestellten angegeben, dass Fehler in Unternehmen nicht angesprochen werden. Hauptgründe für das Vertuschen von Fehlern sind nach Einschätzung der Befragten Angst vor Nachteilen für die eigene Karriere oder die Sorge, den Job verlieren zu können. Wie steht es im Bereich der Softwareentwicklung um die Fehlerkultur? Wie gehen wir damit üblicherweise um? Sehen wir zu, dass die Fehler möglichst klammheimlich korrigiert werden, bevor jemand etwas davon mitbekommen hat, oder diskutieren wir die Ursachen und die Beseitigung von Fehlern offen? In diesem Artikel wollen wir uns dem Thema aus verschiedenen technischen und nicht technischen Perspektiven nähern und daraus Schlüsse ziehen, wie heutzutage ein adäquater Umgang damit aussehen kann. Beginnen wir mit den möglichen Folgen von Softwarefehlern.

Kleiner Fehler, große Wirkung

Nicht alle Softwarefehler haben drastische Folgen. Gern publiziert werden die folgenden Fehler und ihre Wirkungen [2]:

  • Absturz der Ariane 5: Ein Softwarefehler wurde durch eine Konvertierung einer 64-Bit-Fließkommazahl in einen 16-Bit-Integerwert verursacht.

  • Schokoladenberg: Das ERP-System des Schokoladenherstellers Cadbury verursachte durch einen Bug eine Überproduktion von Schokoladenriegeln, die nicht abgesetzt werden konnten. 48 Millionen Euro soll der Fehler gekostet haben – ein süßer Albtraum.

  • Probleme bei Mauteinführung: Die technische Umsetzung war zu 2003 geplant. Gestartet ist das System erst drei Jahre später. Die Ausfälle in den Einnahmen belaufen sich auf 3,5 Mrd. Euro.

Grundsätzlich ist jeder Softwarefehler ein Ärgernis für den Kunden. Das System arbeitet nicht so, wie es soll. Im betrieblichen Umfeld werden zum Beispiel Produktionsprozesse gestört; bei der privaten Nutzung muss der Anwender mit Einschränkungen und Unzulänglichkeiten leben.

Arten von Fehlern in der Softwareentwicklung

Was ist eigentlich ein Fehler in Software? Diese triviale Frage führt zu folgenden, nicht ganz einheitlichen Definitionen [3]:

  • Nach DIN 66271: Ein Fehler ist die Nichterfüllung einer festgelegten Forderung, zum Beispiel die Abweichung von einem erwarteten Merkmalswert, und er führt zu Differenzen zwischen den Vertragsparteien.

  • EN ISO 9000:2005: Ein Fehler ist die Nichterfüllung einer Forderung. Ein Mangel ist die Nichterfüllung einer Forderung hinsichtlich des beabsichtigten oder festgelegten Gebrauchs. Mängel haben rechtliche Folgen im Sinne der Produkthaftung.

  • DIN 55350 Teil 31: Ein Fehler ist die Nichterfüllung vorgegebener Forderungen durch einen Merkmalswert, zum Beispiel ein Maß außerhalb eines Toleranzbereichs, wobei die Verwendbarkeit nicht notwendigerweise beeinträchtigt ist.

  • IEEE Standard 1044-1993 Classification for Software Anomalies: Ein Fehler (engl. Anomaly) ist ein Zustand, der von den Erwartungen oder Erfahrungen abweicht. Diese Abweichung kann sich auf Anforderungsspezifikationen, Designdokumente, Benutzerdokumente, Standards etc. beziehen.

  • Telecom Standard TL9000: Dieser branchenspezifische Standard ist eine ISO-9001-Erweiterung. Der Begriff des Fehlers ist nicht explizit definiert. Dennoch wird zwischen technischem Fehlverhalten (Hardware, Software etc.) und Handhabungsproblemen unterschieden, die beispielsweise aus inkorrekten Systemeingaben resultieren.

  • Six Sigma: Ein Managementsystem zur Prozessverbesserung, ein statistisches Qualitätsziel und zugleich eine Methode des Qualitätsmanagements. Demnach ist ein Fehler ein unerwartetes Verhalten, das nicht bei der Entstehung festgestellt, sondern erst in folgenden Entwicklungsphasen entdeckt wird, aber noch bevor das Produkt durch den Nutzer eingesetzt wird. Wird die Software mit dem Fehler an den Kunden ausgeliefert, spricht man von einem Defekt.

Und welche Definition ist für uns Entwickler heute am besten greifbar? Wir verwenden die folgende Begrifflichkeit: Unter einem Fehler in einem Softwaresystem verstehen wir eine Abweichung von einem gewünschten Sollzustand. Nicht jeder Fehler muss zu einer Unbenutzbarkeit der Anwendung führen. Dabei muss man immer den Zeitpunkt der Vereinbarung zwischen den Vertragsbeteiligten zugrunde legen. Ein Beispiel: Wurde für eine Software vor fünfzehn Jahren ein benutzerfreundliches User Interface (UI) vereinbart, kann dieses nicht mit den Maßstäben für ein UI aus dem Jahr 2018 beurteilt werden. Damals waren Touch-Interaktion und heutige Designvorgaben noch nicht bekannt. Man kann deshalb die Software nicht als fehlerbehaftet ansehen. An diesem Beispiel mag die Beurteilung noch einfach sein. Was ist mit Anwendungen, die für Windows XP geschrieben wurden? Wenn eine solche Software unter Windows 10 nicht ohne Probleme läuft, liegt dann ein Fehler vor? Sofern das Projekt und der Vertrag keine kontinuierliche Anpassung an die technische Entwicklung vorsehen, haben wir es nicht mit einem Fehler zu tun. Wir lernen daraus: Heute problemlos funktionierende Software kann aufgrund des technischen Fortschritts morgen durchaus zu Fehlern führen. Es kommt darauf an, ob wir als Hersteller zur Anpassung verpflichtet sind. Der Begriff Fehler hat damit nicht nur eine technische Dimension, sondern auch Bedeutung aus vertraglicher Sicht zwischen Hersteller und Nutzer einer Software.

Man unterscheidet mehrere Arten von Fehlern. Grobe Kategorien sind Syntaxfehler, logische Fehler, Laufzeit- und Designfehler. Sehen wir uns diese Fehlerarten etwas genauer an:

  • Syntaxfehler: Verstöße gegen die Regeln der Programmiersprache. In den meisten Fällen kann diese Art von Fehlern bereits während der Programmerstellung abgefangen werden. Der Programmcode kann nicht kompiliert werden. Der Fehler betrifft i. d. R. nur den Entwickler, also diejenige Person, die direkt am Quellcode arbeitet. Die modernen Entwicklungsumgebungen inklusive der Compiler geben Hinweise darauf, an welchen Stellen im Programmcode etwas im Argen liegt und korrigiert werden muss.

  • Laufzeitfehler: Diese Fehlerart umfasst alle Arten von Fehlern, die während der Programmausführung auftreten. Typische Beispiele sind Wertebereichsüberschreitungen bei Variablen, Zuweisung von Werten bei nicht initialisierten Objekten, falsche Datentypen usw. Besondern häufig und auch schwerer zu entdecken sind Fehler dieser Art beim Datenaustausch zwischen unterschiedlichen Programmteilen, d. h. an den Schnittstellen von Systemen. Werden die übergebenen Daten dabei nicht auf ihre Zulässigkeit geprüft, kann es schnell zu Fehlern während der Programmausführung kommen. Bei der Aktualisierung einzelner Programmbibliotheken muss darauf geachtet werden, dass die Schnittstellen (APIs) sich nicht ändern.

  • Logische Fehler: Das sind Fehler, die in den Algorithmen der Programme begründet sind. Falsche Ablaufstrukturen, fehlerhafte Berechnungen usw. fallen in diesen Bereich. Logische Fehler lassen sich relativ leicht durch ein umfassendes Testen der Software entdecken. Darauf kommen wir später nochmal zurück.

  • Designfehler: Diese Fehler sind im zugrunde liegenden Konzept begründet und können entstehen, wenn beispielsweise von falschen Anforderungen ausgegangen wird. Auch dass sich Anforderungen zu schnell ändern und nicht in eine Überarbeitung des Konzepts eingeflossen sind, kann eine Ursache für Designfe...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang