<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Krishnankamatchi</title>
    <description>The latest articles on DEV Community by Krishnankamatchi (@krishnankamatchi).</description>
    <link>https://dev.to/krishnankamatchi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4137689%2F93cf575a-7c9d-43bc-9190-e0c0c720d260.jpg</url>
      <title>DEV Community: Krishnankamatchi</title>
      <link>https://dev.to/krishnankamatchi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krishnankamatchi"/>
    <language>en</language>
    <item>
      <title>We Migrated 6 Years of Legacy Code. Production Chose Violence.</title>
      <dc:creator>Krishnankamatchi</dc:creator>
      <pubDate>Tue, 22 Sep 2026 19:25:40 +0000</pubDate>
      <link>https://dev.to/krishnankamatchi/we-migrated-6-years-of-legacy-code-production-chose-violence-3dni</link>
      <guid>https://dev.to/krishnankamatchi/we-migrated-6-years-of-legacy-code-production-chose-violence-3dni</guid>
      <description>&lt;p&gt;I joined a wedding-tech company in December 2025.&lt;/p&gt;

&lt;p&gt;Like every developer joining a new team, my first few weeks were spent figuring out three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the application work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the team work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;why does everyone suddenly become religious before a production deployment?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The platform had been running for years. Real customers, real money, a large CMS, serious search traffic, and enough business logic that deleting one innocent-looking &lt;code&gt;if&lt;/code&gt; statement felt like a reasonable way to ruin everyone's weekend.&lt;/p&gt;

&lt;p&gt;It was a &lt;strong&gt;legacy system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I don't use &lt;em&gt;legacy&lt;/em&gt; as an insult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code had survived years in production. Death would've been kinder.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Years of hotfixes, workarounds, and forgotten requirements had become part of the application.&lt;/p&gt;

&lt;p&gt;Eventually, &lt;strong&gt;history becomes architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And I had joined somewhere around season six.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then I Asked About Production
&lt;/h2&gt;

&lt;p&gt;Development happened in &lt;strong&gt;GitLab&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dev branch. Staging. Normal stuff.&lt;/p&gt;

&lt;p&gt;Then I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Which branch is production?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There wasn't one.&lt;/p&gt;

&lt;p&gt;Production lived in &lt;strong&gt;SVN&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subversion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitLab handled development and staging. SVN handled production.&lt;/p&gt;

&lt;p&gt;And the deployment pipeline connecting them was...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a human being.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    │
    ▼
  GitLab
    │
    ▼
 Staging
    │ QA ✓
    ▼
┌─────────┐
│ Human™  │
│ compare │
│ copy    │
│ pray    │
└────┬────┘
     ▼
    SVN
     │
     ▼
Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes we compared files.&lt;/p&gt;

&lt;p&gt;Sometimes we reconstructed changes.&lt;/p&gt;

&lt;p&gt;Sometimes code moved &lt;strong&gt;line by line&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You haven't experienced continuous delivery until the &lt;em&gt;continuous&lt;/em&gt; part is a developer continuously checking whether they copied the right function.&lt;/p&gt;

&lt;p&gt;Worse, Git and SVN had diverged.&lt;/p&gt;

&lt;p&gt;Production had hotfixes staging didn't. Git had changes production didn't.&lt;/p&gt;

&lt;p&gt;They weren't really two environments anymore.&lt;/p&gt;

&lt;p&gt;They were &lt;strong&gt;distant relatives who still shared a surname&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployments Were... Ceremonial
&lt;/h2&gt;

&lt;p&gt;Production releases needed tickets, approvals, and a scheduled window.&lt;/p&gt;

&lt;p&gt;The application wasn't containerized, so deployment also meant downtime.&lt;/p&gt;

&lt;p&gt;Naturally, releases happened early in the morning.&lt;/p&gt;

&lt;p&gt;Because apparently software is more stable before breakfast.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;05:30 — Deploy
06:35 — Developers verify
07:40 — QA verifies
08:00 — Suspicious silence
08:15 — "One small issue"
08:16 — Nobody agrees what "small" means
08:30 — Deployment window closes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If something broke early, rollback.&lt;/p&gt;

&lt;p&gt;If something broke later...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congratulations. Your bug has been promoted to management.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The scary part wasn't even downtime.&lt;/p&gt;

&lt;p&gt;It was that the code QA approved wasn't necessarily identical to what reached production.&lt;/p&gt;

&lt;p&gt;There was always a gap between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"QA approved it."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Production will behave exactly the same."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gap is where developers discover new forms of prayer.&lt;/p&gt;

