People, processes, and tools are the three foundational pillars of DevOps — the term coined by Patrick Debois in 2009 to describe a new culture of collaboration and shared ownership in software development. With DevOps adoption, software is developed and delivered in short cycles supported by automation and tools.
But DevOps implementation is not all hard stuff. According to Patrick Debois, DevOps is more a human problem. Or, as Viktor Farcic put it in his book The DevOps Paradox, it's a people game at its roots. In the old pre-DevOps days, developers would only tell the operations team after completing a piece they have been working on for months, "Here's version 2.0. Make it run." And Ops would run it to find out that everything has crashed. Finger-pointing was also commonplace.
DevOps processes, however, invite everyone to the party, making teams assume collective responsibility for user experience with new software. In the world of DevOps, Ops engineers are saying, "Fine, we get it, we should ship this piece tomorrow, we'll figure out how to meet the deadline." And Dev people are saying, "We don't want to be messaged in the middle of the night that something has gone terribly wrong, so we will help ship it safely."
In the DevOps environment, everyone is working together toward the same goal — building better quality software faster. With no blame game. Everyone means people from product owners, developers, testers, and IT operations to even marketing and sales that bring customer feedback to the table. An important thing to know is, you don't set up a DevOps department between Dev and Ops to implement DevOps. This way, you can get only a third silo. Instead, you change the culture of Dev and Ops to break down the walls between them.
What is exactly the DevOps mindset?
DevOps implementation above all means a cultural shift. Because DevOps is mostly about soft stuff:
- Empathy and collaboration
Empathy, meaning the ability to think about things from another's perspective, is believed by many to be the true DNA of DevOps. It allows Ops people to understand the importance of quick releases, while developers can better appreciate problems caused by bad code. Plus, both parties are putting users at the center of everything they are doing. Empathy powers collaboration. Collaboration powers productivity, encouraging everyone to commit to software development quality and speed.
- Mutual responsibility
DevOps implementation involves setting up small cross-functional groups who will work autonomously, taking mutual responsibility for continuous delivery. Loosely coupled product-centered teams, consisting of developers, operations engineers, testers, and project managers, enable microservices style, reducing the number of handoffs along the value stream — from version control to production deployment. However, individually, developers are still responsible for a piece of code they've written. "You build it, you run it," Amazon CTO Werner Vogels once famously said.
- Knowledge sharing
Scrum standup meetings and retrospectives allow teams to understand what was done yesterday, what was successful, and what can be improved. In a knowledge-sharing environment, DevOps engineers learn new things and grow continuously, adjusting their competencies. At a bare minimum, everyone on the team should have on-demand access to source code, logs, tools, test servers, production builds, and postmortem reports.
- Continual experimentation
DevOps is hypothesis-driven development. Failing fast to learn faster through a tighter feedback loop is key to DevOps implementation. DevOps teams write code in small batches and push it to production as quickly as possible. This way, they have an immediate chance to put the solution right by fixing defects swiftly or removing a certain feature altogether. As The DevOps Handbook co-author Jez Humble said, "Users don't know what they want. Users know what they don't want once you've built it for them." So, the DevOps mindset is about starting with intuition and learning lessons as you move forward to arrive at a data-driven decision.
- Customer centricity
The DevOps culture relies on a product-first approach that cares about the needs of real users. DevOps teams should understand what they build and understand the people for whom they build. Continuous feedback is crucial. This often means that (i) Ops take part in developing service-level agreements with users to understand user requirements, (ii) developers heed to end-user requests with fast updates, leveraging a loosely coupled, service-oriented architecture that allows utmost flexibility, and (iii) testers set up user focus groups for a controlled UAT, interacting with users directly.
A very strong emphasis in building DevOps is put on automation that reduces human error and amplifies speed, cutting overhead costs. Automation in DevOps processes is extended virtually to everything, from development and testing to infrastructure provisioning, configurations, network tasks, databases, deployment, and monitoring. Netflix is known as a fantastic example for DevOps implementation, with its fully automated deployment processes allowing engineers to run code thousands of times per day.
Why to implement DevOps
According to the 2020 DevOps Trends Survey by Atlassian, organizations see a number of benefits from DevOps implementation, including:
Speaking of tangible DevOps benefits, an example from our experience would be a 5x increase in the speed of delivery of new features that we helped achieve in gaming app development.
DevOps implementation best practices
It's impossible to oversell the importance of automation for a successful DevOps implementation roadmap. Automation, however, cannot be done overnight. It's a journey with multiple stops and requires careful planning. According to the Boston Consulting Group's (BCG) classic article, Leaner, Faster and Better with DevOps, organizations implement DevOps in four automation steps:
- Continuous Integration
An essential part of agile processes, CI allows DevOps teams to always work with the latest code version. In the CI process, developers push new pieces of code into a shared repository at least once a day for validation through an automated build and testing, which typically includes unit, integration, and basic security tests. Builds and tests are triggered by a version control tool for code check-ins which the server is watching. So, CI is a fully automated process run within a few seconds or minutes to allow developers to know immediately if their code is right and has successfully integrated with others' code or has broken the build.
- Continuous Delivery
Continuous Delivery automates the build-test-release process, allowing new builds to be released with one button push. While CI is focused on the quality of code to make sure it passes all testing before being merged into the master build, the objective of CD is to ensure through more testing that the software (the master build) behaves as intended in the real world. CD is a short cycle, completed in a few hours, enabling the team to automate everything in the life of a code. In essence, it consists of two pipelines: a CI pipeline and continuous testing.
- Continuous Deployment
In a Continuous Deployment process, code changes are deployed automatically after successfully passing the complete testing cycle. There is no need for human intervention to decide what to release and when. Continuous Deployment differs from Continuous Delivery in only one thing: it involves an automated push to production environments. Continuous Deployment, however, requires setting up a rigorous automated testing framework.
- Continuous Monitoring
If an organization's environment is automated, ensuring its stable performance will be an imperative. In DevOps infrastructure, there are a lot of things you can monitor, but it is, however, impossible to keep track of all of the services and procedures. So, when implementing DevOps, you need to understand which are your primary monitoring targets. These can include the efficiency of your CI/CD pipeline, deployment milestones, automated handling of vulnerabilities, server health, user activity, application logout output, and application performance. You do the job either through application monitoring tools like Datadog or Newrelic or by going manually through application logs or by configuring the notifications and alarms. Important metrics to watch are failures, usage patterns, performance, availability, scalability, and custom telemetry.
- Plus, Configuration Management
This process in DevOps implementation ensures optimal configuration of multiple testing environments, set up for unit testing, integration testing, load testing, acceptance testing, end-user testing, and more. Unlike in the traditional organization where configuration management is done through formal documentation, this process in a DevOps environment is automated to a great degree — configurations are encapsulated in code or scripts and controlled through a version control tool. Configuration management systems have given rise to:
- Infrastructure as a code, which codifies all infrastructure resources in a code or a script, with the text files stored in a version control tool like Git.
- Configuration as a code, which defines server configurations as a code or script and commits them to version control.
Infrastructure automation enables automated infrastructure provisioning, configuration, and scaling, increasing productivity, saving costs, and freeing engineers for more creative tasks.
Step-by-step DevOps implementation plan
Drawing on our vast hands-on experience, we've compiled a list of practical recommendations on how to implement DevOps activities successfully:
- Start a DevOps initiative DevOps adoption should start with a strong business justification. Your DevOps initiative should be aligned with hard-boiled business goals, rather than driven by a fear of missing out. The CIO plays a key role, initiating DevOps transformation as part of the organization's digital activities and planning financial investments and human resources.
- Build a DevOps strategy Program managers are responsible for developing the company's DevOps implementation strategy. They need to identify its vision based on challenges like production defects, complicated deployments or team burnout, and figure out how to make everything in a software development cycle continuous. It's also critical to set KPIs for your DevOps team. A common set of metrics, proposed by Nicole Forsgren, Jez Humble and Gene Kim in their book Accelerate, includes: Lead time for changes – the time it takes to go from code committed to code successfully running in production Deployment frequency – software deployment to production or an app store Time to restore service – mean time to recover (MTTR) Change failure rate – how often deployment failures occur in production that require an immediate rollback
- Set up a competent team No matter whether your company chooses to go with an in-house or outsourced model, people on your team should be qualified and eager to learn new things. They should be experts in advanced DevOps tools, able to think out of the box when configuring complex scenarios, and… have the patience to troubleshoot and debug as many times as needed to find the root cause of a problem. Consider including a release manager, automation experts, testers, QA lead and SecDevOps engineers in your team. The right people are key. According to the 2020 DevOps Trends Survey, a lack of skills is the number one inhibitor to successful DevOps implementation.
- Choose the right tools There are many good DevOps tools available today, from release planning to building, testing, and safely delivering applications. In fact, there is an overwhelming amount of them that keeps growing, so it's easy to get confused. Get expert help if needed and don't be. When choosing DevOps tools, be also sure to understand how they will fit together to avoid ending up with what Gartner calls disconnected islands of automation. What you will need is an integrated toolchain and systematic automation implemented with tools aligned at each stage.
- Containerize your applications Сontainerization makes your application easy to execute. Containers, implemented with tools like Docker or Kubernetes, are basically an isolated process for an executable file running on a Linux machine. They include code, dependencies, binaries, libraries, and other things your software needs, presenting an environment that can follow the application from development to testing to production deployment. Containers are considered the best choice for a microservices architecture that splits your application in multiple microservices focusing on smaller tasks and providing scalability, flexibility, easier automated testing, and rapid deployment.
- Integrate infrastructure automation with CI/CD You should run a number of application services integrations to make infrastructure automation tools such as Kubernetes, Chef, or Puppet work with CI/CD tools (Jenkins, Bamboo or other). Seamless integrations will arm you with a consistent set of services applied automatically. As a result, you will be able to deploy new infrastructure configurations and release new software way faster.
- Automate testing To achieve DevOps-style speeds and agility with DevOps implementation, it is important to automate testing as much as possible but as appropriate. Once you add automation testing to the process, checks are run the moment new code is complete, and your developers no longer have to spend days on trying to remember and fix code written many weeks ago. According to Slava Makovsky, QA Automation Team Lead at ITRex with more than 15 years of experience with a global tech giant, there are few things to remember when implementing test automation: 1. Start with creating simple test cases, rather than designing a complex automation framework up front 2. Smoke tests are an imperative 3. Use remote machines to run tests from the very beginning 4. Make sure you've got a well-thought-out plan for running tests in parallel and as part of your CI/CD pipeline 5. Set up capabilities to analyze test results on a daily basis
- Start Small Before configuring any complex scenarios, it is safer and more beneficial to begin with small initiatives in DevOps implementation. Pick carefully your first app and scale only when you are ready. There are basically no restrictions for applying DevOps, but web-enabled agile applications are a popular choice for the first moves. These applications are often architectured from the beginning with a lean or agile mindset that complements DevOps.
- Collect feedback "We all need people who will give us feedback. That's how we improve," Microsoft Founder Bill Gates said. There are two types of feedback you might want to seek: feedback on bugs and incorrect usage. Apart from collecting customer-centric data, such as the load time of your application, the maximum number of concurrent users or performance differences between web, mobile app and wearables, you can garner feedback directly from your users. You can either build user feedback mechanisms within your application using emojis, star ratings or binary-type questions, or ask users through your app or in an email to join a survey, or study public discussions. Feedback is an essential part of the DevOps loop, informing the next steps and enhancements.
A final note
While it may be cliche to say that every business should implement DevOps today if they want to keep up with the pace of innovation and stay competitive, almost half of organizations are only starting with DevOps, practicing it for less than three years, according to the 2020 DevOps Trends Survey. DevOps transformation indeed can be complicated. It is not an initiative that can be undertaken once and for all. It is not even done after you implement continuous practices. These will require continuous improvement as well.
Contact ITRex if you are interested in learning more about DevOps or need help from our experienced consultants with starting or accelerating your DevOps journey.