DORA Metrics Aren’t KPIs

Engineering Flow — Part 7

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

One of the fastest ways to ruin a useful metric is to turn it into a target.

DORA metrics are especially vulnerable to this.

A team starts measuring deployment frequency. Leadership sees the number and thinks: “More deployments must be better.”

Soon, someone establishes a target: 20 deployments per developer per month.

And just like that, a system metric becomes an individual performance goal.

Now the measurement has stopped helping!

Goodhart’s Law

Goodhart’s law explains what happens next: “When a measure becomes a target, it ceases to be a good measure.”

Imagine telling developers their performance will be judged by deployment frequency.

What behavior would you expect?

Probably more deployments. That’s now the goal, right?

But not necessarily more value.

Developers might split changes unnecessarily. They might optimize for what counts as a deployment. They may avoid work that takes longer but matters more.

The metric improves.

The system might not.

That’s the danger.

DORA Metrics Are Signals

Deployment Frequency
Lead Time for Changes
Change Failure Rate
Failed Deployment Recovery Time

These metrics are signals about the health of our delivery system.

They help us ask better questions:

Why does it take us three weeks to get a change into production?
Why are deployments large and infrequent?
Why do failures take hours to recover from?
Where are changes waiting?

Those questions help us find where the system needs to improve.

“Why didn’t this developer deploy 20 times?” doesn’t.

Leading vs. Lagging Indicators

DORA metrics are also largely lagging indicators.

They tell us what happened as a result of how our engineering system operates.

If lead time improves, something upstream probably changed.

Maybe changes got smaller.
Maybe test automation improved.
Maybe environments became self-service.
Maybe a dependency or approval disappeared.

Those change are closer to leading indicators.

DORA metric help us see whether those changes are actually improving the system.

That distinction matters.

You don’t improve lead time by demanding a better lead-time number.

You improve the system that creates it.

Measure Systems, Not People

DORA metrics should help us understand teams, platforms, pipelines, processes, and organizational constraints.

They should not become developer scorecards.

Not: “Developers must deploy 20 times per month.”

Instead: “We’re measuring deployment frequency to understand whether our delivery system is improving.”

One creates pressure to produce a number.

The other creates an opportunity to learn.

If deployment frequency drops, don’t immediately ask: “Who is underperforming?”

Ask: “What changed in the system?”

Did a new approval step appear?

Are builds taking longer?

Has test reliability deteriorated?

Are teams waiting on another team?

Did batch sizes increase?

The metric should start the investigation, not end it.

Metrics Should Create Conversations

High-performing engineering organizations don’t use DORA metrics to rank developers. They use them to expose friction.

A worsening metric isn’t automatically a failure. It’s a signal that something changed in the system, and we need to understand why.

That creates a different engineering culture. Instead of hiding problems because a dashboard might turn red, teams surface them as opportunities to improve the system.

The metric isn’t the goal. It’s the signal that tells us where to start looking.

The Takeaway

DORA metrics aren’t quotas.
DORA metrics aren’t developer productivity scores.
DORA metrics aren’t numbers we should optimize in isolation.

They are signals about the delivery system.

Use them to identify constraints.
Use them to ask better questions.
Use them to gauge whether changes are improving the system.

But don’t turn them into individual targets.

Once engineers start optimizing for the metric instead of the outcome, the metric has stopped doing its job.

DORA measures systems, not people.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs (Current Article)
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Stop Measuring Output. Start Measuring Flow.

Engineering Flow — Part 6

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

In Part 5, we looked at one of the biggest hidden problems in software delivery: most lead time isn’t engineering work. It’s waiting.

That raises an important question.

If we want to improve the flow of software delivery, how do we know whether we’re actually getting better?

Engineering organizations certainly aren’t short on metrics.

Story points. Velocity. Tickets closed. Sprint commitments. Utilization.

We measure a lot.

But many of these metrics tell us how busy individual teams are—not how effectively the engineering system delivers value.

A development team can increase its velocity while lead time gets worse. Infrastructure can maintain 95% utilization while requests spend days waiting. QA can hit every SLA while releases still take weeks to reach production.

Every team’s dashboard can be green while the delivery system is red.

What we measure shapes what we optimize.

Story Points Aren’t a Business Outcome

Story points have a legitimate purpose.

Within a team, they can help estimate relative complexity, plan work, and understand how much work the team can reasonably take on. Velocity can help that same team understand its historical capacity.

The problem begins when these planning tools become measures of engineering performance.

A team completed 60 story points this sprint.

Is that good?

Story points aren’t standardized units. Five points on one team may have little relationship to five points on another. More importantly, the number tells us nothing about whether the work reached production, improved the customer experience, or created business value.

Once leaders set velocity targets, teams also begin optimizing the metric. The number can increase without anything about the delivery system actually improving.

Story points can help teams plan work. They shouldn’t be confused with measuring value.

Utilization Tells Us Who Is Busy

The same problem exists with utilization.

As we saw in Part 5, maximizing utilization can actually make delivery slower by creating queues.

If engineers are 95% utilized, that sounds efficient. But a highly utilized team can still have a growing backlog and increasingly long lead times.

Some available capacity allows teams to review work quickly, respond to incidents, absorb unexpected demand, or help remove constraints elsewhere in the system.

The question isn’t: How busy is everyone?

It’s: How effectively is work moving?

That requires different metrics.

