Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Lire en français

Abschnitt 1.7 von 1.8 · Mittelstufe · 20 Min. Lesezeit

Technische Schulden, Architekturerosion und Architekturdrift

Videolektion

4 Min. · auf Englisch gesprochen, mit Untertiteln
Nur anhören (Audio)
Transkript lesen

Jedes Team nimmt Abkürzungen, und jedes Design altert, je mehr man lernt. Diese Lektion erklärt technische Schulden: was sie wirklich bedeuten, wie man sie sieht und wie man entscheidet, was sich zu tilgen lohnt.

Stellen Sie sich vor, Sie ziehen in aller Eile um und werfen alles in Kisten ohne Beschriftung. Sie sind pünktlich umgezogen, und darum ging es ja. Aber jetzt verschwenden Sie jedes Mal, wenn Sie etwas brauchen, zehn Minuten mit Suchen. Diese verschwendeten Minuten sind die Zinsen. Ordentlich auspacken und beschriften heißt, die Schulden zurückzuzahlen. Ein wenig davon ist in Ordnung und manchmal sogar klug. Gefährlich wird es, wenn es sich anhäuft.

Ward Cunningham prägte den Begriff 1992. Code zum ersten Mal auszuliefern ist, als würde man Schulden aufnehmen: Ein wenig beschleunigt, solange man es zügig zurückzahlt. Später erklärte er, dass es nie ein Freibrief für schludrigen Code war. Es ging ihm um Verständnis. Sie liefern Code aus, der Ihren jetzigen Wissensstand widerspiegelt, und wenn Sie mehr lernen, refaktorieren Sie ihn entsprechend. Das funktioniert nur, wenn der Code sauber genug ist, um ihn zu refaktorieren.

Die Begriffe aus der Finanzwelt helfen. Der Tilgungsaufwand ist der Aufwand, der nötig ist, um das Problem zu beheben. Die Zinsen sind der Mehraufwand, den Sie bei jeder Änderung zahlen, die das Problem berührt. Wenn ein Feature in sauberem Code vier Tage dauern würde, aber sechs dauert, sind die zwei zusätzlichen Tage Zinsen. Schulden in Code, der sich nie ändert, kosten also nichts. Tilgen ist eine Investitionsentscheidung: Es lohnt sich, wenn die Zinsen, die Sie sparen, den Tilgungsaufwand übersteigen.

Martin Fowler ordnet Schulden auf zwei Achsen ein: Wurden sie bewusst oder unbeabsichtigt aufgenommen, und war das leichtsinnig oder umsichtig? Umsichtig und bewusst: Wir müssen jetzt ausliefern und tragen die Folgen. Das ist bewusst und geplant, mit einem Tilgungsplan, und kann geschäftlich klug sein. Leichtsinnig und bewusst: Wir haben keine Zeit für Design. Das Team weiß es besser, kürzt aber trotzdem ab und bremst sich meist innerhalb weniger Wochen selbst aus. Leichtsinnig und unbeabsichtigt: Was sind Layer? Das Team sieht die Schulden nicht, die es aufbaut. Die Abhilfe sind Fähigkeiten, Reviews und Mentoring, nicht Refactoring allein. Umsichtig und unbeabsichtigt: Jetzt wissen wir, wie wir es hätten machen sollen. Jedes lernende Team landet hier, und deshalb ist kontinuierliches Refactoring normale Arbeit und kein Zeichen des Scheiterns.

Codeschulden liegen in einem einzelnen Modul und lassen sich oft in Stunden oder Tagen tilgen. Architekturschulden liegen in der Struktur, etwa bei Services, die sich eine Datenbank teilen. Ihre Tilgung berührt viele Teams und oft auch Daten, deshalb sind sie die teuerste Art. Perry und Wolf benannten zwei Arten, wie Struktur verfällt. Erosion entsteht durch Verstöße, etwa einen Controller, der die Datenbank direkt abfragt und die Service-Schicht umgeht. Drift entsteht durch mangelnde Rücksicht: Änderungen, die gegen keine Regel verstoßen, aber die beabsichtigten Konzepte ignorieren, sodass das System nach und nach seine Form verliert.

