← Back to list

How Senior Engineers Find Root Cause in 20 Minutes When Everyone Else Takes 4 Hours

It’s not the tools. It’s not the access. It’s the order in which they ask questions.

Backend Engineer By Devrim in Stackademic · 2026-06-20 23:19 · 0 claps · 10.3 min read
#programming #software-development #software-engineering #web-development #data-science
Open on Medium ↗
Wiki topics: ML · Machine Learning 💻 · Programming 🌐 · Web Development 🔬 · Science · General

How Senior Engineers Find Root Cause in 20 Minutes When Everyone Else Takes 4 Hours

It’s not the tools. It’s not the access. It’s the order in which they ask questions.

The alert fired at 02:17.

By 02:19, six engineers were on the bridge. The application was returning 500s across the checkout flow. Revenue was stopped. Every minute of downtime had a number attached to it that nobody needed to say out loud.

By 02:21, four of those engineers had their dashboards open and were reading logs.

By 02:23, the staff engineer who joined last had a hypothesis.

By 02:41, the incident was resolved.

The four engineers who were reading logs at 02:21 were still reading logs at 02:41.

I was one of them.

What I Thought the Difference Was

For the first two years of my on-call rotation, I had a theory about why some engineers resolved incidents faster than others.

System knowledge. The fast engineers knew the codebase better. They had been at the company longer. They had written the systems they were debugging.

This theory was wrong and I knew it was wrong by the end of that night.

The staff engineer who resolved the incident in twenty-four minutes had joined the company eleven weeks earlier. She had never worked with the checkout service. She had not written a single line of the code that was failing.

She was faster because she was doing something structurally different from what the rest of us were doing.

Not using better tools. Not reading logs more efficiently. Not knowing things we didn’t know.

She was asking different questions, in a different order, before she looked at anything.

The Structural Difference

Here is what the first four minutes looked like for me and for her.

At 02:19, I opened the checkout service dashboard. I pulled up the error logs. I started reading, looking for something that would explain the 500s. I found a stack trace. I started following the stack trace.

At 02:19, she asked: “Is this affecting all checkout attempts or a subset?”

The answer came back in thirty seconds: all checkout attempts, all regions, all payment methods.

At 02:20, she asked: “What changed in the sixty minutes before 02:17?”

The answer: one deployment, to the inventory service, at 01:54.

At 02:21, she asked: “What does checkout call in the inventory service?”

At 02:23, she had a hypothesis: the inventory service deployment had changed a response contract that checkout was depending on. Checkout was failing to parse the response and throwing an unhandled exception.

At 02:24, she asked someone to check the inventory service response schema against what checkout was expecting.

At 02:26, the mismatch was confirmed.

At 02:38, a fix was deployed.

At 02:41, checkout was recovering.

I was still in the stack trace at 02:41. The stack trace was accurate. It was also three levels of abstraction away from the root cause, and I had no framework for knowing when to stop following it and ask a different question.

The Framework She Was Using

After that incident I asked her directly: what were you doing in those first four minutes?

She described it in a way I have thought about consistently since.

“I’m not trying to find the answer in the first four minutes. I’m trying to make the search space small enough that the answer is findable. Every question I ask is designed to eliminate a category, not to gather more information.”

That sentence is the entire framework.

Most engineers in production incidents are gathering information. They open dashboards. They read logs. They look at metrics. They are collecting data and hoping the data reveals something.

Fast incident responders are eliminating categories. Every question they ask is selected because a specific answer will make an entire class of failure impossible. They are not reading. They are running a structured elimination tournament against the failure space.

The tournament has a specific structure.

Round One: Establish the Blast Radius

The first questions in every incident are scope questions. Not “what is wrong” but “what is the shape of what is wrong.”

Is this one service or multiple services? One region or all regions? All users or a subset? All traffic or specific endpoints?

These questions take ninety seconds to answer. They eliminate enormous amounts of search space before a single log is read.

A failure isolated to one region almost certainly has a different cause than a failure affecting all regions simultaneously. A failure affecting only authenticated users has a different cause than a failure affecting all users. A failure on one specific endpoint has a different cause than a failure affecting all endpoints of a service.

Scope doesn’t tell you the root cause. It tells you where the root cause cannot be.

A failure in all regions cannot be caused by a region-specific infrastructure change. A failure affecting all users cannot be caused by a bug in the code path that only authenticated users reach. A failure on all endpoints cannot be caused by a bug in one specific handler.

Every scope answer eliminates a category. The search space gets smaller before anyone has read a single log line.

Most engineers skip this. They go straight to the logs of the first failing service they can access. They are searching the full space when they could be searching a fraction of it.

Round Two: Anchor the Timeline

The second set of questions is about time. Not “what is wrong now” but “when did wrong start relative to what changed.”

