- 1.1 Visibility at Scale
- 1.2 The Importance of Simplicity
- 1.3 Composition
- 1.4 Distributed State
- 1.5 The CAP Principle
- 1.6 Loosely Coupled Systems
- 1.7 Speed
- 1.8 Summary
- Exercises
1.2 The Importance of Simplicity
It is important that a design remain as simple as possible while still being able to meet the needs of the service. Systems grow and become more complex over time. Starting with a system that is already complex means starting at a disadvantage.
Providing competent operations requires holding a mental model of the system in one’s head. As we work we imagine the system operating and use this mental model to track how it works and to debug it when it doesn’t. The more complex the system, the more difficult it is to have an accurate mental model. An overly complex system results in a situation where no single person understands it all at any one time.
In The Elements of Programming Style, Kernighan and Plauger (1978) wrote:
- Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
The same is true for distributed systems. Every minute spent simplifying a design pays off time and time again when the system is in operation.