Wie findet man die Schulden, auf die es ankommt? Eine Technik trägt jede Datei danach auf, wie oft sie sich ändert und wie komplex sie ist. Komplexe Dateien, die sich selten ändern, kosten wenig Zinsen. Lassen Sie sie vorerst, wie sie sind. Einfache Dateien, die sich oft ändern, sind meist harmlos. Aber wo Komplexität und häufige Änderungen zusammenkommen, zahlen Sie bei jedem Commit Zinsen. An diesen Hotspots zahlt sich die Tilgung zuerst aus.

Um die Argumentation zu untermauern, misst ein Onlineshop die Schulden in einem Modul, das sich Bestellungen und Zahlungen teilen. Es wurde in sechs Monaten achtundvierzigmal geändert: der größte Hotspot. Der Mehraufwand bei jeder Änderung plus die Incidents ergibt etwa vierzehn Entwicklertage im Monat. Das sind rund achttausendvierhundert Pfund. Bestellungen und Zahlungen in kleinen Schritten zu trennen, würde etwa fünfundvierzig Entwicklertage kosten, rund siebenundzwanzigtausend Pfund. Bei etwa elf eingesparten Tagen pro Monat amortisiert sich das in rund vier Monaten. Selbst bei doppelten Kosten amortisiert es sich in etwa acht. Das ist eine Argumentation in den Begriffen des Auftraggebers: Tage, Geld und Amortisation, nicht Codequalität.

Das sind technische Schulden. Der vollständige Abschnitt zeigt weitere Wege, sie zu erkennen, und wie man sie mit einem Schuldenregister, geschützter Kapazität und laufendem Refactoring steuert. Als Nächstes betrachten wir in Abschnitt eins Punkt acht die Architektur über den Lebenszyklus. Bis gleich.

Was Sie wissen müssen

Was Ward Cunningham wirklich meinte

Der Begriff technische Schulden stammt aus Ward Cunninghams Erfahrungsbericht über das Portfolio-Management-System WyCash, den er 1992 auf der Konferenz OOPSLA vorstellte. Er schrieb, Code zum ersten Mal auszuliefern sei, als würde man Schulden aufnehmen: Ein wenig Schuld beschleunigt die Entwicklung, solange sie zügig durch eine Überarbeitung zurückgezahlt wird, und gefährlich wird es, wenn sie nicht zurückgezahlt wird: Jede Minute, die man mit nicht ganz richtigem Code verbringt, zählt als Zins auf diese Schuld. Ganze Entwicklungsorganisationen, warnte er, können unter der Schuldenlast zum Stillstand kommen.

Die Metapher wird oft als Erlaubnis missverstanden, schludrigen Code zu schreiben. Cunningham erklärte später (in einem kurzen Video von 2009), dass er das nie gemeint habe. Es ging ihm um Verständnis. Ein Team liefert Code aus, der sein aktuelles, unvollständiges Verständnis eines Problems widerspiegelt, weil man so am schnellsten aus der echten Nutzung lernt. Wenn das Verständnis wächst, passt der Code nicht mehr zu dem, was das Team inzwischen weiß, und jede Änderung muss diese Diskrepanz umgehen. Die Schulden zurückzuzahlen heißt, den Code durch Refactoring so umzubauen, dass er das Gelernte widerspiegelt. Das funktioniert nur, wenn der Code von vornherein sauber genug geschrieben wurde, um refaktoriert werden zu können. So gelesen sind Schulden ein Nebenprodukt des Lernens, nicht der Nachlässigkeit.

Seitdem hat sich der Sprachgebrauch erweitert. Heute umfasst „technische Schulden“ jeden Mangel an innerer Qualität, der künftige Änderungen langsamer oder riskanter macht, ob er aus dem Lernen, bewussten Abkürzungen, Unwissen oder schlichter Vernachlässigung entstanden ist. Die weitere Bedeutung ist nützlich, solange Sie im Kopf behalten, dass die verschiedenen Arten unterschiedliche Antworten verlangen.

