Continuous Delivery (CD) is a design technique that is used in software engineering to automate and enhance the process of software delivery. Software is considered to be notoriously difficult to ship, and CD practices facilitate the capability of organizations to quickly and reliably push software features, enhancements, or bug fixes to production that result in improved business value for the customer.This article focuses on some of the important anti-patterns that are prevalent while implementing CD and which need to be addressed for an organization to implement effective CD practices to enhance business and organizational agility.
The focus of Continuous Delivery is to enable product teams to get quick feedback regarding the state of the software product at every stage in the CD pipeline, and thereby enable quicker releases to the production environment based on market requirements. CD improves what and when you release to the customer. Hence, every product team in any domain and industry (e.g. healthcare, avionics, pharmaceuticals, retail, banking) can and should practice Continuous Delivery, and the team should make it a priority item to build a CD pipeline during the beginning of their project so that they are able to release high-quality software to the customer in the shortest possible time and build their competitive advantage in the market. CD also enhances customer and employee satisfaction as the routine and repetitive work is automated and the product is also brought to the market rapidly.
However, even the best organizations can get trapped in CD anti-patterns during the process of implementing CD practices and trying to release quickly. They may apply engineering best practices that are suited for traditional software development lifecycle models, or improperly apply CD patterns which may not yield the appropriate outcomes. A pattern is an acknowledged, effective way to find a solution to a problem, while an anti-pattern is the exact opposite, i.e. it is known to be an ineffective way to resolve a problem. Patterns are generally considered as best practices, and anti-patterns are generally considered as counter-productive practices.The aim is to focus on the patterns and minimize the occurrence of anti-patterns.
The most important CD anti-patterns that need to be avoided are explained below:
Long and slow deployment pipelines – There are a lot of steps between code commit and release. The deployment pipeline is serial and very long, which leads to a slow pipeline. The aim should be to focus on short and wide pipelines. This enables faster release times.
Rigid pipeline design – If the design of the pipeline is rigid, it prevents the team from optimizing their processes. In some cases, the team might want to do some things in parallel and not serially, e.g. exploratory testing and acceptance testing. Hence, pipelines should be structured such that they are flexible and can incorporate sudden changes and the team should be able to manage the pipeline to meet these requirements in real time.
Inadequate understanding of CD practices – Inadequate understanding of CD practices may lead to a poorly designed CDpipeline that could lead to issues in the future. Hence, understanding the concepts behind CD practices through reading books and blogs, watching training videos, and other activities are useful for implementing these CD concepts through the appropriate design and structuring of the pipeline, which facilitates the reduction of issues during CD implementation.
No capability to track metrics (logging/application) – This leads to ineffective decision making as no one is aware of the issues that are causing bottlenecks which impede effective delivery. The focus should be on tracking application metrics and performing detailed and cumulative logging to enable effective decision making.
Anti-CD mindset – The team is not interested in CD and asks, “Why do we need CD? We are doing fine, and we don’t need CD for any additional improvements, as we do not release to production often.” The focus should be on improving awareness of CD practices and explaining success stories and case studies to the team so that they can understand the critical benefits ofCD and how it will help them reduce the time to market (TTM) for their product. Even if they do not release to production, they could focus on releasing to the simulation/staging environment and into production when required.
Investment in build and deployment pipelines is minimal, and CD tools are implemented just for the sake of implementing them – There is no significant investment made in building and deploying CD pipelines, which will lead to issues in the future when the practices mature and need to be scaled, as the CD foundation is not strong. The focus should be on building infrastructure capabilities, versioning approaches, and evaluating new techniques. Based on the requirements, one team member may undertake these activities to maintain the pipeline and implement other CD practices. The focus should be on continuously re-architecting the Continuous Delivery pipeline and design based on the project and market requirements (this is based on Kaizen – a system of continual incremental improvements).
Operational focus is not addressed appropriately – There is no appropriate focus on the operational features (features which impact the visible features of the product). The focus should be on a single backlog which contains all the types of features including operational and visible features.
Database changes are left out or not done properly – Database updates and changes are not managed appropriately and this affects the final delivery of the product. The focus should be on using a tool to manage the database changes with appropriate versioning practices.
Limited DevOps collaboration and organizational culture –There is limited collaboration between the development and operations teams. Team members work in silos and the organizational culture is not conducive to collaboration. CD practices promote collaboration among all the sub-teams to facilitate the design and creation of the CD pipeline. Limited collaboration between Dev and Ops leads to issues and defects in production. The focus should be on increased DevOps collaboration, an agile mindset, and an open and transparent organizational culture to maximize effectiveness.
Usage of design techniques like microservices and containers, but without the safety harnesses like unit tests and metrology tracking being followed as good practices – Before introducing design techniques like microservices and the use of containers, the focus should be on ensuring that a good and robust infrastructure to track metrics and unit tests as safety harnesses is being used appropriately in the project. This will help the team to build on these basic practices in the future.
Other anti-patterns which cumulatively lead to a deficiency in the implementation of CD practices – These include a focus on the project instead of the product, customer voices not being heard or utilized to effectively resolve problems, requirements scope creep, the focus on only a subset of CD practices like automation, or a focus on tooling compared to a focus on systems engineering. In order to alleviate these anti-patterns, we must focus on the product, customer feedback, a manageable product scope, and systems engineering to ensure the effective implementation of CD practices.
In the future, with the advent of artificial intelligence, data science, machine learning, prescriptive and predictive analytics, and the integration of these technologies with Continuous Delivery models, many of these CD anti-patterns will be managed more effectively through rules, data sets, self-learning, and inference engines.
Hence, while implementing CD practices in any organization, we must be aware of, and able to identify, the important CD anti-patterns so that we can avoid or minimize them, and focus only on CD patterns that maximize organizational and business agility and improve customer satisfaction.