Measure the Delivery System

One of the most useful ways to measure this comes from DORA (DevOps Research and Assessment) and its software delivery performance metrics.

Rather than measuring how much activity engineering produces, DORA metrics help us understand how effectively software changes move through the delivery system.

Four measures are especially useful:

Deployment Frequency — How often can we successfully deploy changes to production?

Lead Time for Changes — How long does it take a change to move from committed code to running in production?

Change Failure Rate — What percentage of production changes result in degraded service and require remediation?

Mean Time to Restore (MTTR) — When something goes wrong, how quickly can we restore service?

Notice what these metrics don’t measure.

They don’t ask how many story points developers completed, whether everyone was fully utilized, or how many tickets operations closed.

They measure the behavior of the delivery system.

Together, they also balance two things engineering organizations sometimes treat as opposites:

Speed and stability.

Deployment frequency and lead time tell us how quickly changes can move. Change failure rate and recovery time tell us whether we can move them safely.

The objective isn’t simply to deploy faster.

It’s to build a system capable of delivering changes quickly, safely, and repeatedly.

Lead Time Exposes What Team Metrics Hide

Lead time is particularly powerful because it crosses organizational boundaries.

Imagine a change requires four hours of development, one hour of testing, 30 minutes of security review, and 15 minutes to deploy.

Measured individually, every team might look efficient.

But if the change takes nine days to reach production, something is missing from those measurements.

The elapsed time exposes it.

This is exactly the problem we explored in Part 5.

The work isn’t necessarily slow. The system is.

Lead time forces us to look at the entire journey instead of celebrating the efficiency of individual steps.

Once we measure that journey, we can ask better questions.

Where is work waiting? Where does it repeatedly get blocked? Where are batches forming? Where are handoffs adding delay?

Those questions take us beyond DORA and into broader flow metrics.

Flow Metrics Help Explain Why

DORA metrics tell us a great deal about software delivery performance.

Flow metrics help explain what’s happening inside the system.

How much work is currently in progress?

How long does work remain active before completion?

How much work is completed over time?

How much time is spent working compared with waiting?

Consider two teams that each complete 20 items this month.

On an output dashboard, they look identical.

But Team A typically moves work from start to finish in three days while Team B takes three weeks.

That’s a very different delivery system.

Or perhaps Team B has 75 items simultaneously in progress while Team A has 15.

The problem may not be how quickly people are working. There may simply be too much work moving through the system at once.

Measuring flow helps us see the system instead of just its individual parts.

Be Careful What You Turn Into a Target

There’s another danger with engineering metrics.

The moment a measure becomes a target, behavior begins changing around it.

Measure developers by lines of code and you’ll get more code. Measure teams by tickets closed and you’ll get more closed tickets. Measure velocity and story points tend to increase.

That doesn’t mean measurement is bad.

It means metrics need context.

Even DORA metrics shouldn’t become another scoreboard used to rank teams. The value comes from establishing a baseline, identifying constraints, and seeing whether changes actually improve delivery.

Metrics should create conversations.

They shouldn’t replace them.

Optimize the System, Not the Scorecard

This brings us back to one of the central ideas behind Engineering Flow.

Local optimization does not guarantee system optimization.

Development can increase velocity. QA can increase throughput. Infrastructure can increase utilization. Operations can close more tickets.

Every individual metric can improve while customer lead time remains unchanged.

Customers don’t care how many story points were completed, how many tickets changed status, or whether infrastructure reached its utilization target.

They experience how effectively we turn an idea into something valuable.

That’s the system we should measure.

Start with deployment frequency, lead time, change failure rate, and recovery time. Look deeper with flow metrics to understand where work is slowing down. Use team-level metrics like velocity for the purposes they were designed for: helping teams plan—not proving productivity.

Because engineering organizations eventually optimize around the things leaders choose to measure.

Takeaway: You get what you measure. Measure activity, and teams optimize activity. Measure flow, and organizations optimize delivery.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow. (Current Article)
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Every Handoff Is a Queue

Engineering Flow — Part 5

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

In most engineering organizations, the actual work doesn’t take nearly as long as the delivery process suggests.

A developer may need a few hours to make a change. Testing might take another hour. Deploying it could take minutes.

Yet somehow, that change takes two weeks to reach production.

Where did the rest of the time go?

Usually, it was spent waiting.

Waiting for an approval. Waiting for another team to provision an environment. Waiting for a ticket to be assigned. Waiting for a CAB meeting. Waiting for someone to perform a manual deployment.

None of those waits necessarily look significant on their own. Together, they can dominate the lead time of an engineering organization.

Most lead time isn’t engineering work. It’s waiting.

Every Handoff Creates a Queue

Whenever work moves from one person or team to another, it rarely begins immediately.

It waits.

Consider a common delivery process:

Developer → Code Review → QA → Security → Change Approval → Operations → Production

At first glance, that looks like a straightforward serial pipeline. But it’s really seven steps plus the queues between them.

The developer finishes the change, but QA is working on something else. QA finishes testing, but security hasn’t reviewed it yet. Security approves it, but the change has to wait for the next CAB meeting. CAB approves it, but operations has a deployment window Thursday night.

The actual work at each stage may take minutes or hours.

The queues between those stages can take days.

Busy Teams Can Still Create a Slow System

Queueing theory studies what happens when work arrives faster—or less predictably—than a system can process it.

