This was extracted from an internal document I wrote for work but I reference it so often I wanted to give it a more permanent home.
Efficient, reliable, and reproducible software delivery keeps the cost of introducing change low over the lifetime of a service offering. With this as a foundation, organizations can iterate toward adopting and leveraging enterprise integrations that reduce maintenance burden and decrease time to delivery for new work.
From Accelerate, Appendix B and The Key to High Performance (free PDF e-book; email sign-up required) p3 (YouTube). The more painful code deployments are, the poorer the software delivery performance and culture.
- Deploy frequency: How often are changes made to production? Favor small, frequent changes.
- Continuous Delivery
- Version control
- Lead time: How long does it take to go from commit to running in production?
- Version control
- Test automation
- Mean time to restore (MTTR): How long does it take to restore a failed service?
- Version control
- Change fail percentage: How often do changes cause an outage or another negative outcome?
- Strongly correlated with overall software delivery performance
From Accelerate, Technical Practices and The Key to High Performance (free PDF e-book; email sign-up required) p14 (YouTube).
- Test automation: automated tests give quick feedback and create a virtuous cycle of quality
- Deployment automation: see Characteristics of Cloud Computing below
- Trunk-based development: keep master deployable, favor short-lived feature branches
- Shift left on security: include InfoSec early and often in the SDLC
- Loosely coupled architecture: see Key Outcomes for System Architecture below
- Empowered teams: teams choose the tools they use, favor performance over standards
- Continuous integration: run tests on every commit, merge, and deploy
- Version control: track everything—not just code, configuration is just as important
- Test data management: automated test suites need access to appropriate data
- Monitoring: measure the four golden signals: latency, traffic, errors, saturation
Characteristics of Cloud Computing
From NIST 800-145. Implementing systems that display these characteristics is strongly correlated with high-performance organizations.
- On-demand self-service. Allow automatic provisioning of computing resources, storage, etc. without requiring human interaction with the service provider.
- Broad network access. Services are available over the network and accessed through standard mechanisms that are device agnostic.
- Resource pooling. Storage, processing, memory, network bandwidth, and other resources are pooled, shared, and dynamically assigned using a multi-tenant model.
- Rapid elasticity. Capabilities can be elastically provisioned and released, in some cases automatically, to scale rapidly outward and inward commensurate with demand.
- Measured service. Resource usage can be monitored, controlled, and reported, providing transparency for both the provider and consumer of the utilized service.
Key Outcomes for System Architecture
Decoupled systems are crucial for lowering the cost of change. This evaluation is from The Key to High Performance (free PDF e-book; email sign-up required) p3 (YouTube).
- Can your team make large-scale changes to the design of your systems without the permission of someone outside of your team or without depending on other teams?
- Can your team complete its work with neither fine-grained communication nor fine-grained coordination?
- Can your team deploy and release your product on-demand independently of other services?
- Can your team do most of your testing on-demand without requiring an integrated test environment?
- Can your team perform deployments during normal business hours and with negligible downtime?