<?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: Smile Gupta</title>
    <description>The latest articles on DEV Community by Smile Gupta (@smilegupta).</description>
    <link>https://dev.to/smilegupta</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%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg</url>
      <title>DEV Community: Smile Gupta</title>
      <link>https://dev.to/smilegupta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smilegupta"/>
    <language>en</language>
    <item>
      <title>😰 System design rounds used to scare me. Until I built a simple 2 2 quadrant to structure my thinking. I’ve finally written about it - with one example of Product Listing Page.</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Mon, 05 May 2025 15:05:12 +0000</pubDate>
      <link>https://dev.to/smilegupta/system-design-rounds-used-to-scare-me-until-i-built-a-simple-2x2-quadrant-to-structure-my-c1n</link>
      <guid>https://dev.to/smilegupta/system-design-rounds-used-to-scare-me-until-i-built-a-simple-2x2-quadrant-to-structure-my-c1n</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-story__hidden-navigation-link"&gt;Scared of System Design? Try This Tradeoff Quadrant&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/smilegupta" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" alt="smilegupta profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/smilegupta" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Smile Gupta
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Smile Gupta
                
              
              &lt;div id="story-author-preview-content-2458558" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/smilegupta" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Smile Gupta&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 4 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" id="article-link-2458558"&gt;
          Scared of System Design? Try This Tradeoff Quadrant
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/systemdesign"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;systemdesign&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;53&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              11&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Mon, 05 May 2025 04:03:48 +0000</pubDate>
      <link>https://dev.to/smilegupta/-geh</link>
      <guid>https://dev.to/smilegupta/-geh</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-story__hidden-navigation-link"&gt;Scared of System Design? Try This Tradeoff Quadrant&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/smilegupta" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" alt="smilegupta profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/smilegupta" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Smile Gupta
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Smile Gupta
                
              
              &lt;div id="story-author-preview-content-2458558" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/smilegupta" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Smile Gupta&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 4 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" id="article-link-2458558"&gt;
          Scared of System Design? Try This Tradeoff Quadrant
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/systemdesign"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;systemdesign&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;53&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              11&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Scared of System Design? Try This Tradeoff Quadrant</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Sun, 04 May 2025 17:49:57 +0000</pubDate>
      <link>https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a</link>
      <guid>https://dev.to/smilegupta/scared-of-system-design-try-this-tradeoff-quadrant-1b4a</guid>
      <description>&lt;p&gt;I’m a frontend engineer.&lt;/p&gt;

&lt;p&gt;And I still remember the first time someone asked me to “design a scalable system.”&lt;/p&gt;

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

&lt;p&gt;No docs. No clear starting point. Just a vague prompt and a blank whiteboard.&lt;/p&gt;

&lt;p&gt;Eventually, I gave up and said, &lt;em&gt;“I don’t think I can do this.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It wasn’t that I didn’t know how to build things - I just didn’t know how to &lt;strong&gt;think&lt;/strong&gt; in system design terms. What to prioritize. What to trade off. What even mattered.&lt;/p&gt;

&lt;p&gt;Over time, through interviews, projects, and a lot of panic-Google moments, I started noticing a pattern in how I approached problems.&lt;/p&gt;

&lt;p&gt;I’d always end up scribbling the same four kinds of thoughts: What we’re solving, How we’re building it, What can go wrong, and How it scales.&lt;/p&gt;

&lt;p&gt;So I started putting them in a simple 2×2 quadrant.&lt;/p&gt;

&lt;p&gt;Not a framework. Not a tool.  &lt;/p&gt;

&lt;p&gt;Just a small thing that helped me &lt;em&gt;feel less stuck&lt;/em&gt; - especially during interviews.&lt;/p&gt;

&lt;p&gt;This blog is me sharing that quadrant, and how you can use it too - whether you're prepping for interviews or just trying to design something with more clarity.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is the Tradeoff Quadrant?
&lt;/h3&gt;

&lt;p&gt;It’s just a 2×2 grid.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Whenever I’m designing something - a new feature, a reusable component, or even prepping for an interview - I draw a big “+” on paper or in my notes and start filling it in.&lt;/p&gt;

&lt;p&gt;Each quadrant forces me to slow down and ask a different kind of question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are we solving?&lt;/strong&gt; - What's the actual user problem? What’s the UX flow? What matters the most?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How will we build it?&lt;/strong&gt; - What components do we need? Which rendering strategy makes sense - CSR, SSR, SSG? Is this a monolith or modular setup?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What can go wrong?&lt;/strong&gt; - What if an API fails? What if data is missing? What happens on slow devices or bad networks?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How will it scale?&lt;/strong&gt; - Will it handle more users? Can it support versioning or A/B testing later? Is it performance-optimized?&lt;/p&gt;

&lt;p&gt;It’s not about filling it “perfectly” - it’s about making your thinking visible.&lt;/p&gt;

&lt;p&gt;The best part? It works whether you're designing a whole page or just a single dropdown.&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%2Feox8tjdtq62zt60abc00.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%2Feox8tjdtq62zt60abc00.png" alt="A 2x2 quadrant titled 'The Tradeoff Quadrant' with four labeled boxes: 'What are we solving?', 'How will we build it?', 'What can go wrong?', and 'How will it scale?'. Used for structuring frontend system design thinking." width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Let’s Apply This: Designing a Product Listing Page (PLP)
&lt;/h3&gt;

&lt;p&gt;Imagine you're working at an e-commerce company and you've been asked to design the frontend system for a &lt;strong&gt;Product Listing Page (PLP)&lt;/strong&gt; -like the ones you see on Amazon, Flipkart, or Myntra.&lt;/p&gt;

&lt;p&gt;The page should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show a grid of products&lt;/li&gt;
&lt;li&gt;Allow filtering by brand, size, price, etc.&lt;/li&gt;
&lt;li&gt;Support sorting (price, popularity, newest first)&lt;/li&gt;
&lt;li&gt;Handle pagination or infinite scroll&lt;/li&gt;
&lt;li&gt;Be mobile- and desktop-friendly&lt;/li&gt;
&lt;li&gt;Work well during high-traffic sale events&lt;/li&gt;
&lt;li&gt;Support deep linking (URL reflects filters and sort)&lt;/li&gt;
&lt;li&gt;Optionally inject ads or sponsored products between rows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oh - and it should be fast, resilient, and easy to maintain over time.&lt;/p&gt;

