Architecture Decision Records
Architekturentscheidungen festhalten
Die Idee und ihr Nutzen
Das Entwicklungsteam einer Schadenanwendung beschließt, Fotos von Schäden nicht mehr in der Datenbank, sondern in einem Objektspeicher abzulegen, einem eigenen Speicherdienst für große Dateien. Ein Jahr später kommt ein neuer Entwickler ins Entwicklungsteam und fragt, warum die Fotos getrennt von den übrigen Schadendaten liegen. Die Antwort steht in einem kurzen Dokument, das das Entwicklungsteam damals geschrieben hat. Das Dokument enthält die Ausgangslage, die Entscheidung, die verworfenen Möglichkeiten und die Folgen. Ein solches Dokument heißt Architecture Decision Record, kurz ADR, auf Deutsch Protokoll einer Architekturentscheidung. Eine Architekturentscheidung legt den Grundaufbau eines Systems fest, hier den Ort, an dem die Fotos liegen. Der neue Entwickler liest im ADR, dass die nächtliche Sicherung der Datenbank wegen der Fotos zu lange dauerte, und kann prüfen, ob dieser Grund heute noch gilt. Das Schreiben von ADRs ist eine Arbeitsweise zur Dokumentation, kein Programmteil.
Wie funktioniert es?
Die Datenbank der Schadenanwendung wächst durch hochgeladene Schadenfotos um etwa 200 GB im Monat. Das Betriebsteam betreibt und sichert die Datenbank. Das Betriebsteam meldet dem Entwicklungsteam, dass die nächtliche Sicherung der Datenbank morgens noch läuft, wenn die Sachbearbeiter mit der Arbeit beginnen. Das Entwicklungsteam prüft zwei Möglichkeiten. Die erste ist, die Fotos als Dateien auf der Festplatte eines Servers abzulegen. Das Entwicklungsteam verwirft diese Möglichkeit, weil die Schadenanwendung auf mehreren Servern läuft, auf jedem Server ein Exemplar desselben Programms. Jedes Exemplar muss auf dieselben Fotos zugreifen, doch die Festplatte eines Servers erreicht nur das Exemplar auf diesem Server. Die zweite ist der Objektspeicher, aus dem jedes berechtigte Programm eine Datei über eine Adresse abruft. Das Entwicklungsteam wählt den Objektspeicher. Als Folge hält es fest, dass Fotos und Schadendaten künftig getrennt gesichert werden müssen und dass beim Wiederherstellen beide Sicherungen zueinander passen müssen. Das Entwicklungsteam schreibt Ausgangslage, Entscheidung, verworfene Möglichkeit und Folgen in ADR 008 und legt ADR 008 mit dem Status „angenommen“ im Repository ab, der gemeinsamen Ablage für Programmcode und ADRs. Das Repository speichert jede Änderung mit Datum und Verfasser. Ein Jahr später will ein neuer Entwickler die Fotos wieder in die Datenbank legen, damit alle Schadendaten an einem Ort liegen, und sucht nach der Begründung. Er liest ADR 008 im Repository, sieht das Sicherungsproblem und die verworfene Dateilösung und versteht die Entscheidung, ohne jemanden fragen zu müssen, der damals dabei war. Hätte sich die Lage wesentlich geändert, würde der neue Entwickler ein neues ADR vorschlagen, und ADR 008 bekäme den Status „abgelöst durch“. Eine solche Änderung wäre zum Beispiel eine neue Datenbank mit schnellerer Sicherung.
Wie ein Softwaresystem grundsätzlich aufgebaut ist, entscheidet ein Entwicklungsteam meist in Besprechungen: welche Datenbank das System nutzt, wo Dateien liegen, wie Programme Daten austauschen. Solche Architekturentscheidungen bestimmen den Grundaufbau des Systems und lassen sich nur mit viel Aufwand ändern. Für jede Architekturentscheidung schreibt das Entwicklungsteam ein eigenes kurzes Dokument, meist eine Textdatei im selben Repository wie der Programmcode. Bewährt hat sich ein fester Aufbau:
- Am Anfang stehen eine Nummer und ein Titel, etwa „ADR 008: Schadenfotos im Objektspeicher ablegen“. Die Nummer macht das Dokument eindeutig auffindbar.
- Der Status lautet „vorgeschlagen“, solange die Entscheidung noch zur Abstimmung steht, danach „angenommen“ und später womöglich „abgelöst durch ADR 027“.
- Die Ausgangslage beschreibt, welches Problem zu lösen war und welche Bedingungen damals galten.
- Die Entscheidung sagt in einem oder zwei Sätzen, was das Entwicklungsteam gewählt hat.
- Unter den verworfenen Möglichkeiten steht, was noch zur Wahl stand und warum das Entwicklungsteam es nicht gewählt hat. Dieser Teil verhindert am wirksamsten, dass dieselbe Diskussion wieder beginnt.
- Die Folgen nennen, was durch die Entscheidung leichter und was schwerer wird.
Ein ADR macht eine Entscheidung nicht richtiger und hindert niemanden daran, sie zu ändern. Wer die Fotos später doch wieder in der Datenbank ablegen will, kennt durch ADR 008 aber den damaligen Grund, die zu lange nächtliche Sicherung.
Ein angenommenes ADR wird inhaltlich nicht mehr geändert, damit nachvollziehbar bleibt, was wann entschieden wurde. Ändert das Entwicklungsteam später seine Meinung, schreibt es ein neues ADR, und beide Dokumente verweisen aufeinander. Tippfehler darf man berichtigen; die ursprüngliche Begründung bleibt dabei erhalten.
ADR 008: warum Schadenfotos im Objektspeicher liegen
Wann ist es sinnvoll und wann nicht?
Ein ADR lohnt sich
- Eine Entscheidung lässt sich nur mit viel Aufwand rückgängig machen. Beispiele sind die Wahl der Datenbank, die Aufteilung eines Systems in Dienste oder das Sicherheitskonzept. Ohne ADR muss das Entwicklungsteam vor jeder späteren Änderung erst herausfinden, warum es damals so entschieden hat.
- Teammitglieder wechseln häufig, oder mehrere Teams arbeiten über viele Jahre an einem System. Ohne ADR kennen oft nur die an einer Entscheidung beteiligten Personen die Gründe für diese Entscheidung. Manche Gründe stehen nur in verstreuten Chatnachrichten. Verlassen diese Personen das Entwicklungsteam, kennt niemand mehr die Gründe. Den Programmcode verwaltet ein Entwicklungsteam ohnehin gemeinsam, die Begründungen für den Aufbau des Systems aber nicht.
- Ein neues Teammitglied soll erkennen können, ob eine ungewöhnliche Lösung ein Versehen oder eine bewusste Abwägung war. Ohne ADR legt das neue Teammitglied die Fotos womöglich aus Unkenntnis wieder in die Datenbank, und die nächtliche Sicherung dauert wieder zu lange. Oder niemand traut sich, die Lösung anzufassen, obwohl sich die Lage geändert hat. In beiden Fällen führt das Entwicklungsteam dieselbe Diskussion erneut.
- Das System wird in einer regulierten Branche eingesetzt, etwa bei Banken und Versicherungen. In einer Versicherung wollen Prüfer der internen Revision oder der Versicherungsaufsicht nachvollziehen, warum ein System so gebaut wurde. Die interne Revision ist die Prüfabteilung des Unternehmens. Im Repository können die Prüfer die Begründung samt Datum und Verfasser nachlesen.
Ein ADR ist nicht das Richtige
- Es geht um eine Kleinigkeit wie die Aktualisierung einer Programmbibliothek. Dann trägt der Entwickler den Grund in die kurze Beschreibung ein, die das Repository zu jeder Änderung speichert. So entstehen keine Dokumente, die niemand liest, und die wichtigen ADRs gehen nicht in der Menge unter.
- Eine Festlegung lässt sich jederzeit mit wenig Aufwand ändern. Ein Beispiel ist die Reihenfolge der Felder in einem Formular. Dann ändert das Entwicklungsteam die Reihenfolge ohne ADR. Ein Irrtum ist mit einer weiteren kleinen Änderung behoben, und die Zeit für Schreiben und Lesen eines ADR entfällt.
- Gesucht ist eine Beschreibung des ganzen Systems. Ein ADR hält nur eine einzelne Entscheidung mit ihren Gründen fest. Für den Überblick schreibt das Entwicklungsteam ein zusammenhängendes Architekturdokument, etwa nach der verbreiteten Gliederungsvorlage arc42. Der Leser findet den Aufbau des Systems dann in einem Dokument und muss ihn nicht aus vielen einzelnen ADRs zusammensuchen. Ein solches Architekturdokument zeigt aber meist nur den aktuellen Stand und nicht, welche Möglichkeiten früher verworfen wurden. Viele Teams verbinden beides: Das Architekturdokument beschreibt den heutigen Aufbau und verweist für die Gründe auf die ADRs.
Nachteile und typische Fehler
ADRs brauchen Zeit beim Schreiben und Lesen. Das Entwicklungsteam muss festlegen, welche Entscheidungen ein ADR bekommen, und diese Festlegung immer wieder überprüfen. Weil angenommene ADRs nicht umgeschrieben, sondern durch neue abgelöst werden, wächst die Zahl der Dokumente mit der Zeit. Wer den aktuellen Stand sucht, muss der Kette der Verweise „abgelöst durch“ folgen.
Typische Fehler und woran man sie erkennt:
- Nachträglich geschrieben: Niemand im Entwicklungsteam achtet darauf, dass ADRs zum Zeitpunkt der Entscheidung entstehen, und sie werden erst Monate später geschrieben. Nachträglich aufgeschriebene Begründungen sind oft lückenhaft oder geschönt. Erkennbar ist das an ADRs, deren Datum im Repository lange nach der Einführung der beschriebenen Lösung liegt.
- Nicht auffindbar: Die ADRs liegen nicht an einem festen, bekannten Ort, oder ihnen fehlen Nummern. Erkennbar ist das an Fragen im Entwicklungsteam nach Gründen, die längst in einem ADR stehen.
- Ohne verworfene Möglichkeiten: In den ADRs fehlen die verworfenen Möglichkeiten. Damit verliert ein ADR seinen wichtigsten Nutzen, weil Leser nicht sehen, was bereits geprüft wurde. Erkennbar ist das an Diskussionen über Möglichkeiten, die das Entwicklungsteam schon einmal verworfen hat.
- Überschriebene Begründung: Das Entwicklungsteam ändert die Begründung in einem angenommenen ADR, statt ein neues ADR zu schreiben. Danach ist nicht mehr zu erkennen, auf welcher Grundlage die ursprüngliche Entscheidung fiel. Erkennbar ist das an inhaltlichen Änderungen alter ADRs im Verlauf des Repositorys.
Weiterführend
Verwandte Ansätze
- Quality Attributes: beschreiben Qualitätsziele wie Verfügbarkeit oder Änderbarkeit, an denen das Entwicklungsteam die Entscheidung in einem ADR messen kann.
- Conway's Law: beschreibt, dass der Aufbau eines Systems oft der Aufteilung der Teams folgt; viele Architekturentscheidungen sind deshalb zugleich Entscheidungen über Teamgrenzen.
Werkzeuge und Umsetzungen
- MADR: verbreitete Vorlage für ADRs im Textformat Markdown, mit Abschnitten für Ausgangslage, Möglichkeiten, Entscheidung und Folgen.
- ADR Tools: Programm für die Kommandozeile, das ADR-Dateien fortlaufend nummeriert anlegt und beim Ablösen die Verweise zwischen altem und neuem ADR einträgt. Die letzte Version 3.0.0 erschien 2018, und seit 2020 hat sich am Code nichts mehr geändert. Für diese Grundaufgaben funktioniert das Programm trotzdem.
- Log4brains: erzeugt aus den ADR-Dateien im Repository eine durchsuchbare Webseite. Die letzte Version 1.1.0 erschien im Dezember 2024.
Quellen
- Michael Nygard: Documenting Architecture Decisions: Blogbeitrag von 2011, der das Format mit Titel, Kontext, Entscheidung, Status und Folgen vorschlägt, fortlaufende Nummern und die Ablage im Repository festlegt und abgelöste Entscheidungen aufbewahrt statt löscht.
- Microsoft: Architecture decision record: beschreibt, welche Entscheidungen ein ADR verdienen, welche Teile es enthalten soll, darunter verworfene Möglichkeiten, und dass angenommene Einträge nicht geändert, sondern durch neue abgelöst werden.
- Martin Fowler: Architecture Decision Record: fasst Inhalt, Kürze, Ablage im Repository und den Umgang mit abgelösten ADRs zusammen.