Writing
A maturity model people didn't roll their eyes at
Apr 22, 2026
“Software maturity model.” That’s a phrase that makes good engineers reach for the exit, and honestly, they’ve earned the reflex. They’ve seen this movie. A spreadsheet of virtues handed down from somewhere above, scored once, filed, and never opened again. So the interesting question isn’t how to write one. It’s how you get from that to a version people actually ask to be measured against. The difference between the model that worked and the usual one that dies quietly is worth writing down.
Define maturity as something you can measure
The first trap is defining maturity as a pile of best practices, because then it’s a matter of taste and everybody argues taste forever. We defined it as a single question instead. How long does it take, on average, to get a feature from an idea to safe production? That maps cleanly onto the DORA Four Key Metrics (deployment frequency, lead time, change-failure rate, and time to restore), and it reframes maturity as something a team can actually feel, velocity with safety, rather than a compliance checklist to survive.
From there we defined six discrete levels, from initial proof-of-concept up through full automation, with concrete requirements at each rung; repositories and PR approvals, then real tests and monitoring, then staging and canary, then proactive prevention, and on up. The levels had to mean something to an engineer and to a non-technical stakeholder in the same breath, and the requirements had to be broad enough to land across wildly different stacks and team sizes. Specific enough to be real, general enough to be fair. That balance was most of the design.
Don’t make everyone aim for the top
The second trap is demanding every project reach the highest level. That’s how a useful tool turns into a tax. In the real world a low-traffic internal tool and a customer-facing system carrying live load do not deserve the same investment in maturity, and pretending they do just burns goodwill.
So we set a target level per project, based on business criticality, exposure, and where it sat on the roadmap. The gap between a project’s current level and its target is the whole signal; it’s what tells you where to spend. A scrappy internal service sitting at a modest level might already be exactly where it should be. A critical system below its target is where the attention goes. That one move, targets tuned to risk instead of a universal top score, is what made the model feel like help instead of judgment.
Run a real review, not a one-time audit
The third trap is scoring everything once and walking away. So we stood up a recurring review, and here’s the part that mattered. The panel was the same team leads whose projects were being graded. Teams presented their work, the panel assigned both the current and the target level, and, more importantly, pointed to other teams who had already solved the same gap. That last bit is the quiet superpower. The model turned into a way for teams to learn from each other instead of each one rediscovering the same lesson alone in the dark.
That’s also why nobody rolled their eyes at it…nobody rolls their eyes at a standard they wrote themselves.
The lesson
A maturity model isn’t a document, it’s a habit. Tie it to a metric people already believe in, set targets by risk so it’s proportional instead of punitive, and run a recurring review that moves solutions between teams. Do that, and the model finally answers a question engineers actually have, instead of one nobody asked. Where do we spend our limited time to ship faster without breaking things?