When did the error rate first appear? Is it the same time as the alert or earlier? Alerts fire at thresholds, not at the moment of failure. The actual start time is often ten to twenty minutes before the alert.

What changed in the window immediately before the failure started? Deployment, configuration change, infrastructure update, scheduled job, traffic pattern shift, certificate expiration.

When did the relevant metrics last look clean?

The timeline doesn’t always identify the root cause. It collapses the hypothesis space dramatically.

A failure that started at exactly the moment of a deployment has a very different starting hypothesis than a failure that started gradually forty minutes before anyone touched anything.

A failure that started when a scheduled batch job ran has a different cause than a failure that started during a traffic spike.

A failure where the metrics had been slowly trending wrong for an hour before the cliff has a different cause than a failure that appeared instantaneously.

Timeline gives you a constraint. The cause had to start before the failure started and after the last clean metric reading. Everything outside that window is eliminated.

Round Three: Generate Three Hypotheses Before Investigating Any

This is the step that feels most counterintuitive under pressure.

When something is failing in production and every minute has a cost, the instinct is to start investigating immediately. Forming hypotheses before investigating feels like procrastination. Like you’re thinking instead of doing.

The engineers who are fastest at incidents have internalized the opposite of this instinct.

They force themselves to generate at least three hypotheses before they investigate any of them. Not because three is a magic number. Because the discipline of generating three hypotheses before committing to one prevents the most expensive failure mode in incident response.

The committed wrong hypothesis.

An engineer who commits to a hypothesis and starts investigating it has a specific cognitive problem. Every piece of evidence they find gets evaluated against the hypothesis they’re already invested in. Evidence that confirms it gets weighted heavily. Evidence that contradicts it gets rationalized. Thirty minutes pass. The hypothesis is wrong. The investigation has to restart from zero.

This is not stupidity. It is how human reasoning works under pressure. The committed hypothesis creates a frame that is very hard to escape once established.

The three-hypothesis discipline prevents the frame from forming too early. You have three candidates. You compare them. You ask which one explains the most symptoms with the fewest assumptions. You ask which one is cheapest to test. You ask which one, if eliminated, removes the most other possibilities from consideration.

Then you investigate the winner. With the explicit understanding that you are testing a hypothesis, not following a lead. If the test comes back negative, you eliminate the hypothesis and move to the next one. The investigation has structure. The structure prevents the committed wrong hypothesis failure mode.

Round Four: Design Tests That Eliminate, Not Confirm

There is a difference between a test designed to confirm a hypothesis and a test designed to eliminate one.

A confirmatory test looks for evidence that you’re right. An eliminatory test looks for evidence that makes a hypothesis impossible.

Eliminatory tests are more valuable for two reasons.

First, a negative result from an eliminatory test is progress. You’ve removed a branch from the search tree. You know where the answer isn’t.

Second, eliminatory tests tend to be cheaper. The cheapest check that makes a hypothesis impossible is usually faster than the investigation needed to confirm it.

In the incident I described at the beginning of this piece: checking the inventory service response schema against what checkout was expecting is an eliminatory test. If the schemas match, the contract mismatch hypothesis is eliminated. If they don’t match, the hypothesis is confirmed.

One check. Thirty seconds. Either confirmed or eliminated.

Compare that to following a stack trace three levels deep, understanding each frame, checking each dependency, and eventually arriving at a layer that points toward the inventory service response. Same destination, thirty minutes later, with a lot of accumulated context that turned out not to matter.

The eliminatory test wins not because it’s clever but because it was selected based on the hypothesis rather than discovered by reading.

Round Five: Time-Box Every Thread

The most expensive single behavior in slow incident response is the unbounded investigation thread.

An engineer disappears into logs or metrics or code, following a thread with no explicit time limit. Twenty minutes later they surface with either an answer or nothing useful. If nothing useful, they’ve spent twenty minutes eliminating one hypothesis when they could have eliminated four.

Fast incident responders time-box explicitly. Ten minutes per thread. At the end of ten minutes, the result gets surfaced to the group regardless of whether it’s conclusive.

“I’ve been following this for ten minutes. Here’s what I found. Here’s what I didn’t find. Here’s what I think it means about whether this hypothesis is alive or dead.”

That surface moment is where incidents often unlock. Someone on the bridge hears the partial findings and makes a connection that the investigating engineer couldn’t see because they were inside the thread.

The time-box forces the surface moment. The surface moment enables the connection.

Most engineers don’t time-box because surfacing a non-conclusive result feels like admitting you didn’t find the answer. It is the opposite. It is the move that keeps the investigation moving rather than stalling in a dead-end thread.

What This Looks Like Applied to the Five Most Common Failures

Let me make this concrete for the failure shapes that appear most consistently.

Connection pool exhaustion:

Blast radius: multiple services failing simultaneously, no region isolation, errors that mention connection or timeout.

Timeline: gradual degradation over minutes before the cliff, no recent deployment.

Hypothesis: resource exhaustion at the database connection layer.

Eliminatory test: pull connection pool metrics. Are they at maximum? When did they start climbing?

Total time to hypothesis confirmation or elimination: ninety seconds.

Retry storm:

Blast radius: downstream service traffic increasing as it degrades, multiple upstream services showing errors simultaneously.

Timeline: started when a downstream service first showed slowness, not when the alert fired.

Hypothesis: upstream retry logic amplifying load on an already-degraded service.

Eliminatory test: check request rate to the failing downstream service. Is it increasing or decreasing as the service degrades? Increasing means retries are amplifying the problem.

Total time: two minutes.

Cascade failure:

Blast radius: multiple services failing with no shared deployment.

Timeline: one service showed problems first, others followed.

Hypothesis: shared dependency failure propagating through the dependency graph.

Eliminatory test: what do all the failing services call in common? Check that dependency’s health.

Total time: three minutes, most of which is mapping the dependency graph.

Configuration drift:

Blast radius: one environment only, specific feature or code path, not load-correlated.

Timeline: started after a deployment or environment change, or started when the feature was first exercised in production.

Hypothesis: environment-specific configuration difference.

Eliminatory test: what is different about this environment? List every configuration value that differs from the environment where it works.

Total time: depends on configuration visibility. This is why configuration management tooling matters.

Silent degradation:

Blast radius: partial failure, subset of traffic, not total outage.

Timeline: may have been happening for hours or days before alert threshold was reached.

Hypothesis: depends on what’s degrading — usually a resource filling up or an upstream dependency degrading.

Eliminatory test: look at the trend, not the current value. When did this metric start moving in the wrong direction?

Total time: ninety seconds to see the trend, then hypothesis-specific from there.

The Thing That Doesn’t Transfer From Watching

I’ve described the framework. I want to be honest about something.

Reading the framework is not the same as having it available at 02:17 when the alert fires and your heart rate spikes and someone senior is on the bridge.

The framework becomes automatic through deliberate practice. Not through incidents alone — through deliberate extraction from each incident.

After every incident you’re involved in, sit with it for thirty minutes and ask three questions.

What was the earliest signal that something was wrong, before the alert fired?

What question changed the direction of the investigation, and why wasn’t it asked ten minutes earlier?

What would I look for first if I saw this exact symptom combination again tomorrow?

Write the answers down. Not in the postmortem system. In a personal incident journal that you own and can review before the next rotation.

The engineers who get fast at incidents fastest are not the ones with the most shifts. They are the ones who treated each shift as raw material for pattern building rather than something to resolve and forget.

The pattern library builds from the incidents you’ve already had.

The framework I’ve described above gives you structure for the incidents you haven’t had yet.

Together, they are what makes 02:17 feel different after two years of deliberate practice than it felt after two years of just being on-call.

The Twenty-Four Minute Incident, Revisited

I described that incident as something that happened to me. I want to be precise about what it actually was.

It was a demonstration of a skill I didn’t have yet, performed by someone who had built it deliberately, in a system she had never worked with before.

The system knowledge I had spent two years accumulating was almost irrelevant to the speed of resolution. The stack trace I was following was accurate. It just wasn’t the fastest path.

The fastest path was three questions, asked in the right order, before opening a single log file.

I have thought about those twenty-four minutes more than any other incident I’ve been part of. Not because the failure was complex. Because the resolution was simple, in a way that was only visible once I understood what she was doing.

The framework was always available. The questions were always askable.

I just didn’t know to ask them first.

The incident response framework I’ve described — the blast radius questions, the timeline anchoring, the three-hypothesis discipline, the eliminatory test design, the time-boxing practice — is organized with eighty production failure patterns inside ***Production Incident System OS*. Each pattern includes the earliest signal, the diagnostic sequence, and the eliminatory tests that find root cause fastest. Built from real incidents. The goal is the same as this piece: make 02:17 feel like a shape you recognize, not a mystery you search.


메타데이터
post_id
bb1f5a6c4ae2
slug
how-senior-engineers-find-root-cause-in-20-minutes-when-everyone-else-takes-4-hours-bb1f5a6c4ae2
url
https://medium.com/@codexlab/how-senior-engineers-find-root-cause-in-20-minutes-when-everyone-else-takes-4-hours-bb1f5a6c4ae2
canonical_url
https://medium.com/@codexlab/how-senior-engineers-find-root-cause-in-20-minutes-when-everyone-else-takes-4-hours-bb1f5a6c4ae2
author_url
https://medium.com/@codexlab
status
ok
fetched_at
2026-06-21 12:17:11