One of its most useful lessons for engineering leaders is simple: as a system approaches full utilization, wait times increase dramatically. In fact, Little’s Law gives us another useful way to see the relationship: as work-in-progress increases relative to throughput, lead time increases with it.

Yet organizations still continue to try to maximize utilization.

We want every engineer busy. Every security analyst busy. Every DBA busy. Every operations engineer busy.

On a spreadsheet, that looks efficient.

In a delivery system, it creates queues.

If the database team is already at capacity when your request arrives, it waits. If security has ten reviews ahead of yours, it waits. If operations has a backlog of deployments, yours joins the queue.

Each team may be highly productive.

The system can still be slow.

Optimizing individual teams for utilization does not necessarily optimize the flow of value.

Tickets Are Often Queues in Disguise

One of the easiest ways to find queues is to look at the ticketing system.

Need a firewall rule? Open a ticket.

Need a database? Open a ticket.

Need an environment? Open a ticket.

Need something deployed? Open a ticket.

The ticket itself isn’t necessarily the problem. Tracking work can be valuable.

The problem is what happens next.

Someone triages it. Someone assigns it. Someone prioritizes it. Eventually, someone performs the work and sends it back.

A task requiring ten minutes of engineering effort can easily spend three days moving through that process.

When this happens hundreds or thousands of times across an organization, the cost isn’t primarily the work.

It’s the waiting.

Governance Doesn’t Have to Mean Waiting

Approvals are another common source of invisible queues.

Many exist for legitimate reasons: security, compliance, stability, separation of duties, or risk management. But organizations often accumulate approvals without continuously asking whether each one still reduces meaningful risk.

CABs are a good example.

A weekly Change Advisory Board creates an automatic queue. Miss Tuesday’s meeting and a change may wait another week—even if the actual review takes five minutes.

The question isn’t whether governance matters. Of course it does.

The better question is:

Can we enforce the same control without making the work wait?

Automated testing, policy as code, security scanning, peer review, deployment controls, and standardized pipelines can often provide stronger controls while dramatically reducing queue time.

Good DevOps doesn’t remove governance.

It engineers governance into the delivery system.

Remove the Handoff, Remove the Queue

The same pattern appears with infrastructure.

An engineer needs an environment and submits a request. The infrastructure work takes 30 minutes.

The environment arrives four days later.

The provisioning time wasn’t really four days. The queue time was three days, 23 hours, and 30 minutes.

This is why platform engineering and self-service matter.

Infrastructure as code, standardized environments, golden paths, automated pipelines, and internal developer platforms aren’t valuable simply because they’re convenient.

They remove handoffs.

And removing a handoff often removes a queue.

The same applies to deployments. If an application team has to schedule an operations engineer to manually deploy its software, the organization has created another queue.

CI/CD changes that flow by allowing teams to safely move changes through standardized, automated pipelines without waiting for another team to perform the next step.

The benefit isn’t simply automation. It’s eliminating waiting from the system.

Measure the Wait

This changes how leaders should think about delivery performance.

When something takes ten days to reach production, don’t just ask why development took ten days.

Ask:

How much of those ten days was someone actually working on it?

You may discover engineering took eight hours. Testing took two. Security review took 30 minutes. Deployment took 15.

Everything else was waiting.

Making the developer 20% faster won’t materially change a ten-day lead time.

Removing a three-day approval queue might.

Automating a two-day provisioning process might.

Eliminating a weekly deployment window might.

The biggest opportunities are often found not by making individual steps faster, but by removing the queues between them.

Optimize for Flow, Not Activity

A development team can hit every sprint commitment. Security can meet every SLA. Infrastructure can maintain high utilization. Operations can execute every scheduled deployment.

Every team can look successful while the end-to-end delivery system remains painfully slow.

Customers don’t experience our organizational boundaries.

They experience how long it takes us to turn an idea into something valuable.

If we want to improve that flow, we have to look beyond how quickly people are working and start looking at how long the work is waiting.

Map the handoffs.

Find the queues.

Then ask which ones actually need to exist.

Because most lead time isn’t engineering work. It’s waiting.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue (Current Article)
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

CI/CD Isn’t About Automation. It’s About Reducing Risk.

Engineering Flow — Part 4

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

When organizations talk about CI/CD, the conversation usually starts with automation. Automated builds, automated testing, deployment pipelines, infrastructure as code, and increasingly sophisticated tooling all become part of the discussion. Eventually, we start measuring CI/CD maturity by how much of the delivery process we’ve automated.

Automation matters, but it isn’t really the point.

The real value of Continuous Integration and Continuous Delivery is reducing the risk associated with changing software. They help us make changes smaller, integrate them earlier, test them consistently, deploy them predictably, and recover quickly when something goes wrong.

When we reduce the risk of each change, teams naturally become more comfortable making changes more frequently. Faster delivery becomes an outcome of a safer delivery system rather than the goal itself.

Big Changes Create Big Risk

Consider a team that releases software once every three months. During that time, hundreds of changes accumulate. Features are added, dependencies change, database schemas evolve, configuration changes, and defects are fixed. Eventually, all of those changes have to move to production together.

Because the release carries so much change, we naturally build more controls around it. Teams coordinate schedules, testing cycles expand, change tickets are created, approvals multiply, engineers prepare rollback plans, and everyone watches production closely after the release.

