My definition of DevOps is:
DevOps is achieved when the processes for managing the dependencies between code and infrastructure are natural and automated.
You can see that I’ve defined the word DevOps to be an achievable state, and not a person or adjective.
Since it’s a short definition, I’ll highlight two points:
Natural means there is an expected interaction between code and the infrastructure beneath it that is planned for in the software development lifecycle.
If a new release of the software has a dependency that must be installed via a system package at the OS level, that should be easily accommodated.
A developer shouldn’t be chasing down a sys admin after a QA deployment fails because the package wasn’t installed on that environment. Whether it’s push-based by the developer, or pull-based with the sys admin asking for requirements, it needs to be a normal, scheduled step in the software development lifecycle.
The interaction between code and it’s underlying infrastructure must be automated or else it is not reproducible.
In the example above, once the developer has communicated the system dependency to a DevOps engineer, the developer should never have to worry about that dependency not being met in any environment.