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