Tilgung und Zinsen

Das Finanzvokabular macht die Metapher in Gesprächen mit Nicht-Technikern so wirkungsvoll. Der Tilgungsaufwand ist der Aufwand, der nötig ist, um das Problem zu beheben: das Modul umzustrukturieren, die Datenbank aufzutrennen, den Zyklus aufzulösen. Die Zinsen sind der Mehraufwand, der bei jeder Arbeit anfällt, die das Problem berührt, solange es besteht. Martin Fowlers Beispiel: Wenn ein Feature in sauberem Code vier Tage dauern würde, wegen Altlasten im Code aber sechs dauert, sind die zwei zusätzlichen Tage Zinsen.

Daraus folgen drei Konsequenzen. Erstens: Schulden, die nie berührt werden, kosten nichts: Ein unordentliches Modul, das niemand ändert, verursacht keine Zinsen, und es zu tilgen kann vergeudete Mühe sein. Zweitens: Zinsen haben einen Zinseszinseffekt: Notlösungen werden zum Fundament weiterer Notlösungen, neue Entwickler kopieren die Muster, die sie vorfinden, und die Kosten der späteren Reparatur steigen. Drittens: Tilgung ist eine Investitionsentscheidung: Es lohnt sich, den Tilgungsaufwand zu leisten, wenn die Zinsen, die Sie über einen sinnvollen Zeitraum sparen, ihn übersteigen. Damit wird aus einem emotionalen Argument („der Code ist ein Chaos“) ein wirtschaftliches („dieses Modul kostet uns elf Tage pro Quartal“).

Fowlers Quadrant der technischen Schulden

Nicht alle Schulden sind gleich. 2009 schlug Martin Fowler vor, Schulden entlang zweier Achsen einzuordnen: ob sie bewusst oder unbeabsichtigt aufgenommen wurden und ob die Entscheidung umsichtig oder leichtsinnig war. Die vier Kombinationen verlangen unterschiedliche Antworten.

Umsichtig und bewusst: Das Team kennt das bessere Design, hält es für die Kosten wert, jetzt auszuliefern, und plant die Tilgung. Das ist Cunninghams ursprünglicher Sinn, und es kann geschäftlich klug sein: etwa bei einem Start-up, das erst die Nachfrage nachweist, bevor es in Skalierung investiert. Leichtsinnig und bewusst: Das Team weiß es besser, verzichtet aber auf Design, weil es glaubt, keine Zeit zu haben, und bremst sich damit meist innerhalb weniger Wochen selbst aus. Leichtsinnig und unbeabsichtigt: Das Team weiß nicht genug, um zu erkennen, dass es Schulden aufbaut; die Abhilfe sind Fähigkeiten, Reviews und Mentoring, nicht Refactoring allein. Umsichtig und unbeabsichtigt: Ein fähiges Team leistet gute Arbeit und versteht erst später, wie es hätte strukturiert sein sollen. Fowler argumentiert, dass dies für jedes lernende Team unvermeidlich ist, weshalb kontinuierliches Refactoring zur normalen Arbeit gehört und kein Zeichen des Scheiterns ist.

Der Quadrant der technischen Schulden

Martin Fowlers Quadrant technischer Schulden: leichtsinnig/umsichtig, bewusst/unbeabsichtigtLeichtsinnUmsichtAbsichtVersehen„Wir haben keine Zeitfür Design.“Weiß es besser,kürzt trotzdem ab„Wir liefern jetzt undtragen die Folgen.“Bewusst, geplant,mit Tilgungsplan„Was sind Layer?“Ohne das Wissen,Schulden zu sehen„Jetzt wissen wir,wie es richtig wäre.“Lernen zeigt einbesseres Design
Nach Martin Fowler (2009): Die beiden leichtsinnigen Quadranten sind Probleme der Disziplin oder des Könnens; die beiden umsichtigen sind normale Folgen einer Auslieferung unter Unsicherheit.

Architekturschulden und Codeschulden