&lt;p&gt;Before jumping into components or API calls, let’s apply the Tradeoff Quadrant to understand the problem better.&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%2F2q9js56m7n19md0t3bbd.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%2F2q9js56m7n19md0t3bbd.png" alt="A filled Tradeoff Quadrant for a Product Listing Page. Top-left quadrant lists what we’re solving — a grid of products with filters, responsive design, deep linking, and ad injection. Top-right covers how we’ll build it — using CSR with optional SSR, modular components, React Query, and backend-driven ad slots. Bottom-left outlines what can go wrong — API failures, layout shifts due to ads, and JS performance issues. Bottom-right explains how we’ll handle scale — debouncing, virtualization, lazy loading, monitoring ad engagement, and CDN caching." width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Functional and Non-Functional Requirements
&lt;/h3&gt;

&lt;p&gt;Once we’ve clarified the problem using the Tradeoff Quadrant, the next step is to define the &lt;strong&gt;requirements clearly&lt;/strong&gt; - both functional and non-functional.&lt;/p&gt;

&lt;p&gt;This helps prevent scope creep, sets expectations, and ensures you're designing for &lt;em&gt;what actually matters&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’ve also learned (sometimes the hard way 😅) that it’s important to think about &lt;strong&gt;what’s truly required to go to production&lt;/strong&gt;. You can always add more later, but the goal of system design is to &lt;strong&gt;prioritize smartly&lt;/strong&gt;, not just list every possible feature.&lt;/p&gt;

&lt;h4&gt;
  
  
  Functional Requirements
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Must-haves for v1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display a grid of products with image, title, and price&lt;/li&gt;
&lt;li&gt;Allow filtering by key fields like brand, price, and category&lt;/li&gt;
&lt;li&gt;Support basic sort options (e.g., price low to high)&lt;/li&gt;
&lt;li&gt;Enable pagination or infinite scroll&lt;/li&gt;
&lt;li&gt;Reflect filter/sort state in the URL (deep linking)&lt;/li&gt;
&lt;li&gt;Responsive layout that works on mobile and desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nice-to-haves (can be added post-launch):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsored ad injection between rows&lt;/li&gt;
&lt;li&gt;Multi-select filters (e.g., select multiple brands)&lt;/li&gt;
&lt;li&gt;Clear-all filters button&lt;/li&gt;
&lt;li&gt;Breadcrumbs and category metadata&lt;/li&gt;
&lt;li&gt;Prefetch next page data for smoother infinite scroll&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Non-Functional Requirements
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Production must-haves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debounced API calls to avoid unnecessary traffic&lt;/li&gt;
&lt;li&gt;Graceful loading (skeletons or spinners)&lt;/li&gt;
&lt;li&gt;Stable layout - avoid CLS (especially with ad slots)&lt;/li&gt;
&lt;li&gt;Resilience to API failure (fallback UI)&lt;/li&gt;
&lt;li&gt;SEO-ready with SSR for first PLP page&lt;/li&gt;
&lt;li&gt;Keyboard + screen reader accessibility for filters and sort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Post-launch enhancements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telemetry for filter usage, scroll depth, and ad clicks&lt;/li&gt;
&lt;li&gt;SWR/CDN caching for assets and filter config&lt;/li&gt;
&lt;li&gt;Lazy image loading with &lt;code&gt;IntersectionObserver&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A/B testing for product card variants&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Component Architecture for Product Listing Page
&lt;/h3&gt;

&lt;p&gt;Now that we know what the PLP needs to do, let’s break it down into components.&lt;/p&gt;

&lt;p&gt;The idea is to keep things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular and reusable&lt;/li&gt;
&lt;li&gt;Config-driven wherever possible&lt;/li&gt;
&lt;li&gt;Scalable to accommodate features like ads, A/B tests, and SSR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a high-level breakdown of what that might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;PLPPage /&amp;gt;
├── &amp;lt;FilterSidebar /&amp;gt;           ← Brand, size, price filters
│   └── &amp;lt;FilterGroup /&amp;gt;
│       ├── &amp;lt;CheckboxFilter /&amp;gt;
│       └── &amp;lt;RangeSliderFilter /&amp;gt;
├── &amp;lt;SortBar /&amp;gt;                 ← Sort options (dropdown or pills)
├── &amp;lt;ProductList /&amp;gt;             ← Displays product + ad rows
│   └── &amp;lt;ProductRow /&amp;gt;
│       ├── &amp;lt;ProductCard /&amp;gt;
│       └── &amp;lt;SponsoredCard /&amp;gt;   ← Conditionally rendered
├── &amp;lt;PaginationControls /&amp;gt;      ← Or &amp;lt;InfiniteScrollLoader /&amp;gt;
├── &amp;lt;SkeletonLoader /&amp;gt;          ← Loading state for list
├── &amp;lt;EmptyState /&amp;gt;              ← No results found
└── &amp;lt;TelemetryTracker /&amp;gt;        ← Fires scroll, ad impressions, clicks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each of these components plays a specific role in how the page functions and scales.&lt;/p&gt;

