Day 21/100

Designing Data-Intensive Applications [Book Highlights]

[Part I : Chapter I] (continued...)

Reliable, Scalable and Maintainable Applications

Coping with load

  • An elastic system can be useful if load is highly unpredictable, but manually scaled systems are simpler and may have fewer operational surprises
  • The problem may be the volume of reads, the volume of writes, the volume of data to store, the complexity of the data, the response time requirements, the access patterns, or (usually) some mixture of all of these plus many more issues.
  • In an early-stage startup or an unproven product it’s usually more important to be able to iterate quickly on product features than it is to scale to some hypothetical future load.

Maintainibility

  • majority of the cost of software is not in its initial development, but in its ongoing maintenance
  • three design principles for software systems:
    • Operability - Make it easy for operations teams to keep the system running smoothly.
    • Simplicity - Make it easy for new engineers to understand the system, by removing as much complexity as possible from the system. (Note this is not the same as simplicity of the user interface.)
    • Evolvability - Make it easy for engineers to make changes to the system in the future, adapting it for unanticipated use cases as requirements change. Also known as extensibility, modifiability, or plasticity.

Operability: Making Life Easy for Operations

  • Provide visibility into the runtime behavior and internals of the system, with good monitoring
  • Providing good documentation and an easy-to-understand operational model
  • Exhibiting predictable behavior, minimizing surprises

Simplicity: Managing Complexity

  • Making a system simpler does not necessarily mean reducing its functionality; it can also mean removing accidental complexity.
  • One of the best tools we have for removing accidental complexity is abstraction.

Evolvability: Making Change Easy

  • simple and easy-to-understand systems are usually easier to modify than complex ones.