Reliable, Scalable, and Maintainable Applications
Reliability
The system should continue to work correctly even in the face of adversity. This means hardware faults, software faults, and human errors.
- Hardware faults: add redundancy (disks, power, servers)
- Software faults: isolate failures, test thoroughly, monitor
- Human errors: good UX, sandbox environments, quick rollback
Scalability
As the system grows in data volume, traffic, or complexity, there should be reasonable ways of dealing with that growth.
- Measure load with a load parameter (requests/sec, data size, etc.)
- Performance metrics: throughput, response time percentiles
Maintainability
Three ingredients:
- Operability: easy to keep running
- Simplicity: easy for new engineers to understand
- Evolvability: easy to change
Martin Kleppmann argues that removing accidental complexity is the main battle.