An Introduction To DevOps
One of the biggest trends in modern software engineering is DevOps, a portmanteau or concatenation of the words Development and Operations meant to signify their unification. In this series, we’ll examine the twelve factors that successful DevOps implementations have in common. These factors are similar to the concepts laid out in the 12-factor App, but are not necessarily identical to them. These posts will not tell you how to implement the factors, as there are numerous ways to do each, and some will be better fits for you than others.
Part one addresses the subject of automation. But before we dive in, let’s take a step back and examine what DevOps is and what it strives to accomplish.
What is DevOps?
Depending on which article you read or who you ask, DevOps may be explained as a technology stack, a philosophy, or a combination of the two. It is, in the author’s opinion, a combination of the two. DevOps’ overarching goal of delivering business value fits in well with Agile methodology in that it seeks to:
- Improve the overall efficiency of the development and deployment of features to your end users.
- Reduce inconvenience experienced by your customers while continuously improving your product.
- Effect a culture shift in product teams to one where all participants share ownership of the outcomes.
- Increase security and stability of products by catching issues early in the lifecycle, failing fast, and acknowledging technical debt.
- Empower teams to make intelligent, data-driven decisions by providing rapid feedback and analytic data.
Although commonly applied to software and data engineering, DevOps is a mentality that can be applied to almost every aspect of a business.
Factor 1: Automate
In a nutshell: eliminate manual steps at all costs to achieve critical efficiency
In a high-performing DevOps culture, processes are automated as much as possible. This reduces both the chance of human error and the time necessary to enact any given process.
A process can be any event or chain of events required to accomplish a task, regardless of the domain. Depending on where you’re focusing your efforts, you might be automating:
- Software Engineering – Unit tests, code quality analysis, builds, quality assurance testing, security testing, deployment, and integration tests.
- Operations & Infrastructure – Building, patching, or replacing resources, backups, restore tests, and fail-overs.
- Site Reliability – Performance testing, load-testing, creation or modification of observation tools & alarms, and escalations.
- Human Resources – Onboarding or off-boarding staff, submission of staff feedback, background checks, and employee reviews.
By automating, you ensure that the process has been defined and documented. To automate something, you must understand the full workflow, including what is being done, what triggers the process, and all the inputs and steps required to successfully complete it.
Scalability increases dramatically with automation. When performing manual tasks, there is a critical load at which you cannot complete more work without increasing staff. Automation is only limited by compute resources, which are vastly easier to acquire.
You gain repeatability in that you know that every time the process is executed, the same steps are followed in the same order. There may be branch logic to skip steps, but the conditions under which that happens are defined as part of the process itself and are well-understood. When any other deviation or error occurs, alerts are raised quickly and can be dealt with.
Speed increases because individual steps can be completed at the speed of the underlying system itself instead of the rate at which a person can keep up. When you have a multi-step process, this also allows the steps to be triggered automatically instead of waiting for a person to do the next thing.
Finally, automation frees time to work on higher-value tasks. For example, instead of executing QA tests, the QA team can work on increasing test coverage and providing better data back to the developers.
Automation begins with scripting the steps necessary to complete the process. Depending on the nature of the process, this might be BASH, Python, Groovy, Powershell, or something else. Once written, you can invoke the script manually, or you can set up continuous integration / continuous delivery (CI/CD) tools like Jenkins, Travis CI, Bamboo, CodeDeploy, and Azure DevOps to do it for you. CI/CD tools all support schedules and triggers, ensuring that the processes are executed in a timely manner.
In the next part of our series, we’ll discuss unification.