&lt;p&gt;Eventually, though, I got used to it.&lt;/p&gt;

&lt;p&gt;Which is probably the most dangerous stage of technical debt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"That's just how we do it."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technical debt rarely arrives saying &lt;em&gt;technical debt&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It usually says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Just for this release."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then it gets a chair.&lt;/p&gt;

&lt;p&gt;Then a desk.&lt;/p&gt;

&lt;p&gt;Six years later, &lt;strong&gt;it has admin access and its own bedroom.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Came One Thursday
&lt;/h2&gt;

&lt;p&gt;About two months after joining, we finished another production release.&lt;/p&gt;

&lt;p&gt;QA signed off.&lt;/p&gt;

&lt;p&gt;Nothing caught fire.&lt;/p&gt;

&lt;p&gt;Friday was a holiday.&lt;/p&gt;

&lt;p&gt;Basically a five-star deployment.&lt;/p&gt;

&lt;p&gt;I walked into one of our VP's cabins to say production was done.&lt;/p&gt;

&lt;p&gt;We started talking about the deployment process.&lt;/p&gt;

&lt;p&gt;Fifteen minutes later, we had somehow progressed from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"This is annoying."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Let's migrate it to AWS."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Migrate to AWS.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Beautiful sentence.&lt;/p&gt;

&lt;p&gt;Three words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software has a strange habit of making terrifying amounts of work fit into very short sentences.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Behind those three words were six-plus years of code, data, infrastructure, integrations, and production behavior — all connected in ways we understood, and probably a few we didn't.&lt;/p&gt;

&lt;p&gt;This wasn't:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nb"&gt;.&lt;/span&gt;
docker run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;followed by applause.&lt;/p&gt;

&lt;p&gt;Some parts of the application ran because we understood them.&lt;/p&gt;

&lt;p&gt;Other parts appeared to run because &lt;strong&gt;nobody had informed them they were allowed to stop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The backend would be handled separately.&lt;/p&gt;

&lt;p&gt;I was asked to own the frontend.&lt;/p&gt;

&lt;p&gt;The intelligent response would've been:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let me analyze it first."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, my brain spent approximately five seconds consulting my ego.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I can do it."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I even promised a frontend foundation over the three-day weekend.&lt;/p&gt;

&lt;p&gt;My confidence lasted until I started my bike.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ride Home Improved My Intelligence
&lt;/h2&gt;

&lt;p&gt;Every kilometer introduced a new question.&lt;/p&gt;

&lt;p&gt;SEO-critical pages?&lt;/p&gt;

&lt;p&gt;Complex routing logic?&lt;/p&gt;

&lt;p&gt;Caching?&lt;/p&gt;

&lt;p&gt;Legacy dependencies?&lt;/p&gt;

&lt;p&gt;Undocumented production behavior?&lt;/p&gt;

&lt;p&gt;How much of this thing actually works locally?&lt;/p&gt;

&lt;p&gt;And finally:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can I call him and pretend the three-day estimate was a network issue?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By the time I reached home, I'd mentally migrated the application six times.&lt;/p&gt;

&lt;p&gt;Five failed.&lt;/p&gt;

&lt;p&gt;The sixth required technology that probably doesn't exist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Friday: Zero Useful Commits
&lt;/h2&gt;

&lt;p&gt;Friday, I barely coded.&lt;/p&gt;

&lt;p&gt;I read.&lt;/p&gt;

&lt;p&gt;Traced dependencies.&lt;/p&gt;

&lt;p&gt;Mapped boundaries.&lt;/p&gt;

&lt;p&gt;Tried to understand what we were actually moving.&lt;/p&gt;

&lt;p&gt;The goal became simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't replace today's legacy system with next year's legacy system.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI was already useful, but pointing an agent at six years of production code and saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Modernize this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;felt like a reliable way to generate &lt;strong&gt;40,000 lines of beautifully documented regret.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I eventually settled on a frontend architecture &lt;strong&gt;inspired by Hexagonal Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not the textbook version — the useful part: keep business logic away from framework and infrastructure details, and put APIs and external services behind clear boundaries.&lt;/p&gt;

&lt;p&gt;The point wasn't architecture cosplay.&lt;/p&gt;

&lt;p&gt;It was making sure changing an API or infrastructure detail didn't require open-heart surgery on the entire frontend.&lt;/p&gt;

&lt;p&gt;Saturday disappeared.&lt;/p&gt;

&lt;p&gt;Then Sunday.&lt;/p&gt;

&lt;p&gt;By Monday, I had a foundation.&lt;/p&gt;

