Premise
Software systems exist within technical, operational, organizational, and economic constraints.
The primary challenge of software engineering is managing complexity over time.
As systems evolve, the limiting factor is often not computational resources but human understanding.
A system that cannot be understood cannot be reliably operated, modified, or repaired.
Principles
Complexity Must Be Justified
Complexity is sometimes necessary.
Distributed systems, security requirements, regulatory obligations, and large-scale operations all introduce unavoidable complexity.
Additional complexity should only be introduced when it solves a demonstrated problem.
Favor Explicitness
Dependencies, ownership, configuration, failure modes, and operational procedures should be visible and discoverable.
Implicit behavior increases cognitive and operational burden.
Prefer Composition
Systems should be built from components with clear responsibilities and stable interfaces.
Complexity should be concentrated rather than distributed throughout the system.
Optimize for Ownership
A system should be maintainable by the people responsible for operating it.
Operational procedures, deployment mechanisms, recovery paths, and system behavior should be understandable without requiring institutional folklore.
Treat Software as a Long-Term Liability
Every dependency, service, integration, and codebase introduces ongoing maintenance obligations.
The decision to create software should be evaluated against its lifetime cost, not only its implementation cost.
Reliability Emerges from Understanding
Reliable systems are not produced by process alone.
Reliability emerges when system behavior, failure characteristics, and operational constraints are sufficiently understood.
Technology Is a Means
Languages, frameworks, platforms, and tooling are implementation choices.
They should be selected according to their suitability for the problem, their operational characteristics, and their long-term maintenance cost.
No technology is inherently modern or obsolete. Only appropriate or inappropriate for a given context.
Evaluation
The quality of a system should be evaluated across its entire lifecycle.
Relevant considerations include:
- Ease of understanding
- Ease of operation
- Ease of modification
- Ease of recovery
- Dependency burden
- Failure characteristics
- Maintenance cost
- Knowledge transfer
A successful system is one that remains dependable, operable, and understandable over time.
Goal
The objective is to preserve human comprehension as systems evolve.
A compact and robust system is one whose complexity remains proportional to the problem it solves.
We can conclude that the system requires constraints, because systems naturally accumulate complexity over time.
Furthermore, if we're about to make a major engineering decision and we haven't attempted to measure1 the problem, we may be solving a story instead of a reality.
1 A measurement is an observation that reduces uncertainty.
A Cell
Nature provides examples of systems that have survived for billions of years under constant change, failure, competition, and environmental pressure.
Consider a biological cell.
A cell:
- has clear boundaries
- exposes explicit interfaces
- has local responsibilities
- is self-contained
- can be understood at multiple levels
- survives partial failures
- is composed of smaller mechanisms
Despite its sophistication, a cell remains comprehensible as a unit.
Its complexity is proportional to its function.
The Compact and Robust System applies a similar principle.