Der Erfolg eines Softwareprojekts steht und fĂ€llt mit der Architektur eines Systems. Nicht immer fĂŒhren anfĂ€ngliche schnelle Erfolge zu einer stabilen Software. Mit welchen Herausforderungen sich ein Softwarearchitekt initial und im Laufe des Projekts konfrontiert sieht, lĂ€sst sich am Beispiel des fiktiven Bob nachvollziehen.

Nach seiner Umschulung zum Softwareentwickler steht Bob, der Baumeister, vor der ersten großen Herausforderung. Zusammen mit anderen Leidensgenossen soll er die Softwarearchitektur fĂŒr einen Webshop erstellen. Was er zunĂ€chst fĂŒr ein lĂ€cherlich einfaches Projekt hielt, erweist sich auf dem zweiten Blick als ganz und gar nicht trivial. Vor ihm steht bedrohlich ein weißes, bislang gĂ€hnend leeres Flip-Chart. Es scheint sehnsĂŒchtig darauf zu warten, dass Bob es mit architektonischen EntwĂŒrfen fĂŒllt.

Bob sieht sich mit diversen Herausforderungen konfrontiert. Er muss ĂŒberlegen, welches der erste Schritt im Architekturentwurf ist, und wie er anschließend systematisch das Softwaresystem erstellt. Außerdem muss er sich klarmachen, welche Informationen und Voraussetzungen zu gewĂ€hrleisten sind. Dieser Artikel konzentriert sich ganz auf diese architektonische Brille. Details wie der Entwicklungsprozess oder die Rolle des Architekten sind nicht Gegenstand der Betrachtungen.

Abbildung 1: Ein systematischer Prozess fĂŒr den Architekturentwurf ist inkrementell und ermittelt zu Beginn alle architektonisch relevanten Anforderungen.
Abbildung 1: Ein systematischer Prozess fĂŒr den Architekturentwurf ist inkrementell und ermittelt zu Beginn alle architektonisch relevanten Anforderungen.

Offensichtlich benötigt der Softwarearchitekt Bob am Anfang eine Liste von hinreichend detaillierten Anforderungen, allesamt mit eindeutigen PrioritĂ€ten versehen. Wie vollstĂ€ndig eine solche Liste sein muss, daran scheiden sich bisweilen die Geister. Dass schon zu Beginn alle Anforderungen vorliegen, entspricht zwar dem Ideal, dĂŒrfte aber bei komplexeren Projekten dem Finden des heiligen Grals gleichkommen. Übrigens mit ein Grund dafĂŒr, warum Wasserfallmodelle sich oft als Sackgasse erwiesen haben. Einer „Mission Impossible“ gleicht das andere Extrem, das mit keinen oder wenigen Anforderungen auskommen will. Es fĂŒhrt letztendlich zu ĂŒbergenerischen Softwarearchitekturen, die es keinem recht machen können, weil sie es allen recht machen wollen. Die Wahrheit liegt also irgendwo in der Mitte.

Conditio sine qua non

Je mehr architektonisch signifikante Anforderungen bekannt sind, desto stabiler das architektonische Fundament. Damit sich der Architekt in Konfliktsituationen fĂŒr das richtige Vorgehen entscheiden kann – Ă€hnlich der Rechts-vorlinks-Regel im Straßenverkehr – sollten diese Anforderungen eindeutige PrioritĂ€ten besitzen. Meistens stammen die Anforderungen nicht von den Softwareentwicklern, sondern von Anforderungsingenieuren, Produktmanagern oder Kunden. Daher kommt der Kommunikation mit dem genannten Personenkreis essenzielle Bedeutung zu, was bedeutet, dass sich der Alltag des Softwarearchitekten nicht auf technische Aspekte beschrĂ€nkt. Nicht immer sind die Anforderungen verstĂ€ndlich, detailliert und widerspruchsfrei formuliert oder haben eindeutige PrioritĂ€ten. Hier heißt es oft, intensiv nachzubohren und bisweilen Überzeugungsarbeit zu leisten.

