Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Grundlagen der industriellen Softwaretechnik

Architektur und Implementierung

Implementierung

Die eigentliche Erstellung des Softwaresystems erfolgt durch die Implementierung, das heißt dem Erzeugen (auch: Schreiben) von Programmcode. Auf Basis der dokumentierten fachlichen Anforderungen, der technischen Spezifikation und der Architekturbeschreibung wird eine Menge von Programmcode-Artefakten erstellt, die in ihrer Summe das lauffähige Softwaresystem ergeben.

Beziehung zu Architektur

Übertragen auf den Bau eines Hauses entspricht die Implementierung den Arbeiten der Gewerke wie Maurer, Zimmermann oder Installateur, die nach den Vorgaben des Architekten die ihnen zugewiesenen Aufgaben erledigen. Wie beim Hausbau gibt es auch in der industriellen Softwareentwicklung mehr ausführende (implementierende) Personen als Architekten. Das Spektrum der Aufgaben von Softwarearchitekten reicht je nach konkretem Projekt von der Gesamtverantwortung über das komplette System, der Verantwortung über einzelne Komponenten bis hin zur Verantwortung über einzelne Schnittstellen. Je nach Projektorganisation ist der Softwarearchitekt auch aktiv an der Implementierung beteiligt.

In jedem Fall ist der Architekt erster Ansprechpartner der Softwareentwickler bei fachlichen und technischen Fragen und falls Entscheidungen getroffen werden müssen, die sich auf mehrere Teile des Systems auswirken. Wenn Softwarearchitekten bei der Implementierung aktiv miteinbezogen werden, können sie begleitend zur Implementierung darauf achten, dass die Vorgaben durch die Architekturbeschreibung von den Entwicklern auch wirklich eingehalten werden. Somit wird das Risiko vermindert, dass sich im Verlauf der Implementierung die tatsächliche Architektur von der geplanten Architektur wegentwickelt.

Erzeugen von Programmcode eines Systems

Ein Softwaresystem manifestiert sich grundsätzlich auf zwei verschiedene Weisen:

  1. Die Menge der vom Entwicklerteam erzeugten beziehungsweise zusammengestellten Artefakte, dem Quellcode (auch: Programmcode, Code, Codebasis, Source Code).
  2. Eine ausführbare Version, die auf einem Rechner gestartet werden kann, der kompilierten Binärversion.

Während der Implementierung wird der Quellcode eines Systems erzeugt. Um ein Programm ausführen zu können, muss der Quellcode kompiliert werden, das heißt in eine ausführbare Version umgewandelt werden.

Die Tätigkeit zur Erzeugung von Programmcode heißt programmieren (auch: implementieren, codieren). Softwareentwickler (auch: Programmierer, Entwickler, Developer) können bei der Erstellung des Codes auf Basis der Architekturbeschreibung auf verschiedene Weise dafür sorgen, dass das System die geforderten Funktionen unterstützt.
Entweder durch ...

Typischerweise werden in der Praxis alle drei Arten der Quellcodeerzeugung miteinander kombiniert.

Schreiben von Programmcode
Beim Schreiben von Programmcode erstellt der Programmierer strukturierten Text zur gezielten Lösung von spezifischen Problemen. Er erstellt zum Beispiel eine Datenstruktur, implementiert einen Algorithmus oder programmiert Regeln zur Bearbeitung von Daten. Bei der Erstellung ist er fest an die Ausdrucksmöglichkeit und die Wörter der von ihm eingesetzten Programmiersprache gebunden.

Bestehenden Programmcode wiederverwenden
Je nachdem wie verbreitet eine Programmiersprache ist und abhängig davon, ob der Softwareentwickler ein sehr spezielles Fachproblem oder ein allgemeines und immer wiederkehrendes Problem lösen muss, kann der Entwickler auf bereits programmierte Lösungen des Problems zurückgreifen. Lösungen für Standardprobleme, wie beispielsweise das Erstellen einer Datenstruktur, die verschiedene Elemente speichern, sortieren und durchsuchen kann, werden heute fast durch jede Programmiersprache unterstützt. Bestehende Lösungen zu allgemeinen Problemen werden in sogenannten Bibliotheken (auch: Frameworks) den Entwicklern zur Wiederverwendung zur Verfügung gestellt. Diese Bibliotheken sind entweder Teil der Programmiersprache oder werden von Dritten angeboten. Neben kommerziellen Anbietern gibt es insbesondere für die Programmiersprache Java unzählige Bibliotheken, die unter einer Open Source Lizenz zur freien Verfügung gestellt werden.

Die Erstellung komplexer Informationssysteme mit Anbindung an das Internet und der Unterstützung von Apps sind ohne Wiederverwendung von bestehendem Code in Form von Frameworks oder Bibliotheken nicht denkbar. Eine grundlegende Fertigkeit von Entwicklern besteht, neben der Fähigkeit zum Schreiben von Programmcode, im Wissen, welches Framework und welche Bibliothek welche Funktionen zur Verfügung stellt und wie diese Funktionen miteinander und mit selbst geschriebenem Programmcode integriert werden können.

Vergleichbar mit der Make-or-Buy-Entscheidung in der Phase Planung müssen Entwickler und Architekten für die Lösung konkreter Implementierungsfragen auch entscheiden, ob sie Code selber produzieren oder wiederverwenden. Vielfach eingesetzter und bereits getesteter Programmcode einer frei verfügbaren Bibliothek ist dabei in der Regel einer eigenen Entwicklung immer vorzuziehen.