None of those controls are necessarily unreasonable. They are responses to the amount of risk concentrated into a single deployment.

But organizations often try to solve that risk by adding even more controls: more testing, more approvals, and more coordination.

Continuous Delivery approaches the problem differently. Instead of asking how we can put more controls around a large change, it asks how we can make the change smaller.

Small Batches Change the Equation

Small batches are one of the most important ideas behind Continuous Delivery.

Instead of allowing weeks or months of changes to accumulate, teams integrate and deliver changes continuously. A deployment might contain a single feature, a small bug fix, or a handful of related changes rather than hundreds of unrelated modifications.

Smaller changes are easier to understand, test, and troubleshoot. If a deployment causes a problem, there are fewer potential causes to investigate. Engineers don’t have to search through months of accumulated changes to figure out what went wrong. They can start with the last small change that was deployed.

This is also why deployment frequency and production stability aren’t necessarily in conflict. Deploying more frequently can actually reduce risk when increased frequency means smaller batches.

The dangerous part isn’t necessarily how often we change production. It’s how much uncertainty we introduce each time we do.

Continuous Integration Shortens the Feedback Loop

Continuous Integration is sometimes reduced to having a build pipeline that runs when code is committed. But the pipeline itself isn’t the important part. The value comes from shortening the time between making a change and learning whether it works with everything around it.

When developers integrate frequently, automated builds and tests can identify problems while changes are still fresh. Integration conflicts, failing tests, security issues, and unexpected interactions can surface within minutes rather than days or weeks.

That timing matters because problems become harder and more expensive to resolve as they move through the delivery system. A conflict discovered while a developer is actively working on a change may take minutes to correct. The same problem discovered weeks later during a major release may require multiple teams to determine what changed and how to safely resolve it.

Continuous Integration moves that feedback earlier, when problems are generally smaller and easier to fix.

Continuous Delivery Builds Confidence

Continuous Delivery extends that principle beyond integration. The goal is to keep software in a state where it can be safely released whenever the organization chooses.

That requires more than a deployment script. Teams need confidence that automated tests will catch common failures, environments are consistent, deployments are repeatable, monitoring will identify unexpected behavior, and recovery mechanisms will work when something goes wrong.

This is where automation becomes extremely valuable. Automation doesn’t just eliminate manual work; it reduces variation.

A repeatable deployment process removes much of the uncertainty from releasing software. When the same process is used successfully over and over, deployments become predictable, teams build confidence, and releases stop feeling like high-risk events.

Repeatability creates confidence, and confidence changes behavior.

Failure Should Be Recoverable

No amount of testing can guarantee that every change will behave perfectly in production. Something will eventually fail. Trying to prevent every possible failure before deployment often creates enormous amounts of process without actually eliminating the risk.

A better delivery system assumes failures will occasionally happen and makes them easier to recover from.

That may mean automated rollback, roll-forward strategies, feature flags, or progressive delivery. Strong observability is equally important because recovery only works if teams can quickly recognize that something has gone wrong.

The objective isn’t a world where deployments never fail. It’s a world where a failed deployment doesn’t automatically become a prolonged production incident.

If a small change can be deployed, observed, and quickly reversed when necessary, the organization no longer needs to treat every deployment as an irreversible event.

Stability and Speed Aren’t Opposites

Many organizations still approach software delivery as if speed and stability exist on opposite ends of a spectrum. If we want to move faster, we have to accept more risk. If we want production to remain stable, we have to slow down.

That makes sense if moving faster means pushing larger changes through the same risky process more quickly. But that isn’t what Continuous Delivery is trying to accomplish.

Small batches reduce the impact of individual changes. Continuous Integration identifies problems earlier. Automated testing provides faster and more consistent feedback. Repeatable pipelines reduce human variation. Observability identifies problems quickly, while rollback and recovery mechanisms limit their impact.

Together, these practices allow teams to increase delivery frequency because each individual change becomes less risky.

The speed comes from confidence.

Don’t Optimize for Deployment Speed

It’s entirely possible to automate a bad delivery process.

We can build sophisticated pipelines around large batches, complicated dependencies, long approval chains, and risky releases. The process may technically be automated, but we haven’t necessarily improved the flow of software through the organization.

The better question isn’t, “How can we deploy faster?”

It’s, “How can we make each change safer?”

Reduce the size of the change. Shorten the feedback loop. Automate the tests that provide meaningful confidence. Make deployments repeatable. Detect problems quickly. Make recovery routine.

When organizations consistently reduce the risk associated with change, teams stop being afraid to deploy. Deployments become routine rather than major events. Changes become smaller, feedback becomes faster, and production becomes more stable.

Delivery speeds up, but not because we asked everyone to move faster. It speeds up because we removed much of the risk that was forcing them to move slowly in the first place.

That’s the real value of CI/CD. Faster delivery comes from reducing deployment risk, not increasing deployment speed.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk. (Current Article)
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Why Platform Engineering Exists

Engineering Flow — Part 3

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

We make software delivery harder than it needs to be. Not intentionally. Most of the friction starts with perfectly reasonable decisions.

We need infrastructure expertise, so we create an infrastructure team. We need stronger security, so we establish security reviews. Databases need to be reliable, so database engineers manage them. Production needs to be stable, so we create change controls.

Every decision makes sense on its own.

Eventually, an engineer needs infrastructure, networking, a database, security approval, and a production deployment just to deliver one change.

