These are the passages and lessons I took away from the book Accelerate by Nicole Forsgren, Jez Humble and Gene Kim. All content credit goes to the author(s).
- Maturity models are quite often a ‘lock-step’ or linear formula, prescribing a similar set of technologies, tooling, or capabilities for every set of teams. Capability models are multidimensional and dynamic.
- Capability models focus on key outcomes and how the capabilities, or levers, drive improvement in those outcomes.
Product Design vs Product Delivery
Product Design and Development
Product Delivery (Build, Testing, Deployment)
|Create new products and services that solve customer problems using hypothesis-driven delivery, modern UX, design thinking.||Enable fast flow from development to production and reliable releases by standardizing work, and reducing variability and batch sizes.|
|Feature design and implementation may require work that has never been performed before.||Integration, test, and deployment must be performed continuously as quickly as possible.|
|Estimates are highly uncertain.||Cycle times should be well-known and predictable.|
|Outcomes are highly variable.||Outcomes should have low variability.|
- Lead Time: Time it takes to go from a customer request to the request being satisfied.
- Deployment Frequency: Amount of deployments per period of time
- Mean Time to Restore Service (MTTR): Time it takes to restore service from an outage or incident
- Change Fail Rate (%): % of changes to production that fail or result in degraded service
- Create a learning climate that develops the capabilities of the people.
- Enable cross-functional collaboration by building trust with counterparts on other teams.
- Make performance metrics visible. Align these with organizational goals.
- Provide resources and tools that make work meaningful and empower people to make decisions, employing their skills, experience, and judgement.
- Version Control
- Keep all product artifacts in version control; application code, system configuration, application configuration and scripts for automating build and configuration of the environment.
- Comprehensive Configuration Management
- It should be possible to provision our environments and build, test, and deploy our software in a fully automated fashion purely from information stored in version control.
- Implement Continuous Integration (CI)
- Keep branches short-lived and integrate them into trunk/master frequently.
- Each change triggers a build process that includes running unit tests.
- Implement Continuous Delivery (CD)
- Keep software in a deployable state throughout its lifecycle.
- Implement Test Automation
- Have automated unit and acceptance tests that are reliable run against every commit to version control to give developers fast feedback on their changes.
- Put unreliable tests in a separate quarantine set that is run independently.
- Use Trunk-Based Development
- Have short-lived branches that are merged into trunk at least daily.
- Support Test Data Management
- Be able to acquire adequate test data to run fully automated test suites on demand;
- Have adequate data to run your test suite, the ability to acquire necessary data on demand, the ability to condition your test data in your pipeline, and the dat not limiting the amount of tests you can run.
- Shift Left on Information Security
- Integrate security concerns, practices and requirements into the design and testing phases of the software delivery lifecycle.
- Teams should be able to make large-scale changes to the design of their system without depending on other teams to make changes in their systems or creating significant work for other teams.
- Teams who develop and deliver software and run complex infrastructures should be able to choose what tools are best for completing their work and supporting their users.
Information Security (InfoSec)
- InfoSec experts should contribute to the process of designing applications, attend and provide feedback on demonstrations of the software, and ensure that security features are tested as part of the automated test suite.
- InfoSec experts should provide easy-to-consume, pre-approved libraries, packages, toolchains, training, support, and processes available for developers and IT operations.
- Limit work in progress (WIP) to drive process improvement, prevent burnout, and increase throughput.
- Visualize work to monitor quality and communicate throughout the team using displays, kanbans, or dashboards to share information.
- Proactively monitor system health to preemptively detect and mitigate problems.
- Use a lightweight change approval process based on peer, combined with a deployment pipeline to detect and reject bad changes.
- Use data from application performance and infrastructure monitoring tools to take action and make business decisions on a daily basis.
Lean Product Development
- Make the flow of work visible from the business all the way through to customers; as well as have visibility into the delivery process, including the status of products and features.
- Decompose work into small batches that allow for rapid development, with just enough features to enable short lead times and faster feedback loops.
- Provide developer teams with the ability to try out new ideas, and create and update specifications as part of the development process without requiring approval of people outside the team, which allows them to innovate quickly and create value.
- Actively gather customer feedback and implement this feedback into the design of your products.
- Build systems that are designed to be deployed easily into multiple environments, can detect and tolerate failures in their environments, and can have various components of the system updated independently
- Ensure that the state of production systems can be reproduced (with the exception of production data) in an automated fashion from information in version control
- Create an environment that supports experimentation, failure, and learning; and allows employees to make decisions that affect their jobs.
- Ask employees what is preventing them from achieving their objectives and give them the time, space, and resources to fix those things.
Automation & Job Satisfaction
- Automation gives over to computers the things computers are good at – rote tasks. People then focus on the things they are good at – weighing evidence, thinking through problems, and making decisions. Being able to apply one’s judgement and experience to challenging problems is a big part of what makes people satisfied with their work.
- Practices like proactive monitoring and test and deployment automation all automate menial tasks and require people to make decisions based on a feedback loop. Instead of managing tasks, people get to make decisions, employing their skills, experience, and judgement.
Diversity and Inclusion
- An inclusive organization is one where “all organizational members feel welcome and valued for who they are and that they bring to the table. All stakeholders share a high sense of belonging and fulfilled mutual purpose.”
- Vision: Have a clear understanding of where the organization is going and where it should be in five years.
- Communicate: Communicate in a way that inspires and motivates, even in an uncertain or changing environment.
- Stimulate: Challenge followers to think about problems in new ways.
- Support: Demonstrate care and consideration of followers’ personal needs and feelings.
- Recognize: Praise and acknowledge achievement of goals and improvements in work quality.
Appendix: The Complete Research Program
Once again, all content credit goes to the authors of this book. I’ve simply shared the bits I’ve enjoyed the most and found most useful to apply in our daily software development practices.
That’s it for now. Cheers ’till next time!