Im digitalen Zeitalter gibt es kaum noch ein Unternehmen, das bei der Entwicklung seiner Produkte ohne umfangreiche Softwareanteile auskommt. Selbst in traditionellen Hardwareunternehmen nimmt die Entwicklung einer passenden Software für die Produkte eine immer wichtigere Rolle ein, und ein immer größerer Teil der F&E-Ausgaben entfällt auf die Softwareentwicklung.
In solchen Unternehmen erweist sich die bestehende Softwarearchitektur jedoch häufig als kritischer Engpass, wenn es darum geht, schnell neue Produkte auf den Markt zu bringen. Die Unternehmen waren über lange Zeit primär auf die Entwicklung der Hardware ausgerichtet, die Software wurde im Nachhinein hinzugefügt. Das führte je nach Produktumfang zu ein oder mehreren monolithische Softwareplattformen, die jeweils nur einen begrenzten Teil des Produktportfolios abdecken.
Im Ergebnis folgen daraus lange Entwicklungszeiten, hohe Entwicklungskosten und immer wieder mangelhafte Qualität, was es schwierig macht, den Markt- und Kundenanforderungen in angemessener Weise gerecht zu werden.
Leseempfehlung: Einen allgemeinen Einstieg in das Thema bietet Ihnen unser Blog-Artikel “Von Hardware-First zu Software-First mit einer modularen Softwarearchitektur”.
Modularität bietet einen Lösungsansatz: Mit einer modularen Softwarearchitektur lassen sich viele der Probleme, die mit einem System aus Softwaremonolithen einhergehen, lösen. Die Voraussetzung dafür ist allerdings ein gutes Verständnis dessen, was Modularität überhaupt ist und wie Softwaremodule als Grundbausteine einer modularen Softwarearchitektur definiert werden. Genau das erklären wir Ihnen in diesem Blog-Beitrag.
Die Modularität einer Software wird daran gemessen, wie gut sie in Komponenten mit standardisierten Schnittstellen organisiert ist. Software-Modularität ist vergleichbar mit der Modularität von Hardware. Das Ziel besteht darin, Produkte durch die Kombination von wiederverwendbaren Elementen des Quellcodes zu schaffen, damit eine Funktion jeweils nur einmal implementiert werden muss. Der Definition passender Softwaremodule kommt hierbei eine besondere Rolle zu.
Auch wenn die Definitionen, was ein Softwaremodul ist, je nach Quelle variieren, gibt es doch einige gemeinsame Merkmale, die sich hier herausstellen lassen. So lässt sich ein Modul grundsätzlich als Teil des Codes definieren, der unabhängig erstellt, gepflegt und verwaltet werden kann, um in verschiedenen Systemen verwendet zu werden. Modulare Programmierung ist demzufolge eine “Technik des Softwaredesigns, bei der die Aufteilung der Funktionen eines Programms in unabhängige, austauschbare Module im Vordergrund steht” (freie Übersetzung nach Wikipedia).
Eine für Softwaremodule gemeinsame Eigenschaft besteht darin, dass sie wiederverwendbar und austauschbar sind. Der große Vorteil der Wiederverwendung von Modulen ist die dadurch erreichte Verkürzung der Markteinführungszeit (engl. Time-to-Market, TTM) von neuen Produktvarianten.
Austauschbarkeit im Rahmen einer modularen Softwarearchitektur bedeutet, dass ein Modul ersetzt werden kann, ohne dass dadurch der Rest des Systems beeinträchtigt wird. Diese Flexibilität ist vor allem dann wichtig, wenn eine Software aufgrund neuer Funktionen oder Fehlerkorrekturen aktualisiert werden muss.
Wenn Sie Änderungen auf ein oder wenige Module beschränken können, benötigen Sie weniger Zeit zum Testen und Implementieren der vorgenommenen Änderungen. Häufigere und kleinere Releases ermöglichen zudem eine größere Flexibilität und verringern das Risiko bei der Freigabe neuer Funktionen.
Leseempfehlung: Lesen Sie auch unseren Blog-Artikel zum Thema “Mehr Qualität und Effizienz in der Softwareentwicklung”.
Jedes Softwaremodul verfügt dabei über eine Schnittstelle, die sowohl innerhalb des modularen Baukastensystems als auch von externen Systemen genutzt werden kann. Bei extern zugänglichen Schnittstellen handelt es sich um sogenannte APIs (Application Programming Interface), Programmierschnittstellen für die Anbindung an andere Systeme. APIs sollten sorgfältig konzipiert werden, da sich nachträgliche Änderungen auf andere (externe) Anwendungen, die die API nutzen, auswirken.
Heutzutage gibt es viele frei verfügbare APIs für Cloud-Dienste, darunter die API von Skyscanner, die zum Erstellen einer eigenen Reise-App zu genutzt werden kann, oder die API von OpenWeatherMap zur Erstellung von Wetter-Apps. Wenn einer dieser Dienste plötzlich seine API ändert, werden viele Apps auf der ganzen Welt nicht mehr funktionieren, da die Schnittstelle dann nicht mehr kompatibel ist, was zu erheblichen Konsequenzen führt.
Um eine stabile modulare Softwarearchitektur zu entwickeln, ist es darüber hinaus wichtig, auch bei der Entwicklung der Schnittstellen zwischen den einzelnen Modulen des Systems sorgfältig vorzugehen und diese richtig zu verwalten.
Eine weitere Eigenschaft von Modulen ist ihre Funktionalität. Ein Modul ist als Teil eines Systems zu verstehen, in dem die verschiedenen Funktionen, die das System zum Arbeiten braucht, auf die einzelnen Komponenten aufgeteilt sind. Ein Modul ist also eine strukturelle Einheit, die innerhalb des Systems eine bestimmte Funktion erfüllt. Die einzelnen Funktionen in logischen Softwaremodulen zu organisieren ist vorteilhaft für die Spezifikation und Dokumentation der Softwarearchitektur.
Diese Bindung von Funktionen an einzelne Module ist außerdem ein wichtiger Aspekt bei der Entkopplung von Modulen. Diese führt dazu, dass es möglich ist, ein Modul ohne Auswirkungen auf andere Module zu entwickeln und zu pflegen, was es den Entwicklern ermöglicht, bei der Erstellung, Wartung und Prüfung des Codes voneinander unabhängig und effizienter zu arbeiten.
Damit es bei der Entwicklung neuer Softwarefunktionen und -versionen möglich ist, unabhängig zu arbeiten und die jeweiligen Softwaremodule in vielen Systemen wiederverwendbar und austauschbar zu machen, muss ein Modul verschiedene Eigenschaften erfüllen.
Ein Modul sollte lediglich auf die Daten zugreifen, die zur Erfüllung der zugewiesenen Funktion benötigt werden. Je weniger Überschneidung bei Datenzugriffen und Bearbeitung zwischen den Modulen besteht, desto geringer sind die Auswirkungen von Änderungen bei einem der Module. Daten, die für ein Modul relevant sind, sind in diesem gekapselt und werden anderen Modulen nur bei Bedarf über Schnittstellen zur Verfügung gestellt.
Die Schnittstelle für den Zugriff auf seine Funktionen und Daten ist eine weitere Eigenschaft, die ein Modul ausmacht. Sie ist eine Voraussetzung dafür, unabhängig, wiederverwendbar und austauschbar zu sein. Die Schnittstelle des Softwaremoduls sollte so abstrakt und klein wie möglich sein. Weniger Details bedeuten eine geringere Kopplung zwischen Softwaremodulen und gewährleisten dadurch ihre Unabhängigkeit und Wiederverwendbarkeit.
Module stellen jedoch nicht nur Schnittstellen für andere Module bereit, sondern sie benötigen gleichermaßen die Schnittstellen, die von anderen Softwaremodulen bereitgestellt werden. Da ein Softwaremodul, das ein anderes Modul über seine Schnittstelle nutzt, letztendlich doch wieder von diesem abhängig macht - was gegen den Grundgedanken der Unabhängigkeit von Softwaremodulen verstößt-, sollten die Abhängigkeiten in der modularen Softwarearchitektur minimiert werden.
Im Lebenszyklus eines Softwaremoduls kann es unter bestimmten Umständen zu Schnittstellenänderungen kommen, bei denen Schnittstellen nicht abwärts-kompatibel sind. Eine solche Änderung führt dazu, dass eine Gruppe von Modulen und deren Schnittstellen gemeinsam aktualisiert werden müssen. Dies hat eine umfangreiche Softwareaktualisierung zur Folge, ohne dass der Kunde davon direkt profitiert (z. B. durch bessere Leistung, Funktionalität oder Qualität). Erzwungene Softwareaktualisierungen, die den Kundennutzen nicht verbessern, sollten als notwendige Komplexitätskosten in der Softwareentwicklung betrachtet werden.
Lassen Sie uns das an einem Beispiel illustrieren. Die folgende Grafik zeigt vier verschiedene Softwaremodule mit ihren Schnittstellen, über die sie jeweils mit anderen Modulen verbunden sind. Modul B1 bietet die Schnittstelle B zu Modul A und benötigt gleichzeitig die Schnittstellen C und D. Angenommen wir haben ein neues Modul B2 mit verbesserter Leistung. Wenn Modul B2 dieselbe Schnittstelle bereitstellt und dieselben Schnittstellen benötigt wie B1, dann ist es mit B1 austauschbar.
Solange ein Modul über die geeigneten und erforderlichen Schnittstellen verfügt, kann es in jeder passenden Softwarearchitektur eingesetzt werden. Die Wiederverwendung zwischen verschiedenen Systemen wird so ermöglicht.
Bisher haben wir uns angesehen, was ein Softwaremodul überhaupt ist und welche Eigenschaften sie erfüllen müssen, um unabhängig, wiederverwendbar und austauschbar zu sein. Auch wenn diese Eigenschaften bekannt sind, kommt es bei der Definition modularer Softwarearchitekturen immer wieder zu Fehlern. Damit die Vorteile der Modularisierung (verbesserte Effizienz, Qualität etc.) voll ausgeschöpft werden können, sollte die strategische Dimension bei der Definition von Modulen nicht vernachlässigt werden.
Neben standardisierten Schnittstellen und einer klar zugewiesenen Funktion brauchen Module - unabhängig davon ob es sich um Hardware- oder Softwaremodule handelt - einen konkreten strategischen Nutzen. Grundsätzlich lassen sich drei strategische Dimensionen unterscheiden. Diese sind:
Leseempfehlung: Mehr zu den strategischen Dimensionen von Modulen und deren Bedeutung für den Wert eines modularen Systems lesen Sie in unserem Blog-Artikel “Warum Strategie im Baukastensystem wichtig ist”.
Hinter jedem Softwaremodul sollte eine strategische Absicht stehen. Die Zielsetzung, die Unternehmen mit Modularisierung verfolgen, kann dabei sehr unterschiedlich ausfallen. Anbei einige Beispiele für mögliche Ziele, die mit dem Aufbau einer modularen Softwarearchitektur verfolgt werden können.
Leseempfehlung: Testautomatisierung, Software Portability und OTA sind nur einige der Vorteile, die sich durch eine modulare Softwarearchitektur erreichen lassen. Für mehr Input, wie Sie mit Modularisierung Ihre Softwarearchitektur erfolgreich verbessern, empfehlen wir unseren separaten Blog-Artikel.
Ein Modul sollte also einer strategischen Dimension zugeordnet sein. Zudem sollte klar spezifiziert sein, welche Funktion es erfüllt und welche Schnittstellen es dazu braucht. Ein wichtiger Teil der Definition dieser Elemente ist auch die Dokumentation.
Eine einheitliche und klar verständliche Dokumentation, in der alle für das Modul relevanten Informationen zusammengefasst sind, erleichtert die Kommunikation und die Einarbeitung von neuen Entwicklern.
Ein erster Schritt für eine Dokumentation kann eine One-Page-Spezifikation sein, wie sie hier in der Grafik dargestellt ist. Diese kann in einem Dokumentenmanagement- beziehungsweise einem Wissensmanagementsystem oder einem Wiki abgelegt und verwaltet werden.
Um mehr Effizienz und Flexibilität zu ermöglichen, müssen große, komplexe und monolithische Softwaresysteme in voneinander unabhängige Module zerlegt werden. Unabhängige Module machen die Entwicklungsteams autonomer, was zu einer besseren Effizienz und einer kürzeren TTM führt. Zudem können Module zur Entwicklung neuer Softwareversionen und -updates einfach wiederverwendet, ausgetauscht und kombiniert werden. Die bei der Entwicklung der Module definierten Schnittstellen nehmen hierbei eine Schlüsselfunktion ein. Wird bei der Definition der verschiedenen Softwaremodule zusätzlich der strategische Beitrag einzelner Module beachtet, können Softwarestrategien klar mit einzelnen Modulen in Beziehung gesetzt werden.
Dank der drei Kernattribute von Softwaremodulen (Unabhängigkeit, Schnittstellen und Strategie) können Unternehmen mit einer modularen Softwarearchitektur in mehrfacher Hinsicht einen Mehrwert schaffen: erhöhte Effizienz in der Softwareentwicklung sowie verringerte Komplexitäts- und Entwicklungskosten. Damit dieser Mehrwert auch tatsächlich erreicht werden kann, müssen die strategisch definierten Softwaremodule richtig dokumentiert werden. Eine passende Vorlage bieten wir Ihnen hier zum Download an.