&lt;p&gt;Let’s go through them quickly to understand how they fit into the bigger picture.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;PLPPage /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Top-level layout, parses URL params, triggers data fetch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;FilterSidebar /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows filter groups from config (brand, size, price, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;FilterGroup /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Renders a specific type of filter group (checkbox or range)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;CheckboxFilter /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checkbox list filter (e.g., brand)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;RangeSliderFilter /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Price slider or size range selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;SortBar /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sort dropdown or pill selector (e.g., Popularity, Price)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ProductList /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Renders the list of products and sponsored cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ProductRow /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controls row layout (2/4 items)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ProductCard /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows individual product info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;SponsoredCard /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Injected ad or sponsored placement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;PaginationControls /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Next/previous navigation or infinite scroll trigger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;SkeletonLoader /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shimmer/skeletons for loading state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;EmptyState /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shown when no products match the filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;TelemetryTracker /&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tracks scrolls, filter usage, ad clicks, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  API Design for Product Listing Page
&lt;/h3&gt;

&lt;p&gt;Now that the component architecture is in place, the next step is to design &lt;strong&gt;APIs that power the frontend cleanly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our API should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work across verticals (shoes, furniture, books, plants)&lt;/li&gt;
&lt;li&gt;Support both products and sponsored content&lt;/li&gt;
&lt;li&gt;Be config-driven to allow flexibility without hardcoding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thought Process Behind the API Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of coupling the frontend logic to specific filters (like brand, size, material), the API should &lt;strong&gt;drive what filters to show&lt;/strong&gt; via config.&lt;/p&gt;

&lt;p&gt;This way, the &lt;strong&gt;filter sidebar becomes dynamic&lt;/strong&gt;, and the same PLP can be used across different categories with little to no hardcoded logic.&lt;/p&gt;

&lt;p&gt;We also want to &lt;strong&gt;inject ads or sponsored cards&lt;/strong&gt; into the product list - so the response should include a &lt;strong&gt;mixed array of items&lt;/strong&gt;, with each item tagged by its type.&lt;/p&gt;

&lt;p&gt;To control &lt;strong&gt;where&lt;/strong&gt; the sponsored card appears, we use a slotIndex - so the frontend can inject the card at that position without guesswork.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "meta": {
    "total": 1870,
    "page": 3,
    "limit": 20,
    "hasMore": true
  },
  "filters": [
    {
      "type": "checkbox",
      "label": "Brand",
      "key": "brand",
      "options": ["Nike", "Puma", "Adidas"]
    },
    {
      "type": "range",
      "label": "Price",
      "key": "price",
      "min": 799,
      "max": 9999
    },
    {
      "type": "checkbox",
      "label": "Size",
      "key": "size",
      "options": ["6", "7", "8", "9", "10"]
    }
  ],
  "sortOptions": [
    { "label": "Popularity", "value": "popularity" },
    { "label": "Price: Low to High", "value": "price_asc" },
    { "label": "Newest First", "value": "newest" }
  ],
  "items": [
    {
      "type": "product",
      "slotIndex": 0,
      "data": {
        "id": "p123",
        "title": "Nike Air Max",
        "price": 3999,
        "image": "https://cdn/air-max.jpg",
        "rating": 4.5,
        "available": true,
        "badges": ["Best Seller"]
      }
    },
    {
      "type": "ad",
      "slotIndex": 1,
      "data": {
        "id": "ad789",
        "title": "Sponsored: Adidas Originals",
        "image": "https://cdn/ad.jpg",
        "ctaUrl": "https://yourstore.com/adidas-campaign",
        "trackingPixel": "https://track.adid.as/imp.png"
      }
    },
    ...
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why This API Design Works&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Solution in API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Configurable filters&lt;/td&gt;
&lt;td&gt;filters[] object drives rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category-specific logic&lt;/td&gt;
&lt;td&gt;Backend sends only relevant filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sort options&lt;/td&gt;
&lt;td&gt;Included as sortOptions[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad/product mix&lt;/td&gt;
&lt;td&gt;Unified items[] array with type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Placement control&lt;/td&gt;
&lt;td&gt;slotIndex helps render at correct position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend reusability&lt;/td&gt;
&lt;td&gt;One PLP layout works across verticals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Performance Considerations
&lt;/h3&gt;

&lt;p&gt;Once your API and component architecture are in place, the next big question is: “How will this perform in the real world?”&lt;/p&gt;

&lt;p&gt;A Product Listing Page might work fine in local dev, but under real conditions - slow devices, 3G networks, high concurrency - things can fall apart quickly.&lt;/p&gt;

&lt;p&gt;Here’s how I think about performance in PLPs:&lt;/p&gt;

&lt;h4&gt;
  
  
  Pagination and Debouncing
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Always debounce filter and sort API calls to avoid flooding the network&lt;/li&gt;
&lt;li&gt;For infinite scroll, make sure to throttle or lock pagination requests to prevent race conditions&lt;/li&gt;
&lt;li&gt;Add a loading state between pages to give feedback and avoid double fetches&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Virtualization and Lazy Loading
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Use virtualization libraries like &lt;code&gt;react-window&lt;/code&gt; or &lt;code&gt;react-virtualized&lt;/code&gt; to render only visible products&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy-load images&lt;/strong&gt; using &lt;code&gt;IntersectionObserver&lt;/code&gt; so the initial page loads faster&lt;/li&gt;
&lt;li&gt;Load ad creatives lazily too (especially 3rd party tracking pixels)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Skeletons and Perceived Performance
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Show skeleton loaders instead of blank spaces during data fetch&lt;/li&gt;
&lt;li&gt;Maintain layout stability with reserved space for ads to avoid layout shifts (CLS)&lt;/li&gt;
&lt;li&gt;Preload next page data to make infinite scroll feel seamless&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  CDN, Caching, and SWR
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Cache static filter config and sort options with SWR or localStorage&lt;/li&gt;
&lt;li&gt;Use CDNs for product images and compress them using WebP or AVIF&lt;/li&gt;
&lt;li&gt;Apply &lt;code&gt;stale-while-revalidate&lt;/code&gt; caching strategy to keep PLP snappy without stale content&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Telemetry and Monitoring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Track API response times, scroll depth, filter interaction, and ad clicks&lt;/li&gt;
&lt;li&gt;Set up frontend alerts if API failure rate exceeds a threshold&lt;/li&gt;
&lt;li&gt;Use these metrics to guide A/B testing and UX decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What I’d Say in an Interview
&lt;/h4&gt;

&lt;p&gt;“In PLPs, performance is not just about speed - it’s about perception. Skeletons, lazy loading, and virtualization make a huge difference. I’d also make sure filter configs are cached, ads don’t block the main thread, and all API calls are debounced.”&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;If system design has ever made you freeze up, just know - you’re not alone.&lt;/p&gt;

&lt;p&gt;I made this quadrant because I needed something simple to help me get unstuck.&lt;/p&gt;

&lt;p&gt;Whether you’re preparing for an interview or solving a problem at work, I hope this gives you a way to slow down, ask better questions, and design with confidence.&lt;/p&gt;

&lt;p&gt;And if this helped, let me know - or share your own version of the quadrant. I’d love to see it. 🙂&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Do you remember the last time something broke at work and you were right in the middle of it? Mine started with a “safe” version bump and ended with checkout disappearing in prod 😬 Wrote about my first prod outage - what went wrong, what i learned.</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Mon, 31 Mar 2025 13:45:20 +0000</pubDate>
      <link>https://dev.to/smilegupta/do-you-remember-the-last-time-something-broke-at-work-and-you-were-right-in-the-middle-of-it-1fc9</link>
      <guid>https://dev.to/smilegupta/do-you-remember-the-last-time-something-broke-at-work-and-you-were-right-in-the-middle-of-it-1fc9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd" class="crayons-story__hidden-navigation-link"&gt;I Thought It Was a Safe Deploy… Until Checkout Disappeared&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/smilegupta" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" alt="smilegupta profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/smilegupta" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Smile Gupta
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Smile Gupta
                
              
              &lt;div id="story-author-preview-content-2368824" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/smilegupta" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Smile Gupta&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 31 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd" id="article-link-2368824"&gt;
          I Thought It Was a Safe Deploy… Until Checkout Disappeared
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;50&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Thought It Was a Safe Deploy… Until Checkout Disappeared</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Mon, 31 Mar 2025 13:12:07 +0000</pubDate>
      <link>https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd</link>
      <guid>https://dev.to/smilegupta/i-thought-it-was-a-safe-deploy-until-checkout-disappeared-cmd</guid>
      <description>&lt;p&gt;It started like any other normal deploy.&lt;/p&gt;

&lt;p&gt;A version bump. Nothing fancy. The kind of change that slips into prod without fanfare.&lt;/p&gt;

&lt;p&gt;We had tests. Dev looked good. It was reviewed. Merged. ✅&lt;/p&gt;

&lt;p&gt;And for a while… everything was fine.&lt;/p&gt;

&lt;p&gt;Then the PagerDuty alert went off.&lt;br&gt;
Then Slack lit up with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Checkout’s not loading.”&lt;br&gt;
“The screen is blank.”&lt;br&gt;
“Apple Pay’s broken.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that’s when my heart sank.&lt;br&gt;
Because this wasn’t just a bug.&lt;br&gt;
This was the &lt;strong&gt;entire payment flow&lt;/strong&gt; going down.&lt;/p&gt;

&lt;p&gt;What made it worse?&lt;br&gt;
&lt;strong&gt;It was my first real production outage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’d read about outages before. I’d seen postmortems.&lt;/p&gt;

&lt;p&gt;But nothing prepares you for what it &lt;em&gt;feels like&lt;/em&gt; when your code takes down checkout.&lt;/p&gt;

&lt;p&gt;When you're on an incident bridge, adrenaline kicking in, trying to act calm while your mind is racing.&lt;/p&gt;

&lt;p&gt;If you’ve ever worked on a checkout team, you know how high the stakes are.&lt;/p&gt;

&lt;p&gt;If you haven’t-trust me, this is the kind of breakage that makes your stomach drop.&lt;/p&gt;

&lt;p&gt;This isn’t a deep technical write-up. It’s a story.&lt;/p&gt;

&lt;p&gt;About what happened, what I learned, and what I wish I knew going in.&lt;/p&gt;

&lt;p&gt;So when your moment comes (and it will), maybe you’ll feel a little more ready than I did.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧨 Part 1: What Changed (And What Went Wrong)
&lt;/h3&gt;

&lt;p&gt;To the readers who don’t know me personally or know what I do to pay my bills — I work on the web side of payments, maintaining internal libraries that power checkout flows across different products.&lt;/p&gt;

&lt;p&gt;It’s a space that lives quietly in the background when everything’s working… and turns into absolute chaos when something breaks.&lt;/p&gt;

&lt;p&gt;Recently, we had to update the Apple Pay SDK.&lt;/p&gt;

&lt;p&gt;The version we were using had been deprecated by the Apple team, and the new one introduced a few changes in the API contract—mostly around how inputs were passed during initialisation.&lt;/p&gt;

&lt;p&gt;We made the necessary updates, tested everything on dev, and it all looked solid. ✅&lt;br&gt;
So we merged it and shipped it.&lt;/p&gt;

&lt;p&gt;A while later, we got alerted about a spike in Apple Pay errors.&lt;/p&gt;

&lt;p&gt;At first, it felt like a small fire.&lt;/p&gt;

&lt;p&gt;But as we started digging in, it quickly escalated.&lt;/p&gt;

&lt;p&gt;We discovered that the updated SDK relied on a function that wasn’t supported in certain older browsers. That resulted in a runtime error early in the flow-so early that it completely broke the entire checkout experience.&lt;/p&gt;

&lt;p&gt;No Apple Pay.&lt;/p&gt;

&lt;p&gt;No other payment methods.&lt;/p&gt;

&lt;p&gt;Just a blank screen.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚠️ First Things First - Don’t Start with Debugging
&lt;/h3&gt;

&lt;p&gt;Before we go into what we found, here’s one thing I learned that I’ll never forget:&lt;/p&gt;

&lt;p&gt;When you're facing a production outage, &lt;strong&gt;your first instinct shouldn’t be to start debugging.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s the mistake I almost made.&lt;br&gt;
Because when your code is involved, your brain goes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay, where’s the bug? What broke? Let’s fix it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But here’s the thing: &lt;strong&gt;debugging takes time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And while you’re digging through logs and testing theories, real users are getting blocked.&lt;/p&gt;

&lt;p&gt;Revenue is dropping. The company is losing money. And most importantly, people are having a bad experience.&lt;/p&gt;

&lt;p&gt;Unless you know the fix and you're confident it's safe to ship fast, the best move is this:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Revert the commit. Redeploy. Stabilize.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It might not feel heroic, but trust me - it's the most responsible thing you can do.&lt;/p&gt;

&lt;p&gt;The goal isn’t to debug under pressure. The goal is to &lt;strong&gt;stop the bleeding.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And then, when the incident is over, you can figure out what actually went wrong.&lt;/p&gt;

&lt;p&gt;And that’s exactly what we did.&lt;/p&gt;

&lt;p&gt;We rolled back the commit.&lt;/p&gt;

&lt;p&gt;The blank screen went away. Checkout came back. Users could pay again.&lt;/p&gt;

&lt;p&gt;The incident bridge went quiet.&lt;/p&gt;

&lt;p&gt;PagerDuty stopped yelling.&lt;/p&gt;

&lt;p&gt;But the work wasn’t over.&lt;/p&gt;

&lt;p&gt;Now it was on us to figure out exactly what broke and why.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Part 2: The Debug Spiral - What We Found
&lt;/h3&gt;

&lt;p&gt;Once things were stable again, it was time to figure out what had actually happened.&lt;/p&gt;

&lt;p&gt;The incident bridge was done. The pressure had dropped.&lt;/p&gt;

&lt;p&gt;But the ownership was still on us to make sure we knew exactly why checkout had broken, and how to prevent it from ever happening again.&lt;/p&gt;

&lt;p&gt;So we started going through logs, testing browsers, and trying to reproduce the issue in a controlled way.&lt;/p&gt;

&lt;p&gt;At first, it was confusing.&lt;/p&gt;

&lt;p&gt;There was no visible crash.&lt;/p&gt;

&lt;p&gt;No red banners. No clean stack trace on screen. Just… silence.&lt;/p&gt;

&lt;p&gt;The kind that’s somehow more unsettling than an obvious error.&lt;/p&gt;

&lt;p&gt;Eventually, we spotted it: A runtime error coming from deep inside the updated Apple Pay SDK.&lt;/p&gt;

&lt;p&gt;It was trying to use a method that wasn’t supported in some older browser environments.&lt;/p&gt;

&lt;p&gt;That’s when it clicked:&lt;/p&gt;

&lt;p&gt;Of course it was happening on Safari.&lt;/p&gt;

&lt;p&gt;Apple Pay is only supported on Safari so if something in the SDK was going to fail, that’s exactly where it would show up.&lt;/p&gt;

&lt;p&gt;And that’s what was happening here.&lt;/p&gt;

&lt;p&gt;In certain versions of Safari, this one method wasn’t available.&lt;br&gt;
And since the SDK tried to use it during initialization, it caused a hard crash.&lt;/p&gt;

&lt;p&gt;Not just for Apple Pay.&lt;/p&gt;

&lt;p&gt;But for everything.&lt;/p&gt;

&lt;p&gt;Because the failure happened at the top level of our checkout bootup, no other payment methods loaded either.&lt;/p&gt;

&lt;p&gt;No UI. No error message. Just a blank screen.&lt;/p&gt;

&lt;p&gt;The kind of bug that slips past on dev.&lt;br&gt;
And punches you right in prod.&lt;/p&gt;




&lt;p&gt;🧠 Part 3: It's Not Just About the Fix - It's About Ownership&lt;/p&gt;

&lt;p&gt;The bug was found. The rollback was done. Users could pay again.&lt;br&gt;
But I knew my job wasn’t over.&lt;/p&gt;

&lt;p&gt;Because being a good engineer doesn’t stop at unblocking users.&lt;/p&gt;

&lt;p&gt;It starts when you step back and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did this break mean for the user?&lt;br&gt;
How much revenue did we potentially lose?&lt;br&gt;
What did this outage cost the business?&lt;br&gt;
Could this have been caught earlier?&lt;br&gt;
Will it happen again?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’re not just here to respond to alerts and patch code like we’re on an assembly line.&lt;/p&gt;

&lt;p&gt;We’re not coders you can prompt like ChatGPT and expect the problem to disappear.&lt;/p&gt;

&lt;p&gt;We’re here to think deeply, own outcomes, and prevent future damage.&lt;/p&gt;

&lt;p&gt;So I started writing.&lt;/p&gt;

&lt;p&gt;I documented everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What we changed&lt;/li&gt;
&lt;li&gt;Why we changed it&lt;/li&gt;
&lt;li&gt;What failed (and where)&lt;/li&gt;
&lt;li&gt;How it slipped past QA&lt;/li&gt;
&lt;li&gt;What we missed in our monitoring&lt;/li&gt;
&lt;li&gt;And what browser/version combos were affected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because someone told me to, but because future-me (or future teammates) might run into something similar and I want them to have answers faster than I did.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 What This Taught Me - and What I Want to Push For
&lt;/h3&gt;

&lt;p&gt;This outage didn’t just teach me what went wrong.&lt;/p&gt;

&lt;p&gt;It made me pause and ask: what would I do differently if this happened again?&lt;/p&gt;

&lt;p&gt;So I started jotting down ideas.&lt;/p&gt;

&lt;p&gt;Not all of them are done yet. Some are in progress.&lt;/p&gt;

&lt;p&gt;But they’re now on my radar and they weren’t before this incident.&lt;/p&gt;

&lt;p&gt;Here’s what I’m exploring post-outage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🧪 Introducing browser-specific test cases, especially for critical SDK integrations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛡️ Adding guard clauses around third-party SDKs to prevent one failure from taking everything down&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📉 Revisiting alert thresholds and adding more granular monitors (especially for visual regressions and blank states)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📊 Surfacing “what changed in this release” summaries to make incident triage faster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 Starting a habit of writing lightweight incident summaries for internal sharing and future reference&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren’t silver bullets.&lt;/p&gt;

&lt;p&gt;But they’re the kinds of things I now know matter and they’re on my roadmap moving forward.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧘‍♀️ Part 4: Wrapping It All Up
&lt;/h3&gt;

&lt;p&gt;If you’ve made it this far thank you.&lt;/p&gt;

&lt;p&gt;This wasn’t the easiest thing to write, but I wanted to put it out there because… no one tells you what your &lt;em&gt;first production&lt;/em&gt; fire feels like.&lt;/p&gt;

&lt;p&gt;It’s messy.&lt;/p&gt;

&lt;p&gt;It’s stressful.&lt;/p&gt;

&lt;p&gt;And sometimes, yes it’s your code.&lt;/p&gt;

&lt;p&gt;But you learn.&lt;/p&gt;

&lt;p&gt;You learn what it really means to take ownership.&lt;/p&gt;

&lt;p&gt;You learn to zoom out and think beyond “what broke” and start asking “who did this impact?”&lt;/p&gt;

&lt;p&gt;You learn that being a good engineer isn’t about writing perfect code -  It’s about how you show up when things aren’t perfect.&lt;/p&gt;

&lt;p&gt;I’m still learning. But one thing’s for sure: this incident taught me more than weeks of “normal” engineering ever could.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ A Checklist for When (Not If) It Happens to You
&lt;/h3&gt;

&lt;p&gt;Here’s a simple list I wish I had in front of me when it all went down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔄 Don’t start debugging immediately - if the issue is real and users are impacted, revert first, then investigate&lt;/li&gt;
&lt;li&gt;📣 Communicate early - even just “Looking into it” goes a long way in incident channels&lt;/li&gt;
&lt;li&gt;🧪 Try reproducing the issue in controlled environments (same browser, device, etc.)&lt;/li&gt;
&lt;li&gt;🔍 Check logs, network calls, error boundaries - don’t assume it’ll crash loudly&lt;/li&gt;
&lt;li&gt;📉 Review your monitoring thresholds - are they tuned to catch subtle failures early?&lt;/li&gt;
&lt;li&gt;📚 Document what happened, in plain language - not just for your team, but for future you&lt;/li&gt;
&lt;li&gt;🧠 Think about business impact - how many users were affected, and for how long?&lt;/li&gt;
&lt;li&gt;✍️ If you find patterns or takeaways, write them down - they’re gold in the next incident&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;In the end I can just say this, breaking prod might not be a badge of honour - but surviving it? Definitely is.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If this story helped you - or reminded you of your own - you can always reach out.&lt;/p&gt;

&lt;p&gt;Would love to connect with others who’ve been through the fire. 🔥&lt;/p&gt;

&lt;p&gt;📍Twitter / X: &lt;a href="https://x.com/smileguptaaa" rel="noopener noreferrer"&gt;smileguptaaa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>7 hard-earned frontend lessons from real-world mistakes, rewrites, and “why did I do that?” moments 😅</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Sun, 23 Mar 2025 12:00:29 +0000</pubDate>
      <link>https://dev.to/smilegupta/7-hard-earned-frontend-lessons-from-real-world-mistakes-rewrites-and-why-did-i-do-that-moments-m6m</link>
      <guid>https://dev.to/smilegupta/7-hard-earned-frontend-lessons-from-real-world-mistakes-rewrites-and-why-did-i-do-that-moments-m6m</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/smilegupta" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F404175%2Fc01bc793-e016-41b8-bb90-2ac7d0e8b212.jpeg" alt="smilegupta"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/smilegupta/7-lessons-that-wouldve-saved-me-years-as-a-frontend-engineer-fje" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;7 Lessons That Would’ve Saved Me Years as a Frontend Engineer&lt;/h2&gt;
      &lt;h3&gt;Smile Gupta ・ Mar 22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#systemdesign&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>systemdesign</category>
      <category>frontend</category>
    </item>
    <item>
      <title>7 Lessons That Would’ve Saved Me Years as a Frontend Engineer</title>
      <dc:creator>Smile Gupta</dc:creator>
      <pubDate>Sat, 22 Mar 2025 11:40:28 +0000</pubDate>
      <link>https://dev.to/smilegupta/7-lessons-that-wouldve-saved-me-years-as-a-frontend-engineer-fje</link>
      <guid>https://dev.to/smilegupta/7-lessons-that-wouldve-saved-me-years-as-a-frontend-engineer-fje</guid>
      <description>&lt;p&gt;A few years ago, if you had asked me what system design was, I probably would’ve said something like "&lt;strong&gt;backend stuff, right?&lt;/strong&gt;" 😅&lt;/p&gt;

&lt;p&gt;I was great at building UIs, designing components, and getting things pixel-perfect. &lt;/p&gt;

&lt;p&gt;But when it came to structuring large-scale frontend applications, making trade-offs, or just knowing how to communicate design decisions, I felt... completely lost.&lt;/p&gt;

&lt;p&gt;And the thing is - I’m not alone.&lt;/p&gt;

&lt;p&gt;System design can feel like a black-box, especially for frontend engineers. &lt;/p&gt;

&lt;p&gt;Most of us aren’t taught how to think about it. We’re just expected to magically know.&lt;/p&gt;

&lt;p&gt;I messed up projects. I over-engineered where I shouldn’t have.&lt;/p&gt;

&lt;p&gt;And sometimes, I just froze - because I didn’t know where to start.&lt;/p&gt;

&lt;p&gt;I realised I couldn’t keep winging it. &lt;/p&gt;

&lt;p&gt;I started asking better questions, learning from smarter folks, observing how teams made decisions - and most importantly, writing it all down.&lt;/p&gt;

&lt;p&gt;Here are 7 things I wish I had known earlier - lessons that would’ve made me a better engineer, faster, and definitely saved me a few headaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. System Design Isn’t Just for Backend Engineers
&lt;/h3&gt;

&lt;p&gt;It took me way too long to realize that &lt;strong&gt;frontend systems need design too&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I used to think system design was mostly about backend things - like databases, queues, and server scaling. But on the frontend, we make &lt;strong&gt;equally important decisions&lt;/strong&gt; every day.&lt;/p&gt;

&lt;p&gt;You're not just placing buttons on a page. You're deciding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the page loads&lt;/li&gt;
&lt;li&gt;When data is fetched&lt;/li&gt;
&lt;li&gt;What happens if something fails&lt;/li&gt;
&lt;li&gt;How to keep things fast and smooth for the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me give you a few quick examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A travel homepage (like Airbnb):&lt;/strong&gt;&lt;br&gt;
You want it to load fast, feel personal, and also be SEO-friendly.&lt;br&gt;
Should you render it on the client, server, or use static generation? Each has pros and cons. Picking one means thinking about performance, infra, and user experience. That’s system design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;An internal dashboard:&lt;/strong&gt; No SEO needed, but tons of data and filters.&lt;br&gt;
You might use client-side rendering, debounce search input, and show skeleton UIs while loading. All small things - but together, they make or break the experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A blog or marketing site:&lt;/strong&gt; Rarely changing content? Great candidate for static generation + CDN.&lt;br&gt;
That’s a conscious design call too.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are everyday decisions. But when you step back and look at them, they're not just "frontend choices" - they're &lt;strong&gt;system choices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And I wish I had realized that sooner.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Start with Questions, Not Solutions
&lt;/h3&gt;

&lt;p&gt;One of the biggest mistakes I made early on was jumping straight into diagrams.&lt;/p&gt;

&lt;p&gt;The moment someone asked me to design a system, I’d start drawing boxes, talking about React, maybe throwing in a Redux for good measure 😅&lt;/p&gt;

&lt;p&gt;But I had no idea why I was making those choices.&lt;/p&gt;

&lt;p&gt;Over time, I learned that the best engineers don’t start with architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They start with questions.&lt;/li&gt;
&lt;li&gt;They pause. They listen.&lt;/li&gt;
&lt;li&gt;They try to understand the problem before jumping into a solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some of the questions I now ask - whether I’m in an interview or building something at work:&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem &amp;amp; Context
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;What is the core goal of this system?&lt;/li&gt;
&lt;li&gt;Who are the users?&lt;/li&gt;
&lt;li&gt;What’s the first thing they need to see?&lt;/li&gt;
&lt;li&gt;Are there different user roles (admin, guest, etc.)?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Scope &amp;amp; Constraints
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;What’s in scope? What’s explicitly out of scope?&lt;/li&gt;
&lt;li&gt;Are there time constraints, team size limits, or tech restrictions?&lt;/li&gt;
&lt;li&gt;Should this work on mobile, desktop, tablets?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Performance &amp;amp; Experience
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Do we care about SEO? (i.e. should we consider SSR or SSG?)&lt;/li&gt;
&lt;li&gt;What kind of performance is expected? (First load, interactions)&lt;/li&gt;
&lt;li&gt;Is this expected to work offline or in low-network conditions?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Edge Cases &amp;amp; Reliability
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;What happens when the API fails?&lt;/li&gt;
&lt;li&gt;What should the user see during loading? Empty state? Errors?&lt;/li&gt;
&lt;li&gt;Do different users see different versions of the UI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asking these questions has changed everything for me.&lt;/p&gt;

&lt;p&gt;Now, instead of throwing tech at the wall and hoping it sticks, I build systems that are designed with purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because when you ask better questions, you make better decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Performance Isn’t Just an Afterthought
&lt;/h3&gt;

&lt;p&gt;There was a time when I’d build an entire app, make sure all the features were working, and only then start thinking about performance.&lt;/p&gt;

&lt;p&gt;Unsurprisingly, it often led to painful fixes, unnecessary rewrites, and slow experiences that frustrated users and me.&lt;/p&gt;

&lt;p&gt;I used to treat performance like a finishing touch. But eventually, I realized that &lt;strong&gt;performance isn’t something you sprinkle on at the end. It’s something you design for from the beginning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One mindset shift that helped me was setting a &lt;strong&gt;clear, simple performance goal at the start of a project.&lt;/strong&gt; For example, just deciding early that "the first screen should load in under 2 seconds on 4G" shaped every technical choice I made after that. It wasn’t about chasing perfection or Lighthouse scores, it was about building something usable, fast, and intentional.&lt;/p&gt;

&lt;p&gt;Performance is not about one magical trick. It’s about small, thoughtful choices that add up. Here are some of the things I now consider early in the design process:&lt;/p&gt;

&lt;p&gt;Over time, I built a habit of thinking about performance as part of system design. Here are some of the things I now consider early:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I lazy-load non-critical components, so the user isn’t blocked waiting for everything at once.&lt;/li&gt;
&lt;li&gt;I split large JavaScript bundles, so the browser doesn’t stall parsing huge files.&lt;/li&gt;
&lt;li&gt;I preload above-the-fold assets to improve the time-to-first meaningful paint.&lt;/li&gt;
&lt;li&gt;I compress images, and prefer modern formats like WebP to reduce size without losing quality.&lt;/li&gt;
&lt;li&gt;I defer loading content that’s below the fold, especially on mobile.&lt;/li&gt;
&lt;li&gt;I use skeleton loaders instead of spinners to create a smoother perceived experience.&lt;/li&gt;
&lt;li&gt;I cache API responses where possible to avoid unnecessary network calls.&lt;/li&gt;
&lt;li&gt;I virtualize long lists or large tables, especially in dashboards and internal tools.&lt;/li&gt;
&lt;li&gt;I debounce or throttle expensive interactions, like live search or input-heavy forms.&lt;/li&gt;
&lt;li&gt;I avoid unnecessary re-renders in React using tools like React.memo or useCallback.&lt;/li&gt;
&lt;li&gt;I add resource hints like dns-prefetch, preconnect, and preload for critical resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to implement all of these in every project. But being aware of them early lets you make smarter, more intentional design decisions.&lt;/p&gt;

&lt;p&gt;These days, performance is no longer something I "get to later". It’s part of how I think from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Trade-Offs Matter More Than "Right Answers"
&lt;/h3&gt;

&lt;p&gt;When I started learning system design, I thought the goal was to find the &lt;strong&gt;best&lt;/strong&gt; solution - the one with the cleanest code, the best architecture, and zero compromises.&lt;/p&gt;

&lt;p&gt;But over time, I learned something more valuable:&lt;br&gt;
&lt;strong&gt;There’s rarely one "right" answer. What matters more is understanding and explaining the trade - offs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As frontend engineers, we make these kinds of decisions all the time:&lt;br&gt;
For example, I once had to decide between using &lt;strong&gt;client-side rendering (CSR)&lt;/strong&gt; or integrating &lt;strong&gt;server-side rendering (SSR)&lt;/strong&gt; for a new product detail page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSR would be simpler and fit right into our existing setup, but the team wanted better SEO for product discovery.&lt;/li&gt;
&lt;li&gt;SSR would improve crawlability, but it added complexity we hadn’t dealt with before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We eventually decided to &lt;strong&gt;go with CSR for the initial release&lt;/strong&gt;, and planned to &lt;strong&gt;introduce SSR for high-impact pages later&lt;/strong&gt;. That wasn't a perfect solution - but it let us move faster while keeping future needs in mind.&lt;/p&gt;

&lt;p&gt;Another time, I worked on a filter-heavy table for an internal dashboard.&lt;br&gt;
The backend APIs were flexible, so we had two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch all data at once and filter it on the client, or&lt;/li&gt;
&lt;li&gt;Fetch filtered results on demand with every interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We chose &lt;strong&gt;client-side filtering&lt;/strong&gt; for simplicity and speed at small scale, knowing that we’d eventually have to switch if the data grew too large.&lt;/p&gt;

&lt;p&gt;Neither solution was perfect. But both worked - because we made the decision consciously.&lt;/p&gt;

&lt;p&gt;That’s the real skill in frontend system design: Not picking the "best" tech, but knowing what you’re trading off and being able to say, "Here’s what I’m choosing, and here’s why it makes sense for now."&lt;/p&gt;

&lt;p&gt;In a nutshell, IMO Design isn’t about being right. It’s about being thoughtful.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Design for the Team, Not Just Yourself
&lt;/h3&gt;

&lt;p&gt;There was a phase where I really loved writing "clever" code.&lt;br&gt;
Reusable hooks, abstracted components, custom configurations, dynamic props - everything looked clean and powerful to me.&lt;/p&gt;

&lt;p&gt;But I slowly started noticing something.&lt;/p&gt;

&lt;p&gt;Other folks on the team - especially newer devs or folks who hadn’t worked on that part of the codebase - struggled to make sense of what I’d built.&lt;/p&gt;

&lt;p&gt;What I thought was "Clean and DRY" was actually "hard to follow and scary to touch."&lt;/p&gt;

&lt;p&gt;That’s when I realised: &lt;strong&gt;good system design isn’t about showing off. It’s about building something others can work with.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, when I’m designing a component, flow, or data structure, I ask myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will this be easy to onboard into?&lt;/li&gt;
&lt;li&gt;Can someone new understand this in 10-15 minutes?&lt;/li&gt;
&lt;li&gt;If I’m on leave, will someone else be able to debug this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve also started embracing boring, obvious solutions.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing components that are slightly repetitive but readable&lt;/li&gt;
&lt;li&gt;Adding in-line comments for future context&lt;/li&gt;
&lt;li&gt;Avoiding over-abstraction, even if the logic looks a bit duplicated&lt;/li&gt;
&lt;li&gt;Creating clear folders and naming things with intent, not cleverness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not about dumbing things down. It’s about being kind to your team, to your future self, and to anyone else who might touch your system months later.&lt;/p&gt;

&lt;p&gt;Because the best frontend systems?&lt;/p&gt;

&lt;p&gt;They’re not the ones that look smartest.&lt;/p&gt;

&lt;p&gt;They’re the ones that let everyone build confidently - without fear of breaking things.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. State Management is a Design Problem
&lt;/h3&gt;

&lt;p&gt;For the longest time, I treated state as "just another implementation detail."&lt;br&gt;
If something needed to remember its value, I’d chuck it into useState, or maybe Context if it was "global."&lt;/p&gt;

&lt;p&gt;No real plan. Just vibes.&lt;/p&gt;

&lt;p&gt;But over time, I started noticing how often state caused bugs, confusion, and painful refactors.&lt;/p&gt;

&lt;p&gt;And I realised: where state lives, how it flows, who owns it - that’s not just a coding problem.&lt;/p&gt;

&lt;p&gt;That’s a system design problem.&lt;/p&gt;

&lt;p&gt;I’ve seen components break because the state was shared across places that shouldn’t talk to each other.&lt;/p&gt;

&lt;p&gt;I’ve seen teams struggle to manage loading flags, local UI state, backend data, and user preferences - all tangled together in one giant store.&lt;/p&gt;

&lt;p&gt;Here’s what I’ve learned: &lt;strong&gt;The best systems have a clear state plan before a single line of code is written.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now when I approach state, I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What kind of state is this? (UI state? server state? app-level config?)&lt;/li&gt;
&lt;li&gt;Where should it live? (local component? context? server cache like React Query?)&lt;/li&gt;
&lt;li&gt;Who should own it? (can it be co-located or does it need to be lifted?)&lt;/li&gt;
&lt;li&gt;Does it need to persist between routes or sessions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes, the answer is simple - like using useState for a toggle.&lt;/p&gt;

&lt;p&gt;Other times, it’s better to reach for tools like Zustand, Redux Toolkit, or React Query if the state is shared or tied to API responses.&lt;/p&gt;

&lt;p&gt;And sometimes… I don’t need a library at all.&lt;/p&gt;

&lt;p&gt;Just a clear, intentional structure.&lt;/p&gt;

&lt;p&gt;The goal isn’t to "use the best tool."&lt;/p&gt;

&lt;p&gt;The goal is to &lt;strong&gt;design a flow where the right data lives in the right place&lt;/strong&gt; - and the team can reason about it without going through five layers of context.&lt;/p&gt;

&lt;p&gt;Once I started thinking about state like part of the system architecture, not just component logic, everything became smoother: fewer bugs, easier debugging, and way less stress when the app grew.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. The Real Skill is Communication
&lt;/h3&gt;

&lt;p&gt;When I first heard the phrase "system design," I thought it was all about architecture diagrams, performance tricks, and naming patterns I hadn’t memorised yet.&lt;/p&gt;

&lt;p&gt;But the more I grew as an engineer, the more I saw &lt;strong&gt;that the people who stood out weren’t always the ones with the fanciest answers - they were the ones who could communicate their thinking clearly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In interviews, in design reviews, or even just whiteboarding with teammate, being able to say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Here are the options I considered…"&lt;/li&gt;
&lt;li&gt;"I chose this because of X, even though it comes with Y."&lt;/li&gt;
&lt;li&gt;"If the scale grows, we can evolve the system like this…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of communication builds trust.&lt;/p&gt;

&lt;p&gt;It shows that you’re not just throwing tech around - you’re thinking, planning, and designing on purpose.&lt;/p&gt;

&lt;p&gt;I’ve had rounds where I didn’t get everything right.&lt;/p&gt;

&lt;p&gt;I didn’t pick the exact pattern they were expecting.&lt;/p&gt;

&lt;p&gt;But I got the role - because I asked good questions, explained my reasoning, and stayed calm under ambiguity.&lt;/p&gt;

&lt;p&gt;And honestly? That mirrors the real world.&lt;/p&gt;

&lt;p&gt;You’ll never have all the context.&lt;/p&gt;

&lt;p&gt;You’ll rarely be 100% certain.&lt;/p&gt;

&lt;p&gt;But if you can &lt;strong&gt;think out loud&lt;/strong&gt;, involve others in your process, and show that you're weighing decisions thoughtfully - that’s what system design is actually about.&lt;/p&gt;

&lt;p&gt;In the end, it’s not about being perfect.&lt;/p&gt;

&lt;p&gt;It’s about being clear, collaborative, and adaptable.&lt;/p&gt;

&lt;p&gt;And that’s a skill worth practicing.&lt;/p&gt;




&lt;h3&gt;
  
  
  What happened after I learned all this?
&lt;/h3&gt;

&lt;p&gt;Once I started looking at frontend system design this way, everything shifted.&lt;/p&gt;

&lt;p&gt;I stopped jumping into code without a plan.&lt;/p&gt;

&lt;p&gt;I started asking better questions.&lt;/p&gt;

&lt;p&gt;I began thinking more like a builder - with structure, clarity, and intention.&lt;/p&gt;

&lt;p&gt;And over time, I built a system for myself - a mental checklist I could follow. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It helped me in interviews.&lt;/li&gt;
&lt;li&gt;It helped me in real projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because I have all the answers.&lt;/p&gt;

&lt;p&gt;But because I wish someone had handed me something like this when I was struggling to make sense of it all.&lt;/p&gt;

&lt;p&gt;That’s when I decided to turn it into a handbook.&lt;/p&gt;

&lt;p&gt;📘 &lt;strong&gt;Frontend System Design: The Guide I Wish I Had&lt;/strong&gt; - a practical guide for engineers who want to build better systems, and think beyond just writing code.&lt;/p&gt;

&lt;p&gt;It covers everything we talked about here and more - how to approach problems, structure your thinking, handle trade-offs, and actually enjoy system design.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://topmate.io/smilegupta/1475999" rel="noopener noreferrer"&gt;Grab your copy here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading 💙 &lt;/p&gt;

&lt;p&gt;If you’re someone trying to level up your frontend skills - especially around system design - I hope this helped.&lt;/p&gt;

&lt;p&gt;And if you’re preparing for an interview right now - &lt;strong&gt;you got this&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>systemdesign</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
