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.

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.

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.

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.

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:
- iX Magazin fĂŒr professionelle Informationstechnik 11/2008, S.118ff
- Software Product Lines : Practices and Patterns, ISBN: 978-0201703320
- Writing Effective Use Cases, ISBN: 978-0201702255
- Architecting Enterprise Solutions: Patterns for High-Capability Internet-based Systems, ISBN: 978-0470856123
- Handbook of Software Architecture, Grady Booch
- Carnegie-Mellon University
Kommentar verfassen