> "Design systems so that developers only need to face a small fraction of the overall complexity at any given time."
**Source**: John Ousterhout - *A Philosophy of Software Design*
## Context
Total system complexity may be unavoidable, but how that complexity is distributed matters enormously. Well-designed systems isolate complexity so developers can work effectively within limited cognitive scope.
## Partitioning Strategies
| Strategy | How It Helps |
|----------|--------------|
| **Modules** | Hide implementation details behind interfaces |
| **Layers** | Each layer handles one concern |
| **Services** | Independent deployment and mental models |
| **Abstractions** | Simplify interaction with complex subsystems |
## Complexity Distribution
- **Good**: Complexity concentrated in few places, most code simple
- **Bad**: Complexity spread uniformly, everything hard
## Practical Application
- Deep modules: Simple interface hiding complex implementation
- Information hiding: Encapsulate design decisions
- Define errors out of existence: Simplify by handling edge cases internally
## Related Concepts
- [[System Bloat]]
- [[Loosely Coupled Architecture]]
- [[Maintenance Effort Design]]
## Tags
#system-design #complexity #software-design #ousterhout