Schulden gibt es auf jeder Ebene, aber ihr Kostenprofil ändert sich mit der Größenordnung. Codeschulden liegen innerhalb eines Moduls: duplizierte Logik, eine Funktion, die fünf Dinge tut, fehlende Tests, schlechte Namen. Sie sind real, aber lokal; ein Entwickler kann sie meist in Stunden oder Tagen tilgen, oft während er an einem benachbarten Feature arbeitet. Architekturschulden liegen in der Struktur: Services, die sich eine Datenbank teilen, sodass keiner sein Schema allein ändern kann; eine Domäne, die entlang der falschen Linien aufgeteilt ist, sodass jedes Feature vier Teams berührt; eine synchrone Aufrufkette, durch die ein langsamer Service den Checkout lahmlegt; ein Framework, das mit jeder Schicht verschweißt ist. Ihre Tilgung berührt viele Module, oft viele Teams und manchmal Daten.

Die Forschung stützt die Intuition, dass strukturelle Schulden die teure Art sind. Eine Umfrage unter 1831 Entwicklern und Architekten, die Neil Ernst und Kollegen am Software Engineering Institute 2015 durchführten, ergab, dass Architekturentscheidungen die wichtigste genannte Quelle technischer Schulden waren, noch vor Problemen auf Codeebene. Werkzeuge, die Code Smells melden, finden Codeschulden gut und Architekturschulden schlecht, weil das Problem in den Beziehungen zwischen Teilen liegt und nicht in einer einzelnen Datei.

Architekturschulden sind aus demselben Grund wichtig, aus dem Architektur überhaupt wichtig ist: Wie Warum Architektur zählt gezeigt hat, sind strukturelle Entscheidungen diejenigen mit den höchsten Änderungskosten.

Erosion und Drift

Architekturschulden entstehen oft nicht durch eine schlechte Entscheidung, sondern durch Tausende kleiner Änderungen. Dewayne Perry und Alexander Wolf benannten in ihrem Aufsatz „Foundations for the Study of Software Architecture“ von 1992 zwei Wege, auf denen das geschieht. Architekturerosion wird durch Verstöße gegen die Architektur verursacht: ein Controller, der die Datenbank direkt abfragt und dabei die Service-Schicht umgeht; ein Modul, das in die internen Tabellen eines anderen greift. Jeder Verstoß macht das System brüchiger, als würde man eine tragende Wand entfernen. Architekturdrift wird durch mangelnde Rücksicht auf die Architektur verursacht: Änderungen, die gegen keine ausdrückliche Regel verstoßen, aber die beabsichtigten Konzepte ignorieren, sodass das System nach und nach an Stimmigkeit und klarer Form verliert. Drift ist weniger unmittelbar gefährlich als Erosion, verschleiert aber die Architektur, was wiederum Verstöße erleichtert.

Spätere Forscher verwenden „Erosion“ oft für die weitere Lücke zwischen der beabsichtigten Architektur (dem, was die Dokumente und der Kopf des Architekten sagen) und der implementierten Architektur (dem, was der Code tatsächlich tut). Wie auch immer die Begriffe lauten, die Ursachen sind vertraut:

Termindruck, der den kürzesten Weg statt des richtigen belohnt. Wissensverlust, wenn die Leute gehen, die das Design verstanden haben, und neue Mitarbeitende kopieren, was sie vorfinden. Unsichtbare Architektur: Regeln, die nur in einem Wiki stehen, das niemand liest, ohne dass der Build sie durchsetzt. Geänderte Anforderungen, durch die eine einst gute Struktur schlecht zum Problem passt. Organisatorischer Wandel: Nach dem Gesetz von Conway erzeugt eine Umorganisation Druck, das System entlang neuer Teamgrenzen umzuformen. Alternde Technologie: Frameworks und Plattformen, deren Support ausläuft, werden zu Schulden, ohne dass jemand den Code anfasst.

Schulden erkennen

