Be Software Architecture Wise
Be Wise Apps

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 Untertiteln
Nur 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

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
PlantUML: ein Sequenzdiagramm zum Aufgeben einer Bestellung; ->> zeichnet eine asynchrone Nachricht und --> eine Antwort

Mermaid, 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
Mermaid: ein Flussdiagramm auf Container-Ebene; [( )] zeichnet einen Datenbankzylinder, und die Beschriftungen sitzen an den Pfeilen; das Topic wird als Container gezeichnet, wie Abschnitt 4.3 empfiehlt

Structurizr 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
            }
        }
    }
}
Structurizr DSL: ein Modell und zwei Sichten der Essenslieferplattform; die Kontextsicht wird aus denselben Definitionen erzeugt

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)
D2: verschachtelte Container, Formen und beschriftete Verbindungen

Die vier im Vergleich

PlantUMLMermaidStructurizr DSLD2
BeschreibtEin Diagramm pro DateiEin Diagramm pro BlockEin Modell plus Sichten daraufEin Diagramm pro Datei
Am stärksten beiUML, besonders SequenzdiagrammenDiagrammen in Markdown ohne Build-SchrittKonsistenten C4-Diagrammen auf mehreren EbenenAnsprechenden allgemeinen Architekturdiagrammen
RenderingJava-Werkzeug oder Server; Graphviz für die meisten LayoutsIm Browser; nativ auf GitHub und GitLabStructurizr-Werkzeuge; Export in andere FormateKommandozeilenwerkzeug; Layout-Engine wählbar
Worauf zu achten istAltbackenes Standardaussehen; Layoutsteuerung nur über HinweiseBegrenzte Layoutsteuerung bei großen DiagrammenNur C4-Konzepte; braucht eigene WerkzeugeDie beste Layout-Engine ist kommerziell

Ein Modell, viele Sichten

Ein Modell, viele Sichten: Ein Structurizr-DSL-Workspace definiert Elemente und Beziehungen einmal; Kontext-, Container- und Deployment-Sichten werden daraus erzeugt und als Bilder, andere Diagrammsprachen oder Dokumentationssite exportiertworkspace.dsl (ein Modell)person Customersystem Platformcontainer OrderingJavacontainer Order DBPostgreSQLcontainer Order eventsKafka-Topic+ Beziehungen, Tags, StylesSystemkontextsichtPersonen, SystemeContainersichtin der PlattformDeployment-Sichtje UmgebungerzeugenSVG, PNGBilderPlantUML,Mermaid, D2Doku-Sitemit ADRsOrdering einmal im Modell umbenennen, und jede Sicht und jeder Export ändert sich mit.
Eine Modellierungssprache definiert jedes Element einmal; Sichten und Exporte werden generiert und können sich daher nicht widersprechen.

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.sh
Ein GitHub-Actions-Workflow, der Diagramme rendert, Links prüft, die Dokumentationssite bei jedem Pull Request baut und von main aus veröffentlicht

Der Docs-as-Code-Workflow

Der Docs-as-Code-Workflow: Dokumentation wird auf einem Branch geändert, im Pull Request geprüft, von CI getestet, gemergt und automatisch veröffentlicht; gescheiterte Checks und Issues führen zurückBranch.md, .dsl,ADRs ändernPull RequestReview mit derCodeänderungCI-ChecksRendern, Lint,LinkprüfungMerge in maingenehmigt vonDoku-OwnerReleaseautomatischneu gebautdefekter Link, ungültiges Diagramm oder altes Datum: Build scheitertLesendesehen stets mainLesende melden Issues, die die nächste Änderung startenDie Dokumentation folgt genau demselben Workflow wie der Code
Änderungen an der Dokumentation nehmen denselben Weg wie Codeänderungen: Branch, Review, automatisierte Prüfungen, Merge und automatische Veröffentlichung.

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]
---
Front Matter am Anfang einer Markdown-Seite: Owner, Prüfdatum und -intervall sowie Links zum beschriebenen Code und zu den Entscheidungen

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 CODEOWNERS und 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.

Weiter · 4.8KommunizierenArchitektur auf Führungskräfte, Produktmanager, Entwickler, Betrieb, Sicherheit und Prüfer zuschneiden: Abwägungen erklären, einseitige Zusammenfassungen, einer Anfrage folgen, Designdokumente und RFCs, Reviews, Diagrammgestaltung und Konsensbildung.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: „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?“