<?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>Forem: Sahil Sahu</title>
    <description>The latest articles on Forem by Sahil Sahu (@sahil_sahu).</description>
    <link>https://forem.com/sahil_sahu</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%2F3540832%2F12b5e216-ea77-43a7-9629-019f8c665218.jpg</url>
      <title>Forem: Sahil Sahu</title>
      <link>https://forem.com/sahil_sahu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sahil_sahu"/>
    <language>en</language>
    <item>
      <title>I Read My Code From 1 Year Ago. I'm Both Impressed and Horrified.</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Fri, 12 Dec 2025 12:38:23 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/i-read-my-code-from-1-year-ago-im-both-impressed-and-horrified-2md1</link>
      <guid>https://forem.com/sahil_sahu/i-read-my-code-from-1-year-ago-im-both-impressed-and-horrified-2md1</guid>
      <description>&lt;p&gt;Found my first "real" project while cleaning up GitHub. Decided to read through it.&lt;/p&gt;

&lt;p&gt;Big mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;One year ago, I built a full-stack blog app. My biggest project at the time. I was so proud.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication system&lt;/li&gt;
&lt;li&gt;CRUD operations&lt;/li&gt;
&lt;li&gt;Comment section&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Deployed to production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Felt like a senior developer. Showed it to everyone.&lt;/p&gt;

&lt;p&gt;Fast forward to today. I opened the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Found
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Good (Surprisingly)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;I actually finished something.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a half-done tutorial project. Not abandoned after day 3. A complete, working application.&lt;/p&gt;

&lt;p&gt;17-year-old me deserves credit for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture wasn't terrible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Separated routes, controllers, models. Not perfect, but organized. I could actually follow my own logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works. Still.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Checked the live site. Still running. No major bugs. Users still posting blogs.&lt;/p&gt;

&lt;p&gt;For a beginner project? That's impressive.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bad (Oh No)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Then I looked at the actual code.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// My actual code from 1 year ago&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&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;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&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;data&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;posts&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&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;data&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;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// actual logic finally starts here&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six levels of if statements. Just to check if posts exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current me would write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;posts&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// logic here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line. Optional chaining. Done.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Ugly (I'm Sorry)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Variable names from hell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userData&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;xx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&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;xxx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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;data1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;xxx&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;data2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comments&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;finalData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What was I thinking? Was I allergic to meaningful names?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comments that lie:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fetches all users&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getAllPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No. It fetches posts. The comment is wrong. The function name is right. Why did I write that comment?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The infamous TODO:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TODO: fix this later&lt;/span&gt;
&lt;span class="c1"&gt;// FIXME: this is temporary&lt;/span&gt;
&lt;span class="c1"&gt;// NOTE: refactor this entire file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spoiler: I never fixed it. It's still there. Still "temporary."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password in the code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mypassword123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes. Hardcoded. In the repo. Public repo.&lt;/p&gt;

