methodatlas
Run SheetArchitectureDecision Documentation

Architecture Decision Record

KomplexitätLow
Zeit15-45 min
Teilnehmende1-3
FormatAsync
MaturityCanonical
01

Vorbedingung

Was vorher fertig sein muss

Vorher abschließenRequest for Comments (RFC)

Bei kontroversen oder weitreichenden Entscheidungen liegt ein durchdiskutiertes RFC vor. Daraus übernimmst du Kontext, geprüfte Optionen und die ausgewählten Tradeoffs.

Ohne: Ohne diesen Schritt wird der ADR zur Diskussionsbühne statt zum Record, und Reviewer prüfen die Optionen ein zweites Mal von vorn.
Vorher abschließenQuality Attribute Workshop

Liegt vor, wenn die Entscheidung primär durch Qualitätsanforderungen getrieben wird. Daraus übernimmst du den Utility Tree und priorisierte Quality Attributes als Bewertungsraster.

Ohne: Ohne klare Quality Attributes wird der Konsequenzen-Block beliebig und die Entscheidung in 12 Monaten schwer zu verteidigen.
Vorher abschließenDecision Triggernicht im Katalog

Ein konkretes Ticket, ein Incident oder eine Issue-ID, an der der ADR aufhängt.

Ohne: Ohne benannten Trigger bleibt das Dokument akademisch und niemand kehrt zu ihm zurück.
02

Vorbereitung

Was vor Start vorliegen muss

Materialien

ADR-Template (MADR oder Nygard-Stil) im Repo unter `docs/adr/`; Markdown- oder Wiki-Editor; Link auf den Issue-Tracker (Linear, Jira, GitHub Issues).

Personen / Rollen

Ein Decider mit Vor- und Nachname (kein „Team“, keine Gilde); ein bis zwei Reviewer aus den betroffenen Teams; Verfasser optional dieselbe Person wie der Decider.

Vorabinfos

Issue-ID oder Trigger; Nummer des nächsten freien ADR im Repo; relevante frühere ADRs zur Verknüpfung; mindestens zwei identifizierte Optionen inklusive Status quo.

Zeitbedarf

15–30 min Schreiben; 24–72 h asynchrone Reviewfrist; 1 min Statussetzen nach Ablauf.

Setup

Nächste freie Nummer im Verzeichnis prüfen; Branch nach Muster `adr/NNNN-kurztitel` anlegen; Reviewer im Pull Request oder Linear-Ticket taggen; Reviewfrist als Datum im PR-Beschreibungsfeld benennen.

03

Kernfrage

Die eine Frage, die diese Methode beantwortet

Welche Architekturentscheidung trifft das Team jetzt, vor welchen Alternativen, und welche Konsequenzen akzeptiert es dafür?

04

Ablauf

Marker: Sektion

SchrittDauerAktionHinweis
1Header
2 minTitel als Entscheidung formulieren, Status auf `proposed`, Datum und Decider eintragen, Trigger-ID referenzieren.Titel ist die Entscheidung, nicht das Thema. „PostgreSQL statt MySQL für Order-Service“ ist gut, „Datenbankwahl“ ist es nicht.
2Kontext
5–10 minForces benennen: Lastannahmen, Constraints, Quality Attributes, bestehende ADRs. Zahlen und Zeitpunkte konkret.3–5 Sätze reichen. Geschichte relationaler Datenbanken gehört nicht hierhin; ein Architektur-Wikipedia-Eintrag ist ein Warnsignal.
3Optionen
5–10 minMindestens zwei Optionen mit je einem Pro und einem Contra; Status quo („nichts ändern“) explizit aufnehmen.Wenn nur eine Option mit Pros aufgeführt ist, ist das eine Begründung und kein Record. Zweite Option auch dann erzwingen, wenn sie verworfen wird.
4Entscheidung
3–5 minEine Option benennen, ohne Konjunktiv: „Wir entscheiden uns für Option 1.“Konjunktive sind hier verbotenes Stilmittel. „Wir würden bevorzugen“ gehört in den Review-Kommentar, nicht in den Record.
5Konsequenzen
3–5 minPositive und negative Folgen, neue Risiken, Folge-ADRs benennen, die aus dieser Entscheidung entstehen.Wenn keine negative Konsequenz einfällt, einen Skeptiker im Team fragen. Reine Pro-Listen sind ein Warnsignal für ungeprüfte Annahmen.
6Review
24–72 hReviewer per PR oder Linear taggen; Frist im Kommentar benennen; Schweigen nach Frist gilt als Zustimmung.Aktives Veto bedeutet Re-Diskussion, nicht stiller Statuswechsel. Veto-Begründung als Risiko in den Konsequenzen-Block übernehmen.
7Status
1 minNach Frist Status auf `accepted`, `rejected` oder `withdrawn` setzen; Datum aktualisieren.Status `draft` über mehrere Tage bedeutet, niemand ist verantwortlich. Ein ADR ohne gesetzten Status hat keinen Wert.
05

