Read in English · Leer en español · Lire en français
Abschnitt 4.7 von 4.8 · Mittelstufe · 22 Min. Lesezeit
Diagrams as Code und aktuelle Dokumentation
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Die meiste Architekturdokumentation scheitert nicht, weil sie schlecht geschrieben wurde. Sie scheitert, weil sie veraltet. In dieser Lektion lernen Sie, wie Diagramme als Text und ein paar einfache Gewohnheiten Dokumentation über die gesamte Lebensdauer eines Systems wahr halten.
Stellen Sie sich ein Familienkochbuch vor, in das jede Änderung vom jeweiligen Koch mit Bleistift eingetragen wird, ohne festzuhalten, wer was geändert hat. Nach ein paar Jahren traut ihm niemand mehr. Stellen Sie sich nun vor, die Rezepte sind abgetippt, und jede Änderung wird vorgeschlagen, von einem zweiten Koch geprüft und datiert. Und das gedruckte Buch wird nach jeder genehmigten Änderung automatisch neu gedruckt. Diagrams as Code überträgt diese Disziplin auf Architekturdiagramme.
Diagrams as Code bedeutet, ein Diagramm als kurze Textdatei zu schreiben und es von einem Werkzeug anordnen und zeichnen zu lassen. Statt Kästen auf einer Zeichenfläche zu verschieben, schreiben Sie etwa „ordering Pfeil database“, und das Werkzeug erzeugt das Bild. Wozu der Aufwand? Eine Textdatei hat eine Historie: wer sie geändert hat, wann und warum. Und wenn jemand eine neue Abhängigkeit einführt, erscheint die Diagrammänderung im selben Pull Request wie der Code, sodass die Reviewer den neuen Pfeil hinterfragen können, solange er am günstigsten zu ändern ist.
Vier Sprachen dominieren, und der Abschnitt schreibt dieselbe Essenslieferplattform in jeder davon. PlantUML, 2009 erstmals veröffentlicht, deckt die gängigen Diagramme der Unified Modeling Language ab, und seine Sequenzdiagramme sind besonders gut. Mermaid, von 2014, wird auf GitHub und GitLab direkt in Markdown-Dateien gerendert, sodass ein Diagramm in einer README-Datei überhaupt keinen Build-Schritt braucht. Bei großen Diagrammen ist die Kontrolle über das Layout begrenzt. Die Sprache von Structurizr, von Simon Brown parallel zu C4 entwickelt, ist grundsätzlich anders. Sie beschreibt kein Diagramm. Sie beschreibt ein Modell und definiert dann Sichten darauf. Und D2, 2022 als Open Source veröffentlicht, zielt auf saubere, moderne Ausgabe und lesbare Syntax. Die Abwägung bei allen: Automatisches Layout ist bequem, aber manchmal hässlich.
Darum ist ein Modell wichtig. Links sehen Sie eine einzige Workspace-Datei. Jede Person, jedes System und jeder Container wird einmal definiert, mit Name und Technologie. Aus diesem einen Modell erzeugt das Werkzeug die Sichten: Systemkontext, Container und Deployment für jede Umgebung. Jede Sicht lässt sich als Bild, in andere Diagrammsprachen oder als Dokumentationssite mit den Entscheidungsdokumente exportieren. Benennen Sie also den Bestellservice einmal im Modell um, und jede Sicht ändert sich mit. In einem Zeichenwerkzeug haben zwei Kästen mit derselben Beschriftung keine Verbindung, und Sie müssen jedes Diagramm von Hand korrigieren.
Sobald Dokumentation als Text im Repository liegt, kann sie genau demselben Workflow folgen wie der Code. Sie ändern sie auf einem Branch, und sie wird zusammen mit der Codeänderung in einem Pull Request geprüft. Die Continuous-Integration-Prüfungen rendern dann jedes Diagramm und prüfen die Links. Ein defekter Link, ein ungültiges Diagramm oder ein überfälliges Prüfdatum lässt den Build scheitern und schickt die Änderung zurück. Sobald sie in main gemergt ist, wird die Site automatisch neu gebaut. Niemand muss daran denken, ein Bild zu exportieren und in ein Wiki hochzuladen. So sehen Lesende immer die Dokumentation, die zum Code auf main passt. Und wenn sie Issues melden, stoßen diese die nächste Änderung an.
Werkzeuge halten Dokumentation nicht wahr. Gewohnheiten schon. Erstens hat jedes Dokument einen namentlich benannten Owner, normalerweise das Team, dem der Code gehört. Dokumente, für die alle verantwortlich sind, pflegt niemand. Zweitens: Prüfen Sie die Dokumentation zusammen mit Codeänderungen. Eine Pull-Request-Vorlage, die fragt, ob sich eine Schnittstelle, eine Abhängigkeit oder eine Entscheidung geändert hat, fängt den meisten Drift ab, wenn er entsteht. Drittens: Geben Sie jeder Seite ein Datum der letzten Prüfung. Eine Seite mit „zuletzt geprüft 2023“ ist ehrlich. Eine Seite, die stillschweigend das System von 2023 beschreibt, ist eine Falle. Viertens: Verknüpfen Sie in beide Richtungen, Seiten verweisen auf den Code, und Code-Kommentare verweisen auf Entscheidungsdokumente. Und fünftens: Löschen Sie veraltetes Material, denn falsche Dokumentation ist schlimmer als keine. Die Ausnahme sind Entscheidungsdokumente. Sie sind Geschichte, deshalb werden sie ersetzt, nie gelöscht.
Zum Schluss ein paar häufige Fehler. Ein Werkzeug wählen, bevor entschieden ist, was dokumentiert wird: Das Werkzeug zählt weit weniger als Verantwortung und Review. Gerenderte Bilder ohne ihre Quellen committen, sodass beide auseinanderlaufen. Und Diagrams as Code als Ausrede nehmen, um Titel, Legenden und Beschriftungen wegzulassen. Die C4-Notationsregeln gelten auch für generierte Diagramme.
Der vollständige Abschnitt zeigt die Plattform in allen vier Sprachen, eine Beispiel-Pipeline und eine Checkliste für Dokumentation, die aktuell bleibt. Als Nächstes, in Abschnitt vier Punkt acht, wenden wir uns von Dokumenten den Menschen zu. Bis gleich.
Was Sie wissen müssen
- Diagrams as Code bedeutet, Diagramme in einer Textsprache zu schreiben und von einem Werkzeug zeichnen zu lassen, sodass sie versioniert, verglichen, in Pull Requests geprüft und von der Build-Pipeline gerendert werden können.
- PlantUML (2009) ist am stärksten bei UML, besonders bei Sequenzdiagrammen; Mermaid (2014) wird auf GitHub und GitLab direkt in Markdown gerendert; D2 (2022) bietet saubere Layouts; Structurizr DSL definiert ein einziges C4-Modell, aus dem viele Sichten erzeugt werden.
- Zeichenwerkzeuge kennen nur Formen, sodass dasselbe Element zwischen Diagrammen auseinanderlaufen kann; Modellierungswerkzeuge halten Elemente und Beziehungen in einem Modell, sodass jede Sicht konsistent bleibt und das Modell abgefragt und geprüft werden kann.
- Eine Docs-as-Code-Pipeline rendert Diagramme, prüft Links, baut die Dokumentationssite bei jedem Pull Request und veröffentlicht von main aus, sodass Lesende eine Dokumentation sehen, die zum Code passt.
- Dokumentation bleibt durch Gewohnheiten aktuell, nicht durch Werkzeuge: namentlich benannte Verantwortliche, Review zusammen mit Codeänderungen, Datum der letzten Prüfung, Links zwischen Dokumentation, Code und Entscheidungen sowie das Löschen veralteter Seiten (ADRs werden ersetzt, nicht gelöscht).
Was Diagrams as Code bedeutet
Diagrams as Code bedeutet, ein Diagramm als kurze Textdatei in einer kleinen Sprache zu schreiben und es von einem Werkzeug anordnen und zeichnen zu lassen. Statt Kästen auf einer Zeichenfläche zu verschieben, schreiben Sie ordering -> db: SQL, und das Werkzeug erzeugt das Bild. Die Textdatei liegt im Code-Repository und wird wie Code behandelt: versioniert, geprüft, von automatisierten Builds getestet und von der Pipeline veröffentlicht.
Es ist ein Teil von Docs as Code, der von der Community Write the Docs vorangetriebenen Praxis, Dokumentation mit denselben Werkzeugen und demselben Arbeitsablauf wie Software zu erstellen: Issue-Tracker, Versionskontrolle (meist Git), Klartext-Auszeichnungssprachen wie Markdown oder AsciiDoc, Code-Review und automatisierte Tests. Die vorigen Abschnitte haben das Material geliefert: Sichten und C4-Diagramme, UML, wo Präzision zählt, ADRs und eine arc42-Struktur. In diesem Abschnitt geht es darum, dieses Material über die gesamte Lebensdauer des Systems korrekt zu halten, und genau daran scheitert die meiste Architekturdokumentation. Die Gründe für dieses Scheitern wurden in Warum und wie viel dokumentieren dargelegt: veraltete Wikis, große Dokumente, für die niemand verantwortlich ist, und Diagramme, die nicht mehr zum System passen.
Warum Diagramme als Text
Versionskontrolle. Ein Diagramm in Textform hat eine Historie. Sie sehen, wer es wann und warum geändert hat, und können zwei beliebige Versionen Zeile für Zeile vergleichen; ein Binärbild oder eine Datei im Format eines Zeichenwerkzeugs zeigt nur, dass sich etwas geändert hat. Sie können es auch verzweigen: Das Diagramm für eine vorgeschlagene Änderung liegt auf demselben Branch wie der Code, der sie umsetzt.
Review in Pull Requests. Wenn eine Entwicklerin oder ein Entwickler eine neue Abhängigkeit zwischen Services einführt, erscheint die Änderung am Diagramm im selben Pull Request wie der Code, als lesbarer Text-Diff. Die Reviewer können fragen, ob der neue Pfeil gewollt ist, und das ist ein Architektur-Review genau in dem Moment, in dem es am wenigsten kostet.
Konsistenz. Das Werkzeug wendet auf jedes Diagramm dieselben Formen, Schriften und Layoutregeln an, sodass Diagramme von zwanzig Personen trotzdem wie ein zusammengehöriger Satz aussehen. Mit einer Modellierungssprache (siehe unten) erscheint dasselbe Element in jeder Sicht mit demselben Namen und derselben Beschreibung.
Generierung. Text kann von Programmen erzeugt werden. Diagramme lassen sich aus dem Code selbst (Abhängigkeitsgraphen), aus Infrastructure as Code (Deployment-Diagramme), aus API-Spezifikationen oder aus einem zentralen Modell generieren und dann automatisch gegen das System prüfen.
Die Abwägungen sind real. Automatisches Layout ist bequem, aber manchmal hässlich, und der Kampf mit einer Layout-Engine um die Position eines einzigen Kastens kann länger dauern, als ihn zu zeichnen; die meisten Werkzeuge bieten Hinweise wie Richtung oder Gruppierung, keine exakten Positionen. Textsprachen haben eine Lernkurve für Menschen, die nicht programmieren, etwa im Produktmanagement. Und eine schöne Skizze am Whiteboard während einer Designdiskussion ist immer noch der schnellste Weg zu denken; Diagrams as Code sind für die Diagramme gedacht, die Sie behalten wollen.
Vier Sprachen, ein Beispiel
Vier Sprachen dominieren. Jedes Beispiel unten beschreibt einen Teil derselben Essenslieferplattform.
PlantUML, von Arnaud Roques entwickelt und 2009 erstmals veröffentlicht, ist die älteste der vier. Es deckt alle gängigen UML-Diagramme ab (Sequenz-, Komponenten-, Deployment-, Zustands-, Aktivitäts- und Klassendiagramm) und viele weitere und nutzt Graphviz für das Layout der meisten Diagrammtypen. Die Bibliothek C4-PlantUML ergänzt C4-Formen. Seine Sequenzdiagramme sind besonders gut, was es zur naheliegenden Wahl für die Laufzeitszenarien aus UML-Grundlagen macht.
@startuml
title Place an order (happy path)
actor Customer
participant "Customer app" as App
participant "Ordering service" as Ord
participant "Payment provider" as Pay
queue "Order events topic" as MB
Customer -> App : Tap "Pay"
App -> Ord : POST /orders (HTTPS)
Ord -> Pay : Authorise payment
Pay --> Ord : Authorised
Ord ->> MB : OrderPlaced (async)
Ord --> App : 201 Created
@enduml->> zeichnet eine asynchrone Nachricht und --> eine AntwortMermaid, 2014 von Knut Sveidqvist entwickelt, ist in JavaScript geschrieben und wird im Browser gerendert. Sein größter Vorteil ist die Verbreitung: GitHub rendert Mermaid-Blöcke in Markdown-Dateien seit Februar 2022, und GitLab sowie viele Wiki- und Notizwerkzeuge tun dasselbe, sodass ein Diagramm in einer README überhaupt keinen Build-Schritt braucht. Es unterstützt unter anderem Flussdiagramme, Sequenz-, Klassen-, Zustands- und Entity-Relationship-Diagramme und hat experimentelle C4-Unterstützung. Bei großen Diagrammen ist die Kontrolle über das Layout begrenzt.
flowchart LR
app["Customer app<br/>Kotlin, Swift"]
gw["API gateway"]
ord["Ordering service<br/>Java"]
db[("Order database<br/>PostgreSQL")]
topic[["Order events<br/>Kafka topic"]]
disp["Dispatch service<br/>Go"]
notif["Notification service<br/>Node.js"]
app -->|HTTPS/JSON| gw
gw -->|HTTPS/JSON| ord
ord -->|SQL| db
ord -->|publishes OrderPlaced| topic
disp -->|consumes| topic
notif -->|consumes| topic[( )] zeichnet einen Datenbankzylinder, und die Beschriftungen sitzen an den Pfeilen; das Topic wird als Container gezeichnet, wie Abschnitt 4.3 empfiehltStructurizr DSL, von Simon Brown parallel zum C4-Modell entwickelt, ist grundsätzlich anders. Es beschreibt kein Diagramm, sondern ein Modell (Personen, Softwaresysteme, Container, Komponenten und die Beziehungen zwischen ihnen) und definiert dann Sichten auf dieses Modell. Jedes Element wird einmal definiert, mit Name, Beschreibung und Technologie, und erscheint in jeder Sicht, die es enthält. Beziehungen zwischen Containern werden auf Systemebene automatisch abgeleitet, sodass die Kontextsicht keine eigenen Pfeile braucht. Die DSL kann dem Workspace außerdem Markdown-Dokumentation und einen Ordner mit ADRs zuordnen, und die Werkzeuge können Sichten nach PlantUML, Mermaid, D2 und in andere Formate exportieren.
workspace "Food delivery" {
model {
customer = person "Customer" "Orders food from local restaurants."
payments = softwareSystem "Payment provider" "Takes card payments." "External"
platform = softwareSystem "Food-delivery platform" {
app = container "Customer app" "Ordering and tracking." "Kotlin, Swift"
gateway = container "API gateway" "Authenticates and routes requests." "Managed API gateway"
ordering = container "Ordering service" "Accepts and tracks orders." "Java"
db = container "Order database" "Orders and their states." "PostgreSQL" "Database"
orderEvents = container "Order events" "Order lifecycle events." "Kafka topic" "Topic"
dispatch = container "Dispatch service" "Assigns couriers." "Go"
}
customer -> app "Places and tracks orders using"
app -> gateway "Makes API calls to" "JSON/HTTPS"
gateway -> ordering "Routes requests to" "JSON/HTTPS"
ordering -> db "Reads from and writes to" "SQL/TCP"
ordering -> payments "Takes card payments using" "JSON/HTTPS"
ordering -> orderEvents "Publishes order events to" "Kafka"
dispatch -> orderEvents "Consumes order events from" "Kafka"
}
views {
systemContext platform "Context" {
include *
autoLayout lr
}
container platform "Containers" {
include *
autoLayout lr
}
styles {
element "Database" {
shape cylinder
}
element "Topic" {
shape pipe
}
}
}
}D2 (Declarative Diagramming), 2022 von Terrastruct als Open Source veröffentlicht, ist die jüngste. Sie zielt auf saubere, moderne Ausgabe und lesbare Syntax, unterstützt verschachtelte Container (mit geschweiften Klammern geschrieben und mit Punktnamen referenziert) und bietet eine Auswahl an Layout-Engines: dagre und ELK sind enthalten und kostenlos, und TALA, für Softwarearchitekturdiagramme entworfen, ist eine separate kommerzielle Engine.
direction: right
customer: Customer {shape: person}
payments: Payment provider
platform: Food-delivery platform {
app: Customer app
ordering: Ordering service
db: Order database {shape: cylinder}
events: Order events topic {shape: queue}
dispatch: Dispatch service
app -> ordering: Places order (HTTPS)
ordering -> db: SQL
ordering -> events: Publishes OrderPlaced
dispatch -> events: Consumes OrderPlaced
}
customer -> platform.app: Places orders using
platform.ordering -> payments: Authorise (HTTPS)Die vier im Vergleich
| PlantUML | Mermaid | Structurizr DSL | D2 | |
|---|---|---|---|---|
| Beschreibt | Ein Diagramm pro Datei | Ein Diagramm pro Block | Ein Modell plus Sichten darauf | Ein Diagramm pro Datei |
| Am stärksten bei | UML, besonders Sequenzdiagrammen | Diagrammen in Markdown ohne Build-Schritt | Konsistenten C4-Diagrammen auf mehreren Ebenen | Ansprechenden allgemeinen Architekturdiagrammen |
| Rendering | Java-Werkzeug oder Server; Graphviz für die meisten Layouts | Im Browser; nativ auf GitHub und GitLab | Structurizr-Werkzeuge; Export in andere Formate | Kommandozeilenwerkzeug; Layout-Engine wählbar |
| Worauf zu achten ist | Altbackenes Standardaussehen; Layoutsteuerung nur über Hinweise | Begrenzte Layoutsteuerung bei großen Diagrammen | Nur C4-Konzepte; braucht eigene Werkzeuge | Die beste Layout-Engine ist kommerziell |
Ein Modell, viele Sichten
Zeichenwerkzeuge und Modellierungswerkzeuge
Der Unterschied zwischen Structurizr und den anderen drei ist ein Fall der in Abschnitt 4.3 eingeführten Unterscheidung zwischen Zeichen- und Modellierungswerkzeugen. Ein Zeichenwerkzeug (diagrams.net, Excalidraw, Visio, ein Online-Whiteboard und auch PlantUML, Mermaid und D2) kennt Formen, Linien und Text. Ein Kasten mit der Beschriftung Bestellservice
in einem Diagramm hat keine Verbindung zum gleich beschrifteten Kasten in einem anderen. Benennen Sie den Service um, müssen Sie jedes Diagramm von Hand suchen und korrigieren; vertippen Sie sich einmal, haben Sie, soweit das Werkzeug weiß, zwei Services.
Ein Modellierungswerkzeug (Structurizr, Archi für ArchiMate-Modelle, Sparx Enterprise Architect für UML und SysML, Capella) führt ein Modell: ein Repository von Elementen und Beziehungen mit Eigenschaften. Diagramme sind Sichten auf das Modell. Benennen Sie ein Element um, ändert sich jede Sicht. Das Modell lässt sich abfragen (Welche Container hängen vom Broker ab?
), prüfen (Keine Komponente der Kunden-App darf die Datenbank aufrufen
) und mit dem laufenden System vergleichen. Der Preis ist mehr Struktur im Voraus und, bei den schwergewichtigen kommerziellen Werkzeugen, Lizenzen, Schulungen und die Neigung, weit mehr zu modellieren, als jemand liest.
Eine praktische Regel: Verwenden Sie Zeichenwerkzeuge, textbasiert oder grafisch, für Skizzen, einmalige Erklärungen und Diagramme, die für sich stehen, etwa ein einzelnes Sequenzdiagramm in einem ADR. Verwenden Sie ein Modell, wenn dieselben Elemente in vielen Diagrammen vorkommen, wenn mehrere Teams beitragen oder wenn Sie die Dokumentation gegen den Code prüfen wollen. Viele Teams kombinieren beides: ein Structurizr-Modell für die C4-Struktur und PlantUML oder Mermaid für einige Sequenz- und Zustandsdiagramme.
Dokumentation in der Pipeline erzeugen
Sobald Dokumentation als Text im Repository liegt, kann die Continuous-Integration-Pipeline aus Kapitel 0 sie wie Code bauen und prüfen. Eine typische Pipeline rendert jedes Diagramm (und lässt den Build bei einem Syntaxfehler scheitern), prüft Links, baut mit einem Generator wie MkDocs, Antora oder Docusaurus eine statische Dokumentationssite und veröffentlicht sie, sobald Änderungen den Main-Branch erreichen. Lesende sehen dann immer die Dokumentation, die zum Code auf main passt, und niemand muss daran denken, ein Bild zu exportieren und in ein Wiki hochzuladen.
Weitere Prüfungen kommen hinzu, wenn das Team reifer wird: eine Rechtschreibprüfung und ein Prosa-Linter (Vale ist beliebt), eine Prüfung, dass jedes ADR einen gültigen Status hat, eine Warnung, wenn das Datum der letzten Prüfung
einer Seite älter als ihr Prüfintervall ist, und Architekturprüfungen, die die dokumentierten Abhängigkeiten mit den tatsächlichen im Code vergleichen und eine Form von Fitness Function sind. Manche Teams generieren Teile der Dokumentation aus dem System selbst: Abhängigkeitsgraphen aus dem Build, API-Referenzen aus OpenAPI-Spezifikationen, Deployment-Diagramme aus Infrastructure as Code.
name: architecture-docs
on:
pull_request:
paths: ["docs/**"]
push:
branches: [main]
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# assumes plantuml, d2, lychee and mkdocs are available on the runner
- name: Render diagrams (fails on syntax errors)
run: |
plantuml -tsvg docs/diagrams/*.puml
for f in docs/diagrams/*.d2; do d2 "$f" "${f%.d2}.svg"; done
- name: Check links
run: lychee --offline docs/
- name: Build site (warnings such as broken links fail the build)
run: mkdocs build --strict
- name: Publish
if: github.ref == 'refs/heads/main'
run: ./scripts/publish-docs.shDer Docs-as-Code-Workflow
Dokumentation aktuell halten
Werkzeuge halten Dokumentation nicht wahr, Gewohnheiten schon. Fünf Gewohnheiten machen den Unterschied.
Verantwortung. Jedes Dokument hat einen namentlich benannten Owner, normalerweise das Team, dem der beschriebene Code gehört. In GitHub und GitLab kann eine CODEOWNERS-Datei dieses Team zum Pflicht-Reviewer für Änderungen in seinem Ordner docs/ machen. Dokumente, für die alle
verantwortlich sind, pflegt niemand.
Review mit Codeänderungen. Eine Pull-Request-Vorlage, die fragt: Ändert dies eine Schnittstelle, eine Abhängigkeit, ein Deployment oder eine Entscheidung? Wenn ja, welches Dokument oder ADR haben Sie aktualisiert?
, fängt den meisten Drift genau dann ab, wenn er entsteht. Manche Teams gehen weiter und blockieren das Mergen von Features ohne Dokumentation, eine Praxis, die der Leitfaden von Write the Docs erwähnt.
Datum der letzten Prüfung. Ein kleiner Kopfbereich auf jeder Seite hält ihren Owner fest, das Datum, an dem sie zuletzt mit der Wirklichkeit abgeglichen wurde, und wie oft sie geprüft werden soll. Lesende können einschätzen, wie weit sie ihr trauen können, und die Pipeline kann überfällige Seiten markieren. Eine Seite mit zuletzt geprüft 2023
ist ehrlich; eine Seite, die stillschweigend das System von 2023 beschreibt, ist eine Falle.
Dokumentation und Code verknüpfen. Seiten verweisen auf den Code, den sie beschreiben (Pfade, Module), Code-Kommentare verweisen auf ADRs, und Commit-Nachrichten nennen die Records, die sie umsetzen. Links in beide Richtungen machen offensichtlich, welche Dokumente eine Änderung betreffen könnte.
Veraltetes Material löschen. Falsche Dokumentation ist schlimmer als keine, weil Lesende danach handeln. Wenn eine Seite das System nicht mehr beschreibt und niemand sie korrigieren wird, löschen Sie sie oder verschieben Sie sie in ein klar gekennzeichnetes Archiv. ADRs sind die Ausnahme: Sie sind Aufzeichnungen der Geschichte und werden daher ersetzt oder als veraltet markiert, nicht gelöscht. Das ist die Idee der lebenden Dokumentation, die Cyrille Martraire 2019 in seinem gleichnamigen Buch entwickelt hat: Dokumentation, die sich im selben Tempo wie das System weiterentwickelt, idealerweise weil vieles davon aus dem System abgeleitet wird.
---
title: "Ordering service: building block view (level 2)"
owner: "@ordering-team"
last_reviewed: 2026-09-14
review_every: 6 months
code: src/ordering/
decisions: [ADR-0007, ADR-0012]
---Checkliste: Dokumentation, die aktuell bleibt
Verwenden Sie sie, wenn Sie die Architekturdokumentation eines Repositorys aufsetzen, und gehen Sie sie alle paar Monate erneut durch.
- Die Dokumentation liegt in dem Repository, das sie beschreibtMarkdown- oder AsciiDoc-Seiten, Diagrammquellen und ADRs unter
docs/, nicht in einem separaten Wiki, das niemand in derselben Änderung aktualisiert. - Diagrammquellen sind Text und werden von der Pipeline gerendertKeine von Hand exportierten Bilder, die stillschweigend hinter ihren Quellen zurückbleiben; der Build scheitert an einem ungültigen Diagramm.
- Jedes Element wird einmal definiert, wo sich Diagramme überschneidenVerwenden Sie ein Modell (etwa Structurizr DSL), wenn dieselben Container in mehreren Diagrammen vorkommen.
- Jede Seite hat einen Owner und ein Datum der letzten PrüfungDurchgesetzt durch
CODEOWNERSund eine Pipeline-Prüfung, die warnt, wenn das Prüfintervall überschritten ist. - Pull Requests fragen nach der DokumentationDie Vorlage fragt, ob sich eine Schnittstelle, Abhängigkeit, ein Deployment oder eine Entscheidung geändert hat und welches Dokument aktualisiert wurde.
- Links werden automatisch geprüftDefekte interne Links und Verweise auf gelöschte Dateien lassen den Build scheitern.
- Die Doku verweist auf den Code und der Code auf EntscheidungenPfade in der Dokumentation, ADR-Nummern in Code-Kommentaren und Commit-Nachrichten.
- Die veröffentlichte Site wird aus main neu gebautLesende sehen immer die Version, die zum deployten Code passt, ohne manuellen Veröffentlichungsschritt.
- Veraltete Seiten werden gelöscht oder archiviertSeiten, die niemand korrigieren wird, werden entfernt; ADRs werden ersetzt oder als veraltet markiert, nie gelöscht.
- Mindestens eine Prüfung vergleicht die Dokumentation mit der WirklichkeitZum Beispiel ein Test, der scheitert, wenn im Code eine Abhängigkeit auftaucht, die das Containerdiagramm nicht zeigt.
Prüfen Sie Ihr Verständnis
Was kann ein Reviewer in einem Pull Request sehen, wenn ein Diagramm Code ist, was er bei einem exportierten Bild nicht sehen kann?
Einen lesbaren Zeile-für-Zeile-Diff dessen, was sich geändert hat, etwa eine neue Beziehung zwischen zwei Services, im selben Pull Request wie der Code, der sie eingeführt hat.
Warum verursacht das Umbenennen eines Service mit einem Zeichenwerkzeug mehr Arbeit als mit einem Modellierungswerkzeug?
In einem Zeichenwerkzeug hält jedes Diagramm seine eigene Kopie der Beschriftung, sodass jedes Diagramm gefunden und geändert werden muss; in einem Modellierungswerkzeug ist das Element einmal definiert, und jede Sicht übernimmt den neuen Namen.
Warum sollte veraltete Dokumentation gelöscht statt stehen gelassen werden, und was ist die Ausnahme?
Lesende handeln nach dem, was sie lesen, daher führt falsche Dokumentation zu falschen Entscheidungen. ADRs sind die Ausnahme: Sie halten Geschichte fest und werden stattdessen als ersetzt oder veraltet markiert.
Nennen Sie zwei Prüfungen, die eine Dokumentations-Pipeline neben dem Rendern von Diagrammen ausführen kann.
Linkprüfung, Prosa- oder Rechtschreib-Linting, ein strikter Site-Build, eine Warnung bei überfälligen Prüfdaten und der Vergleich dokumentierter Abhängigkeiten mit denen im Code.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Unsere Architekturdiagramme liegen in einem Zeichenwerkzeug und sind immer veraltet. Wie könnte ich auf Diagrams as Code umsteigen, ohne dass Personen, die nicht entwickeln, nicht mehr beitragen können?“