Programmcode automatisch generieren
Eine weitere Möglichkeit Programmcode zu erzeugen, ist die automatische Generierung von Code aus Elementen der Architekturbeschreibung. Je nachdem wie detailliert eine Architekturbeschreibung ausgeprägt wurde, kann zum Beispiel aus modellierten Datenstrukturen Programmcode zur Anbindung an Datenbank-Systeme direkt aus dem Modell erzeugt werden. Damit wird dem Entwickler die manuelle Erzeugung von fachlich trivialem Programmcode abgenommen. Ein weiterer typischer Anwendungsfall für die Generierung von Programmcode ist die Erzeugung von Programmcode für Benutzerschnittstellen aus grafischen Editoren (z. B. Microsoft Visual Studio, Xcode). Grundsätzlich ist die Generierung von Programmcode dann sinnvoll, wenn der Aufwand zur Erstellung und Wartung des Code-Generators geringer ist als für die manuelle Erzeugung der Code-Fragmente.

Entwicklungsumgebung

Wie oben bereits erwähnt, findet Softwareentwicklung im industriellen Kontext immer im Team statt. Es arbeiten daher immer mehrere Entwickler gleichzeitig an der Codebasis eines Systems. Um dem Entwicklungsteam die bestmögliche Unterstützung zu geben und dabei Trivialaufgaben so weit wie möglich zu automatisieren, wird für die Softwareentwicklung eine entsprechende Entwicklungsumgebung benötigt.

Die wichtigsten Funktionen von Entwicklungsumgebungen sind:

Typische Entwicklungsumgebungen (englisch: Integrated Development Environment, IDE), die für die Arbeit an Großprojekten geeignet sind, sind zum Beispiel das Open Source Werkzeug eclipse IDE oder Microsoft Visual Studio.

Programmiersprachen

Die Implementierung des Softwaresystems erfolgt in einer bestimmten Programmiersprache. In untenstehender Abbildung sind die zehn am häufigsten eingesetzten Programmiersprachen dargestellt, basierend auf regelmäßig von TIOBE erhobenen Daten. Die imperative Programmiersprache C ist eine der ältesten Sprachen der Top 10. Sie wird häufig für die hardwarenahe Programmierung, zum Beispiel in eingebetteten Systemen, verwendet. Mit Java, C# und C++ sind die objektorientierten Programmiersprachen sehr häufig vertreten, wobei diese in der industriellen Softwareentwicklung insbesondere für Informationssysteme eingesetzt werden. Die damit verwandte, aber nicht in der Abbildung genannte Programmiersprache Objective-C (iOS) wird zusammen mit Java (Android) für die Programmierung mobiler Plattformen verwendet. Darüber hinaus gibt es mit COBOL oder Fortran eine Reihe älterer Programmiersprachen, die heute jedoch immer noch für IT-Systeme von Finanzdienstleistern (Banken, Versicherungen, Krankenkassen) eingesetzt werden. Insbesondere im Bereich der Web-Anwendungen wird die Programmiersprache JavaScript eingesetzt.
Abbildung: Top 10 Programmiersprachen, Stand November 2019

JavaScript Programmcode muss nicht kompiliert werden, er wird direkt im Browser ausgeführt. In industriellen Web-Anwendungen wird JavaScript häufig in Kombination mit Java oder C# eingesetzt, um interaktive Benutzerdialoge zu ermöglichen. Neben den universellen Programmiersprachen, mit denen theoretisch jede Art von Software erstellt werden kann, gibt es auch noch Programmiersprachen für ganz besondere Einsatzbereiche. Das Speichern und Lesen von Daten in einer Datenbank wird häufig mit der Sprache SQL umgesetzt, die speziell für den Einsatz rund um das Thema Datenbanken entwickelt und optimiert wurde.

Neben den Sprachen, die programmiert und ausgeführt werden, gibt es sogenannte Beschreibungssprachen (HTML, XML, CSS). Mit diesen Sprachen werden typischerweise Aufbau und Inhalt von Anwendungsoberflächen (Webseiten) oder Nachrichten, die zwischen Systemen ausgetauscht werden können, beschrieben. Mit Beschreibungssprachen kann eine Struktur vorgegeben werden, in der Nachrichten zwischen Systemen ausgetauscht werden können. Jedoch nicht, wie Systeme diese Informationen verarbeiten.

In einem ausgelieferten Softwaresystem können daher verschiedene Programmiersprachen zum Einsatz kommen, beispielsweise HTML und JavaScript für interaktive Oberflächen, Java für die Geschäftslogik, SQL zum Lesen und Speichern von Daten in der Datenbank und XML für den Nachrichtenaustausch mit anderen Systemen. Um die Programmiersprachen zu kombinieren und miteinander zu verwenden, stehen dem Entwickler in der Regel Bibliotheken und Frameworks zur Verfügung, die ihm die Integration erleichtern.

In der Regel trifft der Softwarearchitekt die Entscheidung, mit welcher Programmiersprache ein konkretes Softwaresystem umgesetzt wird. Insbesondere bei industriellen Informationssystemen, die sich in eine vorgegebene Anwendungslandschaft integrieren müssen, sind bei der Festlegung der Sprache verschiedene Faktoren zu berücksichtigen:

Je reifer eine Programmiersprache ist, umso mehr Bibliotheken, Know-how und Support ist dazu verfügbar. Daher kommt es in der Regel sehr selten vor, das geschäftskritische Informationssysteme mit den neuesten Programmiersprachen umgesetzt werden. Verglichen mit IT-Abteilungen großer Firmen sind kleinere Unternehmen und Start-ups in Bezug auf Programmiersprachen experimentierfreudiger.