/

BlogSoftware
#Software

Ursprünge

Der Begriff hat ein gewissen Bedrohungspotential. Hier wird eine Krise aufbeschworen, die je nach Sprecher seine eigenen Ursachen haben kann. Der Begriff Softwarekrise ist nicht unbedingt neu, sondern wurde in den Siebzigern zum ersten Mal erwähnt, in späteren Jahren wiederholt (Stichwort NASA [Link]) und hat bis heute nicht an seiner Brisanz verloren. Probleme der Vergangenheit, wie Fachkräftemangel im Bereich Cobol bei Banken, oder die Einführung neuer Technologien und die damit verbundene Unkenntnis, wiederholen sich. Darüber hinaus Lösungsansätze der Vergangenheit werden von der aktuellen Bedeutung von Software überholt.

Software heute

Software ist auf unserem alltäglichen Leben nicht mehr wegzudenken und überall präsent. Software befindet in unseren Computern, auf Smartphones und in mechanischen Bauteilen, wie die Internet of Things Geräte. Während früher die eingesetzten Funktionen über Hardware umgesetzt werden, kommen heute billige allgemeine verfügbare Prozessoren zum Einsatz, während Software un die speziellen Umsetzungen kümmert. Interessant dabei ist, dass die meisten Benutzer nicht wissen oder auch keine Interesse daran haben, welche Software im Hintergrund läuft, wie diese aufgebaut ist und warum sie funktioniert. Der übliche Benutzer oder Konsument will nur wissen, dass die Software intuitiv funktioniert und die gewünschten Resultate liefert.

Hardware vs. Software

Viele Funktionen, ob im Computer, in Fabriken oder auch z.B. im Auto wurde in den Anfängen der IT über spezielle Hardwarekomponenten realisiert. Diese Komponenten verarbeitet einfache bis zu komplexe Algorithmen. Beispiele für einfache Komponenten wären z.B. Heizungssteuerungen, Beispiele für komplexe Bausteine wären Lösungen zur Verschlüsselung von Daten. Im Laufe der Zeit gewann die Software an Oberhand. Die Herstellung von Hardwarekomponenten ist ein teurer und langwieriger Prozess, Software dagegen erlaubt kurzfristige Änderungen und Neuentwicklungen ohne den damit verbundenen Produktionsprozess. Und das Beste: Software läuft auf herkömmlichen Prozessoren. Also spricht nicht gegen mehr Software, oder?

Software als Problem

Mit dem Aufkommen der Softwareentwicklung und damit den neuen, vielfältigen Möglichkeiten wurden die Aufgaben anspruchsvoller und die Algorithmen komplizierter. Mit der Zunahme der Komplexität stieg natürlich auch die Anzahl von Programmierfehler auf bisher unbekannte Maße. Die Ersparnis auf Seiten der hardware standen die immensen Kosten der Softwareentwicklung, dem fehlendem Personal und Erfahrungen. Und prompt waren wir beim Begriff Softwarekrise. Eine Krise, die immer wieder in den Medien erwähnt wird und bis heute nicht überwunden zu sein scheint. 

Ursachen

Vielleicht kennt jemand noch den Begriff Spaghetti-Code im Bereich der frühen Programmiersprachen (Fortran, Basic, usw.). Die anfänglichen Probleme basierten auf fehlende Erfahrung, fehlende Tools und natürlich Programmiersprachen, die bei voller Ausschöpfung ihrer Möglichkeiten zu maximalen Schaden führten. Die fehlende Softwarequalität führte oft zum Scheitern vieler ambitionierter Entwicklungsprojekte. Es spielt keine Rolle, ob Projekte bei Null anfangen oder ob diese auf Standardprogrammen bzw. -bibliotheken aufsetzen, die Probleme sind stets ähnlicher Natur. Wir haben also zwei Ursachen identifiziert:

  • Die für das Projekt ungeeignete Programmiersprache
  • Die mangelhafte Softwarequalität (hierzu spendieren wir noch einen eigenen Artikel)

