<?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: Muhammad Ahsan</title>
    <description>The latest articles on DEV Community by Muhammad Ahsan (@muhammadahsanmirza).</description>
    <link>https://dev.to/muhammadahsanmirza</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1502877%2F29f33e23-dbda-4090-ae12-5c7e541cd94e.jpg</url>
      <title>DEV Community: Muhammad Ahsan</title>
      <link>https://dev.to/muhammadahsanmirza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhammadahsanmirza"/>
    <language>en</language>
    <item>
      <title>When One Line of Code Works Everywhere - Except Behind CloudFront</title>
      <dc:creator>Muhammad Ahsan</dc:creator>
      <pubDate>Mon, 16 Feb 2026 05:44:03 +0000</pubDate>
      <link>https://dev.to/muhammadahsanmirza/when-one-line-of-code-works-everywhere-except-behind-cloudfront-4hek</link>
      <guid>https://dev.to/muhammadahsanmirza/when-one-line-of-code-works-everywhere-except-behind-cloudfront-4hek</guid>
      <description>&lt;p&gt;&lt;strong&gt;How a Single CDN Addition Broke Our App, and What It Taught Us About the Invisible Contract Between Infrastructure and Code&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Your code doesn't run in a vacuum. It runs on infrastructure. And infrastructure has opinions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Setup That Should Have Been Identical
&lt;/h2&gt;

&lt;p&gt;We had a production-grade AI chatbot platform  a Next.js dashboard backed by a FastAPI server. Three AWS deployments, same codebase, same Docker image, same CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server A&lt;/strong&gt; and &lt;strong&gt;Server B&lt;/strong&gt; worked flawlessly. Users could open a chat, send a message, and get an AI response. Simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server C&lt;/strong&gt; did something different. When a user sent the &lt;em&gt;very first&lt;/em&gt; message in a new chat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The screen blinked&lt;/li&gt;
&lt;li&gt;The message vanished&lt;/li&gt;
&lt;li&gt;No response appeared&lt;/li&gt;
&lt;li&gt;The network tab showed a cancelled request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the maddening part  if the user &lt;em&gt;refreshed the page&lt;/em&gt;, the chat appeared in the sidebar. The backend had received and processed the message. The data was there. The UI just... self-destructed before it could render.&lt;/p&gt;

&lt;p&gt;Same code. Same image. Three servers. One broken.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Debugging Spiral
&lt;/h2&gt;

&lt;p&gt;We started where any engineer would  the code.&lt;/p&gt;

&lt;p&gt;We checked the API layer. Intact. We checked the Redux store. Correct. We checked the authentication interceptors. No rogue logouts. We added debug logging to every layer  component mount/unmount, axios interceptors, Redux dispatches.&lt;/p&gt;

&lt;p&gt;The logs told us something strange: &lt;strong&gt;the entire React component tree was unmounting and remounting during the first message send.&lt;/strong&gt; Not a re-render. A full destruction and reconstruction. The Redux store was being wiped clean mid-API-call.&lt;/p&gt;

&lt;p&gt;This wasn't a React bug. This was a &lt;em&gt;navigation&lt;/em&gt; event.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Invisible Culprit
&lt;/h2&gt;

&lt;p&gt;Here's the code that worked perfectly on two servers and catastrophically failed on the third:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ChatBlank.tsx  The "new chat" screen&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Create optimistic thread in Redux&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;addThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;optimisticThread&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setCurrentThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tempThreadId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Navigate to the thread view&lt;/span&gt;
  &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/dashboard/chat?threadKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tempThreadId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Fire the API call&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chatApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Update with real data&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;replaceThreadId&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;oldId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tempThreadId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;newThread&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the surface, this is textbook optimistic UI. Create a temporary thread, navigate to it, fire the API, swap in real data when it arrives. And on Servers A and B, it worked exactly like that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server C had one infrastructure difference: CloudFront sat in front of Nginx.&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;Server A: Browser → Nginx → Next.js     ✅
Server B: Browser → Nginx → Next.js     ✅
Server C: Browser → CloudFront → Nginx → Next.js  💥
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Chain Reaction
&lt;/h2&gt;

