This post is a summary of a book I recently read called Accelerate: Building and Scaling High-Performance Technology Organizations. This is not my usual post in the technical blog, but the book’s resume and key points will be helpful for anyone who wants to build a high-performance team or software.
Based on the book here are capabilities that drive improvement:
I will divide the key points into five categories:
- Continuous Delivery
- Product and Process
- Lean management and monitoring
- Cultural capabilities
CONTINUOUS DELIVERY CAPABILITIES
1. Use version control for all production artifacts.
The implementation of version control systems, such as GitHub or Subversion, for managing all key elements of production, including software code, application setups, system configurations, and scripts for automating build and environment setup, is referred to as version control.
2. Automate your deployment process.
The level of automation in deployments, where there is no need for manual intervention, is referred to as deployment automation.
3. Implement continuous integration
Continuous integration (CI) is a critical component of continuous delivery. It is a software development approach where code is frequently added and integrated, and each integration triggers a series of swift tests to identify major regressions, which are promptly addressed by developers. The CI process results in authoritative builds and packages that are eventually deployed and made available to end users.
4. Use trunk-based development methods.
Trunk-based development has been shown to be a predictor of high performance in software development and delivery. It is characterized by fewer than three active branches in a code repository; branches and forks having very short lifetime( less than a day) before being merged into the master; and application teams rarely or never having “code lock” periods when no one can check in code or do pull requests due to merging conflicts, code freezes, or stabilization phases.
5. Implement test automation.
The practice of continuously running software tests automatically throughout the development process is known as test automation. Effective test suites are trustworthy and accurately detect failures, ensuring only release-worthy code passes. It’s important to note that developers should take the lead role in creating and maintaining automated test suites.
6. Support test data management
Managing test data is a crucial aspect of automated testing and is gaining significance. Efficient techniques include having sufficient data to execute your test suite, the capability to acquire required data as needed, the ability to manipulate test data in the pipeline, and ensuring the data doesn’t restrict the number of tests that can be run. It’s advisable to minimize the amount of test data required for automated tests whenever possible.
7. Shift left on security.
Incorporating security into the design and testing phase of software development is essential for optimizing IT performance. This involves conducting security assessments of applications, involving the information security team in the design and demonstration of applications, utilizing pre-approved security libraries and packages, and incorporating security testing as part of the automated testing process.
8. Implement continuous delivery (CD)
The CD, or Continuous Deployment, is a software development methodology where the software remains in a ready-to-deploy condition throughout its lifespan. The team places a high emphasis on maintaining its deployability over adding new features. Team members receive prompt feedback on the quality and deployability of the software, and any issues that prevent deployment are promptly resolved. As a result, the system can be instantly deployed to production or end-users whenever required.
1. Use a loosely coupled architecture.
Adopt a decoupled architecture. This impacts the ability of a team to test and roll out their applications as needed, without the need for coordination with other services. With a decoupled architecture, teams can operate autonomously, without depending on the assistance and services of other teams, thereby enabling them to work efficiently and bring value to the organization.
2. Architect for empowered teams
Teams that have the freedom to select their preferred tools tend to perform better in terms of continuous delivery, ultimately leading to improved software development and delivery outcomes. Practitioners are best equipped to determine what they need to be successful.
PRODUCT AND PROCESS CAPABILITIES
1. Collect and incorporate customer feedback.
It is crucial for software delivery performance for organizations to frequently and actively gather customer feedback and integrate it into their product design.
2. Make the flow of work visible through the value stream.
Teams should have a good understanding of and visibility into the flow of work from the business all the way through to customers, including the status of products and features.
3. Work in small batches.
Teams should break down work into manageable tasks that can be finished within a week or less. The aim is to divide work into smaller, easily achievable features that enable fast development, as opposed to creating complex features on branches and releasing them rarely. This approach can be applied both at the feature and product levels. Working in smaller increments results in shorter lead times and quick feedback cycles.
4. Foster and enable team experimentation.
Team experimentation is the ability of developers to try out new ideas and create and update specifications during the development process, without requiring approval from outside of the team, which allows them to innovate quickly and create value. This is particularly impactful when combined with working in small batches, incorporating customer feedback, and making the flow of work visible.
LEAN MANAGEMENT AND MONITORING CAPABILITIES
1. Have a lightweight change approval processes
A lightweight change approval process base on peer review produces superior IT performance than using external change approval boards.
2. Monitor across applications and infrastructure to inform business decisions.
Leverage data from application and infrastructure monitoring tools to drive action and inform business decisions, rather than simply using them to alert individuals in the case of failures.
3. Check system health proactively
Track system health by utilizing threshold and rate-of-change alerts, allowing teams to proactively identify and resolve issues before they become problematic.
4. Improve processes and manage work with work-in-process (WIP) limits
The use of WIP limits to manage the flow of work is well-known in the Lean community. When used effectively, this drives process improvement, increases throughput, and makes constraints visible in the system.
5. Visualize work to monitor quality and communication throughout the team.
Visual aids like dashboards or internal websites that monitor work progress and quality have been demonstrated to enhance software delivery performance.
1. Support a generative culture
This measure of organizational culture is based on a typology developed by Ron Westrum. The research has found that this measure of culture is predictive of IT performance, and decreasing burnout. Hallmarks of this measure include good information flow, high cooperation and trust, bridging between teams, and conscious inquiry.
2. Encourage and support learning
In order to identify if your organization supports learning, we need to answer to following questions: Is learning, in your culture, considered essential for continued progress? Is learning thought of as a cost or an investment?
3. Support and facilitate collaboration among teams.
This indicates the level of collaboration between teams that were previously isolated in development, operations, and information security.
4. Provide resources and tools that make work meaningful.
This particular measure of job satisfaction is about doing work that is challenging and meaningful and being empowered to exercise your skills and judgment. It is also about being given the tools and resources needed to do your job well.
5. Support or embody transformational leadership.
Transformational leadership supports and amplifies the technical and process work that is so essential in DevOps. It’s comprised of five factors: vision, intellectual stimulation, inspirational communication, supportive leadership, and personal recognition.