Schulden, die Sie nicht sehen, können Sie nicht steuern, und das Bauchgefühl ist unzuverlässig: Entwickler beklagen sich meist am lautesten über den Code, den sie am häufigsten anfassen, was nützlich ist, aber sie wissen selten, wie viel jedes Problem kostet. Mehrere Techniken machen Schulden sichtbar.

Hotspots. Adam Tornhills Your Code as a Crime Scene (2015; zweite Auflage 2024) wendet Ideen der Forensik auf die Historie der Versionskontrolle an. Ein Hotspot ist Code, der sowohl komplex ist als auch häufig geändert wird. Komplexität allein reicht nicht: Eine komplexe Datei, die niemand anfasst, kostet keine Zinsen. Änderungshäufigkeit allein reicht auch nicht: Eine einfache Konfigurationsdatei kann sich täglich ändern, ohne Schaden anzurichten. Wo beides zusammenkommt, werden bei jedem Commit Zinsen gezahlt, und dort zahlt sich Tilgung zuerst aus. In den meisten Codebasen entfällt der Großteil der Änderungsaktivität auf einen kleinen Teil der Dateien.

Change Coupling. Dateien oder Services, die immer wieder in denselben Commits geändert werden, sind gekoppelt, ob der Code eine Abhängigkeit zeigt oder nicht. Wenn jede Änderung am Preisservice mit einer Änderung am Rechnungsservice einhergeht, sind sie eine Sache, die vorgibt, zwei zu sein. Change Coupling über Team- oder Servicegrenzen hinweg ist ein starkes Anzeichen für Architekturschulden.

Abhängigkeitszyklen und Regelverstöße. Statische Analyse kann den tatsächlichen Abhängigkeitsgraphen zeichnen und mit dem beabsichtigten vergleichen. Zyklen (A nutzt B, B nutzt C, C nutzt A) bedeuten, dass keines der drei für sich verstanden, getestet oder ausgeliefert werden kann. Architekturregeln („die Domänenschicht darf nicht von der Webschicht abhängen“) lassen sich bei jedem Build automatisch prüfen; das sind Fitness Functions, die Kapitel 11 behandelt.

Trends in der Auslieferung. Steigende Durchlaufzeiten für Änderungen, mehr durchrutschende Fehler pro Release, längere Einarbeitung, mehr Abstimmungsmeetings pro Feature und wachsende Scheu, bestimmte Bereiche anzufassen, sind nachlaufende Indikatoren für aufgelaufene Zinsen. Die DORA-Metriken für die Auslieferung (etwa Durchlaufzeit von Änderungen und Änderungsfehlerrate) bieten eine einheitliche Möglichkeit, einige davon über die Zeit zu verfolgen.

Hotspots finden

Ein Streudiagramm der Dateien nach Änderungshäufigkeit und Komplexität, mit Hotspots in der Ecke oben rechtsÄnderungshäufigkeit (Commits der letzten 12 Monate)HochNiedrigKomplexitätHotspots: hier anfangenKomplex, aber stabil:vorerst so lassenEinfach und rege:meist harmlos
Trägt man jede Datei danach auf, wie oft sie sich ändert und wie komplex sie ist, zeigt sich, wo Schulden am häufigsten bezahlt werden: bei den wenigen Dateien in der Ecke oben rechts.

Schulden steuern

Keine gesunde Codebasis hat null Schulden, und der Versuch, null zu erreichen, ist selbst Verschwendung. Das Ziel ist, Schulden sichtbar, bewusst und tragbar zu halten. Teams, denen das gut gelingt, kombinieren mehrere Praktiken.

Ein Schuldenregister. Halten Sie bedeutende Schuldenposten dort fest, wo das Team seine Arbeit plant: worin das Problem besteht, wo es liegt, wie es entstanden ist, den geschätzten Tilgungsaufwand, die geschätzten Zinsen (mit Belegen wie Hotspot-Daten oder aktuellen Tickets) und den Auslöser für die Tilgung. Ein Register macht aus vagen Klagen eine Liste, die sich zusammen mit Features priorisieren lässt.

