This article is for non DevOps Engineers who want to become DevOps Engineers.
First of all, what is a DevOps Engineer?
There is an argument for not having DevOps Engineer as a role but more of a culture or practice that every one within a software development team should do. This is quite true and i certainly can not go against that argument.
As a Software Engineer myself, i have embraced DevOps over the last few years and definitely know one thing or two about what it takes to become a DevOps Engineer. Sometimes, i am in favour of not becoming a role specific DevOps Engineer. However, the industry and job market sort of dictates what my job title will be.
Without further a do, let me briefly explain what a DevOps Engineer is.
A DevOps Engineer is practically an engineer who practices DevOps philosophy. DevOps is mainly all about shortening the full software development lifecycle (SDLC) and therefore minimizing the time it takes to delivery that software. Thus, being a DevOps Engineer, you are primarily responsible for developing tools that aid rapid application development, creating build pipelines so that software gets released faster and more efficient.
This article is specifically designed for those people who are coming from a non DevOps Engineering background and wants to step into the world of ‘DevOps’. Those people could mainly be engineers from other software development disciplines. For example, Software Developers, QA/Testers, or any other Engineers who wants to do ‘DevOps’.
This article’s purpose is to help those people get into the world of DevOps. I will explain in this article what you are required and expected to know if you want to start become a DevOps Engineer one day.
Building CI/CD Pipelines
It is without much doubt that creating CI/CD pipelines is one of the primarily things a DevOps Engineer does on a day to day basis.
Know how to use CI/CD tools
Before you know how to build CI/CD pipelines, you need to know what CI/CD tools are available.
You need to know the CI/CD market. Know what tools are available out there and what tools are good for the job. Don’t forget that tooling is one of the many features of ‘DevOps’.
There are just so many CI/CD tools out there in the market right now. The most popular of all is perhaps Jenkins and i am sure you have heard of Jenkins before at some point.
Other used CI/CD tools include GitLab Pipelines, BitBucket Pipelines, GitHub Actions, CircleCI, TravisCI, Semaphore, GoCD, Azure DevOps, AWS CodeSuite plus many more.
Help Bridge the Gap
One must not forget that being a DevOps Engineer is all about embracing DevOps and i am sure we all know by now that DevOps as a principle is all about bridging the ‘gap’ between Development (Dev) and Operations (Ops).
Writing Application Code
So this might mean one day you are expected to help or assist with the development of application code. As a DevOps Engineer, you have to be super comfortable with writing code. You should expect to know ideally in-depth of one programming language and a broad knowledge of many others. The more programming languages you know, the better it is for you.
Put simply, you are expected to know how to take on the role of a normal Software Developer. That means knowing how to write code is probably not enough. To set you apart from the rest, you will probably required to put in extra effort to learn some software development best practices to make yourself standout!
Some software development best practices and principles but not limited to:
- Test Driven Development (TDD)
- SOLID principles
- GRASP principles
- Keeping your code DRY over WET
- Writing good quality ‘clean’ code
So how do you get better at this area then?
- Read technical books
- Read online blogs/articles/wikis
- Doing Code Kata. (practice your coding — practice makes perfect) 👌
- Do some personal coding projects
- Participate in online coding challenges
- Test yourself using online coding platforms
Assisting Operation Work
Since DevOps is basically a combination of ‘Dev’ and ‘Ops’, as well as knowing how to do the coding which is the programming side of things, you are expected to know how to do the ‘Ops’ tasks too.
Ops tasks can be anything operations related whether it is general Sys Admin tasks like Linux Server Administration or the creation and the general configuration of logging and monitoring systems.
For instance, you are expected to know how to set up a complete logging and monitoring solution from scratch for your application.
In addition, basic knowledge of how server works, how machine works, the networking, the underlying infrastructure etc are also expected of you.
Programming Languages DevOps Engineer needs to know
Here i present a few programming languages that i feel it would be nice for a DevOps Engineer to know.
Python is commonly used within the DevOps community as a ‘tool’ for automating common linux server admin tasks purely because Python as a language is very descriptive so it is very easy for a non developer to pick up plus Python interacts well with many Linux Server OS core libraries.
Another programming language that is very popular within DevOps is GoLang (or more popularly known as just ‘Go’ nowadays).
Go is also popular because it is a very low level ‘C’ like programming language that works really well with servers and is also very good at building CLI tools.
Many CLI tools used by DevOps Engineer are actually built by Go:
- Terraform CLI
- + many other Hashicorp’s Tools
- Kubernetes CLI (kubectl)
- AWS CLI (aws-cli)
- … plus many more
Don’t think testing is only restricted to QA/Testers. Far from it. Even a normal Software Developer needs to get involved in testing. Think unit testing, integration testing, end 2 end testing etc.
So as a DevOps Engineer, you need to get involved in testing. At the end of the day, testing is a central part within the full Software Development Lifecycle (SDLC). And as part of your DevOps responsibility, you need to oversee it.
You can’t really hide away from Testing. Testing is everywhere. Even as a DevOps Engineer doing just configuration type work, you need to test your changes are correct and are working as expected. That is testing too.
So what can you do to get into the testing area?
You can work alongside QA/Testers. You can shadow them when they do their tests. You can help them do their tests. You “pair-test” with them. You can just do ‘exploratory testing’ yourself and see for yourself. See if you can spot any abnormal-lies.
Just like development, there are many resources you can do to improve and continue up skilling on testing field.
Read books, read blogs, read articles.
Automation is a key thing in DevOps. Since DevOps is all about shortening the SDLC, you can bet that a lot of the manual tasks would be automated in some form or another.
Having an eye for Automation is important to succeed as a DevOps Engineer. You need to develop an ability to automate things.
Any manual tasks would be the first candidates for automation.
Generally, a lot of the things within software can be automated. For example, the creation or provisioning of your application’s underlying infrastructure can be easily automated with the use of Infrastructure as Code (IAC) tools such as Terraform, CloudFormation, Pulumi, AWS CDK, plus some more.
The development of CI/CD pipelines is indeed also classified as automation since you are trying to automate the delivery of software through a software development pipeline.
Testing can be automated too. This is more commonly known in the industry as Automated Testing or Test Automation. This is practically a field on its own as normally QA/Testers generally move into this field. However, as a DevOps Engineer, there shouldn’t be anything stopping you from getting involved as i mentioned before, as a DevOps Engineer you really need to be comfortable with all areas within Software Development/Engineering.
Other areas for automation can be just generally automating any general IT tasks or any other tasks that can take very long to finish. For example, within Ops, IT Administrators/Operators commonly automate a lot of their mundane Linux Server Administration tasks rather than executing a series of Unix commands manually which can be really prone to errors. Ansible is a popular tool to achieve this.
Think Systems — Understand Software Engineering
As a DevOps Engineer, you are required to know how to not just create a software system, but also how to manage and maintain that software system you built.
So, you also need to have a good grasp of Systems Design. This topic is very broad and it covers numerous software engineering topics.
Here is an extensive list of the common topics that i think you need to know if you want to become a ‘DevOps’:
- Containers (Docker) and Container Orchestration (Kubernetes)
- Software Architecture (Microservices, SOA etc…)
- Scaling (horizontal vs vertical)
- Timeouts & Retries
- Software Engineering Patterns (Circuit Breaker/Fallback, Back Pressure, Rate Limiting, Bulkhead etc…)
- REST principles & API Design
- Web Development (HTTP/S, How Google works)
- Databases/Data Storages/Data Structures
- ACID vs BASE (Strong Consistency vs Eventual Consistency)
- Messaging Solutions (Queues vs Topics/ Pub-Sub)
- Service Communications (Service Discovery)
- Cloud Native concepts/ 12-Factor App Principles
- Cloud Engineering
- Caching Patterns
- Deployment/Release Strategies
- Fault-Tolerance/High Availability (HA) Patterns such as: Master-Slave, Primary-Standby/Secondary, Clustering, Leader Election, Replication etc
- Distributed Tracing
- Chaos Engineering
The thrive for #DevSecOps
Nowadays, it is even more trendier to call yourself “DevSecOps”.
DevSecOps is basically DevOps with Security added in. It basically means you are expected to know at least some basic Security concepts and principles.
Look no further than Authentication, Authorization etc to start off with.
Other security concepts you might be interested in is think how you can embed security testing into your CI/CD pipelines.
How can you catch security vulnerabilities in your application code early on? Perhaps you can use a Security Vulnerability Code Analysis tool like Fortify. Or maybe use CheckMarx?
What about web security?
Think HTTPS/ TLS/SSL instead of HTTP.
Considerations for Cross Site Request Forgery (CSRF) and Cross Site Scripting (XSS).
Traditional web security exploitations like SQL Injection?
Common DevOps Tools
Although DevOps shouldn’t be all about the tools and technologies but more so for the culture and practices associated with SDLC, it is not uncommon for tools to be linked closely or even tightly associated with the idea of DevOps.
Many people called them ‘DevOps tools’ or tools and technologies they feel a ‘DevOps Engineer’ must know.
You’ve already seen some of the following tools as i already briefly mentioned in above sections:
- Jenkins (& other CI/CD tools)
- Linux/Unix Skills…
Other misc stuff (that doesn’t fit into any categories)
There a few other things that you also need to know:
- Usage of a VCS (like Git)
- Branching Models (GitFlow, GitHub Flow, GitLab Flow)
- Release Cadences
- Version Strategies (Semantic Versioning vs. Commit Hash)
- Merge Patterns (Git Merge, Git Squash and Rebase)
- Trunk Based Development
- Feature Branches
- Feature Toggles
The above list is not exhaustive but do check out those topics i listed above and any other similar you find linked to above.
So if you are currently not a DevOps Engineer and you really want to become a DevOps Engineer one day then you really need to start do the following:
- Learn and Practice building CI/CD Pipelines
- Start to become comfortable with configurations
- Learn programming
- Key Programming Languages to know
- Understand Testing Concepts
- Practical experience of Operations tasks
- Get used to automating things (IAC, Test Automation, General Automation etc)
- Understand how Software Systems are built from the ground up and end to end
- Get to know the common ‘DevOps Tools’
- Take an active interest on Security for #DevSecOps
- Other misc stuff
One of the things you might have noticed by now is that to become a DevOps Engineer, you need to become a very versatile generalist engineer with a very broad technical knowledge.
That is a true observation as a DevOps Engineer is exactly that. You need to be skilled in practically everything that is software engineering related.
You also need to have the ability to be a very quick learner and also have the appetite for learning new things. Your challenge is to constantly stay up to date with the advancements within the industry.
You are pretty much a Jack of all Trades / Master of None.