Damit Softwarearchitekten in einem konkreten Projekt die Ziele ihrer Organisation oder ihrer Kunden unterstĂŒtzen können, benötigen sie grundlegendes Wissen ĂŒber geschĂ€ftliche Aspekte. Je nach Kontext kann es zum Beispiel in einem Fall sinnvoll sein, wichtige Teile des Systems mithilfe von Offshoring-Maßnahmen zu entwickeln und die Architektur entsprechend zu planen, wĂ€hrend sich dieses Vorgehen in einem anderen Fall vollkommen verbietet. Zudem lĂ€sst sich manche geschĂ€ftliche Zielvorgabe ĂŒberhaupt nicht umsetzen, zumindest nicht mit vernĂŒnftigem Aufwand. Basiswissen ĂŒber grundlegende Instrumente und nichttechnische Softwarearchitekturaspekte erweist sich daher in diesem Zusammenhang als unbedingt erforderlich.

Zu guter Letzt mĂŒssen Softwarearchitekten sowohl die fachliche ProblemdomĂ€ne als auch die technischen LösungsdomĂ€nen verstehen. Fehlt ihnen die geistige Durchdringung der FachdomĂ€ne, bleibt die Problemstellung im Dunkeln. Haben sie nur unzureichende Kenntnisse der LösungsdomĂ€nen, können sie keine technisch fundierten Ergebnisse erzielen. Wie sagte Bertrand Meyer einst so schön: „Bubbles don’t crash.“

Softwarearchitektur – was ist das?

Bob denkt an seine Umschulung zurĂŒck. FĂŒr den Begriff „Softwarearchitektur“ gibt es mindestens ebenso viele Definitionen, wie die Menschheit Gottesbeweise hervorgebracht hat. Zum GlĂŒck besitzen die diversen Definitionen mehr Gemeinsamkeiten als Unterschiede. Softwarearchitektur beschreibt demnach die Komposition eines Softwaresystems aus Subsystemen, deren Beziehungen zueinander sowie die Grundprinzipien, mit deren Hilfe die Architekten die Anwendung erstellen.

HinzuzufĂŒgen ist an dieser Stelle, dass der Blick auf eine Softwarearchitektur immer aus verschiedenen Perspektiven (Viewpoints) erfolgen muss. Demzufolge geben die verbreiteten Diagramme, die lediglich eine Menge von Rechtecken ĂŒber eine Menge von Linien verbinden, nicht wirklich die Softwarearchitektur wieder. Es bedarf stattdessen weiterer Beschreibungen des Systems, etwa der Interaktionen zwischen den Komponenten oder der SystemzustĂ€nde. Und da bloße Syntax nichts anderes reprĂ€sentiert als Kreidehaufen, gehört zur Softwarearchitektur neben dem „Was“ immer auch das „Warum“, also das Rationale fĂŒr alle architektonischen Entscheidungen. Mit einer Sammlung von UML Diagrammen ist es demnach nicht getan.

Aber was hat es mit den ominösen Grundprinzipen auf sich, die sich in der obigen Definition verstecken, fragt sich Bob. Dass viele Köche den Brei verderben, gilt nicht zuletzt auch fĂŒr die Softwareentwicklung. Wenn ein Entwickler zur Fehlerbehandlung Ausnahmen wirft, wĂ€hrend ein anderer Fehlerwerte zurĂŒckgibt und ein dritter Informationen in ein Logbuch schreibt, befinden sich unvermittelt drei Varianten der Fehlerbehandlung im System. Treten zudem im selben Architekturentwurf verschiedene Softwaremuster zur Lösung Ă€hnlicher Problemstellungen auf, leidet die daraus resultierende Softwarearchitektur an QualitĂ€tsmĂ€ngeln, beispielsweise an schlechter VerstĂ€ndlichkeit und geringer Symmetrie. Daher sollten Bob und seine Koarchitekten schon zu Beginn des Projekts dafĂŒr sorgen, dass sie einheitliche Entwurfskonventionen und -regeln einfĂŒhren. Mit der Erstellung von Dokumenten ist es allerdings nicht getan. Vielmehr mĂŒssen sie die Einhaltung aller Vorgaben und Konventionen auch regelmĂ€ĂŸig kontrollieren.

PrioritÀten des Zwiebelmodells