Fehler

Software ist nie fehlerfrei, sehen wir mal von einfachen Algorithmen mal ab. Dies wird bei der Planung von Projekten oft nicht berücksichtigt. Die Fehler entstehen

  • bei ungenügender Vorbereitung,
  • unvollständigen Aufgabenbeschreibungen, 
  • Fehler in der Projektumsetzung und Leitung,
  • Unverständnis oder Unkenntnis der Besonderheiten der Softwareentwicklung,
  • durch das Unterschätzen der Komplexität von Software bei Entwicklung un der Wartung.

Also schon bevor die ersten Zeilen Sofwtarecode geschrieben worden sind. Die frühen Fehler führen zu einem hohen Ressourcenbedarf an Zeit und geld in der späteren Qualitätssicherung, wie z.B. Tests.

Bugfixing

Neben den erwähnten konzeptionellen und organisatorischen Fehlern kommen die so genannten Bugs, also Fehler im Softwarecode hinzu. Software muss vor ihrer Auslieferung getestet werden, weil Software nach Fertigstellung leider nicht immer problemlos funktioniert. Fehler sollten identifiziert, dokumentiert und, wenn möglich, behoben werden. tests sind in der Regel nur Stichproben, daher werden in vielen Fällen Fehler übersehen, weil die Software erwartungsgemäß funktioniert. Doch spätestens mit der Änderung der Rahmenbedingungen oder der Weiterentwicklung der Software in neue Versionen bzw. Releases tauchen diese Fehler wieder auf. Daher sollte auch Software eine gewisse Toleranz für geänderte Situationen mitbringen. 

Vorwärts

Die Entwicklung neuer Hardware führt zu einer rapiden Leistungssteigerung der Prozessoren, stärkeren Parallelisierung und des Zunahme des verfügbaren Arbeitsspeichers. Damit ergeben sich neue Einsatzgebiete und damit neue Komplexitäten. Trotz neuer Hardware baut der Großteil der eingesetzten Standard-Software noch auf Hardwarearchitekturen vergangener Zeiten. Als z.B. Windows auf dem Markt kam, gab es keine Multiprozessoren. Ein Großteil des Softwarecodes dürfte noch aus den Anfängen stammen. Ähnlich bei anderen Betriebssystemen und Anwendungen.

Die Anpassung von Software an neue Möglichkeiten aktueller Hardware bedarf entsprechender Anpassung und Weiterentwicklungen. Die Weiterentwicklung von komplexen Programmen. Das widerum führt zu neuen Problemen, die die Softwareindustrie  durch neue Paradigmen, neue Softwarelösungen oder Programmiersprachen zu lösen versucht. Leider ist zu beobachten, dass trotz neuer Hardware die Anwendungen durch neue Softwareansätze ausgebremst wird. Würde man z.b. Software aus den 80ern einsetzen, wäre die Überraschung groß, wie performant die gestartete Textverarbeitung auf der neuen Hardware läuft. Optimierungsversuche führen zu neuer Komplexität und damit neuen Fehlern.

Lösungen

Eine allgemeingültige Lösung gibt es sicher nicht. Bei unseren Projekten betrachten wir zuerst die Anforderungen, die eine entsprechende Priorität bekommen. Die Priorität entscheidet über die Fehlerakzeptanz und Testbedarf der umgesetzten Funktionen. Tests erfolgen auf verschiedenen Ebenen, im Coding (Unittests), beim Debugging (mit entsprechenden Teststellen) und von außerhalb über Testapplikationen. Die Wichtigkeit einer Funktion steigt auch mit der Nutzung dieser durch anderen Code. Hier helfen Profiler und Analysetools, die auf die kritischen Stellen verweisen. Damit wollen wir der Softwarekrise zumindest bei unseren Projekten entgegenwirken.