What is DevOps

This is a question I get asked regularly. It always leads to an interesting discussion, because it is not a rigorously defined term. What prompted this post is an answer that I posted on LinkedIn to for that exact question: I realized I should gather some thoughts on the topic here.
DevOps is primarily about bringing Operations and Development closer to accelerate delivery and deployment of computer applications. This is achieved by:
  1. 1.
    coding configuration of infrastructure, and of delivery and deployment processes;
  2. 2.
    using a common set of tools in Ops and Dev;
  3. 3.
    using runtime environments in Dev that are representative of those in Ops;
  4. 4.
    aiming for immutability, idempotency, repeatability, and replicability of infrastructure and runtime environments.
Some devops enthusiasts add to the above that DevOps must be achieved via one team that does both Dev and Ops. I don't agree that it is a must: for one thing, I have only seen this work in small, early stage development projects. Mostly because DevOps tends to make use of a rather large set of specialized tools, certainly more as the system gets larger, and at some point it becomes impossible for everyone on a team to stay comfortable with all the aspects I mentioned above. Inevitably, some specialization and focus occurs for each member of the team.
What is critical is that the devops team communicate with -- and work closely with -- all the dev teams, and enable them as much as possible to manage their own development environments, and to help them make their application deployments as close as feasible to the production deployments.
DevOps is not system and/or network administration or Operations: these roles have a very different focus, namely administration of machines (physical or virtual), networks, and client-facing application, respectively.