&lt;p&gt;Not the migrated application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A place where one could actually be built.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Everyone Got Involved
&lt;/h2&gt;

&lt;p&gt;I started migrating alongside normal sprint work.&lt;/p&gt;

&lt;p&gt;This quickly revealed an advanced software-engineering principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Oh. This is going to need more people.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I did what any responsible engineer would do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I trapped a backend engineer who knew the legacy system into joining me.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By the time he realized what he'd signed up for, &lt;strong&gt;he was already in the Git history. No refunds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;His knowledge was more valuable than any documentation.&lt;/p&gt;

&lt;p&gt;Because the most dangerous legacy code isn't ugly code.&lt;/p&gt;

&lt;p&gt;It's ugly code that &lt;strong&gt;looks unnecessary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Delete it, feel intelligent, and three days later discover it was quietly holding a revenue flow together.&lt;/p&gt;

&lt;p&gt;Eventually, the team joined.&lt;/p&gt;

&lt;p&gt;At first, the architecture caused friction.&lt;/p&gt;

&lt;p&gt;Fair enough.&lt;/p&gt;

&lt;p&gt;Something that looks beautiful after two sleepless nights designing it can look like an &lt;strong&gt;elaborate tax scheme&lt;/strong&gt; to everybody else.&lt;/p&gt;

&lt;p&gt;Then people challenged it.&lt;/p&gt;

&lt;p&gt;Changed it.&lt;/p&gt;

&lt;p&gt;Improved it.&lt;/p&gt;

&lt;p&gt;It stopped being &lt;strong&gt;my architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It became &lt;strong&gt;our application&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New World
&lt;/h2&gt;

&lt;p&gt;We moved toward a containerized setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              User
                │
                ▼
         ┌─────────────┐
         │ Akamai Edge │
         │ CDN / Cache │
         └──────┬──────┘
                ▼
         ┌─────────────┐
         │   AWS ALB   │
         └──────┬──────┘
                ▼
         ┌─────────────┐
         │ ECS Fargate │
         │ Containers  │
         └──────┬──────┘
                │
        ┌───────┴───────┐
        ▼               ▼
     Next.js         Backend APIs
    SSR / ISR             │
                          ▼
                      Data Layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; handled SSR and ISR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ECS Fargate&lt;/strong&gt; ran containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ALB&lt;/strong&gt; routed traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Akamai&lt;/strong&gt; handled the edge.&lt;/p&gt;

&lt;p&gt;For the first time, production could be built from source instead of being lovingly reconstructed by humans.&lt;/p&gt;

&lt;p&gt;Beautiful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suspiciously beautiful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because this was also an SEO-heavy platform, we had to preserve URLs, redirects, metadata, rendering behavior, and caching.&lt;/p&gt;

&lt;p&gt;Turns out search engines don't care that your architecture diagram looks cleaner.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration Day
&lt;/h2&gt;

&lt;p&gt;Before cutover, we prepared backups, a rollback plan, database movement, DNS, ALB health checks, monitoring, and the WIP page.&lt;/p&gt;

&lt;p&gt;We also temporarily reduced the &lt;strong&gt;Akamai edge TTL&lt;/strong&gt; so changes would propagate faster.&lt;/p&gt;

&lt;p&gt;This seemed sensible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Friday, around 6 PM:&lt;/p&gt;

&lt;p&gt;Code freeze.&lt;/p&gt;

&lt;p&gt;WIP page up.&lt;/p&gt;

&lt;p&gt;Database moved.&lt;/p&gt;

&lt;p&gt;Containers online.&lt;/p&gt;

&lt;p&gt;Domains switched.&lt;/p&gt;

&lt;p&gt;ALB targets healthy.&lt;/p&gt;

&lt;p&gt;Logs streaming.&lt;/p&gt;

&lt;p&gt;Most conversations became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Done?"&lt;/p&gt;

&lt;p&gt;"Checked."&lt;/p&gt;

&lt;p&gt;"Check again."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eventually, WIP came down.&lt;/p&gt;

&lt;p&gt;Homepage loaded.&lt;/p&gt;

&lt;p&gt;Authentication worked.&lt;/p&gt;

&lt;p&gt;Core flows worked.&lt;/p&gt;

&lt;p&gt;SEO pages rendered.&lt;/p&gt;

&lt;p&gt;APIs responded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We had actually migrated it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This would've been an excellent place for the story to end.&lt;/p&gt;

&lt;p&gt;Production disagreed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Is Memory Still Going Up?
&lt;/h2&gt;

&lt;p&gt;Real traffic arrived.&lt;/p&gt;

&lt;p&gt;Memory climbed.&lt;/p&gt;

&lt;p&gt;In lower environments, the frontend might idle around &lt;strong&gt;150–200 MB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Production crossed &lt;strong&gt;2 GiB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then we looked at request metrics.&lt;/p&gt;

&lt;p&gt;Some dashboards were reporting traffic in the &lt;strong&gt;tens of thousands of requests per second&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's probably not ideal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Crawler storm?&lt;/p&gt;

&lt;p&gt;Scraper?&lt;/p&gt;

&lt;p&gt;DDoS?&lt;/p&gt;

&lt;p&gt;So began the bot hunt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Everyone Is a Suspect
&lt;/h2&gt;

&lt;p&gt;We had:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Akamai&lt;/strong&gt; for edge traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ALB metrics&lt;/strong&gt; for origin traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loki&lt;/strong&gt; for application logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt; for infrastructure.&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;Grafana&lt;/strong&gt; for converting numbers into anxiety.&lt;/p&gt;

&lt;p&gt;We correlated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP addresses&lt;/li&gt;
&lt;li&gt;User agents&lt;/li&gt;
&lt;li&gt;Routes&lt;/li&gt;
&lt;li&gt;Cache hits and misses&lt;/li&gt;
&lt;li&gt;Response codes&lt;/li&gt;
&lt;li&gt;Origin request rates&lt;/li&gt;
&lt;li&gt;Container memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We checked IP reputation.&lt;/p&gt;

&lt;p&gt;Blocked obvious bots.&lt;/p&gt;

&lt;p&gt;Filtered suspicious user agents.&lt;/p&gt;

&lt;p&gt;Checked for origin bypass.&lt;/p&gt;

&lt;p&gt;Inspected cache headers.&lt;/p&gt;

&lt;p&gt;Streamed logs.&lt;/p&gt;

&lt;p&gt;Watched Grafana.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find suspicious traffic
        │
        ▼
Block it
        │
        ▼
Watch Grafana
        │
        ▼
Find another pattern
        │
        ▼
Watch Grafana
        │
        ▼
Question career choices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It felt like operating an extremely boring air-defense system.&lt;/p&gt;

&lt;p&gt;Except the missiles were &lt;strong&gt;HTTP GET requests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Midnight passed.&lt;/p&gt;

&lt;p&gt;Then 1 AM.&lt;/p&gt;

&lt;p&gt;Then 2 AM.&lt;/p&gt;

&lt;p&gt;At some point, our VP looked at us and said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Let's stop. We'll continue tomorrow."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fair.&lt;/p&gt;

&lt;p&gt;He had a family to go home to.&lt;/p&gt;

&lt;p&gt;Well, I had Grafana.&lt;/p&gt;

&lt;p&gt;A few of us continued until around &lt;strong&gt;6:30 AM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I went home, freshened up...&lt;/p&gt;

&lt;p&gt;and came back.&lt;/p&gt;

&lt;p&gt;This was not resilience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I simply couldn't mentally close the browser tab.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please don't take this as career advice.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Plot Twist: We Were Attacking Ourselves
&lt;/h2&gt;

&lt;p&gt;Saturday morning.&lt;/p&gt;

&lt;p&gt;Almost empty office.&lt;/p&gt;

&lt;p&gt;Grafana. Loki. Akamai. AWS. Logs.&lt;/p&gt;

&lt;p&gt;Too many tabs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three nearly-dead neurons left. All three were debugging production.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then we stopped asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Who's attacking us?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What if nobody is?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The frontend used &lt;strong&gt;Next.js Incremental Static Regeneration (ISR)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During migration, we'd shortened cache durations because we wanted changes to propagate quickly.&lt;/p&gt;

&lt;p&gt;At the CDN layer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short Akamai TTL → more requests reaching origin.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the application layer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short ISR revalidation → popular pages regenerating more often.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both decisions looked reasonable individually.&lt;/p&gt;

&lt;p&gt;Together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 │
 ▼
Short Edge TTL
 │
 ▼
More Origin Requests
 │
 ▼
Low ISR Revalidation
 │
 ▼
Frequent Regeneration
 │
 ▼
SSR + Data Fetching
 │
 ▼
CPU + Memory Pressure
 │
 ▼
Grafana
 │
 ▼
"WE'RE UNDER ATTACK!"
 │
 ▼
No.

It's us.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There it was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js wasn't broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Akamai wasn't broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS wasn't broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The load balancer wasn't secretly plotting against us.&lt;/p&gt;

&lt;p&gt;Every component was doing exactly what we'd configured it to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our assumptions were broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are the bugs that hurt the ego just enough to become permanent memories.&lt;/p&gt;