Nobody designed the system to be slow. It just grew that way.

And that, more than any particular technology, is why platform engineering exists.

We Built Dependencies Into the Organization

In Part 2 of this series, I wrote about how every dependency creates a tax on delivery.

I’ve spent much of my career in large enterprise environments, and I’ve seen this firsthand.

The problem usually isn’t that infrastructure, database, security, or operations teams aren’t moving fast enough. Quite often, they’re filled with talented people doing exactly what the organization asked them to do.

The problem is the system we’ve created around them.

When dozens of engineering teams depend on the same specialized teams for routine work, those teams inevitably become queues.

Our natural response is to make the queues faster. We create better ticketing systems, establish SLAs, prioritize requests, or add people.

Those things can help. But we’re still managing the queue.

Eventually, we need to ask a different question:

Why does this need to be a queue at all?

Turn Expertise Into Capability

Databases are an easy example for me.

Traditionally, if an application needed a database, someone submitted a request to the database team. A DBA reviewed the requirements, provisioned the database, configured security, established backups and monitoring, applied organizational standards, and handed it over.

There are good reasons for that process. You want someone who understands databases making those decisions.

But there’s a difference between needing database expertise and needing a database engineer to manually perform the same process every time.

What if database engineers defined those standards once, then encoded their expertise into something software engineering teams could consume on demand through a self-service platform?

The database engineers haven’t become less important. Their expertise has become more valuable because it can scale beyond the requests they can personally complete.

Platform engineering doesn’t eliminate specialized expertise. It productizes it.

Platform Engineering Is Core to DevOps

Platform engineering became a buzzword several years ago. But like many technology trends, some organizations simply slapped the label on teams that continued to build and manage infrastructure the same way they always had.

What often gets missed is that modern platform engineering grew out of many of the same principles as DevOps, with a stronger focus on internal developer platforms, self-service, golden paths, and developer experience.

The platform team wasn’t designed to become another team software engineers depend on. It was designed to make those dependencies less visible—or eliminate them altogether.

For a while, everyone was talking about platform teams, developer portals, Kubernetes, Terraform, and paved roads.

Then some of the excitement moved on to the next thing.

The underlying problem didn’t.

Many organizations adopted DevOps tooling without fundamentally changing how work flows through the organization.

We automated builds and deployments. We built CI/CD pipelines. But developers still opened tickets for infrastructure and waited for environments, security reviews, databases, and other teams before they could deliver software.

The tooling changed. The delivery system didn’t.

DevOps was never simply about CI/CD, automation, or putting developers and operations engineers on the same team. It’s about improving the system through which software moves from idea to production.

Platform engineering is one of the key ways we make that work at scale.

It isn’t a replacement for DevOps. It’s a core part of putting DevOps into practice at scale.

The Goal Isn’t the Platform

It’s easy to turn platform engineering into a technology initiative.

Build the developer portal. Deploy Kubernetes. Standardize Terraform. Create reusable pipelines.

Those things can all be useful, but none of them proves that we’ve improved software delivery.

The better question is:

Did we make it easier for an engineering team to deliver software?

If developers still need to understand the organizational chart to get something into production, we haven’t solved much.

We’ve spent years learning how to abstract technical complexity. Platform engineering gives us an opportunity to abstract something just as damaging to flow: organizational complexity.

That might mean provisioning an approved database without knowing who the DBA is, creating an environment without an infrastructure ticket, or deploying safely without manually coordinating with operations.

The platform is the mechanism.

Flow is the outcome.

Guardrails Instead of Gates

None of this means removing governance. Security, reliability, compliance, architecture, and operational controls still matter.

But controls don’t always have to take the form of another person giving permission.

A gate stops you until someone lets you through.

A guardrail allows you to keep moving while staying within acceptable boundaries.

If encryption is required, make it the default. If only certain infrastructure configurations are approved, make those the configurations teams can provision. If deployments must meet specific requirements, enforce them automatically.

The control doesn’t disappear. The waiting does.

Don’t Build Another Queue

There’s an irony in platform engineering.

It’s entirely possible to create a platform team and recreate the exact problem it was supposed to solve.

Instead of opening an infrastructure ticket, you open a platform ticket. Instead of waiting for operations, you wait for the platform team.

We’ve changed the name of the dependency without removing it.

A platform team shouldn’t primarily exist to perform work for engineering teams. It should create capabilities that allow those teams to do more themselves—safely, consistently, and independently.

That’s why treating the platform as a product matters. The engineers using it are customers.

If every interaction with your platform requires a ticket, you may have built another dependency, not a platform.

Why Platform Engineering Exists

Small engineering organizations can survive on relationships.

Everyone knows who manages the infrastructure. Someone knows the security engineer. A developer can message the DBA.

That doesn’t scale to hundreds or thousands of engineers.

Eventually, organizational boundaries become delivery boundaries.

Platform engineering gives us a way to expose the expertise of specialized teams without requiring every engineer to navigate those boundaries.

Instead of figuring out how to coordinate more efficiently, we can start asking how much coordination we can eliminate altogether.

That’s why I don’t think platform engineering was just another DevOps buzzword.

If anything, I think many organizations moved on from the buzzword before they fully implemented the idea behind it.

And that idea is still incredibly relevant.

DevOps asks us to improve the system of software delivery.