Das Prinzip der systematischen Architekturerstellung lĂ€sst sich am besten anhand einer Zwiebel illustrieren, was nicht nur daran liegt, dass die architektonischen Anstrengungen Bob bisweilen TrĂ€nen in die Augen treiben. Zu Beginn des Entwurfs und damit im Kern des Zwiebelmodells steht das fachliche Objektmodell. Bob ĂŒberlegt, aus welchen fachlichen EntitĂ€ten sich ein Webshop zusammensetzt. Da wĂ€ren zum Beispiel der Produktkatalog, der Warenkorb, das Zahlungssubsystem, die Kundendatenbank, das Logistik- und das Bestellsystem. NatĂŒrlich fristen diese Objekte kein Inseldasein, sondern haben Beziehungen zueinander. Ein Warenkorb muss mit dem Produktkatalog interagieren, ebenso mit dem Bezahlsystem.

Abbildung 2: Das Zwiebelmodell veranschaulicht die richtige Reihenfolge beim Entwurf: Zuerst die fachlichen Aspekte, dann die nichtfachlichen, jeweils mit absteigender Tendenz.

Fragt sich, wie Bob diese Beziehungen eruieren kann. Im Idealfall existiert fĂŒr die Problemstellung bereits eine allgemein bewĂ€hrte Referenzarchitektur fĂŒr Webshops, derer er sich bedienen kann. Leider gibt es solche Vorlagen nur fĂŒr wenige AnwendungsdomĂ€nen. Daher greift der Softwarearchitekt im Normalfall zu Anwendungsszenarien – zu Neudeutsch Use Cases –, um die Erwartungen an das Zielsystem aus der Vogelperspektive zu beschreiben, sowie zu einem Kontextdiagramm, um zu definieren, welche EntitĂ€ten sich im System und welche sich außerhalb befinden.

FĂŒr den Webshop ermittelt Bob dabei eine Reihe von AnwendungsfĂ€llen, etwa „Im Produktkatalog suchen“, „Produkt zu Warenkorb hinzufĂŒgen“ oder „Warenkorb bestellen“. Da der Kunde das existierende SAP-Warenwirtschaftssystem zur Verwaltung von Bestellungen verwenden möchte, befindet sich die SAP-Schnittstelle im Kontextdiagramm außerhalb des Webshops, ebenso wie das Logistiksystem oder die notwendigen Schnittstellen zu Banken und Kreditkartenfirmen. Aus den AnwendungsfĂ€llen und dem DomĂ€nenwissen ergibt sich nun inkrementell ein grobgranulares fachliches Objektmodell.

FĂŒr den Übergang der von Use Cases propagierten Black-Box- zu einer WhiteBox-Sicht mit detaillierten AblĂ€ufen existiert leider kein Automatismus. Dass es fĂŒr Bobs Webshop einen Anwendungsfall „Warenkorb bestellen“ gibt, ist eine Sache. Wie die internen Komponenten zur Realisierung dieses Anwendungsfalles zusammen spielen mĂŒssen, eine ganz andere. Die Softwarearchitekten stĂŒtzen sich auf ihre DomĂ€nenkenntnisse, um aus Use Cases etwa Sequenzdiagramme abzuleiten.

Abbildung 3: Use Cases reprĂ€sentieren als Black-Box-Sicht alle Erwartungen an das System seitens der Benutzer. Ein Kontextdiagramm klĂ€rt, was innerhalb und außerhalb des Systems sein soll.

Muster erleichtern das Leben

FĂŒr die generelle Strukturierung der Gesamtarchitektur bieten sich die sogenannten architektonischen Muster an, zu denen beispielsweise Layers, MVC (Model-View-Controller) oder Pipes-and-Filters gehören. Dass sich eine webbasierte GeschĂ€ftsanwendung wie Bobs Webshop gut mittels eines Mehrschichtenmodells entwerfen lĂ€sst, dĂŒrfte inzwischen zum Allgemeinwissen gehören. Ebenso, dass Techniken wie Ruby on Rails, JSF, Struts oder ASP.Net ein Anwenden des MVC-Musters forcieren. Überhaupt empfiehlt sich das Nutzen von Softwaremustern fĂŒr alle GranularitĂ€tsebenen des Designs, wollen Entwickler nicht stĂ€ndig das Rad neu erfinden. Was wieder auf die Grundprinzipien der Architekturerstellung zurĂŒckfĂŒhrt. Bobs Bibliothek enthĂ€lt daher die entsprechende Standardliteratur in Griffweite.

