As technology has evolved over the years, countless systems have sprung up into existence; each system formed on the basis of the intelligent application of knowledge and design principles. In our line of work, we design and build systems that provide services to our fellow humans.
Think of all the great services we enjoy today: WhatsApp, Instagram, Twitter, Google Search, etc. They are products of engineering aimed at making life more interesting, or should I use the word.. engaging.
Product Engineering itself is a combined effort that includes Development, Quality Assurance, and Operations. Indeed, it is highly improbable you will find a software company that does not engage in those three processes — the reason being that they are inextricably tied to the quality of service and user happiness. Here’s what it looks like:
Development is the process of systematically evolving a codebase to address business problems. Of course, this is the first stage where the work to be done is analyzed and organized into sprints. The output of each sprint is a new feature or patch to be deployed to your live environment.
Quality Assurance involves testing that code has been well written according to business requirements. The primary incentive for QA is the knowledge that the work done in Development can be shipped to users without any issues or bugs.
Operations is the entirety of all activities involved in system administration, monitoring, and maintenance. Apparently, the work of your engineering team does not end when you go live. They will need to load balance, administer servers, backup databases, run migrations, monitor uptime and resource usage, etc. Operations are no child’s play!
Let’s talk about DevOps
DevOps is more than just a portmanteau of the words ‘Development’ and ‘Operations’. It is a philosophy and discipline that strives to be the bridge between Engineering, Quality Assurance, and Operations; ensuring that all activities involved in those processes are seamlessly integrated into a system that fosters agility and high productivity.
In recent times, DevOps Engineers have gained demand, with companies becoming more aware of their relevance. Still, DevOps should be considered as an approach to work and not necessarily a job title. Even though a company might have designated DevOps engineers, the responsibility of DevOps still falls on the entire team.
So what are the activities involved in DevOps? Here’s a short list:
- Continuous Integration
- Continuous Testing
- Continuous Delivery or Deployment
- Continuous Monitoring and Feedback
The keyword here is Continuous — implying that processes are consistent and ongoing. What this means is that when the developers write code and commit to the repository, a well-defined sequence of events is ALWAYS executed to ensure the code is well tested before it is shipped to production. Also, the live environment is constantly monitored for activity and the development team is alerted when there is a mishap.
Continuous Integration has gained massive adoption among technology companies. The reason is that CI helps to improve developer productivity. By ensuring that code is merged frequently and automated testing is done on merged code, a functional CI process will allow only working versions of the code to progress further towards live deployment.
On the Topic of Testing
“Even today, 80 percent of enterprise testing is done manually. This is crazy. We’re getting ready with autonomous cars on the one hand, but, on the other hand, we’re manually testing the software that’s so fundamental to every enterprise. If you move to Agile development but your testing cycle is still 6 to 12 weeks due to manual testing, you’ll fall right back into a Waterfall model.”
Sandeep Johri, Tricentis CEO
In an Agile environment, it is highly imperative that developers receive quick feedback as they make changes to the code base. Hence one cannot rely on Manual Testing because it can be dreadfully slow. All testing must be automated.
The Problem with Manual testing
Testing typically involves simulating scenarios that can occur in the live environment. A single test case can be incredibly intricate; sometimes requiring the QA staff to tear down a running service, run a SQL script on the database, fire multiple API calls to a remote endpoint, etc. Bear in mind that each action being carried out is prone to human error.
Without automated testing, every time you wish to go live with new features or bug fixes, your QA must run through testing all the features on the application using a predefined test script.
What happens if QA catches a bug? The release is sent back to the devs to fix the reported issue. The devs will need to deploy a new build on the Staging server. QA has to repeat testing all features from scratch. Oh, there’s another bug…
Such back and forth is extremely slow and grossly inefficient.
When you introduce Automated Testing into your development pipeline, you have scripts that can do the work of a manual tester and return your test results in minutes. The earlier you catch bugs or defects, the cheaper they are to fix!
Companies that practice Continuous Deployment rely on Quality Assurance Engineers — programmers capable of writing code to test other code. Due to the complexity of full test automation on enterprise-level software, the work of these QA engineers should be properly coordinated to address live scenarios.
Don’t forget to Monitor
With today’s systems being very business-critical, requirements like low latency, high availability, and instant processing of user requests are very commonplace. Continuous Monitoring is very essential to DevOps because it facilitates the steady observation of user experience and infrastructure stability.
How many times has your server gone down in the last month or year? What’s your average response time? What can you say about your Network’s latency? What are the peak periods of user activity? If you cannot answer these questions, then you are not practicing Continuous Monitoring.
There are several tools on the market that assist with Application Performance Management.
DevOps done correctly
- Setup CI before you start writing code
- Consider using the Git-Flow approach to managing git branches.
- Protect the Master branch. Developers should be incapable of arbitrarily merging code to Master.
- Conduct Peer Reviews on Merge requests
- Minimize access to the CI tool. Only about 2 or 3 Senior developers should be tweaking your CI pipeline.
- Run Automated testing after every code merge.
- Run rigorous Testing in near-live environment with near-live scenarios.
- Dispatch notifications when there is a failed test.
- Stop what you’re doing and fix a broken build or failed test.
- Each live deployment must be tagged appropriately.
- Containerize your applications so deployments can be much faster.
- Deploy in clusters for Redundancy and load balance for High Availability.
- Monitor everything: Requests / Responses per minute, Network Latency, CPU usage, Database query speed, API errors, Server downtimes, basically everything that can be monitored.
- Scale your resources Horizontally or Vertically as needed
- Learn from your mistakes
DevOps gained popularity out of a need to solve some of the pressing problems in Software development such as: lowering the failure rate of new releases, achieving faster time to market, managing unplanned work, to list a few.
DevOps is more than just a job title. It is a set of practices, a philosophy, a culture, an approach to work. For any technology company that seeks to operate at an optimal level, it is impossible to escape this philosophy. Unless of course, you do not care about productivity, quality, and maintenance.
Failure to establish clearly defined processes from development to go-live will always result in haphazard work culture. In my years of experience building systems, I have learned that doing the right thing always results in fewer headaches and better sleep at night.