The Zen of DevOps
- Be able to break non-production systems
- Be able to break non-production systems only
- Design for more than one
- Design for more than once
- Favor changes that make you faster over those that slow you down
- Beautiful is better than ugly
- Explicit is better than implicit
- Simple is better than complex
- Complex is better than complicated
- Errors should never pass silently
- Unless explicitly silenced
- In the face of ambiguity, refuse the temptation to guess
- There should be one - and preferably only one - obvious way to do it
- If the implementation is hard to explain, it's a bad idea
- If the implementation is easy to explain, it may be a good idea
Be able to break non-production systems #
DevOpsNon-production environments are needed for safe experimentation and fast delivery.
Any challenge identified and resolved in non-production is one less risk to worry about on production.
Be able to break non-production systems only #
DevOpsNon-production environments must be representative enough to catch issues.
Testing and observability need to be sufficient to catch issues.
Isolation and guardrails should prevent accidentally breaking production.
Promotion procedures need to be robust enough to avoid introducing issues on production.
Design for more than one #
DevOpsMore than one instance allows horizontal scaling and provides resilience.
More than one concurrent version allows rolling updates and canary releases.
More than one deployment requires parametrizing the right things.
More than one of anything requires automation.
Design for more than one, to stay ahead of scaling and resilience needs.
Design for more than once #
DevOpsHidden dependencies often only appear during disaster recovery or scaling.
More than once allows upgrades to be repeatedly tested.
Make rebuilding a habit, not a project. Weak spots surface when repetition is cheap.
If you can’t rebuild, you can’t recover from disaster.
Favor changes that make you faster over those that slow you down #
DevOpsFriction compounds over time, while improvements pay recurring dividends.
Prioritize work that reduces drag and simplifies future changes over quick fixes.
Beautiful is better than ugly #
Python DevOpsClean, readable code invites contribution and reduces cognitive load.
Enforce consistent style and structure to make maintenance easier for everyone.
Explicit is better than implicit #
Python DevOpsHidden logic, while solving a need, can be hard to reason about.
Configuration values might be deliberately chosen, even though they are defaults.
Implicit behavior hides important details and can lead to misunderstandings.
Consciously choose what to expose and what to hide, guiding future changes.
Simple is better than complex #
Python DevOpsSimple designs are easier to understand, maintain, and scale.
Accept required components, but keep their implementation as simple as possible.
Prefer removing problems over adding solutions.
Complex is better than complicated #
Python DevOpsIgnoring complexity can lead to complicated problems.
Address essential complexity, while keeping accidental complexity to a minimum.
Avoid masking essential complexity with artificial simplicity.
Errors should never pass silently #
Python DevOpsMake errors something that can be observed, diagnosed, and addressed.
If something unexpected is encountered, don’t ignore it.
Blameless culture and post-mortems help turn errors into learning opportunities.
Unless explicitly silenced #
Python DevOpsWhen not addressing an error, make the decision to defer it explicit.
When accepting a certain risk, make that decision explicit.
In the face of ambiguity, refuse the temptation to guess #
Python DevOpsIf guessing at the cause of a problem, try to reproduce and find the root cause.
If guessing at the purpose of a component or piece of configuration, improve the design or documentation.
If guessing what the effect of a change will be, seek ways to remove the guessing. Don’t rely on luck.
Become a fire-preventer instead of a fire-fighter.
There should be one - and preferably only one - obvious way to do it #
Python DevOpsMultiple approaches lead to fragmentation, confusion and cognitive load.
Limit options through clear design, documentation, and standardized examples.
Follow common patterns and conventions to make it easier for others to understand and contribute.
If the implementation is hard to explain, it's a bad idea #
Python DevOpsIf a design is difficult to explain, it is likely flawed.
If the need for a design is difficult to explain, it might not be needed at all.
If the implementation is easy to explain, it may be a good idea #
Python DevOpsEven if a design is easy to explain, underlying assumptions might not be accurate, or change over time.