ErfahrungsgemĂ€ĂŸ scheitern viele Softwareentwicklungsprojekte weniger an den funktionalen Aspekten. Der Knackpunkt besteht stattdessen oft in der Umsetzung nichtfunktionaler QualitĂ€ten. Die ĂŒbliche Wunschliste operationaler Eigenschaften wie 99,999 % VerfĂŒgbarkeit oder Skalierbarkeit bis 100ˇ000 Kunden lĂ€sst sich ebenso wenig en passant realisieren wie entwicklungstechnische Eigenschaften Ă  la leichte Änderbarkeit oder Administrierbarkeit. Gerade die operationalen Eigenschaften eines Softwaresystems beeinflussen dessen Architektur als Ganzes, wĂ€hrend entwicklungstechnische Eigenschaften oft nur lokalen Einfluss auf eines oder wenige Subsysteme haben. Trotzdem stĂŒrzen sich viele Softwarearchitekten oft zuerst auf Letztere. Ein Strategy-Muster hier und da und vielleicht noch ganz woanders zur vermeintlich besseren Änderbarkeit – schon krankt die gesamte Softwarearchitektur am Strategy-Syndrom und mutiert zu einem schwer beherrschbaren, ĂŒbergenerischen Softwaresystem.

Drei Ebenen sind genug

Ein systematisches Vorgehen sieht anders aus. GrundsĂ€tzlich lassen sich drei Ebenen beziehungsweise Phasen in der besagten Zwiebel unterscheiden, sobald Bob das fachliche Objektmodell seines Webshops mit nichtfachlichen Aspekten schmĂŒcken will.

Phase I – Verteilung und ParallelitĂ€t: Zu Beginn sind die meisten Softwaresysteme heutzutage als nebenlĂ€ufige und verteilte Systeme konzipiert. Ein Webshop lĂ€uft in der Regel auf einem vom Kunden separierten Server und benutzt ParallelitĂ€tskonzepte, um Skalierbarkeits- und Performanceanforderungen zu erfĂŒllen. Dies impliziert, dass der vorliegende funktionale Kern in eine verteilte, nebenlĂ€ufige Infrastruktur einzubetten ist. FĂŒr die Trennung der PrĂ€sentationsschicht von den GeschĂ€ftskomponenten sowie deren Separation von EIS-Systemen (Enterprise Information Systems) wie Datenbanken oder ERP-Anwendungen bieten sich broker- und komponentenbasierte Softwarearchitekturen an. Und auch hier finden sich wieder die Softwaremuster fĂŒr verteilte und nebenlĂ€ufige Systeme. Genau genommen entwirft der Softwarearchitekt eine passende Infrastruktur fĂŒr Verteilung und ParallelitĂ€t, in die er anschließend das bereits vorhandene fachliche Objektmodell integriert. Das resultierende Architekturmodell dient dann als Basis fĂŒr die weiteren Phasen.

Phase II – strategisches Design: Nun erfolgt der strategische Entwurf. FĂŒr alle operationalen Eigenschaften erstellen Bob und seine Freunde ebenfalls passende Infrastrukturen. Dabei orientieren sie sich hinsichtlich der Reihenfolge an den vorgegebenen PrioritĂ€ten. WĂŒrde also Sicherheit die wichtigste operationale Eigenschaft darstellen, mĂŒssten sie zunĂ€chst gemĂ€ĂŸ der vorliegenden Anforderungsbeschreibung eine Sicherheitsinfrastruktur konstruieren, die Subsysteme beziehungsweise Komponenten wie Firewalls, Sicherheitsprotokolle oder Authentisierungsserver beinhaltet. Diese Infrastruktur integrieren sie in die bisherige Architektur. Danach folgen die weiteren operationalen Anforderungen mit absteigender PrioritĂ€t. Je weiter innen im Zwiebelmodell eine solche Eigenschaft liegt, desto mehr Einfluss hat sie naturgemĂ€ĂŸ auf die gesamte Softwarearchitektur. Ein Webshop, der in erster Linie sicher und nur in zweiter Linie verfĂŒgbar sein soll, besitzt folgerichtig eine andere Softwarearchitektur als einer, der primĂ€r mit VerfĂŒgbarkeit und sekundĂ€r mit Sicherheit glĂ€nzen will. Mindestens fĂŒr die wichtigsten operationalen Eigenschaften sollten Entwicklungsprojekte eigene Experten oder sogar ganze Teams spendieren, die sich hauptsĂ€chlich um genau diese nichtfachlichen Aspekte kĂŒmmern. GrundsĂ€tzlich ließen sich natĂŒrlich auch Verteilung und NebenlĂ€ufigkeit als operationale Eigenschaften charakterisieren. Da diese Aspekte aber normalerweise ĂŒber andere operationale Eigenschaften dominieren, ist es sinnvoll, zwischen den beschriebenen Phasen I und II zu unterscheiden.

