← Back to list

The Night Prod Went Down: A Tale of Two Mindsets

Disclaimer: The errors in this document are random and are not the exact ones… or you can say AI generated 🤷‍♀️

Sachinadi · 2026-07-14 15:18 · 0 claps · 6.3 min read
#system-resilience #design-systems #incident-response #pagerduty #software-architecture
Open on Medium ↗
Wiki topics: PRD · Product Design 🚀 · Self Improvement 🏛️ · Architecture

The Night Prod Went Down: A Tale of Two Mindsets

Disclaimer: The errors in this document are random and are not the exact ones… or you can say AI generated 🤷‍♀️

Maya is our Senior Engineer (imaginary charectar)

Maya is our Senior Engineer (imaginary charectar)

2:47 AM. Maya’s phone buzzes on the nightstand. PagerDuty. Critical: checkout-service error rate 42%.

She’s a senior engineer. Three floors up (metaphorically — he’s actually in Bangalore), Raj gets the same alert. He’s the architect who designed this system two years ago.

Same fire. Two completely different ways of looking at it.

2:49 AM — Maya opens her laptop

Maya doesn’t ask “why did this happen.” Not yet. That question is a luxury for later. Right now she asks one thing:

“Where, exactly, is it broken — and how bad?”

She pulls up the dashboard.

<svg viewBox=”0 0 700 260" xmlns=”http://www.w3.org/2000/svg" style=”width:100%;height:auto;font-family:’Segoe UI’,Arial,sans-serif;”> <rect width=”700" height=”260" rx=”12" fill=”#0f172a”/> <text x=”24" y=”34" fill=”#e2e8f0" font-size=”15" font-weight=”600">checkout-service — live dashboard</text> <! — Error rate panel → <rect x=”24" y=”52" width=”200" height=”180" rx=”8" fill=”#1e293b” stroke=”#334155"/> <text x=”40" y=”76" fill=”#94a3b8" font-size=”11">ERROR RATE</text> <text x=”40" y=”112" fill=”#f87171" font-size=”30" font-weight=”700">42%</text> <text x=”40" y=”132" fill=”#64748b” font-size=”10">baseline: 0.3%</text> <polyline points=”40,200 70,195 100,190 130,140 160,90 190,80 210,78" fill=”none” stroke=”#f87171" stroke-width=”2.5"/> <! — Latency panel → <rect x=”248" y=”52" width=”200" height=”180" rx=”8" fill=”#1e293b” stroke=”#334155"/> <text x=”264" y=”76" fill=”#94a3b8" font-size=”11">P99 LATENCY</text> <text x=”264" y=”112" fill=”#fbbf24" font-size=”30" font-weight=”700">8.2s</text> <text x=”264" y=”132" fill=”#64748b” font-size=”10">baseline: 240ms</text> <polyline points=”264,205 294,200 324,195 354,150 384,100 414,85 434,82" fill=”none” stroke=”#fbbf24" stroke-width=”2.5"/> <! — Traffic by AZ panel → <rect x=”472" y=”52" width=”204" height=”180" rx=”8" fill=”#1e293b” stroke=”#334155"/> <text x=”488" y=”76" fill=”#94a3b8" font-size=”11">HEALTH BY AZ</text> <circle cx=”520" cy=”120" r=”18" fill=”#22c55e”/> <text x=”500" y=”150" fill=”#94a3b8" font-size=”10">us-east-1a</text> <circle cx=”590" cy=”120" r=”18" fill=”#ef4444"/> <text x=”570" y=”150" fill=”#94a3b8" font-size=”10">us-east-1b</text> <circle cx=”555" cy=”185" r=”18" fill=”#22c55e”/> <text x=”533" y=”215" fill=”#94a3b8" font-size=”10">us-east-1c</text> </svg>

One AZ, red. The other two, green. That single glance just cut her search space by two-thirds.

Lesson one of debugging prod: you don’t start by reading code. You start by reading the shape of the failure.

2:53 AM — Following the trail

Maya doesn’t guess. She walks the request, hop by hop, exactly the way a customer’s click actually travels through the system.

<svg viewBox=”0 0 760 220" xmlns=”http://www.w3.org/2000/svg" style=”width:100%;height:auto;font-family:’Segoe UI’,Arial,sans-serif;”> <rect width=”760" height=”220" rx=”12" fill=”#f8fafc” stroke=”#e2e8f0"/> <defs> <marker id=”arrow1" markerWidth=”8" markerHeight=”8" refX=”6" refY=”4" orient=”auto”> <path d=”M0,0 L8,4 L0,8 z” fill=”#475569"/> </marker> </defs> <! — nodes → <g font-size=”12" text-anchor=”middle”> <rect x=”20" y=”90" width=”90" height=”50" rx=”8" fill=”#dbeafe” stroke=”#3b82f6"/> <text x=”65" y=”119" fill=”#1e3a8a” font-weight=”600">User</text>