Artefakt

Was am Ende rauskommt

Form

Eine Markdown-Datei mit Header (Titel, Status, Datum, Decider, Trigger) und fünf Sektionen in fester Reihenfolge: Kontext, Optionen, Entscheidung, Konsequenzen, optional Referenzen. Dateiname nach Muster `NNNN-kurztitel.md` mit fortlaufender Nummer.

Tool-Alternativen
  • Markdown-Dateien im Code-Repository unter `docs/adr/`
  • Notion-Datenbank mit ADR-Template
  • Confluence-Seite mit Decision-Macro
  • Linear oder Jira mit ADR-Label und Body-Template
  • `adr-tools`-CLI
  • Log4brains für eine interaktive Galerie
  • Backstage TechDocs
Versionierung / Ownership

Idealerweise im Code-Repository neben dem betroffenen Bereich, damit Entscheidung und Implementation zusammen versioniert werden; Owner ist der Decider; angenommene ADRs werden nicht editiert. Änderungen entstehen als neuer ADR, der den alten als `superseded by NNNN` markiert.

markdown

ADR Markdown Template

Kompakte Vorlage für Architecture Decision Records im Repository oder Wiki.

# ADR-0001: Titel der Entscheidung

**Status:** proposed
**Datum:** YYYY-MM-DD
**Decider:** Vorname Nachname
**Trigger:** Ticket, Incident oder RFC

## Kontext

Welche Situation macht die Entscheidung nötig? Welche Constraints, Quality Attributes oder früheren Entscheidungen sind relevant?

## Optionen

### Option 1: ...
- Pro:
- Contra:

### Option 2: ...
- Pro:
- Contra:

## Entscheidung

Wir entscheiden uns für ...

## Konsequenzen

Positive Folgen:
- ...

Negative Folgen und Risiken:
- ...

Folge-ADRs oder Tickets:
- ...
06

Beispielausgabe

Konkret gefülltes Szenario

adr-beispiel.md
markdown
# 0042 — PostgreSQL als primäre Datenbank für den Order-Service

**Status:** accepted
**Datum:** 2026-05-17
**Decider:** Lena König (Tech Lead Order-Domain)
**Trigger:** ORD-2148 — Auswahl der Persistenzschicht für den neuen Order-Service

## Kontext

Der Order-Service ersetzt das Monolith-Modul `order-legacy`, das bisher
gegen MySQL 5.7 läuft. Bis Q3/2026 werden ~1,2 Mio. Bestellungen pro Monat
erwartet, transaktionale Schreiblast in Bursts (Sale-Phasen bis 350
Writes/s), JSONB-Felder für variable Promo-Strukturen, PITR-Backups als
Compliance-Vorgabe aus 0028.

Bestehende ADRs zur Verknüpfung: 0028 (Cloud-Provider AWS), 0033
(Container-Plattform EKS).

## Optionen

### 1. PostgreSQL 16 auf RDS
- Pro: JSONB nativ und indexierbar; PITR aus RDS-Standard; ORM-Support
  (Prisma, TypeORM) gut; geschätzte Betriebskosten ~390 €/Monat in der
  projektierten Last.
- Contra: kein natives Sharding jenseits Citus; vertikales Scaling als
  erste Wachstumsantwort.

### 2. MySQL 8 auf RDS
- Pro: bestehende Backup- und Operations-Routinen wiederverwendbar.
- Contra: JSON-Indexierung schwächer als bei Postgres; Team-Erfahrung
  mit großen JSON-Workloads dünn; aus interner Datenbank-Review Q1/2026
  als nicht empfohlen markiert.

### 3. DynamoDB
- Pro: managed, Auto-Scaling, keine Wartung.
- Contra: Order-Item-Relation aufwendig zu modellieren; Bursts schwer
  kalkulierbar; Transaktionsmodell schwächer als RDBMS; Migration aus
  MySQL technisch teuer.

## Entscheidung

Wir entscheiden uns für Option 1: PostgreSQL 16 auf RDS.

Tragend sind drei Punkte: die vertraute SQL-Toolchain reduziert
Onboarding der drei Junior-Engineers um geschätzt zwei Sprints, JSONB
deckt die Promo-Modellierung ohne Schema-Migrationen ab, und die
PITR-Strategie aus 0028 bleibt ohne Anpassung wiederverwendbar.

## Konsequenzen