Phase III – taktisches Design: Es lĂ€sst sich trefflich darĂŒber streiten, wo architektonisches Design endet und Softwaredesign beginnt. Oft betrachten Experten Architektur- und Softwaredesign als Synonyme. Im taktischen Entwurf konzentrieren sich Architekten auf die entwicklungstechnischen Eigenschaften. Dazu zĂ€hlen unter anderem Wartbarkeit, Erweiterbarkeit, Änderbarkeit und Testbarkeit. Es handelt sich also um Anforderungen, die weniger das Laufzeitverhalten der Anwendung als viel mehr deren Entwicklung oder Evolution betreffen. Nicht immer leuchtet den Projektbeteiligten allerdings ein, warum so wichtige Eigenschaften wie Änderbarkeit erst am Schluss einfließen. Gerade derlei QualitĂ€ten sollten sich aber in einem stabilen Fundament begrĂŒnden statt im Chaos. Bei FlexibilitĂ€tsanforderungen bietet sich die Commonality/Variability-Analyse als adĂ€quates Instrument an. Diese stellt fest, welche Bestandteile der Anwendung invariant und welche variabel sein sollen. Erstere beeinflussen die Softwarearchitektur bereits in frĂŒheren Entwurfsphasen, wĂ€hrend Letztere im taktischen Design zum Tragen kommen. Zwei Beispiele mögen das illustrieren:

Bob hat bereits im funktionalen Entwurf berĂŒcksichtigt, dass jeder Webshop ĂŒber ein Bezahlsystem verfĂŒgen muss. Andererseits soll der Webshop fĂŒr verschiedene Kunden zum Einsatz kommen, deren WĂŒnsche bezĂŒglich der Zahlungsoptionen variieren können. WĂ€hrend einige Online-Shops Zahlung per Rechnung offerieren, beschrĂ€nken sich andere auf EinzugsermĂ€chtigung oder Vorkasse. Die Art der Zahlung stellt somit eine VariabilitĂ€t dar, wĂ€hrend die Notwendigkeit des Bestellsystems selbst eine Invariante reprĂ€sentiert.

Skalierbarkeit ihrer Webshops wĂŒnschen natĂŒrlich alle Kunden. Deren potenzielles Ausmaß ist allerdings direkt proportional zu ihren finanziellen Möglichkeiten. So könnte Bob neben Web- auch Applikationsserver und Datenbanken replizieren und ĂŒber Komponenten fĂŒr Lastverteilung ansteuern. Oder er beschrĂ€nkt sich auf die kostengĂŒnstigere Variante, die lediglich eine Replikation der Webserver vorsieht und alle Softwareserveranwendungen parallel vorhĂ€lt. Letztere Variante sieht Bob deshalb fĂŒr alle Kundenszenarien vor, betrachtet das Replizieren von Applikationsservern und Datenbankservern aber als optional.

Die Reihenfolge beim Einbringen taktischer Eigenschaften bestimmt Bob erneut anhand eindeutiger PrioritĂ€ten. Am Ende seiner BemĂŒhungen steht er vor der vollendeten Zwiebel beziehungsweise vor einer stabilen Basisarchitektur, die als Fundament fĂŒr die nachfolgenden Verfeinerungsschritte dient. Auf die Implementierungsphase selbst kann dieser Artikel nicht weiter eingehen.

Der Teufel steckt im Detail

