Skip to main content
โšก Calmops

Software Architecture Documentation: ADRs, RFCs, and Technical Writing

Introduction

Good documentation is crucial for software maintenance and team collaboration. Architecture Decision Records (ADRs) and RFCs help teams make and communicate technical decisions. This guide covers documenting architecture effectively.

Documentation is a love letter to your future self.

Architecture Decision Records

ADR Template

# ADR-001: Use PostgreSQL as Primary Database

## Status
Accepted

## Context
We need to choose a primary database for our new e-commerce platform. 
The system requires:
- ACID compliance for transactions
- Complex queries for reporting
- JSON support for flexible schemas
- Horizontal scaling capability

## Decision
We will use PostgreSQL 15 as our primary database.

## Consequences

### Positive
- ACID compliance out of the box
- Excellent JSON support
- Rich ecosystem and tools
- Strong community support

### Negative
- Horizontal scaling more complex than NoSQL
- Requires more DBA expertise
- License concerns (though PostgreSQL is open source)

## Alternatives Considered
1. **MySQL**: Less feature-rich, worse JSON support
2. **MongoDB**: No ACID guarantees, limited joins
3. **CockroachDB**: Newer, less mature ecosystem

## Notes
- Decision made after proof-of-concept with both PostgreSQL and MySQL
- POC results available in /docs/poc/database-comparison.md

ADR Index

# Architecture Decision Records Index

| ADR | Title | Status | Date |
|-----|-------|--------|------|
| [001](adr-001-database.md) | Use PostgreSQL as Primary Database | Accepted | 2026-01-15 |
| [002](adr-002-messaging.md) | Use Kafka for Event Streaming | Accepted | 2026-02-01 |
| [003](adr-003-auth.md) | Use OAuth 2.0 for Authentication | Proposed | 2026-03-10 |
| [004](adr-004-api.md) | Use GraphQL for User-Facing API | Deprecated | 2026-01-20 |

## Categories
- Database: 001
- Messaging: 002
- Authentication: 003
- API Design: 004

RFC Process

RFC Template

# RFC-015: Implement Feature Flags System

## Summary
Implement a feature flag system to enable gradual rollouts and A/B testing.

## Motivation
Currently, all code deployments are risky because they affect all users immediately.
We need the ability to:
- Roll out features gradually
- A/B test features
- Kill switch problematic features instantly

## Detailed Design

### Components
1. **Flag Service**: Stores feature flag configuration
2. **Client SDKs**: Libraries for accessing flags
3. **Management UI**: Dashboard for managing flags

### Data Model
```json
{
  "flag": "new-checkout",
  "enabled": true,
  "rollout": 10,
  "targeting": {
    "users": ["user-1", "user-2"]
  }
}

API Endpoints

  • GET /flags - List all flags
  • POST /flags - Create flag
  • PUT /flags/:name - Update flag
  • DELETE /flags/:name - Delete flag

Risks

  • Feature flag technical debt if not cleaned up
  • Performance overhead from checking flags

Alternatives

  • Use LaunchDarkly (external service, cost)
  • Build custom (more control, more work)

Timeline

  • Week 1-2: Design and API specification
  • Week 3-4: Implement flag service
  • Week 5: Client SDKs and integration

Comments

Question: Should we use percentage-based rollout? Answer: Yes, we should implement gradual rollouts.

Decision

[To be filled after review]


### RFC Workflow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ RFC Workflow โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ Draft โ†’ Review โ†’ Discussion โ†’ Decision โ†’ Implementation โ”‚ โ”‚ โ†‘ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


## Technical Writing

### Writing Style

```python
# Clear vs unclear examples

# โŒ Unclear
"The system processes data in a timely manner."

# โœ… Clear
"The system processes data within 100ms."

# โŒ Unclear  
"This should be done efficiently."

# โœ… Clear
"This should complete within 5 seconds."

Document Structure

# Document Title

## Summary
Brief overview (1-2 sentences)

## Background
Why this document exists

## Details
Main content

## Examples
Practical examples

## References
Links to related documents

Best Practices

  1. Keep ADRs small: One decision per ADR
  2. Write them early: Document decisions when made
  3. Include context: Explain the why, not just the what
  4. Review regularly: Update or deprecate stale decisions
  5. Use templates: Consistency helps readability

Conclusion

Good architecture documentation helps teams make better decisions and onboard new members faster. ADRs and RFCs are essential tools for capturing and communicating technical choices.

Comments