Software Engineering
Wie die Softwaretechnik die Digitalisierung vorantreibt
Die Digitalisierung nahezu aller Lebensbereiche ist ohne Softwaretechnik nicht denkbar. Softwareprogramme finden sich nicht nur in Computern, Tablets und Smartphones, sondern auch in Autos, Fernsehern und Waschmaschinen. Der Planung und Entwicklung von Applikationen, Firmware und anderen Softwaretechnologien kommt deshalb eine immer größere Bedeutung zu.
Jedes Unternehmen wird damit zum Softwareunternehmen, wie der Netscape-Erfinder Marc Andreessen bereits vor mehr als zehn Jahren erkannte. „Software is eating the world“, so ein viel zitierter Ausspruch von Andreessen. Design, Entwicklung, Integration und Pflege von Software werden zu wichtigen Erfolgsfaktoren. Die Bedeutung von Software Engineering ist daher nicht zu unterschätzen.
- Was ist Software Engineering?
- Welche Teilgebiete umfasst Software Engineering?
- Welche unterschiedlichen Softwaretypen gibt es?
- Was sind die Ziele von Software Engineering?
- Was sind die Vorteile von Software Engineering?
- Tipps für Software Engineering: So finden Unternehmen den passenden Dienstleister
Was ist Software Engineering?
Laut dem Lehrbuch der Softwaretechnik von Helmut Balzert umfasst Software Engineering die „zielorientierte Bereitstellung und systematische Verwendung von Prinzipien, Methoden und Werkzeugen für die arbeitsteilige, ingenieurmäßige Entwicklung und Anwendung von umfangreichen Softwaresystemen.“ Im Deutschen wird der Begriff Software Engineering meist mit Softwaretechnik oder auch Softwaretechnologie gleichgesetzt.
Wie die Definition schon andeutet, ist Software Engineering mehr als Softwareentwicklung oder Software Asset Management, sondern umfasst auch die Konzeption und Planung von Softwareprojekten sowie deren Organisation und Integration in andere Systeme und Datenstrukturen.
Welche Teilgebiete umfasst Software Engineering?
Beim Software Engineering lassen sich folgende Teilgebiete unterscheiden:
Planung und Entwicklung: Im klassischen Projektmanagement folgt die Softwareentwicklung einer klaren Abfolge von Projektschritten, die wie Kaskaden aufeinander folgen. Dieses Vorgehen wird deshalb auch als „Wasserfallmodell“ bezeichnet. Der Prozess beginnt mit dem sogenannten „Lastenheft“, in dem der Auftraggeber detailliert den Funktionsumfang beschreibt, den die zu erstellende Software haben soll. Der (interne oder externe) Auftragnehmer definiert dann im korrespondierenden „Pflichtenheft“, wie er diese Anforderungen umsetzten will.
Ist der Auftraggeber mit dem Pflichtenheft einverstanden, entwickelt der Auftragnehmer die Software nach vereinbarten Plänen und Meilensteinen. Nach Funktions-, Integrations- und Systemtest folgen Auslieferung und Implementierung und schließlich Einsatz und Wartung.
In den vergangenen Jahren wurden die Probleme dieser linearen Vorgehensweise allerdings immer offensichtlicher. Starre Pläne wurden allzu oft von der Wirklichkeit überholt, das fertige Produkte entsprach nicht mehr den Anforderungen und den technischen Möglichkeiten, die sich längst weiter entwickelt hatten.
Deshalb geht man im Software Engineering vermehrt zu agilen Konzepten wie Scrum über. Diese folgen nicht mehr einem vorgegebenen Stufenplan, sondern sind iterativ und modular aufgebaut. Funktionsfähige, wenn auch rudimentäre Varianten einer Software werden so schnell wie möglich als „Minimum Viable Product“ (MVP) beim Kunden getestet. Das Feedback fließt direkt in die Weiterentwicklung ein. Dieser Prozess wird regelmäßig wiederholt, neue Anforderungen oder veränderte Rahmenbedingungen können so besser berücksichtigt werden.
Agile Softwareentwicklung geht häufig mit anderen modernen Konzepten wie DevOps, Continuous Development / Integration (CD / CI) und Infrastructure as Code (IaC) einher. Unter DevOps versteht man die Verzahnung von Entwicklung (Development) und Betrieb (Operations) einer Software. Ein DevOps-Team ist für beide Bereiche zuständig. Das verhindert zum Beispiel, dass sich Entwicklung und Betrieb bei Problemen gegenseitig die Schuld zuweisen.
CD / CI ist ein Entwicklungskonzept, bei dem Software nicht mehr in festen Release-Zyklen, sondern kontinuierlich entwickelt und bereitgestellt wird. Neue Funktionen werden über sogenannte „Feature Flags“ zunächst einem kleinen Kreis an Nutzern zur Verfügung gestellt. Bei Problemen kann jederzeit ein Roll Back zur letzten stabilen Version erfolgen.
Infrastructure as Code (IaC) geht noch einen Schritt weiter und bildet nicht nur die Software, sondern auch die für deren Ausführung notwendigen Infrastrukturleistungen wie CPU Performance, Arbeitsspeicher, Data Storage und Netzwerkanbindung als maschinenlesbaren Code ab. Die Umsetzung erfolgt in einer virtualisierten Umgebung, in der die notwendigen Ressourcen als Infrastructure as a Service (IaaS) zur Verfügung gestellt werden.
Qualitätssicherung und Software Testing: Tests sind ein wesentlicher Bestandteil des Software Engineering, da sich ohne gründliche Prüfung Qualität, Sicherheit und Funktionsumfang einer Software nicht sicherstellen lassen. Beim Testen unterscheidet man prinzipiell zwischen funktionalen Tests, welche die Leistungsfähigkeit eines Softwareprogramms prüfen, und nicht-funktionalen Tests, bei denen Aspekte wie Sicherheit oder Usability im Vordergrund stehen. Auch die Integration in die IT-Infrastruktur und die Zusammenarbeit mit anderen Systemen ist Gegenstand von Software-Tests.
Eine weit verbreitete Methode des Software Testings ist die Statische Code Analyse. Sie überprüft, ob der Quellcode alle semantischen und syntaktischen Vorgaben der gewählten Programmiersprache einhält und deckt außerdem Schwachstellen wie Pufferüberläufe oder Speicherlecks auf.
Um Fehler zu entdecken, die während der Laufzeit auftreten, werden dynamische Tests eingesetzt. Sie prüfen, wie sich die Applikation im Einsatz verhält. Oft werden dynamische Tests mit Fuzz Tests kombiniert, bei denen die Anwendung mit zufälligen Eingaben konfrontiert wird. So kann sichergestellt werden, dass das Softwareprogramm bei unerwarteten Ereignissen nicht einfach abstürzt.
Wie bei der Planung und Entwicklung gibt es auch beim Software-Testing den Trend zu mehr Flexibilität und Modularität. Während es im Wasserfallmodell eine fixierte Testphase gibt, gehört das Testen in agilen Konzepten zu den regelmäßig durchzuführenden iterativen Aufgaben. Automatisierung und die Integration von Testprotokollen und -tools in die Entwicklungs-Pipeline ermöglichen ein Continuous Testing und verhindern, dass Software-Entwickler aus Zeitdruck Testphasen überspringen oder abkürzen.
Integration und Inbetriebnahme: Um die entwickelte Software produktiv nutzen zu können, muss sie auf Zielsystemen installiert und in die darauf befindliche Systemumgebung integriert werden. Der Aufwand für diesen Schritt kann sehr unterschiedlich sein. Applikationen für Betriebssysteme wie Windows oder Mac OS X sowie Apps für mobile Plattformen wie Android und iOS werden über Standard-Schnittstellen angesprochen. Die entsprechenden Software-Bibliotheken sind bereits in den Entwicklungsumgebungen enthalten.
Wesentlich komplexer und aufwendiger ist die Integration bei Individualsoftware für Rechenzentren und industrielle Umgebungen. Hier kann es zu zahlreichen Abhängigkeiten von Datenbanken, Middleware und anderen Drittsystemen kommen. Es muss jederzeit sichergestellt sein, dass das Softwareprogramm ordnungsgemäß funktioniert und beispielsweise keine Inkonsistenzen in der Datenbankstruktur erzeugt.
Wartung und Pflege: Software ist niemals fertig, sondern muss kontinuierlich angepasst und verbessert werden. Hierbei kann man prinzipiell drei Bereiche unterscheiden: Der erste betrifft die Behebung funktionaler Fehler, die im laufenden Betrieb trotz sorgfältiger Tests immer wieder auftreten. Oft reicht ein Neustart oder eine Konfigurationsänderung, um das Problem zu beheben, in hartnäckigeren Fällen liefert der Anbieter eine korrigierte Version der betroffenen Module.
Ein zweiter wesentlicher Aspekt der Softwarewartung und Softwarepflege ist die Security. Häufig werden erst im laufenden Betrieb Sicherheitslücken entdeckt, die möglichst rasch geschlossen werden müssen. Diese Aufgabe übernimmt das Patch Management, das dafür sorgt, dass die vom Hersteller gelieferten Aktualisierungen (Patches) so schnell wie möglich auf allen betroffenen Systemen installiert werden.
Zur Wartung und Pflege gehört aber auch die Fortentwicklung einer Software. Neue Features erweitern den Funktionsumfang und passen die Applikation regelmäßig an den Stand der Technik an. Ein Update kann auch nötig werden, wenn eine neue Betriebssystemversion Anpassungen erfordert oder eine Plattform auf eine komplett neue Technologie umgestellt wird.
Welche unterschiedlichen Softwaretypen gibt es?
Folgende Softwaretypen lassen sich unterscheiden:
Betriebssysteme: Systeme wie Windows, Unix, Linux oder Mac OS X ermöglichen es, Anwendungen auf einer bestimmten Hardware auszuführen. Sie stellen dazu Treiber und Schnittstellen zur Verfügung, um beispielsweise auf Prozessor und Arbeitsspeicher, Data Storage und Peripheriegeräte zugreifen zu können oder Eingaben per Maus, Tastatur und Trackpad zu verarbeiten.
Heutige Betriebssystemen gehen allerdings weit über die reine Bereitstellung von Plattformdiensten hinaus, sondern werden bereits mit einer Vielzahl von Anwendungen und Komfortfunktionen ausgeliefert. Auch Security Features wie eine Software Firewall oder ein Virenscanner sind zum Teil bereits Bestandteil von Betriebssystemen.
Standardapplikationen: Vor allem im Endkundenbereich werden die meisten Anwendungen als vorgefertigte Pakete mit einem festen Funktionsumfang angeboten – häufig in verschiedenen Varianten, die preislich und funktional aufeinander aufbauen. Aber auch im professionellen Umfeld beruhen Business-Applikationen für Enterprise Resource Planning (ERP), Customer Relationship Management (CRM) und andere Bereiche in der Regel auf einem Standardangebot, das allerdings deutlich flexibler an die Bedürfnisse des Anwendenden angepasst werden kann als im privaten Umfeld.
Während noch vor wenigen Jahren Standardsoftware vor allem in Form von Lizenzen verkauft und auf dem Endgerät oder im Rechenzentrum des Kunden installiert wurde, geht der Trend bei der Bereitstellung heute ganz klar in Richtung Abomodell und Cloud. Dabei wird die Applikation als Software as a Service (SaaS) aus dem Data Center des Anbieters beziehungsweise einer Cloud-Umgebung zur Verfügung gestellt, die Abrechnung erfolgt monatlich auf Subskriptionsbasis.
Individualsoftware: Für ganz spezielle Anwendungsfälle genügen die verfügbaren Softwareprodukte nicht, hier muss eine individuelle Lösung entwickelt werden. Vor allem große Unternehmen haben für diese Aufgabe eigene Entwicklungsabteilungen. Es gibt aber auch zahlreiche Anbieter, die sich auf das Software Development spezialisiert haben.
Eine Zwischenstellung zwischen Standard und Individualsoftware stellen die Produkte sogenannter ISVs (Independent Software Vendor) dar. Diese setzen meist auf großen Softwareplattformen auf und bieten branchenspezifische Erweiterungen, welche vom Plattformanbieter nicht abgedeckt werden.
Embedded Software: Auch Haushaltsgeräte und Maschinen werden heute zum größten Teil von Software gesteuert, die in das Gerät integriert (embedded) ist. Entwickler von Embedded Software müssen besondere Restriktionen beachten. Platz und Rechenleistung der verbauten Hardware sind minimiert, Energieverbrauch und Wärmeentwicklung dürfen enge Grenzen nicht überschreiten. Embedded Software muss darüber hinaus besonders zuverlässig und langlebig sein, denn sie lässt sich nicht oder nur mit größerem Aufwand neu starten oder aktualisieren.
Was sind die Ziele von Software Engineering?
Mit dem Software Engineering sind in erster Linie folgende Ziele verbunden:
Nutzen schaffen: Software sollte natürlich die Aufgaben erfüllen, für die sie konzipiert wurde. Was trivial klingt, ist in der Realität oft gar nicht so einfach. Zum einen können sich die Rahmenbedingungen wie oben bereits ausgeführt schnell ändern. Zum anderen hängen die Funktionsfähigkeit und der Nutzen von Software sehr stark vom Umfeld ab. Bringt die Hardware nicht die erwartete Leistung oder stehen Hilfssysteme wie Datenbanken und Middleware nicht zur Verfügung, kann selbst eine optimal konzipierte Software ihre Aufgabe nicht erfüllen.
Software Engineering muss daher nicht nur die Korrektheit und Funktionalität einer Anwendung im Blick behalten, sondern immer auch das Gesamtsystem betrachten und neue Trends möglichst schnell berücksichtigen.
Sicherheit gewährleisten: Cyber Security wird angesichts der zunehmenden Bedrohung durch Cyberkriminelle und staatliche Akteure immer wichtiger. Die Softwaretechnik spielt dabei eine wesentliche Rolle, denn Sicherheitslücken in Betriebssystemen, Anwendungen und Firmware sind eine der wesentlichen Ursachen für erfolgreiche Angriffe. Laut dem Ponemon Institute ist bei 60 Prozent aller Datendiebstähle eine nicht geschlossene Software-Schwachstelle beteiligt, den Sicherheitsexperten von Veracode zufolge weisen 75 Prozent aller Anwendungen Sicherheitslücken auf.
Es ist daher ein wichtiges Ziel von Software Engineering, nicht nur eine funktionsfähige, sondern auch eine möglichst sichere Software zu entwickeln. Idealerweise wird Sicherheit als „Security by Design“ von Beginn der Konzeption bis zur Implementierung und dem Betrieb berücksichtigt.
Effizienz ermöglichen: Sowohl Herstellung wie auch Betrieb von Software sind aufwendige, teure und personalintensive Unterfangen. Es gehört deshalb zu den Zielen von Software Engineering, diese Aufwände zu minimieren. In der Softwareentwicklung lassen sich beispielsweise Zeit und Kosten sparen, indem man Module mehrfach verwendet und für Standardfunktionen auf vorhandene Softwarebibliotheken zurückgreift.
Im Betrieb spielt unter anderem die Laufzeiteffizienz eine Rolle. Eine Applikation sollte nicht mehr CPU-Leistung und Arbeitsspeicher belegen als unbedingt nötig.
Was sind die Vorteile von Software Engineering?
Software Engineering reduziert die Komplexität von Softwareprojekten, indem Prinzipien, Methoden und Werkzeuge für die Erstellung, Implementierung und Wartung von Softwareprogrammen zur Verfügung gestellt werden. Daraus ergeben sich folgende Vorteile:
Qualitätssicherung: Software Engineering stellt sicher, das Software in der vereinbarten Qualität zur Verfügung gestellt wird und dass Zeit- und Kostenvorgaben eingehalten werden. Qualitätsmanagementprogramme wie Total Quality Management (TQM) oder ISO 9000 helfen, die Vorgaben zu erfüllen und die Qualität der erstellten Software kontinuierlich zu verbessern.
Risikomanagement: Größere Softwarevorhaben sind komplex und hängen von einer Vielzahl von Faktoren ab, die sich im Laufe des Projektes durchaus ändern können. Hinzu kommen Unwägbarkeiten wie Veränderungen in den wirtschaftlichen und technischen Rahmenbedingungen oder im Wettbewerbsumfeld.
Software Engineering hilft durch den Einsatz von Methoden des Risikomanagements, mögliche Risiken über den gesamten System-Lebenszyklus hinweg zu identifizieren, sie zu bewerten und mögliche Maßnahmen zur Risikoreduktion zu entwickeln.
Tipps für Software Engineering: So finden Unternehmen den passenden Dienstleister
Unternehmen, die einen Partner für das Software Engineering suchen, sollten sich an diesen Kriterien orientieren:
Umfassende Expertise: Der Dienstleister sollte Erfahrungen in allen Bereichen des Software Engineering vorweisen können – von der Ablösung von Altsystemen inklusive der Datenmigration über die Entwicklung moderner Webanwendungen bis hin zu Cloud-Lösungen und Digitalisierungsplattformen.
Moderne Konzepte: Vorgehensweisen wie Agile Development, DevOps und CI / CD sollten dem Dienstleister geläufig sein und bereits in der Praxis eingesetzt werden.
Ausreichende Kapazitäten: Das beste Konzept nützt nichts, wenn der Dienstleister das Software Engineering-Projekt nicht in angemessener Zeit umsetzen kann. Der Anbieter sollte deshalb genügend Entwicklungskapazität vorhalten und dies auch nachweisen können.
Skalierbarkeit: Es ist für Unternehmen heute essenziell, auch in Softwareprojekten schnell auf Veränderungen und Marktchancen reagieren zu können. Ohne Cloud-First-Strategie ist dies jedoch oft nur schwer umsetzbar. Software Engineering-Dienstleister sollten daher mit cloudbasiertem Development und maßgeschneiderten Anwendungen den Weg in die Cloud unterstützen.
Sprechen Sie jetzt mit unseren Experten!
Als netgo group bringen wir Menschen und Technologien erfolgreich zusammen.
Dabei denken wir ganzheitlich, verstehen das Geschäft unserer Kunden und ebnen den Weg für eine smarte und intelligente Digitalisierung.