<rect x="150" y="90" width="100" height="50" rx="8" fill="#dbeafe" stroke="#3b82f6"/>
<text x="200" y="112" fill="#1e3a8a" font-weight="600">Load</text>
<text x="200" y="128" fill="#1e3a8a" font-weight="600">Balancer</text>
<rect x="290" y="90" width="110" height="50" rx="8" fill="#fee2e2" stroke="#ef4444"/>
<text x="345" y="112" fill="#7f1d1d" font-weight="700">App Server</text>
<text x="345" y="128" fill="#7f1d1d" font-size="10">(1b) — timing out</text>
<rect x="440" y="90" width="90" height="50" rx="8" fill="#e2e8f0" stroke="#64748b"/>
<text x="485" y="119" fill="#334155" font-weight="600">Cache</text>
<rect x="570" y="90" width="90" height="50" rx="8" fill="#e2e8f0" stroke="#64748b"/>
<text x="615" y="112" fill="#334155" font-weight="600">Database</text>
<rect x="570" y="20" width="150" height="40" rx="8" fill="#fef9c3" stroke="#eab308"/>
<text x="645" y="45" fill="#713f12" font-size="10">Payment API (3rd party)</text>

</g> <! — arrows → <line x1=”110" y1=”115" x2=”145" y2=”115" stroke=”#475569" stroke-width=”2" marker-end=”url(#arrow1)”/> <line x1=”250" y1=”115" x2=”285" y2=”115" stroke=”#475569" stroke-width=”2" marker-end=”url(#arrow1)”/> <line x1=”400" y1=”115" x2=”435" y2=”115" stroke=”#475569" stroke-width=”2" marker-end=”url(#arrow1)”/> <line x1=”530" y1=”115" x2=”565" y2=”115" stroke=”#475569" stroke-width=”2" marker-end=”url(#arrow1)”/> <line x1=”615" y1=”88" x2=”615" y2=”65" stroke=”#475569" stroke-width=”2" marker-end=”url(#arrow1)”/>

<text x=”345" y=”180" text-anchor=”middle” fill=”#7f1d1d" font-size="12" font-weight="600">🔥 Requests die here — every app instance in AZ-1b is timing out</text> </svg>

She checks the deploy log. A build shipped to that AZ 40 minutes before the alert fired. Nowhere else — the rollout was still mid-way through a canary deploy.

That’s not a coincidence. That’s the answer.

“Rollback first. Understand later.”

She rolls it back. 90 seconds later, the red circle turns green. Error rate drops from 42% to 0.4%. Fire’s out.

3:10 AM — Raj is asking a very different question

While Maya was heads-down chasing the trail, Raj was watching the same dashboard with a different question in his head:

“Why was one bad AZ allowed to take down 33% of checkout traffic in the first place?”

Raj is our Architect (imaginary charectar)

Raj is our Architect (imaginary charectar)

He’s not debugging the incident. He’s debugging the system that allowed the incident to matter.

<svg viewBox=”0 0 760 300" xmlns=”http://www.w3.org/2000/svg" style=”width:100%;height:auto;font-family:’Segoe UI’,Arial,sans-serif;”> <rect width=”760" height=”300" rx=”12" fill=”#f8fafc” stroke=”#e2e8f0"/>

<text x=”185" y=”30" text-anchor=”middle” fill=”#7f1d1d" font-size="14" font-weight="700">BEFORE — single point of failure</text> <text x="575" y="30" text-anchor="middle" fill="#14532d" font-size="14" font-weight="700">AFTER — designed to fail safely</text>

<! — BEFORE → <g> <rect x=”60" y=”55" width=”250" height=”50" rx=”8" fill=”#dbeafe” stroke=”#3b82f6"/> <text x=”185" y=”85" text-anchor=”middle” fill=”#1e3a8a” font-weight=”600">Load Balancer (all-or-nothing)</text>