Platform engineering gives us a powerful way to do that at scale—when done right.

The goal isn’t to build a platform. The goal is to help teams flow autonomously.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists (Current Article)
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Every Dependency Is a Tax on Delivery

Engineering Flow — Part 2

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

In the first article, I argued that software delivery rarely slows down because engineers aren’t working hard enough. It slows down because work spends too much time waiting.

So the obvious next question is:

What creates all of that waiting?

More often than not, it’s dependencies.

Dependencies Cost More Than We Think

Every engineering organization has dependencies.

Some are technical.
Some are organizational.
Some exist because of regulations or compliance requirements.

Others simply exist because that’s how the company has always been structured, or someone simply wanted additional oversight in the delivery process.

On their own, most dependencies seem reasonable.
But software delivery doesn’t experience them one at a time.
It experiences them together, and very additional dependency compounds the cost of delivery.

One dependency may add very little overhead.
Ten dependencies can fundamentally change how the team delivers software.

A feature may depend on infrastructure, security, networking, a shared API, a database team, architecture approval, and a coordinated release.

None of those are necessarily bad.

But, collectively, they become expensive.

Every Dependency Is a Tax on Delivery

One idea has fundamentally changed how I think about software delivery.

Every dependency is a tax on delivery.
The question isn’t whether you’re paying the tax. The question is whether it’s worth paying.

Like any tax, every dependency adds cost.

Sometimes it’s measured in time.
Sometimes it’s measured in meetings.
Sometimes it’s measured in competing priorities.
Sometimes it’s measured in context switching.
Sometimes it’s measured in uncertainty.

Not every tax is unnecessary.
But every tax should have a purpose.

The same is true for dependencies.
The more dependencies a piece of work accumulates, the harder it becomes to predict when it will reach customers.

Dependencies Reduce Autonomy

The biggest cost of dependencies isn’t speed.

It’s autonomy.

Imagine two engineering teams.

The first owns everything it needs to design, build, test, deploy, and operate its application.
The second depends on five other teams before anything can reach production.

Which team controls its own delivery?

The answer is obvious.
The second team may have outstanding engineers.
They may write excellent software.
They may start every sprint committed.
But they simply can’t control when their work reaches the customer.

Every dependency transfers part of that control somewhere else. As dependencies increase, ownership becomes diluted. Delivery becomes less about engineering and more about coordination.

That raises another important question.

Why Do Organizations Accumulate Dependencies?

Over the years, I’ve noticed another interesting pattern. The dependencies in our software often mirror the dependencies in our organization. When five teams have to coordinate to deliver a feature, it’s often because the organization itself is structured that way.

This observation is known as Conway’s Law, and I’ll explore it in more detail later in this series.

For now, it’s enough to recognize that organizational design influences delivery more than most of us realize.

Not Every Dependency Should Disappear

None of this suggests that every dependency is bad.

Security reviews exist for a reason.
Compliance protects customers.
Specialized expertise creates better outcomes.

The goal isn’t to eliminate collaboration. It’s to eliminate unnecessary dependencies.

High-performing engineering organizations constantly ask questions like:

  • Does this team really need another group to complete this work?
  • Can this capability become self-service?
  • Can this approval become automated?
  • Can ownership move closer to the people doing the work?

Every unnecessary dependency that’s removed gives a team greater control over its own outcomes.

A Different Way To Think About Engineering

High-performing engineering organizations don’t simply build faster delivery pipelines.

They build teams that can move independently.
Because autonomy improves flow.
Ownership improves accountability.
And every unnecessary dependency that’s removed shortens the time between idea and customer.

The goal isn’t to remove every dependency.
The goal is to make every remaining dependency intentional.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is.
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery (Current Article)
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Your Team Isn’t Slow. Your Delivery System Is.

Engineering Flow — Part 1

A series exploring how high-performing engineering organizations improve the flow of software delivery through DevOps, Platform Engineering, DORA Metrics, and systems thinking.

For years, I’ve seen organizations try to improve software delivery the same way:

Push engineers to work harder.

Increase velocity.
Add more meetings.
Hire more developers.
Work nights and weekends.

Yet somehow, delivery never gets much faster. In fact, it often gets slower.

I’ve come to believe that, more often than not, the problem isn’t the people.
It’s the system they work in.

Where Does Work Actually Spend Its Time?

Think about a typical feature request.

The actual engineering work might take a few hours or a few days.

But before and after that work, it often sits idle.

Waiting for:

  • Infrastructure to be provisioned.
  • Requirements to be clarified.
  • A pull request review.
  • Another team’s approval.
  • Code promotion.
  • QA testing.
  • UAT testing.
  • CAB approval.
  • A production release window.

The code isn’t moving.
The feature isn’t creating value.
The work is simply waiting.

Those waiting periods often exceed the time spent actually building the feature.

Every Handoff Is a Queue.

One idea that has really changed how I think about software delivery is this:

Every handoff creates a queue.
Every queue creates delay.
Every delay increases risk.

When work moves between teams, tools, or approval steps, it almost always slows down.

Individually, each queue may seem reasonable.
Together, they can stretch a two-day feature into a two-week delivery.

The more dependencies a team has on others to deliver solutions, the less control it has over its own delivery speed. High-performing organizations work to reduce those dependencies, not just to move faster, but to give each team greater ownership of its own outcomes.

