Getting software updates to users quickly is paramount in today's world. You know from your own phone, mobile, and computer usage that software updates for applications are a daily occurrence. We live in "internet time." The ability to be quick and responsive with value to meet users' needs can mean great success for a company, but the inability to do so could mean the death dive.
In order to survive in this world, you must be able to produce both swiftly and frequently. This is how you get ideas out fast and bring business value to customers. And, being able to do this requires agility. Working in the traditional Waterfall process of software delivery where there was a long drawn-out series of investigation, analysis, and planning doesn't cut it anymore. Agile development allows you the framework that is critical to optimize planning, testing, and implementation. Agile development is a way to have faster cycle times, the goal being to achieve "internet time."
Achieving Continuous Delivery and Continuous Deployment in the Solution Delivery Pipeline means your organization is nimble and can release updates to users in a responsive manner; these 2 phases in the pipeline are very important to the overall goal of fast, responsive deployments. However, sometimes there is confusion about what they are. In this article, we clarify the difference between Continuous Delivery and Continuous Deployment and describe how each fits into an Agile environment.
"Continuous Delivery" means that you are ready and able to deploy any version to any supported platform at any time.
"Continuous Deployment" means that you are engaging in actual deployment.
The Solution Delivery Pipeline
In order to understand Continuous Delivery and Continuous Deployment and how they differ, it's necessary to look at the entire Solution Delivery Pipeline.
This graphic depicts the phases that comprise the Solution Delivery Pipeline.
The phases in the Solution Delivery Pipeline lead you through a shortened cycle in order to be fast in response. For example, the planning phase is accelerated in that you plan just enough to get to the next 2-week Sprint. Contrast this with the traditional way of spending a lot of time planning for the entire project, which usually results in testing, scalability, and QA getting squeezed and ultimately a less-than-optimum product being released.
In shortening the cycle, it's imperative to incorporate feedback loops in order to get useful information that enables you to learn and improve. Feedback is achieved by collecting metrics at each phase-plan, code, build, test, release, and so on, so the development team can improve the next integration.
Working in an Agile environment, you constantly learn from small pieces of work and thereby are able to make improvements before actual deployment.
Planning for short cycles, such as 2-week Sprints, allows you to have a smaller bit to review and improve. By incorporating feedback loops along the way you are given important information that illuminates what works and what doesn't work in order to make corrections quickly. Being agile means you can have the infrastructure keep up with changes and match the application development cadence in order to avoid deploying on the "wrong" infrastructure.
An Agile environment requires automating the testing phase so it happens fast and provides accurate feedback and can keep up with a Continuous Delivery pace. An agile response comes into play for issues that are reported through the help desk and other user input channels.
When you are striving for Continuous Delivery, where you can deploy any version at any time on any platform, it forces you to optimize the development process.
It's a given that there is 10-30% technical debt on each Sprint. Technical debt includes such things as introducing defects or bugs and releasing a feature on infrastructure that hasn't been developed yet. It's difficult to be perfect. So, just realize that technical debt will occur and look for the feedback loops to give you the information necessary for corrections.
Be sure that you get detailed feedback about how the test run went and how the process went at the end of the delivery cycle. These are some examples of questions you can answer in order to improve the process:
- Did you finish what you thought you would finish?
- Did you estimate properly?
- Did it take the same amount of time you thought it would take?
- Were the tasks done the actual tasks the team had to complete during Sprint execution?
- Were there a lot of tasks that had to be done that were not planned?
In looking at Continuous Delivery, the preferred goal is to be ready and able to deploy 10 or more times per day. If you hit that goal, then deployment can be done every 45 minutes.
Continuous Deployment is actually deploying; however, it doesn't mean you must deploy to production or to the customer every time. For example, you can deploy to QA or to a deployment slot. A deployment slot is an A/B deployment method that allows you to get valuable information without inconveniencing users in the event that a defect leaks through a gap in the testing process. This takes some of the fear and anxiety out of the deployment.
One way of deploying to a slot might be to offer an "opt-in" choice for the customer to get an updated version, providing you with a smaller group of users that can serve as a "beta." You always give these users the ability to go back to the former version if they want to do so.
Engaging in Continuous Improvement is an important part of Continuous Delivery and Continuous Deployment. Continuous Improvement requires that you amplify feedback loops by:
- Setting baselines. Be sure you have a starting point from which you can measure.
- Monitoring important metrics. The key metric is deployment frequency of 10 or more times per day. There are some other side effect metrics like mean time to recover, mean time to change, and defect to new work ratio, but these aren't as important as the deployment frequency.
- Identifying bottlenecks. Feedback loops during Sprints give you information on any congestion or blockages in the cycle.
Every time you find a gap in the process you have an opportunity to do a "gap fill" with a new test, new script, or new process. Create tests that test for defects. Set acceptance criteria based on input from the users. And, automate Acceptance Testing so that testing gets run on every commit to the source code.
Delivery vs. Deployment
In this graphic, you can see the point at which the difference between Continuous Delivery and Continuous Deployment exists.
With Continuous Delivery, "Deploy to Production" is a manual process, meaning that it is initiated manually. This differs from Continuous Deployment, which is automated all the way through "Post Deployment Test."
In summary, Continuous Delivery is a state of being ready and able to release any version at any time on any platform, whereas Continuous Deployment is being able to continually deploy. Both require an Agile process that provides a framework where you work on small, frequent changes and obtain feedback. Both require that you continually learn and improve on what you have done. And, both require open communication throughout the process. Achievement means you can ultimately bring needed value to your customers.