Ein fester Anteil der Kapazität. Viele Teams reservieren einen gleichbleibenden Anteil jeder Iteration, meist irgendwo zwischen 10 und 20 Prozent, für die Tilgung von Schulden und andere Verbesserungsarbeit. Für eine magische Zahl gibt es keine Belege; entscheidend ist, dass der Anteil geschützt ist und nicht jedes Mal verschwindet, wenn ein Termin naht.

Refactoring parallel zu Features. Am günstigsten tilgen Sie Schulden, wenn Sie ohnehin in dem Bereich arbeiten, weil Sie den Kontext im Kopf haben und die Tests laufen. Fowler nennt das opportunistisches Refactoring. Seine alltägliche Form ist die Pfadfinderregel, die Robert C. Martin bekannt gemacht hat: Hinterlassen Sie den Code ein wenig sauberer, als Sie ihn vorgefunden haben. Weil Hotspots per Definition dort liegen, wo Features landen, konzentriert sich der Aufwand so ganz von selbst dort, wo die Zinsen am höchsten sind.

Geplante strukturelle Tilgung. Architekturschulden lassen sich selten allein mit kleinen Schritten abbauen. Sie brauchen ein ausdrückliches, finanziertes Arbeitspaket mit einem Ziel, einem Plan für eine schrittweise Migration und der Unterstützung der Stakeholder. Techniken wie das Strangler-Fig-Muster (Kapitel 11, Altsysteme modernisieren) erlauben es einem Team, eine Struktur Stück für Stück zu ersetzen, ohne alles auf einen Schlag neu zu schreiben.

Vorbeugung. Automatisierte Architekturprüfungen im Build, Code-Reviews, die neben dem Stil auch auf die Struktur achten, und aktuelle Entscheidungsdokumente bremsen Erosion und Drift an der Quelle.

Schulden für nicht technische Stakeholder erklären

Auftraggeber und Product Owner müssen nichts über zyklische Abhängigkeiten hören; sie müssen die Auswirkungen auf das verstehen, was ihnen wichtig ist: Tempo, Kosten, Risiko und Kundenerlebnis. Die Finanzmetapher ist hier ein Geschenk, vorausgesetzt, Sie verwenden sie mit Zahlen.

Sprechen Sie in Zeit und Geld: „Jede Änderung am Checkout kostet uns etwa drei zusätzliche Entwicklertage, weil Zahlung und Bestellungen so ineinander verheddert sind.“ Sprechen Sie in Risiko: „Zwei unserer letzten vier Incidents begannen in diesem Modul.“ Sprechen Sie in Optionen: „Bis wir das trennen, können wir die neuen Zahlungsarten nicht anbieten, die der Vertrieb angefragt hat.“ Und stellen Sie die Tilgung als Investition mit Amortisationszeit dar, nicht als Bitte um Entwicklungszeit. Vermeiden Sie zwei Fallen: Schulden als moralisches Versagen der Vorgänger darzustellen (sie sind meist umsichtig oder unbeabsichtigt entstanden) und einen unbefristeten „Refactoring-Sprint“ ohne messbares Ergebnis zu verlangen.

Ausgearbeitetes Beispiel

Ausgearbeitetes Beispiel: die Zinsen einer Schuld schätzen

In einem Onlineshop teilen sich Bestell- und Zahlungslogik ein großes Modul und dieselben Datenbanktabellen. Das Team vermutet, dass sie das viel kostet. Es sammelt Belege aus den Tickets und der Versionskontrollhistorie der letzten sechs Monate und schätzt dann.