<rect x="60" y="130" width="115" height="45" rx="8" fill="#fee2e2" stroke="#ef4444"/>
<text x="117" y="157" text-anchor="middle" fill="#7f1d1d" font-size="11">100% new build</text>
<rect x="195" y="130" width="115" height="45" rx="8" fill="#e2e8f0" stroke="#64748b"/>
<text x="252" y="150" text-anchor="middle" fill="#334155" font-size="11">no health-based</text>
<text x="252" y="163" text-anchor="middle" fill="#334155" font-size="11">routing</text>
<rect x="120" y="210" width="130" height="45" rx="8" fill="#fef2f2" stroke="#ef4444" stroke-dasharray="4"/>
<text x="185" y="237" text-anchor="middle" fill="#7f1d1d" font-size="11">no automatic rollback</text>
<text x="185" y="285" text-anchor="middle" fill="#7f1d1d" font-size="11">→ full canary blast radius, manual fix only</text>
</g> <! - divider → <line x1="380" y1="45" x2="380" y2="290" stroke="#cbd5e1" stroke-width="1.5" stroke-dasharray="6,4"/> <! - AFTER → <g> <rect x="450" y="55" width="260" height="50" rx="8" fill="#dcfce7" stroke="#22c55e"/> <text x="580" y="85" text-anchor="middle" fill="#14532d" font-weight="600">Load Balancer + health checks</text>
<rect x="450" y="130" width="120" height="45" rx="8" fill="#dcfce7" stroke="#22c55e"/>
<text x="510" y="150" text-anchor="middle" fill="#14532d" font-size="11">5% canary</text>
<text x="510" y="163" text-anchor="middle" fill="#14532d" font-size="11">traffic slice</text>
<rect x="590" y="130" width="120" height="45" rx="8" fill="#dcfce7" stroke="#22c55e"/>
<text x="650" y="150" text-anchor="middle" fill="#14532d" font-size="11">unhealthy AZ</text>
<text x="650" y="163" text-anchor="middle" fill="#14532d" font-size="11">auto-drained</text>
<rect x="520" y="210" width="140" height="45" rx="8" fill="#dcfce7" stroke="#22c55e"/>
<text x="590" y="230" text-anchor="middle" fill="#14532d" font-size="11">error-rate trigger</text>
<text x="590" y="243" text-anchor="middle" fill="#14532d" font-size="11">→ auto-rollback</text>
<text x="580" y="285" text-anchor="middle" fill="#14532d" font-size="11">→ blast radius capped at 5%, self-heals in seconds</text>

</g> </svg>

He doesn’t touch a single line of code that night. He opens a doc titled “Postmortem: checkout-service, July 14” and starts writing three things down:

  1. Canary deploys had no automated rollback trigger tied to error rate.
  2. The load balancer had no health-check-based traffic shifting away from a degrading AZ.
  3. Nobody was paged until 42% error rate — the alert threshold was too loose.

None of these are Maya’s fault. None of them are anyone’s fault, really. They’re gaps in the system’s design, and design gaps are the architect’s job to close.

The two mindsets, side by side

They’re not competing skill sets. They’re the same skill, at different altitudes. And here’s the part that matters most for anyone building toward architecture:

You can’t design good guardrails for failures you’ve never personally chased at 3 AM.

Every incident Maya debugs by hand becomes a pattern Raj eventually designs against. That’s not a coincidence either — it’s the actual career path. The engineers who become the sharpest architects are the ones who spent years in the trenches first, because they’re not theorizing about failure modes. They’ve lived inside them.

The playbook, distilled

When you’re the one debugging:

  1. Triage the blast radius before you touch anything — one host, one AZ, or everywhere?
  2. Ask “what changed?” first — deploy logs, config changes, feature flags, cron jobs.
  3. Walk the request path hop by hop: LB → app → cache → DB → third-party.
  4. Contain first (rollback, failover, kill switch), root-cause after.

When you’re the one designing:

  1. Find every single point of failure before it finds you.
  2. Cap blast radius by default — canaries, bulkheads, circuit breakers.
  3. Build automatic rollback triggers, not just manual ones.
  4. Run blameless postmortems that fix the system, not the person.

Same fire. Two mindsets. One career arc that runs straight through both.

Maya went back to sleep at 3:20 AM. Raj’s postmortem doc was open until sunrise. Next sprint, canary auto-rollback shipped as a P1. Nobody got paged at 3 AM for that particular reason ever again.

There is a reason why I thought of writing this… Being at different roles in the industry teaches you different ways to solve the problem.. it’s either that you are firefighter trying to fix the fire or you are the security inspector who designed the fire safe mechanisms…

Hope you enjoyed reading this!


메타데이터
post_id
b987fb5cbd60
slug
the-night-prod-went-down-a-tale-of-two-mindsets-b987fb5cbd60
url
https://medium.com/@sachinadi424/the-night-prod-went-down-a-tale-of-two-mindsets-b987fb5cbd60
canonical_url
https://medium.com/@sachinadi424/the-night-prod-went-down-a-tale-of-two-mindsets-b987fb5cbd60
author_url
https://medium.com/@sachinadi424
status
ok
fetched_at
2026-08-12 10:37:11