Eine der Zielsetzungen dieses Buches besteht darin, Ihnen einen Weg durch das verworrene Dickicht der Begriffsauslegungen aufzuzeigen und ein fĂŒr alle Mal zu definieren, was genau unter Design und Architektur zu verstehen ist. FĂŒr den Anfang soll an dieser Stelle zunĂ€chst einmal festgehalten werden, dass es eigentlich keinen Unterschied gibt. Ăberhaupt keinen Unterschied.
Das Wort »Architektur« wird hĂ€ufig im Zusammenhang mit Dingen auf einer ĂŒbergeordneten Ebene verwendet, die sich von den Details auf einer untergeordneten Ebene unterscheiden. Mit »Design« scheinen dagegen oftmals Strukturenâ und Entscheidungen auf einer untergeordneten Ebene bezeichnet zu werden. Betrachtet man die Arbeit eines echten Architekten, ist diese Begriffsverwendung jedoch geradezu absurd.
Versetzen Sie sich doch einmal in den Architekten, der Ihr neues Haus entwirft. Besitzt dieses GebĂ€ude eine Architektur? NatĂŒrlich! Und worin besteht diese Architektur? Nun, einerseits beschreibt sie die Gestalt des Hauses â sein Ă€uĂeres Erscheinungsbild, den Aufriss und die Anordnung des Wohnraums bzw. der RĂ€ume. Wenn Sie sich jedoch die PlanungsentwĂŒrfe Ihres Architekten anschauen, werden Sie darin zum anderen auch eine Vielzahl von untergeordneten Details entdecken. So ist zum Beispiel ausgewiesen, wo jede einzelne Steckdose, jeder einzelne Lichtschalter und jede einzelne Lampe platziert werden wird. Sie können sehen, welche Schalter welche Lampen steuern. Ebenso lĂ€sst sich feststellen, wo der Kamin errichtet werden wird und an welchen Standorten und in welcher GröĂe der Warmwasserboiler und die Schmutzwasserpumpe installiert werden. Und darĂŒber hinaus werden Sie auch detaillierte Darstellungen der Wand-, Dach- und Fundamentkonstruktionen vorfinden.
Kurz: Die PlĂ€ne geben Auskunft ĂŒber alle winzigen Details, die sĂ€mtliche auf der ĂŒbergeordneten Ebene getroffenen Entscheidungen stĂŒtzen. Und es wird deutlich, dass diese untergeordneten Details und die ĂŒbergeordneten Entscheidungen Teil des Gesamtentwurfs des Hauses sind.
Genauso verhĂ€lt es sich auch mit dem Softwaredesign. Die untergeordneten (low-level) Details und die ĂŒbergeordnete (high-level) Struktur sind allesamt Teil desselben Ganzen. Zusammen bilden sie ein durchgĂ€ngiges Konstrukt, das die Gestalt des Systems definiert. Das eine kann nicht ohne das andere sein. TatsĂ€chlich gibt es keine eindeutige Grenzlinie zwischen diesen beiden Komponenten â es gibt einfach nur ein Kontinuum an Entscheidungen, die sich von der höchsten bis zu den niedrigsten Ebenen erstrecken.
1.2 Fallstudie
Die nachstehende Fallstudie soll hier als Beispiel dienen. Sie weist reale Daten eines echten Unternehmens aus, das jedoch anonym bleiben möchte.
Werfen wir zunĂ€chst einen Blick auf den Anstieg des technischen Mitarbeiterstabs im Engineering-Bereich. Sicher werden Sie zustimmen, dass dieser Trend Ă€uĂerst vielversprechend aussieht. Das in Abbildung 1.1 gezeigte Personalwachstum muss doch ein Indikator fĂŒr einen bedeutenden Erfolg sein!
Betrachten wir als NĂ€chstes die ProduktivitĂ€tâ des Unternehmens in demselben Zeitraum, und zwar gemessen an den Lines of Codeââ, also der Anzahl der Codezeilenâ (siehe Abbildung 1.2).
Hier lÀuft ganz offenkundig irgendetwas nicht richtig: Obwohl jedes Release unter Zuhilfenahme einer stetig steigenden Anzahl von Entwicklern bearbeitet wird, scheint der Code lediglich in einem asymptotischen VerhÀltnis dazu anzuwachsen.
Was nun folgt, ist allerdings eine noch weitaus besorgniserregendere Grafik: Abbildung 1.3 zeigt, wie sich die Kosten pro Codezeiâle im Zeitverlauf verĂ€ndert haben.
Diese Trendentwicklungen sind definitiv nicht tragbar. Egal, wie profitabel das Unternehmen zum gegenwĂ€rtigen Zeitpunkt auch dastehen mag: Verlaufskurven wie diese werden die Gewinne des GeschĂ€ftsmodells in katastrophaler Art und Weise belasten und die Firma in die Verlustzone treiben â wenn nicht sogar direkt in die Pleite.
Doch was in aller Welt hat diese bemerkenswerte VerĂ€nderung in Bezug auf die ProduktivitĂ€t verursacht? Warum war die Codeerstellung fĂŒr Release Nummer 8 gleich 40 Mal teurer als fĂŒr Release Nummer 1?
1.2.1 Die Signatur des Chaosââ
Was Sie in den vorstehenden Grafiken gesehen haben, könnte man auch als die »Signatur des Chaosââ« bezeichnen. Wenn Systeme hastig zusammengeschustert werden, wenn die schiere Anzahl der Programmierer der alleinige Antrieb fĂŒr den zu erzielenden Output ist und wenn nur wenige bis gar keine Ăberlegungen hinsichtlich der Sauberkeit des Codes oder der Struktur des Designs angestellt werden, dann können Sie gewiss sein, dass Sie den hier demonstrierten eingeschlagenen Weg bis zum bitteren Ende gehen werden.
In Abbildung 1.4 ist zu sehen, wie sich dieser Weg fĂŒr die Entwickler darstellt: Sie haben mit einer ProduktivitĂ€t von nahezu 100 % angefangen, die dann jedoch mit jedem weiteren Release radikal abfiel. Bereits ab Release Nummer 4 wurde deutlich, dass ihre ProduktivitĂ€t in einer asymptotischen AnnĂ€herung gegen null abflachen wĂŒrde.
Aus Sicht der Entwickler ist das enorm frustrierend, weil sie faktisch alle die ganze Zeit ĂŒber unvermindert hart an dem Programm weitergearbeitet haben â ohne dass auch nur ein einziger von ihnen seine Anstrengungen verringert hĂ€tte.
Und doch, trotz all ihres heroischen Einsatzes, der Ăberstunden und ihrer Hingabe, bringen sie einfach nicht mehr viel zustande. All ihre BemĂŒhungen entfernen sich zusehends von den Features weg und richten sich nun immer mehr darauf, das entstandene Chaos zu verwalten. Ihre Aufgabe hat sich somit inzwischen dahin gehend verĂ€ndert, dass sie jetzt das Chaos von einer Stelle zur nĂ€chsten verlagern, und wieder zur nĂ€chsten und ĂŒbernĂ€chsten, damit sie ĂŒberhaupt noch in der Lage sind, auch nur ein einziges weiteres mickriges Feature zu ergĂ€nzen.
1.2.2 Die Perspektive der Unternehmensleitung
Wenn Sie nun glauben, das sei schon ĂŒbel, dann stellen Sie sich nur einmal vor, wie sich die Sachlage der FĂŒhrungsebene des Unternehmens darstellt! Abbildung 1.5 zeigt die Entwicklung der monatlichen Gehaltszahlungâen fĂŒr denselben Zeitraum.
Release Nummer 1 wurde bei monatlichen Gehaltszahlungen von wenigen Hunderttausend US-Dollar fertiggestellt. Das zweite Release kostete bereits ein paar Hunderttausend Dollar mehr. Und mit Release Nummer 8 hatten die monatlichen Zahlungen bereits 20 Millionen US-Dollar erreicht, Tendenz steigend!
Allein dieses Diagramm ist schon erschreckend. Zweifelsohne ist hier irgendetwas Alarmierendes im Busch. Man kann nur hoffen, dass die ErtrĂ€ge die Kosten am Ende ĂŒbersteigen werden und somit die Ausgaben rechtfertigen â doch egal, wie man diesen Kurvenverlauf auch betrachtet, er gibt in jedem Fall Anlass zur Sorge.
Vergleichen Sie die Kurve in Abbildung 1.5 nun aber mal mit den pro Release geschriebenen Codezeilen in Abbildung 1.2. Mit der Investition von ursprĂŒnglich wenigen Hunderttausend Dollar pro Monat wurde eine Menge FunktionalitĂ€t erzielt â die letzten 20 Millionen Dollar brachten dagegen nahezu nichts! Jeder CFO bzw. Finanzdirektor wird mit einem Blick auf diese beiden grafischen Darstellungen erkennen, dass sofort etwas unternommen werden muss, um die bevorstehende Katastrophe abzuwenden.
Doch was lĂ€sst sich dagegen unternehmen? Was ist hier schiefgelaufen? Wodurch wurde dieser unglaubliche ProduktivitĂ€tsabfall verursacht? Was kann die Managementebene anderes tun, als mit den FĂŒĂen aufzustampfen und den Entwicklern ihren Unmut kundzutun?
1.2.3 Was ist schiefgelaufen?
Vor fast 2.600 Jahren erzĂ€hlte der griechische Dichter Ăsop die Fabel von der Schildkröte und dem Hasen. Die Moral dieser Geschichte wurde im Laufe der Zeit auf vielerlei unterschiedliche Weise interpretiert:
»Eile mit Weile.«
»Nicht den Schnellen gehört im Wettlauf der Sieg, nicht den Tapferen der Sieg im Kampf.«
»Blinder Eifer schadet nur.«
Im Prinzip illustriert diese Fabel die Unvernunft der SelbstĂŒberschĂ€tzungâââ: Der Hase vertraut dermaĂen auf die ihm eigene Schnelligkeit, dass er das Rennen nicht ernst genug nimmt und ein Nickerchen hĂ€lt, wĂ€hrend die Schildkröte unterdessen die Ziellinie ĂŒberquert.
Moderne Entwickler finden sich in einer Ă€hnlichen Wettbewerbssituation wieder â und stellen eine ganz Ă€hnliche SelbstĂŒberschĂ€tzung zur Schau. Allerdings schlafen sie nicht, ganz im Gegenteil: Die Programmierer von heute arbeiten buchstĂ€blich Tag und Nacht. Dennoch: Ein Teil ihres Verstandes befindet sich oftmals tatsĂ€chlich im DĂ€mmerschlaf â und zwar der Teil, der im Grunde genommen genau weiĂ, dass guter, sauberer und ordentlich designter Code den entscheidenden Unterschied macht.
Diese Entwickler erliegen einer landlĂ€ufigen Illusion: »AufrĂ€umen können wir spĂ€ter immer noch, jetzt mĂŒssen wir das System aber zuerst mal auf den Markt bringen!« Allerdings wird der Code im Nachhinein natĂŒrlich nicht mehr aufgerĂ€umt â ganz einfach weil der Marktdruck niemals nachlĂ€sst. Ist die MarkteinfĂŒhrung erst einmal vollzogen, hat man sofort eine Horde von Wettbewerbern auf den Fersen, denen man um jeden Preis vorausbleiben muss, indem man im ĂŒbertragenen Sinne so schnell rennt, wie man nur kann.
Dementsprechend wird den Programmierern zu keinem Zeitpunkt ein Wechsel ihres Arbeitsmodus gelingen. Sie können nicht zurĂŒck und den vorhandenen Code sĂ€ubern, weil sie schon gleich wieder das nĂ€chste Feature fertigstellen mĂŒssen â und das nĂ€chste und das nĂ€chste und das nĂ€chste. So hĂ€uft sich immer mehr Unordnung an, und in der Konsequenz nimmt die ProduktivitĂ€t einen zielstrebigen asymptotischen Verlauf gegen null.
Ebenso wie der Hase der SelbstĂŒberschĂ€tzung seiner Schnelligkeit erlag, verfallen auch die Entwickler einer SelbstĂŒberschĂ€tzung in Bezug auf ihre FĂ€higkeit, produktiv zu bleiben. Das Chaos, das sich in den Code einschleicht und ihre ProduktivitĂ€t beeintrĂ€chtigt, setzt sich somit unerbittlich fort. Und wenn diesem Prozess nicht Einhalt geboten wird, reduziert er ebendiese ProduktivitĂ€t binnen weniger Monate auf null.
Ein noch gravierenderer Trugschluss, dem die Entwickler erliegen, ist jedoch die Vorstellung, dass ihnen das Schreiben von unordentlichem Code kurzfristig einen Geschwindigkeitsvorteil bringen und alles andere auf lange Sicht nur aufhalten wĂŒrde. Programmierer, die diesem Irrglauben aufsitzen, demonstrieren nicht nur die SelbstĂŒberschĂ€tzung des Hasen in Bezug auf ihre FĂ€higkeit, den Wechsel vom chaotischen Arbeiten zur zukĂŒnftigen Beseitigung der angerichteten Unordnung zu vollziehen, sondern begehen darĂŒber hinaus auch einen simplen faktischen Fehler, denn: Tatsache ist, dass Unordnung immer fĂŒr mehr Verzögerungen sorgt als die fortgesetzte Einhaltung sauberer Programmierung, unabhĂ€ngig davon, welcher Zeitrahmen zugrunde gelegt wird.
Betrachten Sie in diesem Zusammenhang einmal die Ergebnisse eines bemerkenswerten, von Jason Gorman unternommenen Experiments, das in Abbildung 1.6 veranschaulicht ist. Jason fĂŒhrte seine Untersuchungsreihe ĂŒber einen Zeitraum von sechs Tagen durch. An je...