Änderungen, die das Modul berühren48 Änderungen in sechs Monaten, etwa 8 pro Monat (es ist der größte Hotspot).
Mehraufwand pro ÄnderungIm Vergleich mit ähnlichen Änderungen an anderer Stelle schätzen die Entwickler jeweils etwa 1,5 zusätzliche Tage für das Verstehen, das Umgehen der gemeinsamen Tabellen und zusätzliche Regressionstests.
Aufwandszinsen8 Änderungen × 1,5 Tage = 12 Entwicklertage pro Monat.
Fehlerzinsen3 Produktions-Incidents in sechs Monaten, die auf dieses Modul zurückgingen und deren Untersuchung und Behebung jeweils etwa 4 Entwicklertage kostete: 12 Tage ÷ 6 = 2 Tage pro Monat.
Zinsen insgesamtEtwa 14 Entwicklertage pro Monat. Bei Vollkosten von £600 pro Entwicklertag sind das rund £8400 pro Monat oder etwa £100.000 pro Jahr.
TilgungsaufwandBestellungen und Zahlungen hinter einer Schnittstelle trennen und die Tabellen aufteilen, schrittweise umgesetzt: geschätzt 45 Entwicklertage, etwa £27.000 insgesamt.
Verbleibende Zinsen nach der TilgungDie Entwickler rechnen damit, dass etwas Mehraufwand bleibt: geschätzt 3 Entwicklertage pro Monat.
AmortisationMonatliche Ersparnis etwa 11 Entwicklertage. 45 ÷ 11 ergibt etwa 4 Monate, bis der Tilgungsaufwand wieder hereingeholt ist.
EmpfehlungTilgen, in Schritten von jeweils etwa zwei Wochen, beginnend mit den Tabellen, die am häufigsten an Incidents beteiligt sind. Die Durchlaufzeit von Änderungen am Checkout verfolgen, um die Ersparnis zu bestätigen.

Jede Zahl ist eine Schätzung mit großer Unsicherheit. Selbst bei doppeltem Tilgungsaufwand von 90 Tagen amortisiert es sich in etwa acht Monaten, die Schlussfolgerung ist also robust; diese Prüfung lohnt es sich, den Stakeholdern zu zeigen.

Dieselbe Methode kann zeigen, dass sich manche Schulden nicht zu tilgen lohnen: Ein unordentliches Modul, das zweimal im Jahr geändert wird, kann eine Amortisationszeit von mehreren Jahren haben.

Die Argumentation erfolgt in den Begriffen des Auftraggebers (Tage, Geld, Incidents, Amortisation), nicht in Begriffen der Codequalität.

Prüfen Sie Ihr Verständnis

Warum kann ein sehr unordentliches Modul eine geringe Priorität für die Tilgung haben?

Weil Zinsen nur anfallen, wenn der Code geändert wird oder Ausfälle verursacht. Wenn niemand ihn anfasst und er stabil ist, kosten die Schulden fast nichts.

Warum lassen sich leichtsinnige, unbeabsichtigte Schulden nicht allein durch Refactoring beheben?

Weil das Team nicht wusste, dass es Schulden aufbaute; solange sich seine Fähigkeiten und Review-Praktiken nicht verbessern, baut es dieselbe Art von Schulden so schnell auf, wie es sie tilgt.

Was ist in den Begriffen von Perry und Wolf der Unterschied zwischen Erosion und Drift?

Erosion entsteht durch Verstöße gegen die Regeln der Architektur; Drift entsteht durch Änderungen ohne Rücksicht auf die Architektur, die gegen keine ausdrückliche Regel verstoßen, aber ihre Konzepte verwischen.

Warum verbinden Hotspot-Analysen Änderungshäufigkeit mit Komplexität, statt eines von beiden allein zu nutzen?

Komplexer Code, der sich nie ändert, verursacht kaum Zinsen, und einfacher Code, der sich oft ändert, ist billig zu ändern; erst die Kombination zeigt, wo Schulden immer wieder Aufwand kosten.

Weiter · 1.8Architektur im LebenszyklusBig Design Up Front gegenüber emergentem Design, was das Agile Manifest wirklich sagt, Fairbanks’ risikogetriebenes Modell, beabsichtigte Architektur und die Runway, kontinuierliche Architektur, Walking Skeletons, Spikes und Architektur in DevOps.Weiter →

Quellen und weiterführende Literatur

Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.

Fragen: „Wie überzeuge ich meinen Product Owner, Zeit in den Abbau von Architekturschulden zu stecken, wenn ein langes Feature-Backlog wartet?“