&lt;p&gt;We adjusted ISR revalidation.&lt;/p&gt;

&lt;p&gt;Restored saner edge caching.&lt;/p&gt;

&lt;p&gt;Reduced unnecessary origin work.&lt;/p&gt;

&lt;p&gt;Then we stared at Grafana again.&lt;/p&gt;

&lt;p&gt;Traffic dropped.&lt;/p&gt;

&lt;p&gt;Memory settled.&lt;/p&gt;

&lt;p&gt;Origin pressure fell.&lt;/p&gt;

&lt;p&gt;The application stopped trying to kill itself.&lt;/p&gt;

&lt;p&gt;Stupid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But beautiful.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Changed
&lt;/h2&gt;

&lt;p&gt;The migration didn't magically make everything perfect.&lt;/p&gt;

&lt;p&gt;Production immediately made sure we understood that.&lt;/p&gt;

&lt;p&gt;But we had changed something fundamental.&lt;/p&gt;

&lt;p&gt;Production was no longer manually reconstructed from a separate source-control world.&lt;/p&gt;

&lt;p&gt;Containers gave us reproducible runtimes.&lt;/p&gt;

&lt;p&gt;AWS gave us observable infrastructure.&lt;/p&gt;

&lt;p&gt;Akamai became part of an intentional caching strategy.&lt;/p&gt;

&lt;p&gt;And we finally understood much more of what happened between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That alone felt enormous.&lt;/p&gt;




&lt;h2&gt;
  
  
  Four Years Earlier, I Wasn't a Software Engineer
&lt;/h2&gt;

&lt;p&gt;My original background is &lt;strong&gt;mechanical engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I moved into software because I liked building things and understanding how they worked.&lt;/p&gt;

&lt;p&gt;Kidding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short-term dopamine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four years later, I was sitting in an almost empty office debugging CDN caching, ISR, container memory, and load-balancer traffic on a production system we'd just moved to AWS.&lt;/p&gt;

&lt;p&gt;I still have an absurd amount to learn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which is disappointing. I thought that was it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That weekend made this painfully obvious.&lt;/p&gt;

&lt;p&gt;But it also reminded me why I chose this job.&lt;/p&gt;

&lt;p&gt;We started with something we didn't completely understand.&lt;/p&gt;

&lt;p&gt;We designed.&lt;/p&gt;

&lt;p&gt;We argued.&lt;/p&gt;

&lt;p&gt;We broke assumptions.&lt;/p&gt;

&lt;p&gt;We asked for help.&lt;/p&gt;

&lt;p&gt;We shipped.&lt;/p&gt;

&lt;p&gt;Production punched us in the face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And we fixed that too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sleep is an excellent technology. I strongly recommend adopting it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  I Hope AI Never Takes This Part Away
&lt;/h2&gt;

&lt;p&gt;AI was there.&lt;/p&gt;

&lt;p&gt;GPT/Claude sat beside Grafana, Loki, AWS consoles, terminals, and documentation.&lt;/p&gt;

&lt;p&gt;I use AI every day.&lt;/p&gt;

&lt;p&gt;It makes me faster.&lt;/p&gt;

&lt;p&gt;But I remember when being stuck meant reading documentation, digging through source code, finding a seven-year-old Stack Overflow answer from some random user who somehow knew exactly what was wrong, breaking something, fixing it, and slowly building the mental model yourself. &lt;strong&gt;Mental model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don't want all of that back.&lt;/p&gt;

&lt;p&gt;Nobody needs to manually center another &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; for character development.&lt;/p&gt;

&lt;p&gt;But I hope we don't optimize away &lt;strong&gt;understanding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let AI write boilerplate.&lt;/p&gt;

&lt;p&gt;Let it explain logs.&lt;/p&gt;

&lt;p&gt;Let it help debug.&lt;/p&gt;

&lt;p&gt;But give me the architecture decisions.&lt;/p&gt;

&lt;p&gt;Give me the production incidents.&lt;/p&gt;

&lt;p&gt;Give me the bug where &lt;strong&gt;every component is working correctly and the entire system is still wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Give me that moment when Grafana finally starts moving in the right direction and everyone realizes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Oh. We were the DDoS.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because somewhere between &lt;strong&gt;SVN, containers, AWS, Akamai, ISR, an almost-melted origin, and a Saturday morning with far too little sleep...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I remembered why I chose software engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And I'd still choose it again.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Names, domains, and identifying project details have intentionally been generalized. The technical events and lessons are based on a real production migration.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