Positiv:
- Onboarding-Zeit der drei Junior-Engineers reduziert sich
  voraussichtlich um zwei Sprints.
- Promo-Strukturen erweiterbar ohne Schema-Migration.
- Backup- und PITR-Strategie aus 0028 ohne Anpassung wiederverwendbar.

Negativ:
- Sharding ab ~5 Mio. Bestellungen pro Monat notwendig (Citus oder
  Logical Replication), erwartet für 2027. Eigener ADR fällig.
- Kein Multi-Region-Active/Active out of the box; Failover bleibt
  regional.
- Vendor-Lock-in zu AWS RDS bleibt bestehen.

Folge-ADRs:
- 0043: Migrationsstrategie `order-legacy` → Order-Service (Dual Write
  vs. Replay).
- 0044: Indexierungs- und Partitionierungskonzept für Order-Items.
07

Stolperfallen

Symptome erkennen, gegensteuern

Falle

Begründung statt Entscheidung

Symptom

Im Abschnitt „Optionen“ steht direkt die spätere Wahl, ohne Vergleich, oder nur eine Option mit Pros und ohne Contra.

Was tun

Status quo als zweite Option erzwingen, auch wenn unrealistisch; mindestens ein Pro und ein Contra pro Option formulieren.

Falle

Nur positive Konsequenzen

Symptom

Der Konsequenzen-Block liest sich wie ein Vendor-Pitch.

Was tun

Mindestens zwei negative Folgen oder neue Risiken einfordern; wenn keine einfallen, hat das Team die Optionen nicht durchdacht. Einen Skeptiker im Team explizit nach Risiken fragen.

Falle

ADR bleibt im Status `draft`

Symptom

Der Branch lebt zwei Wochen, niemand reviewt, Code ist aber längst im Main-Branch.

Was tun

Reviewfrist hart auf 48–72 Stunden setzen, Reviewer namentlich pingen, nach Ablauf der Frist Status auf `accepted` ziehen. Schweigen gilt als Zustimmung, das muss vorher kommuniziert sein.

Falle

Editieren statt Superseden

Symptom

Jemand ändert die Entscheidung in einem existierenden ADR.

Was tun

Alten ADR auf `superseded by NNNN` setzen, neuen ADR mit eigener Nummer anlegen. Die Git-Historie reicht nicht; sie ist nicht navigierbar und nicht im Wiki sichtbar.

Falle

Decider „Team“ oder „Gilde“

Symptom

Im Header steht kein konkreter Name.

Was tun

Eine Person mit Vor- und Nachname als Decider eintragen, die im Streitfall einsteht. Konsens muss nicht aus dem Header hervorgehen, Verantwortung schon.

Falle

ADR für triviale Entscheidung

Symptom

Ein ADR mit Titel wie „Wir nutzen Tabs statt Spaces“ oder „Variable umbenennen“.

Was tun

ADR zurückziehen oder löschen. ADRs sind für Entscheidungen mit mindestens sechs Monaten Wirkungshorizont oder Rollback-Kosten von mehr als einem Sprint.

Falle

Kontext nicht zeitlos

Symptom

„Aktuell haben wir Probleme mit der Performance“ ohne Zahl, ohne Datum.

Was tun

Werte und Zeitpunkte konkret nennen: „Im Februar 2026 lag die p95-Latenz auf `/orders` bei 1.8 s, Ziel <500 ms“. Ein Leser in 18 Monaten muss den Kontext rekonstruieren können.

08

Abbruchkriterien

Done-Signale, in unter einer Minute prüfbar

Dateiname folgt dem Muster `NNNN-kurztitel.md` mit der nächsten freien Nummer im Repository.
Status ist eines von `proposed`, `accepted`, `rejected`, `withdrawn`, `superseded by NNNN`; kein `draft`.
Genau ein Decider mit Vor- und Nachname im Header.
Mindestens zwei Optionen im Abschnitt „Optionen“, jede mit mindestens einem Pro und einem Contra; Status quo ist eine davon.
Abschnitt „Konsequenzen“ enthält mindestens eine negative Folge oder ein neues Risiko.
Trigger-Referenz (Ticket-ID, Issue-Link, Incident oder ADR-Nummer) ist im Header oder im ersten Kontext-Satz benannt.
Wenn ein früherer ADR ersetzt wird, ist sein Status auf `superseded by NNNN` aktualisiert.
Datum im Header entspricht dem Tag der Statussetzung auf `accepted` oder `rejected`, nicht dem Tag des ersten Drafts.

Run Sheet durchgearbeitet?

Zum Steckbrief für Zweck, ähnliche Methoden und Quellen — oder direkt zur nächsten Methode im Katalog.