&lt;p&gt;I'm lucky I wasn't hacked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned About My Growth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. I Understand Async Now
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;saveResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Callback hell. I didn't understand promises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&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;data&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. Readable. Async/await saved my life.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. I Know When NOT to Comment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt; Comments everywhere explaining obvious things&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// increment i by 1&lt;/span&gt;
&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// check if user exists&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;user&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;Now:&lt;/strong&gt; Comments only when code isn't self-explanatory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Retry with exponential backoff for rate limiting&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;retryWithBackoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiCall&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. I Understand Error Handling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 50 lines of code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;Catch everything. Log nothing useful. Pray it works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;riskyOperation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to process user data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AppError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to process data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&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;Specific errors. Useful context. Actual error handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. I Value Readability Over Cleverness
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt; Tried to be clever&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({...&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;adult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;u&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="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;u&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;One line! So smart! Impossible to debug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt; Readable over clever&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&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;adultsWithFlag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;adults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&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="na"&gt;adult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;userMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;adultsWithFlag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;id&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More lines. Way clearer. Future me will understand this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cringe Moments
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My auth "security":&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&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;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// login success&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plain text passwords. In 2024. I'm embarrassed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My "validation":&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&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;// valid email&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not validation. That's hope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My error messages:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every. Single. Error. Same message. Debugging was a nightmare.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Stayed Good
&lt;/h2&gt;

&lt;p&gt;Not everything was terrible:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;File structure made sense&lt;/strong&gt; - Even now, I can navigate it easily&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Function names were descriptive&lt;/strong&gt; - &lt;code&gt;getUserPosts()&lt;/code&gt; does what it says&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Separated concerns&lt;/strong&gt; - Routes, controllers, models in different files&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;It works&lt;/strong&gt; - Despite the mess, users can still use it  &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;One year ago, I thought this was amazing code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, I see all the flaws. The inefficiencies. The bad practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One year from now, I'll probably look at my current code and cringe too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not depressing. That's growth.&lt;/p&gt;

&lt;p&gt;If you're not embarrassed by your old code, you're not learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Doing About It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Rewrite Everything
&lt;/h3&gt;

&lt;p&gt;"Let me fix all these issues!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; I'd spend weeks rewriting working code. Not worth it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Leave It Alone
&lt;/h3&gt;

&lt;p&gt;"It works, don't touch it"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; But it's public. It's on my portfolio. It represents me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: Strategic Improvements (What I'm Actually Doing)
&lt;/h3&gt;

&lt;p&gt;✅ Fixed the security issues (hashed passwords, env variables)&lt;br&gt;&lt;br&gt;
✅ Added proper error handling&lt;br&gt;&lt;br&gt;
✅ Improved the most painful parts&lt;br&gt;&lt;br&gt;
✅ Added a README explaining it's an old project&lt;br&gt;&lt;br&gt;
✅ Left the rest alone&lt;/p&gt;

&lt;p&gt;It's a time capsule of my learning journey. That's okay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Your old code will always look bad. That means you're growing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Signs you're improving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You cringe at code from 6 months ago&lt;/li&gt;
&lt;li&gt;You spot bugs immediately in old projects
&lt;/li&gt;
&lt;li&gt;You can't believe you didn't use X pattern&lt;/li&gt;
&lt;li&gt;You want to refactor everything (but don't)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your year-old code still looks perfect, you haven't learned anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Advice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Go Read Your Old Code
&lt;/h3&gt;

&lt;p&gt;Pick a project from 6-12 months ago. Read it honestly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You'll feel:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proud (you built something!)&lt;/li&gt;
&lt;li&gt;Embarrassed (what was I thinking?)&lt;/li&gt;
&lt;li&gt;Motivated (look how much I've grown)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are valid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Delete It
&lt;/h3&gt;

&lt;p&gt;I almost deleted this project out of embarrassment. Glad I didn't.&lt;/p&gt;

&lt;p&gt;It shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where I started&lt;/li&gt;
&lt;li&gt;How far I've come
&lt;/li&gt;
&lt;li&gt;That I actually finish things&lt;/li&gt;
&lt;li&gt;My learning progression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recruiters appreciate the growth story more than perfect code.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn From Past You
&lt;/h3&gt;

&lt;p&gt;Every cringe moment is a lesson:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nested ifs everywhere? → Learn optional chaining&lt;/li&gt;
&lt;li&gt;Callback hell? → Master async/await
&lt;/li&gt;
&lt;li&gt;Bad variable names? → Practice clean code&lt;/li&gt;
&lt;li&gt;No error handling? → Learn proper patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your past mistakes are your future study guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Year From Now
&lt;/h2&gt;

&lt;p&gt;I'll probably read THIS post and cringe at something I said.&lt;/p&gt;

&lt;p&gt;I'll look at my current projects and see obvious flaws.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And that will be a good sign.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It means I'm still learning. Still growing. Still improving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;When's the last time you looked at your old code?&lt;/p&gt;

&lt;p&gt;Go find a project from 6+ months ago. Read through it. Come back and tell me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What made you proud?&lt;/li&gt;
&lt;li&gt;What made you cringe?&lt;/li&gt;
&lt;li&gt;What did you learn?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop it in the comments. Let's celebrate our growth (and our cringe) together.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;My commitment:&lt;/strong&gt;&lt;br&gt;
Not deleting old projects. They're proof of progress, not embarrassment.&lt;/p&gt;

&lt;p&gt;Hit ❤️ if you've ever cringed at your own code. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Learning Frameworks. Seriously</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Mon, 24 Nov 2025 08:18:35 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/stop-learning-frameworks-seriously-1h7e</link>
      <guid>https://forem.com/sahil_sahu/stop-learning-frameworks-seriously-1h7e</guid>
      <description>&lt;p&gt;I wasted 2 years chasing the "hot new framework." Then I realized the uncomfortable truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Trap
&lt;/h2&gt;

&lt;p&gt;My journey looked like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Year 1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January: "React is the future, I need to learn it!"&lt;/li&gt;
&lt;li&gt;March: "Wait, Vue is easier, switching to Vue"&lt;/li&gt;
&lt;li&gt;June: "Everyone's talking about Svelte, time to learn Svelte"&lt;/li&gt;
&lt;li&gt;September: "Angular has better structure, maybe I should..."&lt;/li&gt;
&lt;li&gt;December: Still can't build anything complex in any of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Year 2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning Next.js, then Remix, then Astro&lt;/li&gt;
&lt;li&gt;Rewriting the same portfolio in 6 different frameworks&lt;/li&gt;
&lt;li&gt;Watching "X vs Y" comparison videos for hours&lt;/li&gt;
&lt;li&gt;Arguing in Twitter comments about which framework is "best"&lt;/li&gt;
&lt;li&gt;Still not building anything meaningful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the pattern? I learned ABOUT frameworks. I didn't learn TO BUILD.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wake-Up Moment
&lt;/h2&gt;

&lt;p&gt;A friend who learned coding in 2010 showed me his project. Built with jQuery and vanilla JS. It was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Clean&lt;/li&gt;
&lt;li&gt;Actually used by 10,000+ people&lt;/li&gt;
&lt;li&gt;Making him $2k/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My reaction: "But... that's old tech?"&lt;/p&gt;

&lt;p&gt;His response: "Yeah, but it works and I actually finished it."&lt;/p&gt;

&lt;p&gt;That stung.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Nobody Tells You
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frameworks don't make you a better developer. Problem-solving does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you break down complex problems?&lt;/li&gt;
&lt;li&gt;Do you understand how data flows?&lt;/li&gt;
&lt;li&gt;Can you debug efficiently?&lt;/li&gt;
&lt;li&gt;Do you know when to optimize and when not to?&lt;/li&gt;
&lt;li&gt;Can you actually ship something?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These skills transcend frameworks.&lt;/p&gt;

&lt;p&gt;I know developers who master React but can't explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to use state vs props&lt;/li&gt;
&lt;li&gt;How async actually works&lt;/li&gt;
&lt;li&gt;Why their app is slow&lt;/li&gt;
&lt;li&gt;How the internet works&lt;/li&gt;
&lt;li&gt;What happens when you type a URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They can install packages. They can't solve problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I challenged myself: Build something complex WITHOUT any framework.&lt;/p&gt;

&lt;p&gt;Just vanilla JavaScript. HTML. CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It was HARD. Really hard.&lt;/p&gt;

&lt;p&gt;But I learned more in 2 weeks than I did in 6 months of framework hopping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How DOM manipulation actually works (not just &lt;code&gt;setState&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Why frameworks exist (they solve real problems I was now facing)&lt;/li&gt;
&lt;li&gt;What "reactivity" actually means (I had to build it myself)&lt;/li&gt;
&lt;li&gt;How routing works under the hood&lt;/li&gt;
&lt;li&gt;Real performance optimization (no framework to hide behind)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After this, going back to React felt like superpowers. I finally UNDERSTOOD what it was doing for me.&lt;/p&gt;

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

&lt;p&gt;Now I tell beginners:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Build Without Frameworks (2-3 months)
&lt;/h3&gt;

&lt;p&gt;Build these with vanilla JS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive quiz app&lt;/li&gt;
&lt;li&gt;Image carousel&lt;/li&gt;
&lt;li&gt;Form with validation&lt;/li&gt;
&lt;li&gt;Data table with sorting/filtering&lt;/li&gt;
&lt;li&gt;Simple SPA with routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, it's harder. That's the point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Feel The Pain
&lt;/h3&gt;

&lt;p&gt;You'll naturally encounter problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Managing all this DOM manipulation is messy"&lt;/li&gt;
&lt;li&gt;"Keeping UI in sync with data is annoying"&lt;/li&gt;
&lt;li&gt;"This routing logic is getting complex"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good. Now you understand what frameworks solve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Learn ONE Framework (3-4 months)
&lt;/h3&gt;

&lt;p&gt;Pick based on job market:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most jobs? React&lt;/li&gt;
&lt;li&gt;Want easiest? Vue&lt;/li&gt;
&lt;li&gt;Love TypeScript? Angular&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn it deeply. Not just the tutorial level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4: Stop Learning Frameworks
&lt;/h3&gt;

&lt;p&gt;Seriously. One is enough.&lt;/p&gt;

&lt;p&gt;Spend your time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building actual projects&lt;/li&gt;
&lt;li&gt;Learning backend&lt;/li&gt;
&lt;li&gt;Understanding databases&lt;/li&gt;
&lt;li&gt;Getting good at debugging&lt;/li&gt;
&lt;li&gt;Shipping products&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The framework doesn't matter as much as you think.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React vs Vue vs Svelte? They all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manipulate the DOM&lt;/li&gt;
&lt;li&gt;Manage state&lt;/li&gt;
&lt;li&gt;Handle events&lt;/li&gt;
&lt;li&gt;Compose components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you deeply understand ONE, you can learn another in 2 weeks if needed.&lt;/p&gt;

&lt;p&gt;But here's what takes years to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to structure large applications&lt;/li&gt;
&lt;li&gt;How to write maintainable code&lt;/li&gt;
&lt;li&gt;How to debug production issues&lt;/li&gt;
&lt;li&gt;How to work with APIs&lt;/li&gt;
&lt;li&gt;How to optimize performance&lt;/li&gt;
&lt;li&gt;How to collaborate with a team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These skills work in ANY framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed For Me
&lt;/h2&gt;

&lt;p&gt;I picked React (because job market) and went DEEP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the actual docs (not just tutorials)&lt;/li&gt;
&lt;li&gt;Built 5 complex projects (not todo apps)&lt;/li&gt;
&lt;li&gt;Read open source React code&lt;/li&gt;
&lt;li&gt;Understood how it works internally&lt;/li&gt;
&lt;li&gt;Learned patterns, not just syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, I ignored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New framework announcements&lt;/li&gt;
&lt;li&gt;"X is dead, use Y" posts&lt;/li&gt;
&lt;li&gt;Comparison videos&lt;/li&gt;
&lt;li&gt;Twitter framework wars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result? I'm actually employable now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Paradox
&lt;/h2&gt;

&lt;p&gt;Beginners think: "I need to learn all frameworks to get hired"&lt;/p&gt;

&lt;p&gt;Reality: "Companies want someone who can solve problems, regardless of framework"&lt;/p&gt;

&lt;p&gt;I've seen job postings say "React experience required" hire Vue developers.&lt;/p&gt;

&lt;p&gt;Why? Because the Vue dev showed they could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build complex features&lt;/li&gt;
&lt;li&gt;Write clean code&lt;/li&gt;
&lt;li&gt;Debug effectively&lt;/li&gt;
&lt;li&gt;Learn quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specific framework was irrelevant.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Advice If You're Starting Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Month 1-3:&lt;/strong&gt; Learn JavaScript deeply. Build things without frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 4-7:&lt;/strong&gt; Pick ONE framework (React is safest bet). Build real projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 8+:&lt;/strong&gt; Stop learning frameworks. Start building your career.&lt;/p&gt;

&lt;p&gt;Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solving real problems&lt;/li&gt;
&lt;li&gt;Building complete projects&lt;/li&gt;
&lt;li&gt;Understanding fundamentals&lt;/li&gt;
&lt;li&gt;Shipping actual products&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Test
&lt;/h2&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;p&gt;❌ "What framework should I learn next?"&lt;br&gt;&lt;br&gt;
✅ "What problem am I trying to solve?"&lt;/p&gt;

&lt;p&gt;❌ "Is React better than Vue?"&lt;br&gt;&lt;br&gt;
✅ "Can I build this feature?"&lt;/p&gt;

&lt;p&gt;❌ "Should I rewrite this in [new framework]?"&lt;br&gt;&lt;br&gt;
✅ "Does my current solution work?"&lt;/p&gt;

&lt;p&gt;If you're still asking the first questions, you're stuck in the framework trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop Optimizing For Learning. Start Optimizing For Building.
&lt;/h2&gt;

&lt;p&gt;The goal isn't to know every framework.&lt;/p&gt;

&lt;p&gt;The goal is to build things people use.&lt;/p&gt;

&lt;p&gt;You can do that with React. Or Vue. Or even jQuery.&lt;/p&gt;

&lt;p&gt;Pick one. Go deep. Build stuff. Ship it.&lt;/p&gt;

&lt;p&gt;Then, and only then, if you NEED another framework for a specific job or project, learn it in 2 weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;What framework are you "learning" right now? Be honest - are you learning to build, or learning to say you know it?&lt;/p&gt;

&lt;p&gt;Drop a comment. Let's be real with each other.&lt;/p&gt;




&lt;p&gt;Hit ❤️ if you needed this reality check. Hit 💀 if you're currently stuck in framework tutorial hell.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Learned React Wrong for 3 Months. Here's What I Wish I Knew on Day 1</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Tue, 18 Nov 2025 06:23:24 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/i-learned-react-wrong-for-3-months-heres-what-i-wish-i-knew-on-day-1-hcp</link>
      <guid>https://forem.com/sahil_sahu/i-learned-react-wrong-for-3-months-heres-what-i-wish-i-knew-on-day-1-hcp</guid>
      <description>&lt;p&gt;I spent 3 months learning React.&lt;/p&gt;

&lt;p&gt;Built 4 projects. Felt confident. Then got destroyed in my first code review.&lt;/p&gt;

&lt;p&gt;"Why are you doing it like this?"&lt;br&gt;&lt;br&gt;
"This isn't how React works."&lt;br&gt;&lt;br&gt;
"Did you learn this from a 2018 tutorial?"&lt;/p&gt;

&lt;p&gt;Turns out, I learned React completely wrong.&lt;/p&gt;

&lt;p&gt;Here's what I wish someone told me on Day 1.&lt;/p&gt;


&lt;h2&gt;
  
  
  Mistake #1: I Learned Class Components First
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyComponent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&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;Why it's wrong:&lt;/strong&gt; Class components are legacy. The industry moved to functional components in 2019.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I should've learned:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&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;The lesson:&lt;/strong&gt; Don't learn outdated patterns. Check when the tutorial was made.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #2: I Used useEffect for Everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&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;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="nf"&gt;useEffect&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&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;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&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;Why it's problematic:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Race conditions&lt;/li&gt;
&lt;li&gt;No loading state&lt;/li&gt;
&lt;li&gt;No error handling&lt;/li&gt;
&lt;li&gt;Runs on every render if dependencies are wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I should've learned:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&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;isLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&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;isLoading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Spinner&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&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;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&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;The lesson:&lt;/strong&gt; Use proper data fetching libraries (React Query, SWR). Don't reinvent the wheel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #3: I Put Everything in useState
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAge&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAddress&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="c1"&gt;// ... 10 more useState calls&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;Why it's messy:&lt;/strong&gt; Too many state variables. Hard to manage. Causes unnecessary re-renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I should've learned:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFormData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&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="na"&gt;email&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="na"&gt;age&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="na"&gt;address&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="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="nf"&gt;setFormData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; Related state should be grouped. Use &lt;code&gt;useReducer&lt;/code&gt; for complex state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #4: I Prop-Drilled Like Crazy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&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;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Sidebar&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&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;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Content&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&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;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&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;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it sucks:&lt;/strong&gt; Passing props through 5 levels. Nightmare to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I should've learned:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Context for global state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&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="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Sidebar&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Content&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/UserContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Header&lt;/span&gt;&lt;span class="p"&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&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;The lesson:&lt;/strong&gt; Context API exists for a reason. Use it for global state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #5: I Didn't Think About Performance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TodoList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;todos&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;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TodoItem&lt;/span&gt; 
          &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
          &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onDelete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;deleteTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
          &lt;span class="nx"&gt;onEdit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;editTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Why it's slow:&lt;/strong&gt; Creates new functions on every render. Every todo re-renders when ANY todo changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I should've learned:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TodoItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onEdit&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TodoList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="p"&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;handleDelete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;id&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="nf"&gt;deleteTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TodoItem&lt;/span&gt; 
          &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
          &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onDelete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleDelete&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;The lesson:&lt;/strong&gt; Use &lt;code&gt;memo&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt; for expensive operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Wish I Learned First
&lt;/h2&gt;

&lt;p&gt;If I could restart learning React today, I'd learn in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Functional components + Hooks&lt;/strong&gt; (skip class components entirely)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proper state management&lt;/strong&gt; (useState → useReducer → Context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data fetching&lt;/strong&gt; (React Query or SWR, not raw useEffect)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance optimization&lt;/strong&gt; (memo, useMemo, useCallback)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component patterns&lt;/strong&gt; (compound components, render props)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resources That Actually Helped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't learn from:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tutorials older than 2020&lt;/li&gt;
&lt;li&gt;Courses teaching class components first&lt;/li&gt;
&lt;li&gt;Random YouTube videos without dates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Learn from:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official React docs (beta.reactjs.org)&lt;/li&gt;
&lt;li&gt;Kent C. Dodds blog&lt;/li&gt;
&lt;li&gt;React Query documentation&lt;/li&gt;
&lt;li&gt;Josh Comeau's blog&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Lesson
&lt;/h2&gt;

&lt;p&gt;You'll learn React wrong at first. Everyone does.&lt;/p&gt;

&lt;p&gt;The key is unlearning bad patterns quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signs you learned React wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still using class components&lt;/li&gt;
&lt;li&gt;useEffect for data fetching&lt;/li&gt;
&lt;li&gt;Props drilling 5 levels deep&lt;/li&gt;
&lt;li&gt;Creating functions inside render&lt;/li&gt;
&lt;li&gt;Not using any state management library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix it now.&lt;/strong&gt; Refactor one project using modern patterns.&lt;/p&gt;

&lt;p&gt;Your future self (and code reviewers) will thank you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What React mistake did you make? Drop it below. Let's learn together. 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Stop Building Todo Apps. Build These 3 Projects Instead</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Mon, 10 Nov 2025 12:56:31 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/stop-building-todo-apps-build-these-3-projects-instead-1ca5</link>
      <guid>https://forem.com/sahil_sahu/stop-building-todo-apps-build-these-3-projects-instead-1ca5</guid>
      <description>&lt;p&gt;I built 5 projects before getting my first interview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first 2 got me ghosted.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Project 3 got me noticed.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Projects 4-5 got me hired.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference? I stopped building what tutorials told me to build and started building what &lt;em&gt;recruiters actually care about&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you're self-taught and wondering why your portfolio isn't getting responses, here's what to build instead.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❌ Stop Building: Todo Apps, Weather Apps, Calculators
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why they don't work:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every beginner builds them&lt;/li&gt;
&lt;li&gt;Too simple to showcase real skills
&lt;/li&gt;
&lt;li&gt;Recruiters have seen 10,000 of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The harsh truth&lt;/strong&gt;: These projects say "I can follow a tutorial" not "I can solve problems."&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ Build This Instead: Project #1 - "Clone Something Real"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What&lt;/strong&gt;: Pick a feature from a real app and rebuild it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter's infinite scroll feed&lt;/li&gt;
&lt;li&gt;Spotify's search with filters&lt;/li&gt;
&lt;li&gt;Instagram's image upload with preview&lt;/li&gt;
&lt;li&gt;Uber's live location tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Todo App teaches you this:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&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="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Cloning Twitter teaches you THIS:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchFeed&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;page&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;// Pagination&lt;/span&gt;
    &lt;span class="c1"&gt;// Infinite scroll&lt;/span&gt;
    &lt;span class="c1"&gt;// Loading states&lt;/span&gt;
    &lt;span class="c1"&gt;// Error handling&lt;/span&gt;
    &lt;span class="c1"&gt;// Rate limiting&lt;/span&gt;
    &lt;span class="c1"&gt;// Image optimization&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 recruiters see&lt;/strong&gt;: "This person can build features we actually need."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My example&lt;/strong&gt;: I cloned Instagram's image upload. Learned file handling, image compression, progress bars, and preview generation. Got asked about it in 6/10 interviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Build This Instead: Project #2 - "Solve YOUR Problem"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What&lt;/strong&gt;: Build a tool that solves a problem YOU actually have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: Real problems = real solutions = interesting to talk about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples from my journey&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built a browser extension that blocks YouTube recommendations (saved 2 hours/day)&lt;/li&gt;
&lt;li&gt;Created a script that auto-applies to jobs (applied to 100 companies in 1 hour)&lt;/li&gt;
&lt;li&gt;Made a dashboard tracking my LeetCode progress with charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The magic question in interviews&lt;/strong&gt;:&lt;br&gt;
"Why did you build this?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad answer&lt;/strong&gt;: "I followed a tutorial"&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Good answer&lt;/strong&gt;: "I was wasting 2 hours daily on YouTube, so I built this to block distractions. Saved me 60 hours/month."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recruiters love this&lt;/strong&gt; because it shows initiative and problem-solving.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ Build This Instead: Project #3 - "Real-Time Anything"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What&lt;/strong&gt;: Build something with live updates. Chat app, collaborative editor, live notifications, multiplayer game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: 90% of developers avoid this because it's "hard." That's your advantage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tech that impresses&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// WebSockets (Socket.io)&lt;/span&gt;
&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;// Real-time updates&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Or Server-Sent Events&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/stream&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Or WebRTC for peer-to-peer&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;peerConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RTCPeerConnection&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;My example&lt;/strong&gt;: Built a collaborative whiteboard. Multiple users draw simultaneously. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In interviews, I said&lt;/strong&gt;: "I handle 50+ concurrent users with optimized socket events, batching updates to reduce server load by 95%."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Their response&lt;/strong&gt;: "When can you start?"&lt;/p&gt;




&lt;h2&gt;
  
  
  The Framework: What Makes a Project "Hire-Worthy"
&lt;/h2&gt;

&lt;p&gt;Every good portfolio project has these 3 things:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Complexity You Can Explain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not complicated for the sake of it. But complex enough that you learned something hard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: "I implemented JWT authentication with refresh tokens and role-based access control."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;A Problem It Solves&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not "I built this to learn React."&lt;br&gt;&lt;br&gt;
But "I built this because finding parking near campus was impossible."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Live Demo + Clean Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy it (Vercel, Netlify, Railway)&lt;/li&gt;
&lt;li&gt;Write a README explaining WHAT and WHY&lt;/li&gt;
&lt;li&gt;Add screenshots/GIFs&lt;/li&gt;
&lt;li&gt;Keep code clean with comments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Actual Portfolio That Got Me Interviews
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Project 1&lt;/strong&gt;: Twitter clone (infinite scroll, image uploads)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why&lt;/strong&gt;: Showed I could handle complex state management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project 2&lt;/strong&gt;: Job application automation tool&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why&lt;/strong&gt;: Solved my own problem, showed initiative&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project 3&lt;/strong&gt;: Cloud Based File Management System&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why&lt;/strong&gt;: Demonstrated advanced technical skills&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total time&lt;/strong&gt;: 12 weeks&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Interview callbacks&lt;/strong&gt;: 12 companies&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Success rate&lt;/strong&gt;: 5x higher than my first portfolio&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Action Plan (Start Today)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1-3&lt;/strong&gt;: Clone one feature from Twitter/Instagram/Spotify&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Week 4-6&lt;/strong&gt;: Build a tool that solves YOUR problem&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Week 7-10&lt;/strong&gt;: Build something real-time (chat, notifications, collab tool)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy all 3&lt;/li&gt;
&lt;li&gt;Write clear READMEs&lt;/li&gt;
&lt;li&gt;Add to LinkedIn/GitHub&lt;/li&gt;
&lt;li&gt;Start applying&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Truth Nobody Tells You
&lt;/h2&gt;

&lt;p&gt;You don't need 10 projects.&lt;/p&gt;

&lt;p&gt;You need &lt;strong&gt;3 projects that show&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can build real features ✅&lt;/li&gt;
&lt;li&gt;You can solve problems ✅&lt;/li&gt;
&lt;li&gt;You can handle complexity ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Todo apps show none of this.&lt;/p&gt;

&lt;p&gt;Stop building what every tutorial teaches.&lt;br&gt;&lt;br&gt;
Start building what every company needs.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's the most interesting problem you've faced recently? Drop it below—that's your next project. 👇&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow me on X - &lt;a href="https://x.com/SahilSahu731" rel="noopener noreferrer"&gt;click here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My Portfolio - &lt;a href="https://sahil-sahu-portfolio.vercel.app/" rel="noopener noreferrer"&gt;click there&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Went From "Hello World" at 15 to Full-Stack Developer at 18</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Thu, 06 Nov 2025 05:16:57 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/how-i-went-from-hello-world-at-15-to-full-stack-developer-at-18-3fm8</link>
      <guid>https://forem.com/sahil_sahu/how-i-went-from-hello-world-at-15-to-full-stack-developer-at-18-3fm8</guid>
      <description>&lt;p&gt;Three years ago, I didn't know what HTML stood for. Today, I have a portfolio with 5+ full stack projects and just landed my first freelance client.&lt;/p&gt;

&lt;p&gt;My Portfolio - &lt;a href="https://sahil-sahu-portfolio.vercel.app/" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;br&gt;
Follow me on X - &lt;a href="https://x.com/SahilSahu731" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is everything I wish someone told me when I started.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Beginning (Age 15)
&lt;/h2&gt;

&lt;p&gt;It started with Minecraft mods. Seriously.&lt;/p&gt;

&lt;p&gt;I wanted to create custom items for my server, found a YouTube tutorial, and copied some code I didn't understand. It didn't work. I spent 6 hours figuring out why.&lt;/p&gt;

&lt;p&gt;When it finally worked, I felt like a wizard.&lt;/p&gt;

&lt;p&gt;That's when I realized: I could BUILD things. Not just use apps - actually create them.&lt;/p&gt;

&lt;p&gt;I was hooked.&lt;/p&gt;
&lt;h2&gt;
  
  
  Year 1: The Messy Start (Age 15-16)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; HTML, CSS, JavaScript basics&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I jumped around. A LOT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: "I'll learn Python!"&lt;/li&gt;
&lt;li&gt;Week 2: "Actually, web dev seems cool"&lt;/li&gt;
&lt;li&gt;Week 3: "Wait, should I learn C++ for games?"&lt;/li&gt;
&lt;li&gt;Week 4: Back to web dev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first website was... terrible. Like, Comic Sans terrible. Centered everything terrible. But I made it myself and put it on the internet. That felt incredible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- My actual first website, no joke --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;bgcolor=&lt;/span&gt;&lt;span class="s"&gt;"black"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;center&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;font&lt;/span&gt; &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"lime"&lt;/span&gt; &lt;span class="na"&gt;face=&lt;/span&gt;&lt;span class="s"&gt;"Comic Sans MS"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome to my EPIC Website!!!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;marquee&amp;gt;&lt;/span&gt;This is so cool!!!&lt;span class="nt"&gt;&amp;lt;/marquee&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/font&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/center&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I thought I was a genius. Looking back... yikes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turning Point
&lt;/h2&gt;

&lt;p&gt;Around month 4, I built a simple to-do app following a tutorial. Then I tried to add my own feature - a dark mode toggle.&lt;/p&gt;

&lt;p&gt;I spent 2 days on it. Stack Overflow became my second home. But when that toggle finally worked?&lt;/p&gt;

&lt;p&gt;That's when I learned the most important lesson: &lt;strong&gt;You learn by breaking things and fixing them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Following tutorials is fine for learning syntax. But real learning happens when you go off-script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Year 2: Getting Serious (Age 16-17)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; React, Node.js, MongoDB, Git&lt;/p&gt;

&lt;p&gt;This was the "grind" year. I was that kid coding during lunch break. My friends thought I was weird. My parents worried I was on my computer too much.&lt;/p&gt;

&lt;p&gt;But I was building real stuff:&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 1: Study Timer App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built with vanilla JS (before I knew React)&lt;/li&gt;
&lt;li&gt;Pomodoro technique timer&lt;/li&gt;
&lt;li&gt;Saved data to localStorage&lt;/li&gt;
&lt;li&gt;Looked ugly but WORKED&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; DOM manipulation, local storage, JavaScript events&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 2: Weather App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;My first API integration&lt;/li&gt;
&lt;li&gt;Used OpenWeather API&lt;/li&gt;
&lt;li&gt;Learned about async/await the hard way (callback hell nightmares)&lt;/li&gt;
&lt;li&gt;Actually looked decent with CSS Grid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; APIs, async JavaScript, responsive design&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 3: Movie Database
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First React project&lt;/li&gt;
&lt;li&gt;TMDB API integration&lt;/li&gt;
&lt;li&gt;Search, filter, favorites&lt;/li&gt;
&lt;li&gt;Deployed on Netlify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; React basics, state management, component lifecycle&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 4: Chat App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First full-stack project&lt;/li&gt;
&lt;li&gt;Node.js + Express backend&lt;/li&gt;
&lt;li&gt;Socket.io for real-time chat&lt;/li&gt;
&lt;li&gt;MongoDB for storing messages&lt;/li&gt;
&lt;li&gt;Completely broke in production multiple times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Backend, databases, deployment, that production is DIFFERENT from localhost&lt;/p&gt;

&lt;h2&gt;
  
  
  The Struggles Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Imposter Syndrome Hit HARD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every YouTube tutorial made it look easy. Every dev on Twitter seemed to know everything. I felt stupid constantly.&lt;/p&gt;

&lt;p&gt;I'd see 12-year-olds building AI apps and think "I'm already behind."&lt;/p&gt;

&lt;p&gt;Reality check: Those kids probably followed a tutorial too. Everyone's faking it a bit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutorial Hell Was Real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For 3 months, I just followed tutorials. Built the same to-do app 15 different ways. Never built anything original.&lt;/p&gt;

&lt;p&gt;Breaking free was hard. I had to force myself: "Build something without a tutorial."&lt;/p&gt;

&lt;p&gt;It was messy. It took forever. But that's when I actually learned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Burnout at 16&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Around month 14, I hit a wall. Coded for 8 hours, made zero progress, felt like I'd never be good enough.&lt;/p&gt;

&lt;p&gt;I took a week off. Just played games, hung out with friends. Came back refreshed.&lt;/p&gt;

&lt;p&gt;Lesson: Breaks aren't weakness. They're necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Year 3: Portfolio &amp;amp; Real Projects (Age 17-18)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Next.js, TypeScript, PostgreSQL, Tailwind, Docker&lt;/p&gt;

&lt;p&gt;This year was about leveling up. Making things that actually looked professional.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Portfolio
&lt;/h3&gt;

&lt;p&gt;I rebuilt my portfolio 4 times. Each time I learned something new and thought "I need to redo everything."&lt;/p&gt;

&lt;p&gt;Version 4 finally felt right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js for performance&lt;/li&gt;
&lt;li&gt;Tailwind for styling (game changer)&lt;/li&gt;
&lt;li&gt;Framer Motion for animations&lt;/li&gt;
&lt;li&gt;Dark mode (obviously)&lt;/li&gt;
&lt;li&gt;Actually mobile responsive (shocking, I know)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real Projects I'm Proud Of
&lt;/h3&gt;

&lt;p&gt;*&lt;em&gt;1. FileFlow *&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User Authentication with Email Verification&lt;/li&gt;
&lt;li&gt;Secure File Uploading and Storage&lt;/li&gt;
&lt;li&gt;Preview and Download Files&lt;/li&gt;
&lt;li&gt;Delete and Manage Uploaded Files&lt;/li&gt;
&lt;li&gt;Responsive and User-Friendly Interface&lt;/li&gt;
&lt;li&gt;JWT-based Authentication &amp;amp; Authorization&lt;/li&gt;
&lt;li&gt;Drag-and-Drop File Upload&lt;/li&gt;
&lt;li&gt;Cloud Storage Integration with File Validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. JobTube&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User &amp;amp; Employer Authentication (JWT)&lt;/li&gt;
&lt;li&gt;Role-based Dashboards (Job Seeker &amp;amp; Employer)&lt;/li&gt;
&lt;li&gt;Job Listings with Search &amp;amp; Filter Functionality&lt;/li&gt;
&lt;li&gt;Application Submission &amp;amp; Tracking&lt;/li&gt;
&lt;li&gt;Admin Panel to Manage Users, Jobs &amp;amp; Applications&lt;/li&gt;
&lt;li&gt;Responsive &amp;amp; Accessible UI (Tailwind CSS)&lt;/li&gt;
&lt;li&gt;Backend API with Secure CRUD Operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;3. Framely *&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User Authentication with JWT and secure cookies&lt;/li&gt;
&lt;li&gt;Full Profile Customization (profile picture, bio, website)&lt;/li&gt;
&lt;li&gt;Follow/Unfollow user system&lt;/li&gt;
&lt;li&gt;Post Creation with image uploads to Cloudinary&lt;/li&gt;
&lt;li&gt;Interactive Posts with likes, comments, and post deletion&lt;/li&gt;
&lt;li&gt;Ephemeral Stories that automatically expire after 24 hours&lt;/li&gt;
&lt;li&gt;Real-Time Notifications for likes, comments, and follows using Socket.IO&lt;/li&gt;
&lt;li&gt;Real-Time Direct Messaging (Chat) between users&lt;/li&gt;
&lt;li&gt;Dynamic Explore Page to discover popular content&lt;/li&gt;
&lt;li&gt;Saved Posts feature for bookmarking content&lt;/li&gt;
&lt;li&gt;User Search functionality to find and connect with others&lt;/li&gt;
&lt;li&gt;Responsive and Intuitive UI with skeleton loaders for a smooth experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Growth AI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-Powered Conversational Interface&lt;/li&gt;
&lt;li&gt;Real-time Response Rendering&lt;/li&gt;
&lt;li&gt;Multiple Chat Sessions&lt;/li&gt;
&lt;li&gt;Clean and Modern UI&lt;/li&gt;
&lt;li&gt;Responsive Design for All Devices&lt;/li&gt;
&lt;li&gt;Secure API Integration&lt;/li&gt;
&lt;li&gt;Persistent Chat History (Local Storage or DB)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Actually Helped Me Learn
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Build Projects, Not Just Follow Tutorials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After basics, I learned by building. Every new concept = new project.&lt;/p&gt;

&lt;p&gt;Want to learn React? Build something in React. Not another todo app. Something YOU want to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Document Everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I kept a dev journal. Every time I solved a hard problem, I wrote it down.&lt;/p&gt;

&lt;p&gt;Now when I hit the same problem, I have my own notes. Way better than googling the same thing 50 times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Read Other People's Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub is free education. Find projects similar to what you're building, read the code.&lt;/p&gt;

&lt;p&gt;I learned more from reading Next.js source code than any tutorial taught me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Don't Learn Everything At Once&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wasted months trying to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend frameworks&lt;/li&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;DevOps&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;All at the same time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn ONE thing deeply, then add layers.&lt;/p&gt;

&lt;p&gt;My path: HTML/CSS → JavaScript → React → Backend → Databases&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deploy Your Projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code on localhost isn't real. Deploy it.&lt;/p&gt;

&lt;p&gt;Netlify, Vercel, Railway - they're free. Deploy everything.&lt;/p&gt;

&lt;p&gt;You'll learn about environment variables, CORS, HTTPS, and all the stuff tutorials skip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Join Communities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Discord servers, Reddit, dev.to - other developers are helpful.&lt;/p&gt;

&lt;p&gt;I was scared to ask "dumb questions" for so long. Turns out, everyone has the same questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack I Use Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React / Next.js (for everything)&lt;/li&gt;
&lt;li&gt;Tailwind CSS (never going back to vanilla CSS)&lt;/li&gt;
&lt;li&gt;TypeScript (game changer for big projects)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js + Express (simple, works)&lt;/li&gt;
&lt;li&gt;MongoDB (when I need a database)&lt;/li&gt;
&lt;li&gt;Firebase (for quick projects)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code + extensions&lt;/li&gt;
&lt;li&gt;Git + GitHub&lt;/li&gt;
&lt;li&gt;Figma (for designs)&lt;/li&gt;
&lt;li&gt;Postman (for API testing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deployment:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vercel (frontend)&lt;/li&gt;
&lt;li&gt;Railway / Render (backend)&lt;/li&gt;
&lt;li&gt;Cloudinary (images)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Wish I Knew at 15
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You don't need a $3000 course&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I learned everything from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YouTube (Traversy Media, Web Dev Simplified, Fireship)&lt;/li&gt;
&lt;li&gt;freeCodeCamp&lt;/li&gt;
&lt;li&gt;docs&lt;/li&gt;
&lt;li&gt;Building stuff and googling errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You don't need a perfect portfolio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My first portfolio had 3 projects. That's enough. Just make sure they WORK and the code is on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Age doesn't matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm 18. Some people start at 30. Some at 50. Doesn't matter. Just start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency beats intensity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1 hour every day &amp;gt; 10 hours once a week&lt;/p&gt;

&lt;p&gt;I coded daily, even if just for 30 minutes. That adds up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your first projects will suck&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's normal. Make them anyway. You can't get better without making bad stuff first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I Am Now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;12 projects in my portfolio&lt;/li&gt;
&lt;li&gt;First freelance client ($200)&lt;/li&gt;
&lt;li&gt;Starting to apply for junior dev positions&lt;/li&gt;
&lt;li&gt;Still learning every day&lt;/li&gt;
&lt;li&gt;Still googling "how to center a div" sometimes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not a senior developer. I'm not a genius. I'm just someone who started at 15 and didn't quit.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You're Just Starting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start today.&lt;/strong&gt; Not tomorrow. Today.&lt;/p&gt;

&lt;p&gt;Pick ONE thing to learn (I'd say HTML/CSS). Follow ONE tutorial. Build ONE thing.&lt;/p&gt;

&lt;p&gt;Then build another. Then another.&lt;/p&gt;

&lt;p&gt;In 3 years, you'll look back and be amazed at how far you've come.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perfect conditions&lt;/li&gt;
&lt;li&gt;Expensive courses&lt;/li&gt;
&lt;li&gt;A CS degree&lt;/li&gt;
&lt;li&gt;To be a "natural"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You just need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A laptop&lt;/li&gt;
&lt;li&gt;Internet&lt;/li&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;li&gt;Patience with yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next For Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep building projects&lt;/li&gt;
&lt;li&gt;Learn more about system design&lt;/li&gt;
&lt;li&gt;Contribute to open source&lt;/li&gt;
&lt;li&gt;Maybe start a YouTube channel?&lt;/li&gt;
&lt;li&gt;Get my first dev job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm 18. I have so much to learn. But I'm not waiting until I "know enough."&lt;/p&gt;

&lt;p&gt;I'm building, shipping, and learning as I go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;If you're learning to code right now - what's holding you back from building something?&lt;/p&gt;

&lt;p&gt;If you already learned - what do you wish you knew when you started?&lt;/p&gt;

&lt;p&gt;Drop it in the comments. Let's help each other out.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;My learning resources (all free):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;freeCodeCamp&lt;/li&gt;
&lt;li&gt;JavaScript.info&lt;/li&gt;
&lt;li&gt;React docs&lt;/li&gt;
&lt;li&gt;YouTube (Traversy, WebDevSimplified, Fireship)&lt;/li&gt;
&lt;li&gt;MDN Web Docs&lt;/li&gt;
&lt;li&gt;Stack Overflow (obviously)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Follow my journey:&lt;/strong&gt;&lt;br&gt;
My PortFolio - &lt;a href="https://sahil-sahu-portfolio.vercel.app/" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;br&gt;
Follow me on X - &lt;a href="https://x.com/SahilSahu731" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this helped you, hit that ❤️. If you're learning too, drop your GitHub - I'll check out your projects!&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #beginners #javascript #react #coding #100daysofcode
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Stopped Writing Tests and My Code Got Better</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Tue, 04 Nov 2025 07:42:05 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/i-stopped-writing-tests-and-my-code-got-better-3hd1</link>
      <guid>https://forem.com/sahil_sahu/i-stopped-writing-tests-and-my-code-got-better-3hd1</guid>
      <description>&lt;p&gt;Yeah, I said it. Come at me.&lt;/p&gt;

&lt;p&gt;Before you start typing that angry comment, hear me out. I'm not saying "don't test." I'm saying I stopped writing tests the way everyone tells you to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;For years, I followed the gospel: Write tests first. Test everything. 100% coverage. TDD or bust.&lt;/p&gt;

&lt;p&gt;My codebase had 3,247 tests. Coverage was 94%. CI took 23 minutes to run. I felt like a responsible adult developer.&lt;/p&gt;

&lt;p&gt;Then I shipped a bug that wiped out $12k worth of data.&lt;/p&gt;

&lt;p&gt;The tests? All green. ✅&lt;/p&gt;

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

&lt;p&gt;The bug was simple: An edge case in our payment processing where users could submit the same transaction twice within 50ms. Race condition. Classic.&lt;/p&gt;

&lt;p&gt;Why didn't the tests catch it? Because I tested what I thought about, not what actually breaks.&lt;/p&gt;

&lt;p&gt;Our test suite was massive, but it was testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Happy paths (90% of tests)&lt;/li&gt;
&lt;li&gt;Edge cases I imagined (9% of tests)
&lt;/li&gt;
&lt;li&gt;Whatever got me to 94% coverage (1% of tests)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero tests for the actual user behavior that broke things.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;Most tests are just checking if functions return what you told them to return. That's not testing, that's just... writing the same logic twice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// My old tests looked like this&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculateTotal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should add tax to subtotal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;110&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;// Cool story. But did I test:&lt;/span&gt;
&lt;span class="c1"&gt;// - What if subtotal is negative?&lt;/span&gt;
&lt;span class="c1"&gt;// - What if tax is a string "10%"?&lt;/span&gt;
&lt;span class="c1"&gt;// - What if this runs 1000 times per second?&lt;/span&gt;
&lt;span class="c1"&gt;// - What if the user's locale formats numbers differently?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Do Now Instead
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. I Write Fewer, Better Tests
&lt;/h3&gt;

&lt;p&gt;Instead of 3,247 tests, I have about 400. But these 400 tests are &lt;em&gt;mean&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// New style: Test like users actually break things&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment processing under stress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;handles rapid duplicate submissions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test-user&lt;/span&gt;&lt;span class="dl"&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;paymentData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4242...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Fire 10 identical requests simultaneously&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promises&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;paymentData&lt;/span&gt;&lt;span class="p"&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;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promises&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;successful&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Only ONE should succeed&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;successful&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. I Test Integration, Not Units
&lt;/h3&gt;

&lt;p&gt;Unit tests are overrated. There, I said it again.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;calculateTax()&lt;/code&gt; function works fine in isolation. But does it work when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The database returns null&lt;/li&gt;
&lt;li&gt;The API times out
&lt;/li&gt;
&lt;li&gt;The user's session expires mid-request&lt;/li&gt;
&lt;li&gt;Redis goes down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's what breaks in production. Not your pure functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. I Use Property-Based Testing
&lt;/h3&gt;

&lt;p&gt;This changed everything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fc&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fast-check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Instead of testing specific cases, test properties&lt;/span&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user input never causes crashes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// any string&lt;/span&gt;
      &lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// any integer&lt;/span&gt;
      &lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// any object&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;metadata&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;// This should NEVER throw, no matter what garbage we pass&lt;/span&gt;
        &lt;span class="nf"&gt;expect&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="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toThrow&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="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;This generates thousands of random test cases. It found 7 bugs in my code that I would NEVER have thought to test.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. I Test in Production
&lt;/h3&gt;

&lt;p&gt;Controversial? Maybe. Effective? Absolutely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Feature flags + monitoring = production tests&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;featureFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newPaymentFlow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&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;newPaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new_payment_flow.success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new_payment_flow.error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;New payment flow failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Fallback to old flow&lt;/span&gt;
    &lt;span class="nx"&gt;result&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;oldPaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payment&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I know in real-time if something's broken. My test environment never caught the issues that production monitoring does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;6 months after this switch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tests run in 4 minutes&lt;/strong&gt; instead of 23&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Found 3x more bugs&lt;/strong&gt; before users did&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployments went from scary to boring&lt;/strong&gt; (in a good way)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding new devs is faster&lt;/strong&gt; - they understand 400 good tests way easier than 3k mediocre ones&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm NOT Saying
&lt;/h2&gt;

&lt;p&gt;I'm not saying "don't test." I'm saying:&lt;/p&gt;

&lt;p&gt;❌ Stop writing tests just to hit coverage numbers&lt;br&gt;&lt;br&gt;
❌ Stop testing only happy paths&lt;br&gt;&lt;br&gt;
❌ Stop writing tests that just repeat your implementation&lt;br&gt;&lt;br&gt;
✅ Start testing like users actually use (and break) your app&lt;br&gt;&lt;br&gt;
✅ Start testing the integration points where things actually fail&lt;br&gt;&lt;br&gt;
✅ Start monitoring production like it's part of your test suite  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Backlash I'm Ready For
&lt;/h2&gt;

&lt;p&gt;"But TDD!"&lt;br&gt;&lt;br&gt;
TDD is great for well-defined problems. But most of our work isn't well-defined. Requirements change. You'll rewrite those tests 5 times.&lt;/p&gt;

&lt;p&gt;"But code coverage!"&lt;br&gt;&lt;br&gt;
Coverage tells you what you executed, not what you tested. 100% coverage with bad tests is worse than 60% coverage with good tests.&lt;/p&gt;

&lt;p&gt;"But best practices!"&lt;br&gt;&lt;br&gt;
Best practices from 2010 don't apply to 2025 codebases. We have better tools now. Use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try This Instead
&lt;/h2&gt;

&lt;p&gt;For your next feature:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write ONE integration test that exercises the whole flow&lt;/li&gt;
&lt;li&gt;Add property-based tests for any user input&lt;/li&gt;
&lt;li&gt;Test the failure modes (timeouts, null responses, etc.)&lt;/li&gt;
&lt;li&gt;Add monitoring to catch what you missed&lt;/li&gt;
&lt;li&gt;Ship it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll find more bugs, write less code, and ship faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Am I completely wrong? Probably partially. Tell me why in the comments.&lt;/p&gt;

&lt;p&gt;Already doing something like this? Share your approach. Let's learn from each other.&lt;/p&gt;

&lt;p&gt;Still writing unit tests for getters and setters? I'm sorry for your loss.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tools I Actually Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/dubzzz/fast-check" rel="noopener noreferrer"&gt;fast-check&lt;/a&gt; - Property-based testing for JS/TS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt; - Integration testing that doesn't suck&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog/New Relic/etc&lt;/a&gt; - Production monitoring&lt;/li&gt;
&lt;li&gt;Feature flags (LaunchDarkly, Unleash, or roll your own)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hit that ❤️ if this made you question your test suite. Drop a 💀 if you think I'm about to get fired.&lt;/p&gt;

&lt;h1&gt;
  
  
  testing #controversial #webdev #javascript #devops
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Broke My Code 17 Times in One Day — Here’s What I Learned</title>
      <dc:creator>Sahil Sahu</dc:creator>
      <pubDate>Fri, 31 Oct 2025 08:28:05 +0000</pubDate>
      <link>https://forem.com/sahil_sahu/i-broke-my-code-17-times-in-one-day-heres-what-i-learned-3fp8</link>
      <guid>https://forem.com/sahil_sahu/i-broke-my-code-17-times-in-one-day-heres-what-i-learned-3fp8</guid>
      <description>&lt;p&gt;Let’s be honest — we’ve all been there.&lt;/p&gt;

&lt;p&gt;You install a new tool, follow every tutorial step by step… and &lt;strong&gt;still get an error that makes zero sense&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For me, it was Docker.&lt;/p&gt;

&lt;p&gt;I was excited to containerize my first app. I wrote my Dockerfile, typed &lt;code&gt;docker build .&lt;/code&gt;, and BAM —&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ERROR: error during connect: Head "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/_ping": The system cannot find the file specified.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I stared at it for 10 minutes straight.&lt;/p&gt;

&lt;p&gt;But that one frustrating day taught me lessons every developer should know — especially if you’re just getting started with modern tools like Docker, Git, or any CLI-based tech.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Don’t just copy-paste commands — understand them
&lt;/h2&gt;

&lt;p&gt;Tutorials are great, but they often skip &lt;em&gt;why&lt;/em&gt; you’re running each command.&lt;/p&gt;

&lt;p&gt;When I typed &lt;code&gt;docker build&lt;/code&gt;, I didn’t even know that it connects to a background process called the &lt;strong&gt;Docker daemon&lt;/strong&gt;.&lt;br&gt;
Once I realized that, the error message finally made sense — my Docker daemon wasn’t running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Every command has a purpose. Before running it, ask yourself — &lt;em&gt;what does this actually do?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. 90% of bugs aren’t code — they’re setup issues
&lt;/h2&gt;

&lt;p&gt;You can write perfect code and still get errors because of missing installations, environment variables, or wrong versions.&lt;/p&gt;

&lt;p&gt;Instead of blaming yourself, &lt;strong&gt;blame your environment first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, whenever something breaks, I run through a checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is my service running?&lt;/li&gt;
&lt;li&gt;Is the path or environment variable correct?&lt;/li&gt;
&lt;li&gt;Did I open the correct terminal (Windows CMD vs WSL vs Linux shell)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mindset alone saves hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Read error messages like clues
&lt;/h2&gt;

&lt;p&gt;Errors are not enemies — they’re breadcrumbs.&lt;/p&gt;

&lt;p&gt;That terrifying long red text in your terminal? It’s actually your best friend.&lt;br&gt;
It’s trying to tell you &lt;em&gt;exactly&lt;/em&gt; where things went wrong.&lt;/p&gt;

&lt;p&gt;When I learned to slow down and read every line of an error, I started solving issues faster — even ones I’d never seen before.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Document your pain — someone else needs it
&lt;/h2&gt;

&lt;p&gt;Every time I fix a weird bug, I write it down.&lt;br&gt;
Not only does it help me later, but it also turns into a &lt;strong&gt;blog post like this&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you share your learnings, you help others skip the same pain — and that’s how you grow your dev audience.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The “Error → Curiosity → Understanding” loop
&lt;/h2&gt;

&lt;p&gt;That day I broke my code 17 times was exhausting. But each fix gave me a deeper understanding of how Docker works.&lt;br&gt;
And that’s the secret to becoming a better developer — not avoiding errors, but &lt;em&gt;learning through them&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Final Thought
&lt;/h3&gt;

&lt;p&gt;Every developer has a “nothing works” day.&lt;br&gt;
But those days shape you far more than the ones where everything runs smoothly.&lt;/p&gt;

&lt;p&gt;So next time you hit a scary error, don’t quit — &lt;strong&gt;debug it, document it, and share it&lt;/strong&gt;.&lt;br&gt;
You never know whose life (or terminal) you might make easier.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you enjoyed this post&lt;/strong&gt;, give it a ❤️ and follow me — I’ll be sharing more real-world dev lessons and debugging stories every week.&lt;/p&gt;

&lt;p&gt;Let’s grow together, one error at a time.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>development</category>
    </item>
  </channel>
</rss>