Irgendwann wĂ€hrend seiner architektonischen Schwerstarbeit stellt sich Bob die philosophische Frage, wie detailliert die Basisarchitektur fĂŒr den Webshop ĂŒberhaupt sein muss. Wie weit sollte der Softwarearchitekt also gehen und wann beginnt die eigentliche Implementierungsphase? In einigen Projekten soll die Entwurfsphase angeblich schon unĂŒberschaubare Ausmaße angenommen haben und so mancher Kunde vor Beendigung des Projektes dahingeschieden sein. Eine wissenschaftlich fundierte Antwort gibt es hierfĂŒr leider nicht, wohl aber eine Daumenregel. Und weil Bilder oft mehr sagen als tausend Worte, möge das Pyramidenmodell (Abbildung 4) der Veranschaulichung dienen. Die Architektur eines Softwaresystems umfasst demnach maximal drei Ebenen: das System als Ganzes, die grundlegenden Subsysteme und ihre Beziehungen sowie die Komponenten, aus denen sich wiederum die Subsysteme konstituieren.

Abbildung 4: Um sich nicht in Details zu verlieren, schlÀgt das Pyramidenmodell einen dreistufigen Ansatz vor.

Die Abbildung der mehrdeutigen Begriffe Subsysteme oder Komponenten auf reale EntitĂ€ten hĂ€ngt vom Problemkontext ab. In einem serviceorientierten Umfeld könnten die Subsysteme zum Beispiel Dienste darstellen, die sich ihrerseits aus Komponenten zusammensetzen. FĂŒr Kleinstsysteme könnten Subsysteme zu Komponenten und Komponenten zu Klassen mutieren.

Bekanntlich beginnen die wenigsten Softwareprojekte auf der grĂŒnen Wiese. Da wĂŒnschen Auftraggeber die Nutzung eines speziellen Datenbanksystems fĂŒr ihren Webshop oder fordern die optimale Nutzung eines bestimmten Betriebssystems. Ein Extrem stellen in diesem Zusammenhang eingebettete und Echtzeitsysteme dar, weil sie stringente Vorgaben hinsichtlich Laufzeitverhalten und Ressourcennutzung implizieren. Hier stellt sich die Frage, ob solche Aspekte ĂŒberhaupt ins bisherige Bild passen oder derartige Systeme einen gĂ€nzlich anderen Prozess benötigen. Zum GlĂŒck lassen sich die beschriebenen Prinzipien auch auf diese Problemkontexte anwenden, sofern die Softwarearchitekten die genannten stringenten Vorgaben als Anforderungen höchster PrioritĂ€t betrachten. Im Zwiebelmodell mĂŒsste Bob also von Anfang an Vorgaben wie die Begrenzung auf 512 KByte Hauptspeicher berĂŒcksichtigen.

Fazit

Bob ist ĂŒberglĂŒcklich, nachdem er sein erstes Projekt erfolgreich zu Ende gefĂŒhrt hat. Er hat gelernt, dass erfolgreiche Softwarearchitekturen sich nur in einem systematischen und inkrementellen Prozess realisieren lassen, wie dies auch bei allen anderen Ingenieursdisziplinen der Fall ist. Ad-hoc getriebene AnsĂ€tze hingegen erwecken zwar mitunter anfangs die Illusion eines rasanten Fortschritts, scheitern dann aber an der KomplexitĂ€t der Problemstellung, die den Beteiligten schon bald hoffnungslos ĂŒber den Kopf wĂ€chst.

NatĂŒrlich muss das VerhĂ€ltnis von Planung und Umsetzung in einem vernĂŒnftigen VerhĂ€ltnis stehen. Man kann sich auch zu Tode planen, wie einige Großprojekte aus jĂŒngster Zeit beweisen. Der Architekt sollte ĂŒber ein ausreichendes Fundament an Erfahrung und Wissen verfĂŒgen, das sich von der DomĂ€nenexpertise ĂŒber Technik- und Methodenkenntnisse bis zu sozialen FĂ€higkeiten erstreckt.

Und zu guter Letzt sollten Softwarearchitekten nicht nach Innovation, sondern nach Lösungen streben. Der erste TrÀgheitssatz der Softwarearchitektur postuliert nicht umsonst die ausgiebige Nutzung von Softwaremustern und anderen bewÀhrten Praktiken, um die ProduktivitÀt und EffektivitÀt zu steigern. Und ganz nebenbei verbessert sich dadurch Bobs Work-Life-Balance, aber das ist eine andere Geschichte.

Quellen: