Software Engineering

Software

Software ist nicht nur ein Programm sondern auch alle dazugehörigen Informationen, welche von Computern verarbeitet werden. Des Weiteren zählen auch die Dokumentationen und die Konfigurationsdaten, welche für ein ordnungsgemäß, funktionierendes Programm benötigt werden aus als Software. Somit Zählen zugehörige Informationen und Materialien zur Unterstützung von Installation, Programmausführung, zur Reparatur und zur Erweiterung des Programms als Software.

Software beinhaltet:

  • ein ausführbares Programm und seine Daten
  • zugehörige Konfigurationsdateien
  • die Systemdokumentation (Systemanforderungen)
  • die Benutzerdokumentation (Handbuch)
  • selbst die dazugehörige (Hersteller-) Website über das Programm, beispielsweise um sich über Probleme zu informieren oder um Updates herunter zu laden)

Unterscheidung von Software

Es zwei Unterscheidungstypen:

Das Generische Produkt

Dabei handelt es sich (in der Vergangenheit, als das im Karton, eingeschweißte Produkt) z.B. Microsoft Word, Open Office, Acrobat,…
In USA auch oft bekannt als „shrink-wrapped software“, zu deutsch in Schrumpffolie verpacke Software. Welche für den Markt als „fertiges“, ganzes Produkt verkauft wurde.

Die Sonderanfertigung

Die Individualsoftware, welche als Auftragsfertigungssoftware genau an die Bedürfnisse eines Unternehmens oder Person entwickelt wird. Zum Beispiel SAP Software Pakete, ein Flugsicherungssystem oder auch ein Buchungssystem.

Dabei sind die Grenzen oft verwischt, da beispielsweise ERP-Software wie SAP, Oracle oder auch Microsoft Software aus einer Kernkomponente besteht, welche als generisches Produkt angesehen wird, welche dann an die Arbeitsabläufe eines bestimmten Unternehmens angepasst werden und dadurch zu einer Sonderanfertigung wird.

Eigenschaften

Software ist im Gegensatz zu Hardware einzigartig, da es keine „echten“ physischen Grenzen gibt. So nutzt sich Software nicht ab, es sind keine Ersatzteile und trotzdem muss die Software ständig aktualisiert werden. Diese Aktualisierungen geben der Software die Möglichkeit, mit Änderungen in Umgebungen umzugehen. Beispielsweise um sicher zu stellen, dass die Software nicht veraltet und auch auf neuer Hardware (Schnellere CPU, größerer Speicher, andere Architektur) lauffähig bleibt.
Andernfalls altert die Software und veraltet, da diese in neuer Umgebung nicht mehr funktioniert.

Software ist schwer zu „messen“ im Gegensatz zu Hardwarekomponenten.
Wir definieren beispielsweise Hardware über Werte, wie Stromverbrauch, Kapazität oder Geschwindigkeit. Wie definiert man die Qualität von Software? Kann man Software überhaupt messen? Sind Dinge, wie beispielsweise Anzahl von Codezeilen dafür ausschlaggebend? Oder Messen wir immer nur die Hardware damit?

Gute Software zeichnet sich durch guten Code aus. So ist ein Code, mit vielen unnötigen Sprüngen oder Abfragen langsamer. Darum ist ein durchdachtes Konzept so wie ein gutes (Code-) Design sehr wichtig.

Lebenszeit

Während Hardware ständig altert und dadurch ausgetauscht werden muss, ist die Lebenszeit von Software viel länger. Betriebsystem altern im Gegensatz zur Hardware nur halb so schnell, sprich im Schnitt, überlegt ein Betriebsystem zwei Computer, bevor es ein Upgrade auf eine neue Version gibt. Anwendersoftware lebt dagegen ein vielfaches länger.

Vielleicht kennen Sie es ja selbst, dass in der Regel Hardwareänderungen wie beispielsweise Festplatten (Umrüstung von HDD auf SSD), Monitore (17″ auf 21″) oder Drucker häufiger gewechselt werden als Ihr Betriebsystem.

Und Anwendungssoftware wie beispielsweise Microsoft Office Pakete, welche zusammen mit dem Betriebsystem Windows 7 erworben wurden noch heute auf Ihrem Windows 8 oder Windows 10 Betriebsystem laufen.

Die Software-Krise

Der Begriff „Software Crisis“ oder Software-Krise wurde in den 50er und 60er Jahren geprägt und bezieht sich hierbei auf mehrere Probleme:

  • Die Preise für neuere und bessere Hardware sanken, im Gegenzug stiegen aber die Kosten für die Entwicklung von Software
  • Programme konnte nicht rechtzeitig fertiggestellt werden, da die Anpassungen an neue Hardware nicht im Budget lagen
  • Die ausgelieferte Software war oft unvollständig und enthielt zu viele Fehler

Dazu kamen dann noch technologische Probleme wie:

  • Mangel an geeigneten Programmiersprachen
  • Mangel an Erfahrung bei der Umsetzung
  • Mangel an Entwicklungsumgebung / Entwicklungssoftware

Software Engineering

Software Engineering bezieht die disziplinierte Anwendung von technischen, wissenschaftlichen und mathematischen Prinzipien zur wirtschaftlichen Herstellung von qualitativ hochwertiger Software.
Dabei bezieht sich Qualität auf den Grad, in dem ein Produkt seinen Anforderungen oder den Bedürfnisse des Anwenders entspricht.

Ich beziehe mich dabei auf die Aussagen von W.S. Humphrey, aus dem seinem Buch The Software Engineering Process: Definition and Scope; ACM
SIGSOFT Software Engineering Notes, Vol. 14, Issue 4, 1989

