326 lines
10 KiB
Markdown
326 lines
10 KiB
Markdown
# ADR Methodology for Complex Decisions
|
|
|
|
## Complex ADR Workflow
|
|
|
|
Copy this checklist and track your progress:
|
|
|
|
```
|
|
ADR Progress (Complex Decisions):
|
|
- [ ] Step 1: Identify decision pattern and scope
|
|
- [ ] Step 2: Conduct detailed analysis for each concern
|
|
- [ ] Step 3: Engage stakeholders and gather input
|
|
- [ ] Step 4: Build decision tree for related choices
|
|
- [ ] Step 5: Perform quantitative analysis and create ADR
|
|
```
|
|
|
|
**Step 1: Identify decision pattern and scope**
|
|
|
|
Determine which pattern applies to your decision (cascading, competing concerns, unknown unknowns, etc.). See [Complex Decision Patterns](#complex-decision-patterns) for patterns and approaches.
|
|
|
|
**Step 2: Conduct detailed analysis for each concern**
|
|
|
|
For each competing concern (security, scalability, cost, compliance), analyze how alternatives address it. See [Extended ADR Sections](#extended-adr-sections) for analysis templates.
|
|
|
|
**Step 3: Engage stakeholders and gather input**
|
|
|
|
Identify all affected parties and gather their perspectives systematically. See [Stakeholder Management](#stakeholder-management) for mapping and engagement techniques.
|
|
|
|
**Step 4: Build decision tree for related choices**
|
|
|
|
Map out cascading or interdependent decisions. See [Decision Trees for Related Choices](#decision-trees-for-related-choices) for structuring related ADRs.
|
|
|
|
**Step 5: Perform quantitative analysis and create ADR**
|
|
|
|
Use scoring matrices, cost modeling, or load testing to support decision. See [Quantitative Analysis](#quantitative-analysis) for methods and examples.
|
|
|
|
## Complex Decision Patterns
|
|
|
|
### Pattern 1: Cascading Decisions
|
|
|
|
When one architectural choice forces or constrains subsequent decisions.
|
|
|
|
**Approach:**
|
|
1. Create primary ADR for the main architectural decision
|
|
2. Create child ADRs for cascading decisions, referencing parent
|
|
3. Use "Related ADRs" field to link the chain
|
|
|
|
**Example:**
|
|
- ADR-100: Adopt Microservices Architecture (parent)
|
|
- ADR-101: Use gRPC for Inter-Service Communication (child - follows from ADR-100)
|
|
- ADR-102: Implement Service Mesh with Istio (child - follows from ADR-101)
|
|
|
|
### Pattern 2: Competing Concerns
|
|
|
|
When decision must balance multiple competing priorities (cost vs performance, security vs usability).
|
|
|
|
**Approach:**
|
|
Add **Analysis Sections** to standard ADR:
|
|
|
|
```markdown
|
|
## Detailed Analysis
|
|
|
|
### Security Analysis
|
|
{How each alternative addresses security requirements}
|
|
|
|
### Performance Analysis
|
|
{Benchmarks, load tests, scalability projections}
|
|
|
|
### Cost Analysis
|
|
{TCO over 3 years, including hidden costs}
|
|
|
|
### Operational Complexity Analysis
|
|
{Team skill requirements, monitoring needs, on-call burden}
|
|
```
|
|
|
|
### Pattern 3: Phased Decisions
|
|
|
|
When full solution is too complex to decide at once; need to make interim decision.
|
|
|
|
**Approach:**
|
|
1. Create ADR for Phase 1 decision
|
|
2. Add "Future Decisions" section listing what's deferred
|
|
3. Set review date to revisit (e.g., "Review in 6 months")
|
|
|
|
**Example:**
|
|
```markdown
|
|
## Decision (Phase 1)
|
|
Start with managed PostgreSQL on RDS. Evaluate sharding vs Aurora vs NewSQL in 12 months.
|
|
|
|
## Future Decisions Needed
|
|
- ADR-XXX: Horizontal scaling strategy (by Q3 2025)
|
|
- ADR-XXX: Multi-region deployment approach (by Q4 2025)
|
|
```
|
|
|
|
## Extended ADR Sections
|
|
|
|
### When to Add Detailed Analysis Sections
|
|
|
|
**Security Analysis** - Add when:
|
|
- Decision affects authentication, authorization, or data protection
|
|
- Compliance requirements involved (SOC2, HIPAA, GDPR)
|
|
- Handling sensitive data
|
|
|
|
**Performance Analysis** - Add when:
|
|
- SLA commitments at stake
|
|
- Significant performance differences between alternatives
|
|
- Scalability is critical concern
|
|
|
|
**Cost Analysis** - Add when:
|
|
- Multi-year TCO differs significantly (>20%) between alternatives
|
|
- Hidden costs exist (operational overhead, training, vendor lock-in)
|
|
- Budget constraints are tight
|
|
|
|
**Operational Complexity Analysis** - Add when:
|
|
- Team skill gaps exist for some alternatives
|
|
- On-call burden varies significantly
|
|
- Monitoring/debugging complexity differs
|
|
|
|
**Migration Analysis** - Add when:
|
|
- Replacing existing system
|
|
- Need to maintain backward compatibility
|
|
- Rollback strategy is complex
|
|
|
|
### Template for Extended Sections
|
|
|
|
```markdown
|
|
## Security Analysis
|
|
|
|
### {Alternative A}
|
|
- **Threat model**: {What threats does this mitigate?}
|
|
- **Attack surface**: {What new vulnerabilities introduced?}
|
|
- **Compliance**: {How does this meet regulatory requirements?}
|
|
- **Score**: {1-5 rating}
|
|
|
|
### {Alternative B}
|
|
{Same structure}
|
|
|
|
### Security Recommendation
|
|
{Which alternative is strongest on security, and any mitigations needed}
|
|
```
|
|
|
|
## Stakeholder Management
|
|
|
|
### Identifying Stakeholders
|
|
|
|
**Technical stakeholders:**
|
|
- Engineering teams affected by the decision
|
|
- DevOps/SRE teams who will operate the solution
|
|
- Security team for compliance/security decisions
|
|
- Architecture review board (if exists)
|
|
|
|
**Business stakeholders:**
|
|
- Product managers (feature impact)
|
|
- Finance (budget implications)
|
|
- Legal/compliance (regulatory requirements)
|
|
- Executive sponsors (strategic alignment)
|
|
|
|
### Getting Input
|
|
|
|
**Pre-ADR phase:**
|
|
1. Conduct stakeholder interviews to gather requirements and constraints
|
|
2. Share draft alternatives for early feedback
|
|
3. Identify concerns and dealbreakers
|
|
|
|
**ADR draft phase:**
|
|
1. Share draft ADR with key stakeholders for review
|
|
2. Hold working session to discuss controversial points
|
|
3. Revise based on feedback
|
|
|
|
**Approval phase:**
|
|
1. Present ADR at architecture review (if applicable)
|
|
2. Get sign-off from decision-makers
|
|
3. Communicate decision to broader team
|
|
|
|
### Recording Stakeholder Positions
|
|
|
|
For controversial decisions, add:
|
|
|
|
```markdown
|
|
## Stakeholder Positions
|
|
|
|
**Backend Team (Support):**
|
|
"PostgreSQL aligns with our SQL expertise and provides ACID guarantees we need."
|
|
|
|
**DevOps Team (Concerns):**
|
|
"Concerned about operational complexity of read replicas. Request 2-week training before launch."
|
|
|
|
**Finance (Neutral):**
|
|
"Within budget. Request quarterly cost reviews to ensure no overruns."
|
|
```
|
|
|
|
## Decision Trees for Related Choices
|
|
|
|
When decision involves multiple related questions, use decision tree approach.
|
|
|
|
**Example: Cloud Provider + Database Decision**
|
|
|
|
```
|
|
Q1: Which cloud provider?
|
|
├─ AWS
|
|
│ ├─ Q2: Which database?
|
|
│ │ ├─ RDS PostgreSQL → ADR-042
|
|
│ │ ├─ Aurora → ADR-043
|
|
│ │ └─ DynamoDB → ADR-044
|
|
│
|
|
├─ GCP
|
|
│ └─ Q2: Which database?
|
|
│ ├─ Cloud SQL → ADR-045
|
|
│ └─ Spanner → ADR-046
|
|
```
|
|
|
|
**Approach:**
|
|
1. Create ADR for Q1 (cloud provider selection)
|
|
2. Create separate ADRs for Q2 based on Q1 outcome
|
|
3. Link ADRs using "Related ADRs" field
|
|
|
|
## Quantitative Analysis
|
|
|
|
### Cost-Benefit Matrix
|
|
|
|
For decisions with measurable trade-offs:
|
|
|
|
| Alternative | Setup Cost | Annual Cost | Performance (QPS) | Team Velocity Impact | Risk Score |
|
|
|-------------|-----------|-------------|-------------------|---------------------|------------|
|
|
| PostgreSQL | $10k | $36k | 50k | +10% (familiar) | Low |
|
|
| MongoDB | $15k | $84k | 100k | -20% (learning) | Medium |
|
|
| DynamoDB | $5k | $60k | 200k | -15% (new patterns) | Medium |
|
|
|
|
### Decision Matrix with Weighted Criteria
|
|
|
|
When multiple factors matter with different importance:
|
|
|
|
```markdown
|
|
## Weighted Decision Matrix
|
|
|
|
Criteria weights:
|
|
- Performance: 30%
|
|
- Cost: 25%
|
|
- Team Expertise: 20%
|
|
- Operational Simplicity: 15%
|
|
- Ecosystem Maturity: 10%
|
|
|
|
| Alternative | Performance | Cost | Team | Ops | Ecosystem | Weighted Score |
|
|
|-------------|-------------|------|------|-----|-----------|----------------|
|
|
| PostgreSQL | 7/10 | 9/10 | 10/10| 8/10| 10/10 | **8.35** |
|
|
| MongoDB | 9/10 | 6/10 | 5/10 | 7/10| 8/10 | 7.10 |
|
|
| DynamoDB | 10/10 | 7/10 | 4/10 | 9/10| 7/10 | 7.50 |
|
|
|
|
PostgreSQL scores highest on weighted criteria.
|
|
```
|
|
|
|
### Scenario Analysis
|
|
|
|
For decisions under uncertainty, model different futures:
|
|
|
|
```markdown
|
|
## Scenario Analysis
|
|
|
|
### Scenario 1: Rapid Growth (3x projections)
|
|
- PostgreSQL: Need expensive scaling (Aurora + sharding), $150k/yr
|
|
- DynamoDB: Handles easily, $120k/yr
|
|
- **Winner**: DynamoDB
|
|
|
|
### Scenario 2: Moderate Growth (1.5x projections)
|
|
- PostgreSQL: Read replicas sufficient, $60k/yr
|
|
- DynamoDB: Overprovisioned, $90k/yr
|
|
- **Winner**: PostgreSQL
|
|
|
|
### Scenario 3: Slow Growth (0.8x projections)
|
|
- PostgreSQL: Single instance sufficient, $40k/yr
|
|
- DynamoDB: Low usage still requires min provision, $70k/yr
|
|
- **Winner**: PostgreSQL
|
|
|
|
**Assessment**: PostgreSQL wins in 2 of 3 scenarios. Given our conservative growth estimates, PostgreSQL is safer bet.
|
|
```
|
|
|
|
## Review and Update Process
|
|
|
|
### When to Review ADRs
|
|
|
|
**Scheduled reviews:**
|
|
- High-stakes decisions: Review after 6 months
|
|
- Medium-stakes: Review after 12 months
|
|
- Check if consequences matched reality
|
|
|
|
**Triggered reviews:**
|
|
- Major change in context (team size, scale, requirements)
|
|
- Significant problems attributed to decision
|
|
- New technology emerges that changes trade-offs
|
|
|
|
### How to Update ADRs
|
|
|
|
**Never edit old ADRs.** Instead:
|
|
|
|
1. Create new ADR that supersedes the old one
|
|
2. Update old ADR status to "Superseded by ADR-XXX"
|
|
3. New ADR should reference old one and explain what changed
|
|
|
|
**Example:**
|
|
```markdown
|
|
# ADR-099: Migrate from PostgreSQL to CockroachDB
|
|
|
|
**Status:** Accepted
|
|
**Date:** 2026-03-15
|
|
**Supersedes:** ADR-042 (PostgreSQL decision)
|
|
|
|
## Context
|
|
ADR-042 chose PostgreSQL in 2024 when we had 5k users. We now have 500k users across 8 regions. PostgreSQL sharding has become operationally complex...
|
|
|
|
## What Changed
|
|
- Scale increased 100x beyond projections
|
|
- Multi-region deployment now required for latency
|
|
- Team size grew from 5 to 40 engineers (distributed systems expertise available)
|
|
...
|
|
```
|
|
|
|
## Summary
|
|
|
|
For complex decisions:
|
|
- Break into multiple ADRs if needed (use cascading pattern)
|
|
- Add detailed analysis sections for critical factors
|
|
- Engage stakeholders early and document positions
|
|
- Use quantitative analysis (matrices, scenarios) to support intuition
|
|
- Plan for review and evolution over time
|
|
|
|
Remember: The best ADR is the one that helps future teammates understand "why" when reading it 2 years later.
|