Komplexität managen: Denken in Mustern

By SodiusWillert | 7/11/2019 | Reading time: 4 min

Dringender Wunsch und einhelliges Ziel aller Stakeholder im Entwicklungsprojekt sind beherrschbare, befähigte Systeme. Während ihres gesamten Lebenszyklus sollen diese Systeme flexibel anpassbar an sich verändernde Anforderungen sein und dabei transparent und nachvollziehbar für alle Stakeholder bleiben. Entwicklungszeiten sollten kalkulierbar sein, Ressourcen effizient eingesetzt werden. Im Ergebnis sollen sie sich fehlerfrei, leistungsstark und wartungsfreundlich zeigen.

Die herkömmliche Entwicklung von Software auf Basis von Hochsprachen erreicht die Grenze ihrer Leistungsfähigkeit. Deshalb werden in diesen Entwicklungsumgebungen Redundanzen zugunsten der Verstehbarkeit in Kauf genommen. Es werden häufig grafische Repräsentanzen parallel zum Programmcode erstellt. Diese erhöhen zwar die Verstehbarkeit, müssen nun aber parallel zum Code gepflegt werden. Da der Aufwand für die Pflege dieser redundanten, nicht integrierten Repräsentanzen im Alltagsstress nicht zu leisten ist, besteht die Gefahr, dass die Aussagen der grafischen Repräsentanzen inkongruent zum Programmcode werden. Ergebnis: Die Aussagen in den redundanten Repräsentanzen veralten – und im schlimmsten Fall werden sie falsch sein. Würde auf sie als Anweisung zurückgegriffen, führte das zur Dysfunktion des Systems.

Wenn Komplexität mit einem Vorgehen nicht mehr beherrschbar ist, drückt sich das in latent steigender Dysfunktion aus, zum Beispiel wenn in Systemen Module geändert werden und deren Verhalten wirksam, aber unerkannt, im Zusammenhang zu anderen Modulen steht. Im undurchsichtigen Netz der Beziehungen entstehen „Hidden Links“, versteckte Verbindungen, deren Zusammenspiel Emergenzen, also neue, ungeplante Eigenschaften oder Strukturen, unkontrolliert erzeugt. Diese zeigen sich als – oft gefährliche, überraschend auftretende – Dysfunktion des Systems.

Jenseits der limitierenden Faktoren der Eindimensionalität von Softwareentwicklung auf Basis von Hochsprachen stehen Entwicklerteams jedoch drei grundlegende Mechanismen zur Abwehr dieser Gefahr und zur Vermeidung von Hidden Links, Emergenz und Dysfunktion zur Verfügung:

  1. die Musterbildung
  2. „vertragsbasierte Programmierung“ (Design by Contract oder Contract based Design)
  3. die Abstraktion.
Sie hängen eng zusammen und bedingen sich gegenseitig.
  1. Die Musterbildung bringt Routinen in die Systementwicklung. Sind die Muster einmal gelernt, funktionieren sie wie Blaupausen.
  2. Das Contract based Design sichert das reibungslose Zusammenspiel einzelner Programmmodule durch die Definition formaler „Verträge“ zur Verwendung von Schnittstellen. Ihr großer Vorteil: Auf Basis von Modellen, also Metastrukturen, können diese Verträge durch Werkzeuge automatisiert verifiziert werden. Änderungen, die einen Vertrag verletzen, werden bereits in frühen Phasen entdeckt.
  3. Durch Abstraktionsmechanismen beschreiben wir anhand von Modellen komplexe Zusammenhänge auf eine einfachere Art und Weise. Das Abstraktionsniveau eines Modells erleichtert uns das Verstehen. Abstraktion ist der mächtigste Mechanismus, um Komplexität zu begegnen. Abstraktion greift im Wesentlichen auf Muster und grafische Darstellungen zurück. Auf Basis von Mustern kann unser Gehirn einmal gelernte komplizierte Konstrukte schnell assoziieren. Die grafische Darstellung abstrahiert deren Zusammenwirken auf Basis von verschiedenen Diagrammen hinsichtlich Zeit, Datenfluss, logischem Verhalten und statischem Design.

Das Modell auf der Basis von Abstraktion, Muster und Vertrag bildet das gesamte System mit seiner Komplexität ab. Vergleichbar mit einer Lupe ermöglicht es nun, den Blick auf einen bestimmten Aspekt zu richten, ohne den Bezug zum gesamten System zu verlieren. Andere Aspekte des Systems werden lediglich in der spezifischen Darstellung ausgeblendet, diese werden dann wiederum in anderen Sichten dargestellt. Der Blick auf das jeweils Wesentliche erhöht dessen Verstehbarkeit trotz der Komplexität und beugt Hidden Links vor.

Auf diese Weise repräsentieren (abstrahieren) Modelle mit ihren multidimensionalen Darstellungen die multidimensionalen Systeme sehr viel verstehbarer als eindimensionale Code-Repräsentationen. Modelle enthalten alle Stakeholdersichten bezüglich der Anforderungen, der Architektur und des Designs bis hin zum Test. Änderungen und Weiterentwicklungen, anhand welcher Artefakte auch immer durchgeführt, werden automatisch auf das Gesamtsystem ausgeprägt und auf Emergenz geprüft.

Im Embedded Systems Software Engineering ist ein Paradigmenwechsel von der Programmierung zur Modellierung, zum Model Driven Software Engineering, notwendig und – wie bereits viele Willert Kunden belegen - machbar. Um den Umstieg auf diese Methode erfolgreich zu vollziehen oder zu vertiefen, steht den Softwareentwicklungsabteilungen mittlerweile ein umfangreiches Portfolio an Ressourcen sowie Tools, beschriebenen Prozessen, Leitfäden und Referenzen zur Verfügung. Willert und andere innovative Softwarehäuser, wie zum Beispiel die Unterzeichner der MSDE Manifests, haben umfassende Erfahrung und liefern die notwendigen Tools im Paket mit fundierten Beratungsdienstleistungen.

Leave us your comment

Most read articles

Subscribe to our blog

Watch the product demo

OSLC Connect for Jira: integrate Jira with IBM Engineering Lifecycle Management.

Icon_OSLC Connect for Jira_color_144*144px_SodiusWillert_2020_RVB

 

OSLC Connect for Jira leverages Open Services for Lifecycle Collaboration (OSLC) technology to collaboratively allow linking across design and implementation teams and better manage requirements and compliance.