Der Begriff Software Engineering entstand durch das systematische, disziplinierte, quantifizierbare Herangehen an die Entwicklung einer Anwendung, den Betrieb und die Wartung von Software. Also unter der Anwendung von Ingenieurwissen eine Software zu entwickeln.

Der Duden deklariert Informatik wie folgt: Der Begriff Software-Engineering steht auch für die Auffassung, dass die Erstellung, Anpassung und Wartung von Programmsystemen kein “künstlerischer”, sondern vorwiegend ein ingenieurmäßig verlaufender Prozess ist.

Bereiche der Software-Entwicklung

  • Software Anforderungen: Die Anforderungen definieren, was von den Systemen erwartet wird.
  • Software-Design: Wie ist das System aufgebaut?
  • Softwaretest: Die systematische Identifizierung (und Beseitigung) von Fehlern.
  • Software-Wartung
  • Softwarekonfigurationsverwaltung: Verwaltung verschiedener Versionen und Konfiguration einer Software.
  • Software Engineering-Prozess: Definition und Verbesserung von Softwareentwicklungsprozessen.
  • Software-Engineering-Tools und -Methoden
  • Software Qualitätssicherung)

System und Software Engineering

Systembezogene Aktivitäten, z.B. die Definition des Gesamtsystems Ziele und Anforderungen, Zuordnung von Systemfunktionen zwischen Hardware und Software, Hardware- / Software-Schnittstellen definieren, so wie Akzeptanztests sind wesentlicher Bestandteil des Software Engineering, aber auch Teil von System Engineering. Die Grenzen verwischen hier stark. Da Software Engineering ein Teil des Systems Engineering ist.

Erfolgsquoten bei der Entwicklung

De Standish Group, Boston, Massachusetts verkündete im April 23, 2009: „Die diesjährigen Ergebnisse zeigen einen deutlichen Projektrückgang.

32% aller Projekte waren erfolgreich (wurden pünktlich fertiggestellt, lagen im Budget und beinhalteten alle erforderlichen Eigenschaften und Funktionen).

44% aller Projekte wurden angefochten, da diese was zu spät, über dem Budget und/oder nicht mit all denen vom Kunden geforderten Eigenschaften und Funktionen ausgeliefert wurden.

24% aller Projekte sind fehlgeschlagen, das heisst, sind vor der Fertigstellung storniert, nie an den Kunden ausgeliefert worden oder wurden nie benutzt.

Diese Zahlen bedeuten einen starken Abwärtstrend bei der Erfolgsquote aus vorangegangenen Studien sowie eine signifikante Steigerung der Anzahl von Fehlern in Software.“

Scheitern von Softwareprojekten

Softwareprojekte scheitern aus verschiedenen Gründen. Beispielsweise gilt ein Softwareprojekt als fehlgeschlagen, sobald das Projekt nicht pünktlich an den Kunden ausgeliefert wurde oder nicht mehr im Budget ist.

Gründe für ein Scheitern sind dass die Anforderungen und Systemabhängigkeiten im Vorfeld nicht genau definiert wurden. So sind beispielsweise Anpassungen an die Anforderungen der Software während der Entwicklung sehr viel einfacher als Änderungen der Hardware. Software muss für Hardwareänderungen und Hardwareprobleme geeignet sein.

Ein weiteres bekannte Problem, welche oft zum Scheitern von Softwareprojekten verantwortlich ist, ist der Mangel an Werkzeugen, Mangel an Erfahrung bei der Umsetzung, Mangel an ausgebildeten Entwicklern, so wie falsche Planung schon bei Beginn des Projektes.

Häufig werden auch die komplexen und innovativen Hardwaresysteme auf denen die Software laufen soll unterschätzt wodurch der straffe Zeitplan nicht eigehalten werden kann. Beispiele dafür wären die verspäteten Softwareauslieferungen für den Airbus A380, der Boeing 787 oder das Apple iPhone. Beim Software Engineering geht es darum, „die richtige, funktionale Software“ zu entwickeln und nicht darum 100mal eine Software für den A380 zu entwickeln.

Dei fünfzehn Prinzipien

  1. Qualität hat höchste Priorität
  2. Hochwertige Software ist möglich
  3. Geben Sie den Kunden früh Einsicht in sein Produkt
  4. Beseitigen Sie Probleme, bevor diese in die Anforderungen eingehen und dann im Code landen.
  5. Überlegen Sie sich alternative Designs / Ansätze
  6. Verwenden Sie ein geeignetes Prozessmodell
  7. Verwenden Sie verschiedene Sprachen für verschiedene Probleme
  8. Minimieren Sie die intellektuelle Distanzen im Team
  9. die der Technologie steht vor der Wahl der Entwicklerumgebung. Bevor Sie eine Entwicklerumgebung verwenden, sollten Sie mit dieser vertraut machen und diese verstehen.
  10. Machen Sie es richtig, bevor Sie es verbessern
  11. Code regelmässig ansehen, Code anzusehen und zu verstehen ist oft effektiver als diesen zu testen.
  12. Gutes Management ist wichtiger als gute Technologie. Der Führungsstil muss an die fortlaufende Situation angepasst werden.
  13. Der Umgang mit den Menschen ist der Schlüssel zum Erfolg
  14. Bleiben Sie immer skeptisch! Nur weil jeder etwas gut findet, oder jeder so macht, muss es nicht gut oder richtig sein.
  15. Verantwortung übernehmen

Beim Software-Engineering geht es um das richtige Entwerfen von Software und nicht um das Runterschreiben von Code-Zeilen für Software.