That is why improving engineering isn’t just about writing better code—it’s about improving how work flows through the entire system.

Technology Can Help, But Only If It Removes Friction

Practices like Continuous Integration, Continuous Delivery (CI/CD), automated testing, and Platform Engineering aren’t valuable simply because they’re modern.

By reducing batch sizes and accelerating feedback, these practices help teams learn faster and deliver with greater confidence.

They’re valuable because they reduce friction.
They eliminate unnecessary waiting.
They shorten feedback loops.
They make it easier, and safer, for work to move from idea to customer.

Measuring What Matters

This is why I believe DORA Metrics matter.

They don’t measure how hard engineers are working. They measure how effectively work flows through the delivery system.

Optimizing one team doesn’t necessarily optimize the entire system. A team can become more efficient while the organization as a whole becomes slower.

They shift the conversation away from questions like:

  • “How many story points did we complete?”
  • “Are developers busy enough?”

And toward questions like:

  • How long does it take to go from idea to production?
  • How often can we safely deploy?
  • How quickly can we recover from failures?
  • Where is work getting stuck?

Those are system questions, not individual performance questions.

A Different Way To Think About Engineering

I’ve become increasingly convinced that high-performing engineering organizations don’t optimize for busy people.

They optimize for smooth flow.

When work flows well:

  • Customers receive value sooner.
  • Teams spend less time waiting.
  • Deployments become less risky.
  • Engineers experience less frustration.
  • The business can adapt more quickly.

The best engineering organizations don’t optimize people, they optimize the systems so people can do their best work.

That’s the philosophy behind everything I’ll be writing about in this series.

This is the first post in the Engineering Flow series, where I’ll explore how DevOps, Platform Engineering, DORA Metrics, and organizational design help teams deliver software faster, safer, and with less friction.

Engineering Flow Series

  1. Your Team Isn’t Slow. Your Delivery System Is. (Current Article)
    The foundation of Engineering Flow: why software delivery is constrained more by systems than by individual effort.
  2. Every Dependency Is a Tax on Delivery
    why team dependencies reduce autonomy and slow delivery
  3. Why Platform Engineering Exists
    How platforms enable autonomy without sacrificing governance.
  4. CI/CD Isn’t About Automation. It’s About Reducing Risk.
    Why smaller deployments are actually safer deployments.
  5. Every Handoff Is a Queue
    The hidden cost of waiting, approvals, and organizational bottlenecks.
  6. Stop Measuring Output. Start Measuring Flow.
    Why engineering effectiveness starts with measuring systems, not activity.
  7. DORA Metrics Aren’t KPIs
    How to use DORA Metrics to improve systems, not evaluate people.
  8. CI/CD Is Easy. Culture Is Hard.
    Why trust, ownership, and feedback matter more than tooling.
  9. Why Engineering Leaders Should Care About DORA Metrics
    Using engineering metrics to improve organizational performance.
  10. Why Most Data Engineering Teams Aren’t Practicing DevOps
    Applying modern software delivery principles to data platforms.

If you enjoyed this article, consider subscribing for future posts in the Engineering Flow series.

Where does work spend the most time waiting in your software delivery process?
Share your experience in the comments.

My Data & Leadership Monthly Roundup — December 2025

Opening Thoughts

I’m getting this post out a bit later than I had planned. December was a busy month, with lots of quality time spent with family and friends. I’m looking forward to a return to normalcy in January.

My New Posts From Last Month

Disaster Recovery Is Not a Replacement for Backup & Recovery

The Hidden Cost of Being the Smartest Person in the Room

Why Bad Data Type Choices Kill Performance

Tools or Scripts I like to use

Brent Ozar’s First Responder Kit

Ola Hallengren’s SQL Server Maintenance Solution

dbatools (PowerShell Module for SQL Server Automation)

Tip for New DBAs

Focus on learning one new thing each day, no matter how small. Then continue to do that for the next 20 years.

Thanks for following along! If this was helpful, please share it with others who might benefit.


Disaster Recovery Is Not a Replacement for Backup & Recovery

It surprises me how many people treat “disaster recovery” and “backup & recovery” as interchangeable terms. But backups are not disaster recovery, and disaster recovery is not a backup strategy. Confusing the two creates a false sense of security that often becomes visible the moment something goes wrong. The goal of this post is to offer clarity on what separates these concepts, so you can design a strategy that actually protects your business, not just your data.

What Disaster Recovery Really Is

Disaster recovery (DR) is the capability to restore business operations after a major outage, as quickly as possible. It’s about continuity, not just data. DR covers the entire stack: infrastructure, networking, applications, services, dependencies, and yes, data. It typically involves a functional version of these components in a remote location. A well-defined DR plan articulates how quickly systems must be recovered (RTO), how much data loss is acceptable (RPO), and the sequence in which components must come back online. DR is not just infrastructure, but also orchestration. It’s people, processes, automation, communication plans, and testing. You can have perfect backups and still have a failed disaster recovery effort if none of this is in place. In SQL Server, we commonly design Availability Groups where data is replicated from site A to site B, ensuring the current data set in DR is as close to real-time as Production as possible, in preparation for an unplanned DR cutover.

What Backups Are Actually For

