DevOps is one of those Buzz words present on the Tech scene for some time. Funny enough during all this time the meaning of it varies a lot, depending on its usage, who is using it, and in which context.
People described whole organisations as DevOps organisations. People described teams as DevOps teams and at the same time, people described certain roles of some people as DevOps engineers.
By the look of it, DevOps means everything and nothing. But don't worry there is some order in all of this.
In most cases when people point out that their org is a DevOps organisation, either they have no clue what they are talking about and just want to make their organisation sound and look modern, or it means that they embraced good "DevOps" practices of having CI/CD tools in place and either DevOps teams or people with the role of DevOps in their org.
In its pure form, DevOps teams should mean that all team members are equally capable in knowledge and access rights to develop code, but also take care of other infra/cloud/network/etc needed stuff for development and running in production.
In most cases, it means that there are people in the team who have DevOps roles who are responsible for all nonpure development stuff. In old days, these people were called system administrators or Ops (short for operations) or Run engineers. Usage of name DevOps engineers is used to highlight that they do all their work through automation and code of some sort (Infra as Code for example) compared to old school admins/sys ops/etc
Let us look at why is there even the need to have something called DevOps in the first place.
First, we need to take a look at the team working on developing a new or existing application that is solving some business need, or adding value. For the team to deliver the end product and value they need to satisfy two parts
Application Development is done by engineers (backend, frontend, mobile UX/Ui), team structure varies from org to org and depends on what type of application the team delivers. These engineers usually are following engineering practices and develop code in programming languages.
Runtime needs are all the things that are needed for code that engineers wrote to start working in a real production environment and also to be transferred there. Here a lot of tools and other systems come in place, like a version control system for code, a ticket system for development, CI/CD tools and pipelines, and different environments (Test, Acceptance, and Production) which are in the Cloud or Data Center, etc.
What is the same for all organisations and teams, is that whole Runtime needs (stuff) can be easily split into two parts
The common part is reusable across the whole organisation. Here we find things like a version control system, ticketing system, basic setup of CI/CD tools and pipelines, setup around artifactory and all other common stuff like static code analysis and quality gates, and other stuff that are the same for all workloads.
Workload-specific stuff consists of utilizing common components and enriching them with specific configurations used in that particular workload. It consists also additionally, of any runtime or infra or similar stuff that is unique for that workload and there is no possibility at the moment for it to be reused. Here comes also any type of environment variables and similar things.
For any team to be able to deliver the end product, work needs to happen in all of these three boxes
In an ideal world and setup, we would love to have team members being able to do the work in all three boxes. Since in this way anyone would be able to pick up any work, and this would allow to focus resources depending on the need at that point in time.
In reality, a good part of engineers is not able to pick up work in all three boxes and execute it to high standards. What I see over and over again, in different companies and with different engineers, is that most people are good with doing work in one of those boxes, while not being proficient in the other. This is also one of the reasons why for years there was a split between Software engineers doing the work in Box 1 (Dev) and Runtime/System Administrators doing the work in Boxes 2 and 3 (Ops).
The original idea behind DevOps is to break the wall between Dev (Box 1) and Ops (Box 2 and 3) and optimise work more efficiently. In pure form, it would mean anyone picking any type of work, and if engineers in an organisation are on the level that they can pick work in all boxes, things will move extremely fast and with good quality.
The question remains how to approach this problem in the case when not all of the engineers in the organisation are Rock Stars, and in most cases, they will not be.
What I see over and over again is that usually, companies approach this problem in one of two ways
Create a Center of Excellence (COE) for Common Runtime needs. This can be either a team or a department consisting of multiple teams, depending on the size of org. Here all common needs are taken care of, templates are being built and anything that can and should be reused across the whole organization is engineered here.
Organize Application Development teams as DevOps teams. Roles present in the team, are depending on the type of work that that team is doing. There can be one or multiple Backend, Frontend, Mobile, UX/UI and other engineers in the team. In teams, there are also DevOps Engineers (or Ops engineers, role names vary from company to company), whose task is to do the work on Workload Specific Runtime needs.
One of the things that can easily happen is that there isn't enough work for a DevOps person in one team, in which case DevOps engineer would split their time between multiple teams. In my experience working in more than two teams is usually very difficult and contra-productive.
Additionally, there is an expectation that in case something that was developed in one specific team to solve their need, evolves and grows into something that is needed in other teams also, would move from the Application Development team into CoE for Runtime Common Needs. This would allow good reuse of solutions across the organisation.
For this to be true proper collaboration model should be put in place between the CoE of Runtime Common and the DevOps part of the organisation
Similar to Option 1 create a Center of Excellence for Common Runtime needs across the organisation.
In the case of Option 2 CoE of Runtime would also fulfil needs of Workload-specific needs of Application Teams. In this case, Application teams would again consist of different roles needed to deliver the end product, however, they would not have a dedicated DevOps engineer. For all needs around workload-specific runtime, they need to contact CoE for Runtime for execution.
One common mistake that I see over and over again is that CoE for Runtime Needs is positioned in part of the organisation and under people who don't understand Engineering needs or what is needed to deliver modern software. To give you an example classic Stereotype would be an old-school Network or Administrator type of manager and mentality.
In both Option 1 and Option 2, CoE Runtime Needs need to be the foundation on which all Application teams are going to build and enrich the experience. If the person responsible for CoE doesn't understand the task at hand or their customers, then it is destined to fail, to lead to frustrations and reorgs that will aim to solve the problem that shouldn't be even present in the first place.
In any job, for the team to be successful, the correct people need to be in the right positions, and they need to be provided with the right tools and access rights to do a good job. CoE for Runtime need to be positioned under the person who has the right engineering and Application Development mindset, knowledge and experience, otherwise, it will be a sub-par solution.
Unfortunately, a large number of companies make this mistake, and position CoE for Runtime under Old School Infra and Operations which still look at the world through the lens of the 1960s. DevOps came to the tech scene exactly due to this problem, and because a lot of people are doing the same old stuff and using a different name is a big part of why there is a big confusion about what DevOps is and how it should be