&lt;p&gt;Here's what &lt;code&gt;router.replace()&lt;/code&gt; actually does under the hood in Next.js App Router (v14+):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It sends an HTTP request to the server with special headers: &lt;code&gt;RSC: 1&lt;/code&gt;, &lt;code&gt;Next-Router-State-Tree&lt;/code&gt;, &lt;code&gt;Next-Url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The server responds with a lightweight RSC payload (&lt;code&gt;text/x-component&lt;/code&gt;)  not full HTML&lt;/li&gt;
&lt;li&gt;React reconciles the diff and updates the DOM in-place&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the &lt;strong&gt;React Server Components flight protocol&lt;/strong&gt;. It's elegant and fast  &lt;em&gt;when those headers reach the server intact.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CloudFront's default Origin Request Policy (&lt;code&gt;Managed-HostHeaderOnly&lt;/code&gt;) forwards exactly one header to the origin: &lt;code&gt;Host&lt;/code&gt;. Every other header  including &lt;code&gt;RSC: 1&lt;/code&gt;  gets &lt;strong&gt;silently stripped&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when &lt;code&gt;router.replace()&lt;/code&gt; fired on Server C:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser sends: &lt;code&gt;GET /dashboard/chat?threadKey=abc&lt;/code&gt; with &lt;code&gt;RSC: 1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CloudFront strips &lt;code&gt;RSC: 1&lt;/code&gt;, forwards a plain GET&lt;/li&gt;
&lt;li&gt;Next.js sees a normal page request, responds with &lt;strong&gt;full HTML&lt;/strong&gt; (&lt;code&gt;text/html&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The browser receives HTML where it expected an RSC payload&lt;/li&gt;
&lt;li&gt;Next.js client-side router &lt;strong&gt;falls back to a hard navigation&lt;/strong&gt;  full page reload&lt;/li&gt;
&lt;li&gt;The Redux store is destroyed&lt;/li&gt;
&lt;li&gt;The in-flight &lt;code&gt;sendMessage&lt;/code&gt; API call is cancelled&lt;/li&gt;
&lt;li&gt;The page remounts with a blank slate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The message reached the backend (it was already in-flight before the reload), but the response had nowhere to land. The component that dispatched it no longer existed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Lesson: Infrastructure Is a Runtime Dependency
&lt;/h2&gt;

&lt;p&gt;The fix wasn't a one-line change. It required rethinking the assumption that was baked into the code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Client-side navigation is always a lightweight, in-place update."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That assumption holds when your infrastructure is transparent to the framework's protocol. The moment a CDN, proxy, or WAF modifies headers, the contract breaks  and it breaks &lt;em&gt;silently&lt;/em&gt;. No error. No warning. Just a fallback behavior that looks like a bug in your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Decouple Navigation from API Calls
&lt;/h3&gt;

&lt;p&gt;We moved the API call out of the component lifecycle entirely, into a Redux thunk. And we replaced &lt;code&gt;router.replace()&lt;/code&gt; with &lt;code&gt;window.history.replaceState()&lt;/code&gt;  a browser-native API that updates the URL without triggering any server request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ChatBlank.tsx  After fix&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Create optimistic thread in Redux&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;addThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;optimisticThread&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setCurrentThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tempThreadId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. NO router.replace()  let React re-render via Redux state change&lt;/span&gt;
  &lt;span class="c1"&gt;// 3. Fire API call at Redux level (survives component unmount)&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sendFirstMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tempThreadId&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// page.tsx  View switches on Redux state, not URL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeThreadId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;threadKey&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;currentThreadId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;composeMode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;threadKey&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;currentThreadId&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChatBlank&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChatThread&lt;/span&gt; &lt;span class="na"&gt;threadId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeThreadId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// thunks/chat.ts  API call + URL update happens at store level&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendFirstMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chatApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;replaceThreadId&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;oldId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tempThreadId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newThread&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setCurrentThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;external_chat_id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// Update URL only after API completes, using browser API (no RSC fetch)&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replaceState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="s2"&gt;`/dashboard/chat?threadKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;external_chat_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What changed:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;router.replace()&lt;/code&gt; triggers RSC fetch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;window.history.replaceState()&lt;/code&gt; – no server request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API call lives in component (dies on unmount)&lt;/td&gt;
&lt;td&gt;API call lives in Redux thunk (survives any re-render)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View switches based on URL&lt;/td&gt;
&lt;td&gt;View switches based on Redux state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL updates reactively via useEffect&lt;/td&gt;
&lt;td&gt;URL updates imperatively after API success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Broader Takeaway
&lt;/h2&gt;

&lt;p&gt;This bug didn't appear in any test suite. It couldn't  it only manifested when a CDN sat between the browser and the server. The code was correct. The infrastructure was correctly configured for a traditional web app. But Next.js App Router isn't a traditional web app. It has an &lt;strong&gt;implicit runtime protocol&lt;/strong&gt; (RSC flight) that requires specific headers to pass through every layer of your infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three rules we now follow:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Treat your deployment topology as a code dependency.&lt;/strong&gt;&lt;br&gt;
If your code assumes &lt;code&gt;router.push()&lt;/code&gt; does a lightweight RSC fetch, your infrastructure &lt;em&gt;must&lt;/em&gt; forward RSC headers. Document this. Test this. Don't discover it in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Never couple API calls to navigation events.&lt;/strong&gt;&lt;br&gt;
If a user action requires both "navigate somewhere" and "call an API," those should be independent operations. Navigation can fail, be intercepted, or behave differently across environments. Your API call shouldn't be collateral damage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The same Docker image on different infrastructure is NOT the same deployment.&lt;/strong&gt;&lt;br&gt;
A CDN, a WAF, a reverse proxy  each one is a participant in your application's runtime behavior. "Works on my server" is the new "works on my machine."&lt;/p&gt;




&lt;h2&gt;
  
  
  The Humbling Part
&lt;/h2&gt;

&lt;p&gt;The CloudFront distribution was added to Server C as a performance optimization  faster static asset delivery, edge caching, DDoS protection. A routine infrastructure improvement. No one thought to check whether the CDN would interfere with a framework-level protocol that operates over HTTP headers.&lt;/p&gt;

&lt;p&gt;It took &lt;strong&gt;a few hours of debugging&lt;/strong&gt; across application code, Redux state, authentication flows, and network traces before we even looked at the infrastructure layer. The fix was ultimately ~40 lines of code. The diagnosis was the hard part.&lt;/p&gt;

&lt;p&gt;Sometimes the most dangerous bugs aren't in the code you write. They're in the assumptions your code makes about the world it runs in.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
      <category>debugging</category>
    </item>
    <item>
      <title>The Myth of the 10x Developer 🦄</title>
      <dc:creator>Muhammad Ahsan</dc:creator>
      <pubDate>Mon, 28 Apr 2025 11:32:24 +0000</pubDate>
      <link>https://dev.to/muhammadahsanmirza/the-myth-of-the-10x-developer-153c</link>
      <guid>https://dev.to/muhammadahsanmirza/the-myth-of-the-10x-developer-153c</guid>
      <description>&lt;p&gt;The tech world loves the idea of the "10x developer" — someone who can supposedly produce 10 times more results than a typical programmer.&lt;/p&gt;

&lt;p&gt;But is it real? Let's dive in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a 10x Developer?
&lt;/h2&gt;

&lt;p&gt;A 10x developer is imagined to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write code 10x faster&lt;/li&gt;
&lt;li&gt;Create 10x fewer bugs&lt;/li&gt;
&lt;li&gt;Build 10x more scalable systems&lt;/li&gt;
&lt;li&gt;Be 10x more productive solo than average devs in teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sounds impressive, right? But this idea is more myth than reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the 10x Developer Is a Myth
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Productivity isn't linear:&lt;/strong&gt; Programming is creative, complex, and deeply collaborative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context matters:&lt;/strong&gt; Tools, teams, and project complexity shape productivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain-specific strengths:&lt;/strong&gt; No one is 10x at everything (frontend ≠ backend ≠ DevOps).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team dynamics:&lt;/strong&gt; Big systems need communication, not just code speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's More Important Than Being 10x
&lt;/h2&gt;

&lt;p&gt;Instead of chasing myths, developers and teams should focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;strong&gt;Continuous Learning:&lt;/strong&gt; Stay curious, stay humble.&lt;/li&gt;
&lt;li&gt;🗣️ &lt;strong&gt;Communication Skills:&lt;/strong&gt; Share knowledge and ideas clearly.&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Design Thinking:&lt;/strong&gt; Solve real problems with empathy and creativity.&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Agility:&lt;/strong&gt; Adapt to change and feedback.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Attention to Detail:&lt;/strong&gt; Write thoughtful, maintainable code.&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Teamwork:&lt;/strong&gt; Elevate each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advice for Developers
&lt;/h2&gt;

&lt;p&gt;Stop trying to be a 10x myth.&lt;br&gt;&lt;br&gt;
Start becoming a strong, reliable, ever-improving team player.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advice for Employers
&lt;/h2&gt;

&lt;p&gt;Stop searching for unicorns.&lt;br&gt;&lt;br&gt;
Start investing in building &lt;em&gt;healthy, high-performance teams&lt;/em&gt; with growth mindsets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e7l77r8kma83e03n3cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e7l77r8kma83e03n3cd.png" alt="Choose Team aPlayer" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🏁 &lt;strong&gt;In the end, great software is not built by superheroes.&lt;br&gt;&lt;br&gt;
It’s built by great teams.&lt;/strong&gt; 🏁&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Build Fast vs Build Right 🛠️</title>
      <dc:creator>Muhammad Ahsan</dc:creator>
      <pubDate>Fri, 25 Apr 2025 10:46:55 +0000</pubDate>
      <link>https://dev.to/muhammadahsanmirza/build-fast-vs-build-right-212k</link>
      <guid>https://dev.to/muhammadahsanmirza/build-fast-vs-build-right-212k</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;"Move fast and break things" sounds exciting… until you’re the one cleaning up the mess.&lt;/p&gt;

&lt;p&gt;In software engineering, speed can be deceptive. Often, the push to “build fast” leads to unscalable systems, messy architecture, and endless debugging.&lt;/p&gt;

&lt;p&gt;Like financial debt, &lt;strong&gt;technical debt&lt;/strong&gt; must be repaid. And unless it's a disposable one-off, building fast &lt;em&gt;without thinking long-term&lt;/em&gt; only makes the project &lt;em&gt;slower&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make It Work → Make It Right → Make It Fast
&lt;/h2&gt;

&lt;p&gt;This mantra has been around for a reason. Here's what it means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make it Work&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Get the core functionality running. Validate your idea. Don’t over-polish at this stage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make it Right&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Refactor. Clean up. Introduce structure. Follow standards. Think about readability, reusability, and maintainability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make it Fast&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Only optimize after you're sure the code is solid. Premature optimization = unnecessary complexity.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  But Reality Isn’t Always Linear
&lt;/h2&gt;

&lt;p&gt;Sometimes, the real-world pressure flips the process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVPs need to ship &lt;em&gt;yesterday&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Product-market fit takes priority.&lt;/li&gt;
&lt;li&gt;Timelines are tight.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still, &lt;strong&gt;doing things right doesn’t always take longer&lt;/strong&gt;. Experience teaches you to build smart from the beginning — scalable layout systems, modular code, naming conventions. These don't slow you down, they &lt;strong&gt;protect your velocity&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Personal Lesson
&lt;/h2&gt;

&lt;p&gt;At my first job, I rushed to ship a dashboard. I skipped layout planning, ignored consistency, and hardcoded everything.&lt;/p&gt;

&lt;p&gt;It worked — barely.&lt;/p&gt;

&lt;p&gt;Every minor change required editing 6–7 places. I saved no time. I just delayed the cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;👉 &lt;em&gt;Build right = build fast in the long run.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Even MVPs benefit from thoughtful design. Don’t trade future progress for present speed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvec4usykafm56wvp61e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvec4usykafm56wvp61e.png" alt="Comparison of Short Term Speed vs Long term Efficiency" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you had moments where "fast" came back to bite you?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. If you liked this, follow me for more honest takes on software development.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>softwareengineering</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Frontend Isn't Just UI</title>
      <dc:creator>Muhammad Ahsan</dc:creator>
      <pubDate>Wed, 23 Apr 2025 09:19:18 +0000</pubDate>
      <link>https://dev.to/muhammadahsanmirza/frontend-isnt-just-ui-289d</link>
      <guid>https://dev.to/muhammadahsanmirza/frontend-isnt-just-ui-289d</guid>
      <description>&lt;p&gt;When someone says "frontend," many still think it means styling buttons and aligning layouts. But frontend engineering is &lt;strong&gt;way more than UI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At its core, it's about building &lt;strong&gt;systems that serve human experiences&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 System Thinking in the Frontend
&lt;/h2&gt;

&lt;p&gt;Frontend engineers make design decisions that ripple through the entire product.&lt;/p&gt;

&lt;p&gt;We think in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data flow:&lt;/strong&gt; Where does the data come from? Who owns it? How is it updated?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State models:&lt;/strong&gt; What does the UI look like in each state? Loading, error, empty, success?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component architecture:&lt;/strong&gt; How do we break the UI into reusable, testable pieces?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience flow:&lt;/strong&gt; How does a user's action change the application state or behavior?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility and edge cases:&lt;/strong&gt; Can everyone, regardless of ability or device, use the product?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;system thinking&lt;/strong&gt; — seeing the frontend not as isolated screens but as part of a living, breathing system that reacts, updates, and scales.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 UI is Static. Frontend is Dynamic.
&lt;/h2&gt;

&lt;p&gt;Let’s break it down:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UI (Visual Layer)&lt;/th&gt;
&lt;th&gt;Frontend Engineering&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Buttons and colors&lt;/td&gt;
&lt;td&gt;State handling (e.g., Redux)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layout and spacing&lt;/td&gt;
&lt;td&gt;API integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typography&lt;/td&gt;
&lt;td&gt;Component lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Icons and visuals&lt;/td&gt;
&lt;td&gt;Conditional rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Style guides&lt;/td&gt;
&lt;td&gt;Form validation &amp;amp; error flows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 A Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine building a simple &lt;strong&gt;to-do app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Visually, it’s just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An input field
&lt;/li&gt;
&lt;li&gt;A list
&lt;/li&gt;
&lt;li&gt;Some checkboxes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But behind the scenes, you’re designing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A state model&lt;/strong&gt;: What happens when a task is marked done? Deleted? Filtered?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A component structure&lt;/strong&gt;: List → Item → Checkbox → Actions
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data synchronization&lt;/strong&gt;: Does this update locally? Remotely? In both?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling&lt;/strong&gt;: What if the server fails?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usability&lt;/strong&gt;: Can a user with screen reader interact with it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is system-level thinking — applied to the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbjtxwudvc193n3t9l9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbjtxwudvc193n3t9l9g.png" alt="FRONTEND Lifecycle" width="800" height="770"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 It’s About Building Products That Think
&lt;/h2&gt;

&lt;p&gt;Frontend engineering today is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing &lt;strong&gt;human-centered systems&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Balancing &lt;strong&gt;speed and structure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bridging &lt;strong&gt;design with logic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Making products that scale &lt;em&gt;and&lt;/em&gt; feel good to use&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👨‍💻 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Frontend isn't fluff. It's not just CSS and colors.&lt;/p&gt;

&lt;p&gt;It’s the &lt;strong&gt;glue between humans and machines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Whether you’re designing a dashboard, a mobile app, or an interactive form — you’re thinking in systems. And that’s where the real challenge (and joy) lies.&lt;/p&gt;




&lt;p&gt;💬 &lt;strong&gt;Do you see frontend as a system too? Or just presentation? Let’s talk in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🌀 Vibe Coding: Hype, Help, or Something In Between?</title>
      <dc:creator>Muhammad Ahsan</dc:creator>
      <pubDate>Mon, 21 Apr 2025 09:04:06 +0000</pubDate>
      <link>https://dev.to/muhammadahsanmirza/vibe-coding-hype-help-or-something-in-between-27ce</link>
      <guid>https://dev.to/muhammadahsanmirza/vibe-coding-hype-help-or-something-in-between-27ce</guid>
      <description>&lt;p&gt;Over the last couple of years, the AI space has exploded with new ideas and buzzwords: LLMs, agentic AI, multi-modal models… and now, the curious rise of &lt;strong&gt;"vibe coding."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might’ve heard this term tossed around by influencers and tech Twitter. It’s essentially about &lt;strong&gt;coding with the help of AI&lt;/strong&gt; — but more casually. Less deep-diving into documentation, and more relying on tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;bolt.new &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lovable.dev/" rel="noopener noreferrer"&gt;loveable.dev &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://windsurf.com/editor" rel="noopener noreferrer"&gt;Windsurf &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://traeide.com/" rel="noopener noreferrer"&gt;Trae Editor&lt;/a&gt;
…and dozens more launching every month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first glance, it sounds magical. Build apps just by talking to an AI? Dream come true, right?&lt;/p&gt;

&lt;p&gt;But here’s the thing: &lt;strong&gt;real-world development isn’t just vibes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔍 My Personal Experiment with Vibe Coding&lt;br&gt;
I wanted to test this out for myself, so I asked an AI tool to generate a basic &lt;strong&gt;portfolio site.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It started off… meh.&lt;br&gt;
Despite clearly mentioning the framework I wanted, the tool picked a completely different stack. Fixing bugs took more time than expected. And to get anything non-trivial done, I had to explain every single logic flow in &lt;strong&gt;plain, ultra-specific English.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the project grew more complex, this back-and-forth quickly turned frustrating.&lt;br&gt;
It became clear: vibe coding &lt;strong&gt;wasn’t scalable&lt;/strong&gt; for a structured project.&lt;/p&gt;




&lt;p&gt;🤖 So Who &lt;em&gt;Is&lt;/em&gt; Vibe Coding For?&lt;br&gt;
I’d say vibe coding isn’t really beginner-friendly.&lt;br&gt;
Here’s why:&lt;/p&gt;

&lt;p&gt;✅ It requires &lt;strong&gt;clear, technical prompting&lt;/strong&gt;&lt;br&gt;
✅ You need to &lt;strong&gt;validate the code&lt;/strong&gt; AI produces&lt;br&gt;
✅ You must &lt;strong&gt;debug or refactor&lt;/strong&gt; things when they break (and they will break)&lt;/p&gt;

&lt;p&gt;It’s actually more beneficial for mid-to-senior developers who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know how to guide the AI properly &lt;/li&gt;
&lt;li&gt;Understand code well enough to debug and iterate &lt;/li&gt;
&lt;li&gt;Use AI for productivity boosts, not total replacements&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💡 Where Vibe Coding Shines&lt;br&gt;
That said, I’m not against the approach at all.&lt;/p&gt;

&lt;p&gt;Vibe coding is great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid prototyping &lt;/li&gt;
&lt;li&gt;UI mockups and landing pages &lt;/li&gt;
&lt;li&gt;Brainstorming technical flows &lt;/li&gt;
&lt;li&gt;Automating repetitive boilerplate tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It saves time and unlocks creativity.&lt;br&gt;
Just don’t expect it to replace the deep work of engineering — at least not yet.&lt;/p&gt;




&lt;p&gt;📊 A Visual Summary&lt;br&gt;
Here’s a summary that captures the reality of vibe coding in 2025:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ih5v60ns8quis12fxgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ih5v60ns8quis12fxgc.png" alt="Pros and Cons of Vibe Coding" width="553" height="589"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧠 Final Thoughts&lt;br&gt;
AI is improving rapidly — and I genuinely believe vibe coding will get &lt;em&gt;better&lt;/em&gt; at handling structured logic and long-term projects.&lt;/p&gt;

&lt;p&gt;But today?&lt;br&gt;
It’s a &lt;strong&gt;tool, not a replacement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re just starting out as an engineer, focus on &lt;strong&gt;learning the fundamentals.&lt;/strong&gt; Once you know how to code, vibe coding can absolutely become part of your toolkit.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have you built anything using vibe coding tools?&lt;/strong&gt;&lt;br&gt;
I’d love to hear your experience. Let’s talk!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#AI #SoftwareEngineering #MERNStack #VibeCoding #LLMs #DeveloperJourney #WebDev #PromptEngineering&lt;/strong&gt;&lt;/p&gt;

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