Backups serve a very different purpose. They protect your data, not your operational continuity. A backup is a point-in-time copy that allows you to restore a database. They help you recover from corruption, accidental deletion, ransomware (maybe), and internal mistakes. Backups answer questions like “Can we get the data back?” and “To which point in time?”. But they do not answer “Can our business continue running?”. Backups are essential, but they are a safety net, not a continuity plan. Without DR, backups simply give you something to restore while you remain offline. Backups are typically most valuable when someone runs that DELETE statement without a WHERE clause (happens more than you you’d like to believe), or you discovered corruption in a database.

The Key Differences (and Why They Matter)

The easiest way to understand the difference is this: backups rewind; disaster recovery moves forward. Backups help you return to a previous state, while DR helps you resume operations after a major disruption. You can restore data without ever achieving uptime, and you can fail over to a secondary site without having clean, restorable data. DR focuses on speed and continuity; backups focus on retention and recovery points. Backups alone cannot solve for an entire data center going offline, and DR alone cannot protect you from corruption or data-loss scenarios. Mature organizations design both, because one without the other is a half-built strategy.

Summary

Disaster recovery and backup & recovery are complementary, not interchangeable. DR protects the business; backups protect the data. Both are required if you want real resilience. If you’ve only tested restores, you don’t have a DR plan. If you’ve only tested failover, you don’t have a data-protection strategy. The organizations that survive outages with minimal impact are the ones that treat DR and backups as two distinct disciplines working together. Make the distinction clear, design intentionally, and your business will be far better prepared when the unexpected happens.

The Hidden Cost of Being the Smartest Person in the Room

Why Being “The Expert” Can Kill Your Growth, Influence, and Career

In tech, especially in the database world, we celebrate expertise. We respect the person who knows every wait type, every DMV, every undocumented trace flag. But there’s a danger hidden in becoming too comfortable being “the smartest person in the room”.

I’ve seen it in others. I’ve caught it in myself, at times.

And it’s one of the fastest ways to stall your career, damage your influence, and slowly transform into what every team dreads:

The grumpy DBA in the corner who wonders why no one listens anymore.

Here’s why you should avoid that trap, and how to do it.

When You’re the Smartest Person in the Room, You Stop Growing

Growth comes from friction:

  • Someone challenging your assumptions
  • Someone showing you a tool you’ve never used
  • Someone explaining a pattern you haven’t seen
  • Someone exposing blind spots you didn’t know existed

If you’re always the one teaching, correcting, proving a point, or worse, trying to prove someone wrong, you’re not learning.

And in a field changing as fast as data engineering, SQL Server, and cloud platforms, the moment you stop learning is the moment your value starts dropping.

Comfort feels good. But comfort kills careers.

When You’re Always Right, People Stop Listening

This part hurts, but it’s true: If you always have the answer, eventually people stop asking their questions.

Not because you’re wrong. But because you make them feel:

  • Inferior
  • Judged
  • Uncomfortable
  • Shutdown
  • Interrupted

Think about the smartest engineer you’ve ever known, who constantly corrects people mid-sentence.

  • Do you enjoy brainstorming with them?
  • Do you feel heard?
  • Do you want to collaborate?

Competence builds credibility. Humility builds influence.

If you want people to listen to you, collaborate with you, and trust you, you need to make space for others to shine.

Being the Only Expert Makes You “The Bottleneck”, Not the Hero.

Many DBAs learn this lesson the hard way. You’re proud no one else can troubleshoot broken replication, or tune a problematic query, or rebuild a broken AG. You feel irreplaceable.

Then you wake up one day and realize: If you’re irreplaceable, you’re also not promotable.

You’ve boxed yourself into a corner, and the business sees you as a single-function asset rather than a scalable leader.

Worse, you’ve trained the entire team to need you instead of to learn from you. That’s how smart experts become bitter, exhausted, and stuck.

The “Grumpy DBA” Is Usually Someone Who Never Stretched Beyond Their Expertise

The stereotype exists for a reason.

  • The person muttering in the back of the meeting…
  • The one ranting about how no one understands indexing…
  • The one convinced that “management doesn’t listen”…
  • The one who refuses to learn anything cloud-related…
  • The one whose career hasn’t moved in 10+ years…

That person is often genuinely brilliant.

  • But brilliance without humility becomes isolation.
  • Isolation becomes frustration.
  • Frustration becomes bitterness.

And bitterness is career poison.

So What Should You Do Instead?

Here’s how to avoid becoming the smartest stuck person in the room:

1. Put yourself in rooms where you’re not the expert

Go to user groups, conferences, new communities, architecture sessions, or cross-functional teams where you feel outclassed.

That discomfort is a sign of growth.

2. Ask more questions than you answer

Curiosity builds connection.

Questions create collaboration.

But always being the one with the Answers can shut it down.

Your goal isn’t to prove you’re smart. It’s to help others rise with you.

3. Build successors, not dependencies

If your team can operate without you, that’s leadership — not replacement.

4. Learn outside your lane

Cloud. Platform Engineering. Python. Security frameworks. Data governance. Observability.

These skills multiply your value.

Final Thoughts

Being smart isn’t the problem.

Believing and acting as if you are the smartest is.

  • When you’re the only expert, you limit your growth.
  • When you’re always right, you lose influence.
  • When you isolate yourself by expertise, you become stuck.

And when you’re stuck long enough, you become the stereotypical “grumpy DBA” wondering why your career never moved.

  • Put yourself in bigger rooms.
  • Be curious.
  • Grow with others.

And never let your expertise become the ceiling over your career.