> "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