<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[codeWithNaydu]]></title><description><![CDATA[codeWithNaydu]]></description><link>https://blog.sticobytes.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 04:58:42 GMT</lastBuildDate><atom:link href="https://blog.sticobytes.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why React-Quill Broke My React 19 App and How TipTap Saved It]]></title><description><![CDATA[Introduction
I'm currently building my first fullstack web application — a digital agency website with a complete blog management system. On Day 13 of the build, I ran into one of those errors that stops everything and sends you deep into Stack Overf...]]></description><link>https://blog.sticobytes.com/why-react-quill-broke-my-react-19-app-and-how-tiptap-saved-it</link><guid isPermaLink="true">https://blog.sticobytes.com/why-react-quill-broke-my-react-19-app-and-how-tiptap-saved-it</guid><category><![CDATA[React]]></category><category><![CDATA[tiptap]]></category><category><![CDATA[React 19]]></category><category><![CDATA[webdev]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Wed, 18 Feb 2026 12:55:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771419010385/ef8afc6a-b145-48d7-b893-cd39c35d24f2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-introduction">Introduction</h2>
<p>I'm currently building my first fullstack web application — a digital agency website with a complete blog management system. On Day 13 of the build, I ran into one of those errors that stops everything and sends you deep into Stack Overflow. This is the story of that error, why it happened, and how I fixed it.</p>
<hr />
<h2 id="heading-what-i-was-building">What I Was Building</h2>
<p>I needed a rich text editor for an admin blog dashboard. The requirements were simple:</p>
<ul>
<li><p>Bold, italic, headings</p>
</li>
<li><p>Bullet lists and numbered lists</p>
</li>
<li><p>Code blocks</p>
</li>
<li><p>Image support</p>
</li>
</ul>
<p>React-Quill seemed like the obvious choice. It's popular, well-documented, and has thousands of GitHub stars. So I installed it:</p>
<pre><code class="lang-bash">npm install react-quill@2.0.0 quill@1.3.7 --legacy-peer-deps
</code></pre>
<p>Everything looked fine. Then I opened the page.</p>
<hr />
<h2 id="heading-the-error">The Error</h2>
<pre><code class="lang-plaintext">Uncaught TypeError: react_dom_1.default.findDOMNode is not a function
    at ReactQuill2.getEditingArea (react-quill.js:13139:45)
    at ReactQuill2.instantiateEditor (react-quill.js:13028:50)
    at ReactQuill2.componentDidMount (react-quill.js:12998:16)
</code></pre>
<p>The editor crashed immediately on mount. The page was blank. Nothing worked.</p>
<hr />
<h2 id="heading-why-this-happens">Why This Happens</h2>
<p>The key is in the error: <code>findDOMNode is not a function</code>.</p>
<p><code>findDOMNode</code> was a React DOM method that allowed class components to access their underlying DOM node. React deprecated it years ago and finally <strong>removed it completely in React 19</strong>.</p>
<p>React-Quill 2.0.0 internally uses class components and calls <code>findDOMNode</code> to locate its editor container. Since React 19 no longer has this method, the editor crashes the moment it tries to mount.</p>
<p>You can verify your React version by checking <code>package.json</code>:</p>
<pre><code class="lang-json"><span class="hljs-string">"react"</span>: <span class="hljs-string">"^19.2.0"</span>
</code></pre>
<p>If you are on React 19, React-Quill will not work. There is no workaround — the issue is inside React-Quill's source code itself.</p>
<hr />
<h2 id="heading-what-i-tried-first-that-didnt-work">What I Tried First That Didn't Work</h2>
<p>I tried wrapping the editor in an error boundary. The editor still crashed before rendering.</p>
<p>I tried lazy loading it with dynamic imports. Same result — the crash happens inside <code>componentDidMount</code>, not during import.</p>
<p>I tried downgrading React-Quill versions. None of the published versions support React 19.</p>
<p>The conclusion was clear: React-Quill needed to be replaced entirely.</p>
<hr />
<h2 id="heading-the-solution-tiptap">The Solution: TipTap</h2>
<p>TipTap is a modern headless rich text editor built specifically for React. It uses hooks instead of class components, which means it has zero compatibility issues with React 19.</p>
<p>Install it like this:</p>
<pre><code class="lang-bash">npm install @tiptap/react @tiptap/pm @tiptap/starter-kit @tiptap/extension-image @tiptap/extension-link @tiptap/extension-placeholder --legacy-peer-deps
</code></pre>
<hr />
<h2 id="heading-setting-up-tiptap-in-react-19">Setting Up TipTap in React 19</h2>
<p>Here is a minimal working example:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { useEditor, EditorContent } <span class="hljs-keyword">from</span> <span class="hljs-string">'@tiptap/react'</span>;
<span class="hljs-keyword">import</span> StarterKit <span class="hljs-keyword">from</span> <span class="hljs-string">'@tiptap/starter-kit'</span>;

<span class="hljs-keyword">const</span> Editor = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> editor = useEditor({
    <span class="hljs-attr">extensions</span>: [StarterKit],
    <span class="hljs-attr">content</span>: <span class="hljs-string">'&lt;p&gt;Start writing here...&lt;/p&gt;'</span>,
    <span class="hljs-attr">editorProps</span>: {
      <span class="hljs-attr">attributes</span>: {
        <span class="hljs-attr">class</span>: <span class="hljs-string">'focus:outline-none min-h-64 px-4 py-3'</span>,
      },
    },
  });

  <span class="hljs-comment">// Get HTML content for saving</span>
  <span class="hljs-keyword">const</span> handleSave = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> html = editor.getHTML();
    <span class="hljs-built_in">console</span>.log(html); <span class="hljs-comment">// Send this to your API</span>
  };

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">EditorContent</span> <span class="hljs-attr">editor</span>=<span class="hljs-string">{editor}</span> /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{handleSave}</span>&gt;</span>Save<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> Editor;
</code></pre>
<p>Two things to note:</p>
<ul>
<li><p><code>useEditor()</code> initializes the editor instance</p>
</li>
<li><p><code>EditorContent</code> renders it into the DOM</p>
</li>
<li><p><code>editor.getHTML()</code> gives you the content as an HTML string ready to save to your database</p>
</li>
</ul>
<hr />
<h2 id="heading-building-a-custom-toolbar">Building a Custom Toolbar</h2>
<p>TipTap is headless — it has no built-in toolbar UI. You build your own, which actually gives you full control. Here is how I built mine:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> ToolbarButton = <span class="hljs-function">(<span class="hljs-params">{ onClick, active, children }</span>) =&gt;</span> (
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button</span>
    <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span>
    <span class="hljs-attr">onClick</span>=<span class="hljs-string">{onClick}</span>
    <span class="hljs-attr">className</span>=<span class="hljs-string">{</span>`<span class="hljs-attr">px-2</span> <span class="hljs-attr">py-1</span> <span class="hljs-attr">rounded</span> <span class="hljs-attr">text-sm</span> <span class="hljs-attr">font-medium</span> ${
      <span class="hljs-attr">active</span> ? '<span class="hljs-attr">bg-blue-100</span> <span class="hljs-attr">text-blue-700</span>' <span class="hljs-attr">:</span> '<span class="hljs-attr">text-gray-600</span> <span class="hljs-attr">hover:bg-gray-100</span>'
    }`}&gt;</span>
    {children}
  <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></span>
);

<span class="hljs-comment">// Inside your component:</span>
<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"flex gap-1 p-2 border-b"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">ToolbarButton</span>
    <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> editor.chain().focus().toggleBold().run()}
    active={editor.isActive('bold')}&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>B<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">ToolbarButton</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">ToolbarButton</span>
    <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> editor.chain().focus().toggleItalic().run()}
    active={editor.isActive('italic')}&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">em</span>&gt;</span>I<span class="hljs-tag">&lt;/<span class="hljs-name">em</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">ToolbarButton</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">ToolbarButton</span>
    <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> editor.chain().focus().toggleBulletList().run()}
    active={editor.isActive('bulletList')}&gt;
    • List
  <span class="hljs-tag">&lt;/<span class="hljs-name">ToolbarButton</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">ToolbarButton</span>
    <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> editor.chain().focus().toggleHeading({ level: 2 }).run()}
    active={editor.isActive('heading', { level: 2 })}&gt;
    H2
  <span class="hljs-tag">&lt;/<span class="hljs-name">ToolbarButton</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
</code></pre>
<p>The <code>chain().focus().toggleBold().run()</code> pattern is TipTap's command API. It chains actions together and executes them on the editor.</p>
<hr />
<h2 id="heading-one-gotcha-loading-existing-content">One Gotcha: Loading Existing Content</h2>
<p>If you are building an edit form where you need to load existing content into the editor, there is a timing issue to be aware of. The editor initializes asynchronously, and your API data also loads asynchronously. If you call <code>editor.commands.setContent()</code> before the editor is ready, nothing happens.</p>
<p>The fix is to use a separate state variable and a <code>useEffect</code> that watches both:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> [postContent, setPostContent] = useState(<span class="hljs-string">''</span>);

<span class="hljs-keyword">const</span> editor = useEditor({
  <span class="hljs-attr">extensions</span>: [StarterKit],
  <span class="hljs-attr">content</span>: <span class="hljs-string">''</span>,
});

<span class="hljs-comment">// Sync content to editor only when BOTH are ready</span>
useEffect(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">if</span> (editor &amp;&amp; postContent) {
    editor.commands.setContent(postContent);
  }
}, [editor, postContent]);

<span class="hljs-comment">// When your API data loads:</span>
<span class="hljs-keyword">const</span> fetchPost = <span class="hljs-keyword">async</span> () =&gt; {
  <span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> axios.get(<span class="hljs-string">`/api/blog/post/<span class="hljs-subst">${id}</span>`</span>);
  setPostContent(response.data.content); <span class="hljs-comment">// This triggers the useEffect</span>
};
</code></pre>
<p>This pattern ensures content is set safely regardless of which loads first.</p>
<hr />
<h2 id="heading-add-list-styles-to-css">Add List Styles to CSS</h2>
<p>TipTap renders lists correctly in the DOM but you need to add CSS to make them visible. Add this to your global stylesheet:</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.tiptap</span> <span class="hljs-selector-tag">ul</span> {
  <span class="hljs-attribute">list-style-type</span>: disc;
  <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">1.5rem</span>;
  <span class="hljs-attribute">margin</span>: <span class="hljs-number">0.5rem</span> <span class="hljs-number">0</span>;
}

<span class="hljs-selector-class">.tiptap</span> <span class="hljs-selector-tag">ol</span> {
  <span class="hljs-attribute">list-style-type</span>: decimal;
  <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">1.5rem</span>;
  <span class="hljs-attribute">margin</span>: <span class="hljs-number">0.5rem</span> <span class="hljs-number">0</span>;
}

<span class="hljs-selector-class">.tiptap</span> <span class="hljs-selector-tag">h2</span> {
  <span class="hljs-attribute">font-size</span>: <span class="hljs-number">1.5rem</span>;
  <span class="hljs-attribute">font-weight</span>: bold;
  <span class="hljs-attribute">margin</span>: <span class="hljs-number">0.75rem</span> <span class="hljs-number">0</span>;
}

<span class="hljs-selector-class">.tiptap</span> <span class="hljs-selector-tag">blockquote</span> {
  <span class="hljs-attribute">border-left</span>: <span class="hljs-number">4px</span> solid <span class="hljs-number">#009ad9</span>;
  <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">1rem</span>;
  <span class="hljs-attribute">color</span>: <span class="hljs-number">#6b7280</span>;
}
</code></pre>
<p>Without this, bullet points and headings will render invisibly.</p>
<hr />
<h2 id="heading-key-takeaway">Key Takeaway</h2>
<p>Before installing any npm package, check whether it supports your React version. React 19 is still new and many popular packages have not updated yet.</p>
<p>If you see <code>findDOMNode is not a function</code> in your console, the package you are using relies on a removed React API. The fix is to find a modern alternative — not to downgrade React.</p>
<p>TipTap is that alternative for rich text editing. It is actively maintained, React 19 ready, and honestly more flexible than React-Quill anyway.</p>
<hr />
<h2 id="heading-what-im-building">What I'm Building</h2>
<p>This editor is part of a 30-day fullstack project I am documenting publicly. I am building a complete digital agency website with React, Node.js, PostgreSQL and Cloudinary. Follow along if you want to see the full build!</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[The Confusing React Error That Has Nothing to Do With What It Says]]></title><description><![CDATA[The Confusing React Error That Has Nothing to Do With What It Says
How We Fixed a react-helmet-async Crash That Gave Us Zero Clues

If you have been building React apps for a while, you know the feeling. You write your code, save the file, check the ...]]></description><link>https://blog.sticobytes.com/the-confusing-react-error-that-has-nothing-to-do-with-what-it-says</link><guid isPermaLink="true">https://blog.sticobytes.com/the-confusing-react-error-that-has-nothing-to-do-with-what-it-says</guid><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[debugging]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Tue, 17 Feb 2026 13:04:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771333467329/5ad4bff0-a7a8-4991-8e69-5d3ab1ea8ba1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-the-confusing-react-error-that-has-nothing-to-do-with-what-it-says">The Confusing React Error That Has Nothing to Do With What It Says</h1>
<h2 id="heading-how-we-fixed-a-react-helmet-async-crash-that-gave-us-zero-clues">How We Fixed a react-helmet-async Crash That Gave Us Zero Clues</h2>
<hr />
<p>If you have been building React apps for a while, you know the feeling. You write your code, save the file, check the browser, and instead of seeing your beautiful page — you get a white screen and a red error in the console that makes absolutely no sense.</p>
<p>That is exactly what happened to us on Day 12 of building the Sticobytes website. We had just finished the Blog listing page. Everything looked good. The code was clean. And then this showed up in the browser console:</p>
<pre><code class="lang-plaintext">Uncaught TypeError: Cannot read properties of undefined (reading 'add')
    at HelmetDispatcher.init (react-helmet-async.js:812:21)
    at HelmetDispatcher.render (react-helmet-async.js:816:10)
</code></pre>
<p>White screen. Blog page gone. No helpful hints.</p>
<p>If you have never seen this error before, welcome to the club. Let us break it down together — what caused it, why the error message is so misleading, and most importantly, what the fix is and why it works.</p>
<hr />
<h2 id="heading-first-what-is-react-helmet-async">First, What Is react-helmet-async?</h2>
<p>Before we talk about the error, let us quickly understand what <code>react-helmet-async</code> is and why we were using it.</p>
<p>When you visit a website, each page usually has a unique title in the browser tab — something like "Blog | Sticobytes Digital Agency". Each page also has hidden tags in the HTML <code>&lt;head&gt;</code> section called <strong>meta tags</strong>. These tags tell Google, Facebook, Twitter, and other platforms what the page is about. They look like this in your HTML:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Blog | Sticobytes Digital Agency<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"description"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"Explore our latest tutorials and insights."</span> /&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"og:title"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"Blog | Sticobytes Digital Agency"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
</code></pre>
<p>In a normal HTML website, you just type those tags directly into your HTML file. But React apps work differently. React controls the entire page through JavaScript — there is only one HTML file (<code>index.html</code>) and React swaps the content dynamically as you navigate between pages.</p>
<p>So how do you change the page title and meta tags when the user moves from the Home page to the Blog page to a single Blog Post? That is exactly what <code>react-helmet-async</code> solves. It lets you set those <code>&lt;head&gt;</code> tags from inside your React components like this:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { Helmet } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-helmet-async'</span>;

<span class="hljs-keyword">const</span> Blog = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">Helmet</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Blog | Sticobytes Digital Agency<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"description"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"Explore our latest tutorials."</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">Helmet</span>&gt;</span>

      {/* rest of your page */}
    <span class="hljs-tag">&lt;/&gt;</span></span>
  );
};
</code></pre>
<p>Clean, simple, and it works on every page. This is important for SEO — search engines like Google read those meta tags to understand and rank your pages.</p>
<p>We added <code>&lt;Helmet&gt;</code> to our Blog page. Saved the file. And that is when the white screen appeared.</p>
<hr />
<h2 id="heading-the-error-and-why-it-is-so-misleading">The Error — And Why It Is So Misleading</h2>
<p>Let us look at the error again:</p>
<pre><code class="lang-plaintext">Uncaught TypeError: Cannot read properties of undefined (reading 'add')
    at HelmetDispatcher.init
</code></pre>
<p>Read that error message carefully. What does it tell you?</p>
<ul>
<li><p>Something is <code>undefined</code></p>
</li>
<li><p>It tried to read a property called <code>'add'</code> from that undefined thing</p>
</li>
<li><p>It happened inside <code>HelmetDispatcher.init</code></p>
</li>
</ul>
<p>What does it NOT tell you?</p>
<ul>
<li><p>What is undefined</p>
</li>
<li><p>Why it is undefined</p>
</li>
<li><p>What you need to do to fix it</p>
</li>
</ul>
<p>This is the kind of error that sends new developers to Google for an hour. Because nothing in the message says "hey, you forgot to add HelmetProvider". It just says something is undefined somewhere deep inside the library code.</p>
<p>Here is what is actually happening under the hood.</p>
<hr />
<h2 id="heading-what-react-context-is-in-plain-english">What React Context Is (In Plain English)</h2>
<p>To understand the real cause of this error, you need to understand a concept called <strong>React Context</strong>.</p>
<p>Imagine you are in a large office building. The building has a central electricity supply room in the basement. Every floor, every room, every socket in that building gets its power from that central room. You do not need to run individual wires from the power station outside directly to every single desk. The building's infrastructure handles it.</p>
<p>React Context works the same way. Some libraries need a <strong>central "supply room"</strong> set up at the top of your app. Once that central room exists, every component anywhere in your app can tap into it — no matter how deeply nested it is.</p>
<p>For <code>react-helmet-async</code>, that central supply room is called <code>HelmetProvider</code>.</p>
<p>When you use <code>&lt;Helmet&gt;</code> inside your <code>Blog</code> component, it does not work on its own. It tries to communicate with <code>HelmetProvider</code> — to say "hey, update the page title and meta tags to these values". If <code>HelmetProvider</code> does not exist, there is nothing to communicate with. The connection is <code>undefined</code>. And that is exactly what the error is telling us, just in a very unhelpful way.</p>
<hr />
<h2 id="heading-the-fix">The Fix</h2>
<p>The fix is simple once you know what is missing. Open your <code>main.jsx</code> file — this is the entry point of your React app, the very top of your component tree.</p>
<p><strong>Before (broken):</strong></p>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { StrictMode } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>
<span class="hljs-keyword">import</span> { createRoot } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-dom/client'</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'./index.css'</span>
<span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.jsx'</span>

createRoot(<span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'root'</span>)).render(
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">StrictMode</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">App</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">StrictMode</span>&gt;</span></span>,
)
</code></pre>
<p><strong>After (fixed):</strong></p>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> { StrictMode } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>
<span class="hljs-keyword">import</span> { createRoot } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-dom/client'</span>
<span class="hljs-keyword">import</span> { HelmetProvider } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-helmet-async'</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'./index.css'</span>
<span class="hljs-keyword">import</span> App <span class="hljs-keyword">from</span> <span class="hljs-string">'./App.jsx'</span>

createRoot(<span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'root'</span>)).render(
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">StrictMode</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">HelmetProvider</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">App</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">HelmetProvider</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">StrictMode</span>&gt;</span></span>,
)
</code></pre>
<p>Two changes:</p>
<ol>
<li><p>Import <code>HelmetProvider</code> from <code>react-helmet-async</code></p>
</li>
<li><p>Wrap <code>&lt;App /&gt;</code> with <code>&lt;HelmetProvider&gt;</code></p>
</li>
</ol>
<p>Save the file. Refresh the browser. White screen gone. Blog page working perfectly.</p>
<hr />
<h2 id="heading-why-this-fix-works-everywhere-forever">Why This Fix Works Everywhere, Forever</h2>
<p>Here is the beautiful part about this fix. You do it <strong>once</strong> and it works for every single page in your app — now and in the future.</p>
<p>Because <code>HelmetProvider</code> wraps <code>&lt;App /&gt;</code>, which contains your entire application, every component anywhere in your app can now use <code>&lt;Helmet&gt;</code> without any issues. Your Home page, Blog page, Services page, individual Blog Post pages, Contact page — all of them can set their own unique titles and meta tags, and they all tap into that one <code>HelmetProvider</code> you set up in <code>main.jsx</code>.</p>
<hr />
<h2 id="heading-the-bigger-lesson-the-provider-pattern">The Bigger Lesson — The Provider Pattern</h2>
<p>This is not just a <code>react-helmet-async</code> thing. This is a pattern you will see over and over again in React development. It is called the <strong>Provider Pattern</strong>.</p>
<p>Many popular React libraries work this way:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Library</td><td>Provider You Need</td></tr>
</thead>
<tbody>
<tr>
<td>react-helmet-async</td><td><code>HelmetProvider</code></td></tr>
<tr>
<td>React Router</td><td><code>BrowserRouter</code></td></tr>
<tr>
<td>Redux</td><td><code>Provider</code> from react-redux</td></tr>
<tr>
<td>React Query</td><td><code>QueryClientProvider</code></td></tr>
<tr>
<td>Custom Auth</td><td><code>AuthProvider</code> (your own)</td></tr>
</tbody>
</table>
</div><p>The rule is simple: <strong>if a library exports both a Provider and a component that uses it, the Provider must be an ancestor of all components that use it — and usually that means putting it in</strong> <code>main.jsx</code> at the very top.</p>
<p>When you see a cryptic error from a library you just installed, one of the first questions to ask yourself is: "Does this library need a Provider that I forgot to add?"</p>
<hr />
<h2 id="heading-how-to-spot-this-pattern-in-future">How to Spot This Pattern in Future</h2>
<p>When you install a new React library, do this one thing before writing any code — read the "Getting Started" or "Installation" section of the documentation and look for any mention of a Provider or a wrapper component.</p>
<p>If you see something like:</p>
<pre><code class="lang-jsx"><span class="hljs-comment">// Wrap your app with this</span>
&lt;SomeProvider&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">App</span> /&gt;</span></span>
&lt;/SomeProvider&gt;
</code></pre>
<p>Go straight to <code>main.jsx</code> and add it there. Do not add it to individual pages. Add it once at the root. That is the correct way.</p>
<hr />
<h2 id="heading-quick-summary">Quick Summary</h2>
<p>Here is everything we covered, in one place:</p>
<ul>
<li><p><strong>What happened:</strong> We added <code>&lt;Helmet&gt;</code> to our Blog page for SEO meta tags but got a white screen with a confusing error</p>
</li>
<li><p><strong>Why it happened:</strong> <code>react-helmet-async</code> requires a <code>HelmetProvider</code> at the root of the app. Without it, <code>&lt;Helmet&gt;</code> has nothing to connect to and crashes</p>
</li>
<li><p><strong>Why the error is confusing:</strong> The error message talks about <code>undefined</code> and <code>'add'</code> — nothing about a missing Provider</p>
</li>
<li><p><strong>The fix:</strong> Import <code>HelmetProvider</code> and wrap <code>&lt;App /&gt;</code> with it in <code>main.jsx</code></p>
</li>
<li><p><strong>The bigger lesson:</strong> This is the Provider Pattern — many React libraries need a root-level Provider. Always check the docs for this when installing something new</p>
</li>
</ul>
<hr />
<h2 id="heading-final-thought">Final Thought</h2>
<p>The most valuable bugs are the ones that teach you something that applies far beyond the original problem. This one taught us about React Context, the Provider Pattern, and how to read cryptic library errors.</p>
<p>Next time you see an error that seems to come from deep inside a library with no clear explanation — take a breath, check if a Provider is missing, and remember this post.</p>
<p>Happy building. 🚀</p>
<hr />
<p>Written by Chinedu Obia, Co-Founder of Sticobytes — sharing real bugs from real projects so you learn faster than we did.</p>
<p>Follow the Sticobytes 30-day build journey at <a target="_blank" href="http://blog.sticobytes.com">blog.sticobytes.com</a></p>
]]></content:encoded></item><item><title><![CDATA[Stop Using AI to Learn Code (Until You Can Code Without It)]]></title><description><![CDATA[I've been coding for about three years now. I'm not a beginner anymore, but I recently joined a bootcamp to level up my skills and connect with other developers. What I've observed across online learning communities, coding forums, and even in struct...]]></description><link>https://blog.sticobytes.com/stop-using-ai-to-learn-code-until-you-can-code-without-it</link><guid isPermaLink="true">https://blog.sticobytes.com/stop-using-ai-to-learn-code-until-you-can-code-without-it</guid><category><![CDATA[webdev]]></category><category><![CDATA[AI]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Tue, 02 Dec 2025 05:54:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764654486293/3141219b-1f63-4ebd-8002-a1ab5bdfac89.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've been coding for about three years now. I'm not a beginner anymore, but I recently joined a bootcamp to level up my skills and connect with other developers. What I've observed across online learning communities, coding forums, and even in structured learning environments has been eye-opening—and honestly, a bit concerning.</p>
<p>I've seen a pattern emerge: a student receives a coding challenge, opens ChatGPT, pastes in the requirements, and within seconds has a complete, working solution. Project submitted. Green checkmark earned. Next module unlocked.</p>
<p>But here's what happens next: that same person struggles to explain their own code during code reviews. They can't debug when something breaks. The project that took five minutes to "complete" taught them absolutely nothing.</p>
<p>This is the uncomfortable reality of learning web development in 2025, and we need to talk about it.</p>
<h2 id="heading-the-elephant-in-the-room">The Elephant in the Room</h2>
<p>Let me be clear: I love AI. I use it. It's an incredible tool that's transforming how we work. But there's something deeply concerning happening in the developer learning space right now. New developers are using AI not as a learning aid, but as a replacement for learning itself.</p>
<p>I've observed this pattern across various learning communities:</p>
<ul>
<li><p>Students copying entire code blocks from ChatGPT without reading them</p>
</li>
<li><p>Learners using AI to complete assessments and challenges</p>
</li>
<li><p>People celebrating projects they built but can't explain</p>
</li>
<li><p>Developers with impressive portfolios who struggle to code basic functionality from scratch</p>
</li>
</ul>
<p>The code runs. The project deploys. The portfolio looks great. But when it's time to debug, modify, or build something new without AI, the foundation crumbles.</p>
<h2 id="heading-yes-ai-is-powerful-and-thats-exactly-the-problem">Yes, AI Is Powerful (And That's Exactly the Problem)</h2>
<p>Here's what makes this tricky: the people defending AI-heavy learning aren't entirely wrong. They'll tell you:</p>
<p>"AI is the future of development. Why wouldn't you use the best tools available?"</p>
<p>"Senior developers use Stack Overflow and copy-paste code all the time. What's the difference?"</p>
<p>"You don't need to memorize syntax anymore. Just understand concepts."</p>
<p>These arguments sound reasonable on the surface. AI <em>is</em> transforming software development. Professionals <em>do</em> use AI tools in production. But there's a crucial difference between a senior developer using AI to accelerate their workflow and a beginner using it to avoid developing fundamental skills.</p>
<p>A senior developer using GitHub Copilot understands <em>why</em> the suggested code works. They can evaluate it, modify it, and debug it when it breaks. A beginner copying from ChatGPT is building on quicksand.</p>
<h2 id="heading-the-real-cost-of-the-ai-shortcut">The Real Cost of the AI Shortcut</h2>
<p>When you use AI to solve problems you haven't yet learned to solve yourself, you're not just missing out on syntax knowledge. You're losing something far more valuable:</p>
<p><strong>Problem-solving skills.</strong> The mental muscle you build when you're stuck, frustrated, and forced to think through a problem is irreplaceable. That struggle is where real learning happens.</p>
<p><strong>Pattern recognition.</strong> When you write code yourself (even badly), you start recognizing patterns. You see how HTML structures relate to CSS selectors. You understand why JavaScript functions are organized a certain way. AI-generated code robs you of this intuition.</p>
<p><strong>Debugging ability.</strong> If you didn't write the code and don't understand how it works, how will you fix it when it breaks? And trust me, it <em>will</em> break.</p>
<p><strong>Confidence.</strong> There's a unique confidence that comes from solving a hard problem yourself. When you rely on AI for everything, you develop a dependency that makes you doubt your own abilities.</p>
<p>I've experienced this firsthand. There have been moments when I was tempted to ask ChatGPT to "just fix this CSS issue" or "write this JavaScript function for me." And sometimes I did. Every time I took that shortcut, I regretted it later when I encountered the same problem again and still didn't know how to solve it.</p>
<h2 id="heading-my-framework-when-to-use-ai-and-when-to-struggle">My Framework: When to Use AI (and When to Struggle)</h2>
<p>After three years of coding and observing different approaches to learning, I've developed some personal rules for using AI as a developer still building their foundation. These aren't universal laws, just guidelines that have worked well for me and others I've mentored:</p>
<h3 id="heading-use-ai-when">Use AI When:</h3>
<p><strong>1. You're stuck after genuine effort.</strong> My rule: try to solve the problem myself for at least 30-45 minutes before turning to AI. This ensures I've actually wrestled with the problem.</p>
<p><strong>2. You need concept explanations.</strong> AI is brilliant at breaking down complex concepts into simple terms. Asking "Can you explain what closures are in JavaScript?" is productive learning. Asking "Write me a function that uses closures" is not.</p>
<p><strong>3. You want to understand existing code.</strong> Pasting code and asking "What does this do line by line?" can be enlightening, especially when reading documentation or open-source projects.</p>
<p><strong>4. You're learning best practices.</strong> Questions like "What's the most accessible way to structure this form?" or "How can I make this code more performant?" help you level up.</p>
<p><strong>5. You need a starting point for research.</strong> Using AI to generate a list of topics to study or resources to explore is smart learning strategy.</p>
<h3 id="heading-dont-use-ai-when">Don't Use AI When:</h3>
<p><strong>1. It's an assignment, test, or exercise designed to teach you something.</strong> If the point is to learn, and you skip the learning, you've defeated the entire purpose.</p>
<p><strong>2. You haven't tried the problem at all.</strong> The first attempt should always be yours, no matter how messy or broken.</p>
<p><strong>3. You're building your portfolio projects.</strong> These projects should showcase <em>your</em> abilities. If you can't rebuild them from scratch without AI, they're not really your abilities.</p>
<p><strong>4. You don't understand the code it generates.</strong> If AI gives you code you can't explain, don't use it. Take time to understand it first, or ask AI to explain it and then rewrite it yourself.</p>
<p><strong>5. You're trying to "get through" material quickly.</strong> Speed means nothing if you haven't learned anything.</p>
<h2 id="heading-the-balance-ai-as-a-mentor-not-a-crutch">The Balance: AI as a Mentor, Not a Crutch</h2>
<p>The key is treating AI like you would a senior developer mentor. A good mentor doesn't do your work for you. They guide you, explain concepts, point you in the right direction, and help when you're genuinely stuck. They don't hand you solutions without teaching you the principles behind them.</p>
<p>Here's how I use AI productively:</p>
<p><strong>Instead of:</strong> "Write me a responsive navigation bar"<br /><strong>I ask:</strong> "What are the key CSS properties I need to understand to make a navigation bar responsive?"</p>
<p><strong>Instead of:</strong> "Fix this code [paste entire project]"<br /><strong>I ask:</strong> "I'm getting this error message. What does it mean and what should I investigate?"</p>
<p><strong>Instead of:</strong> "Create a to-do list app in JavaScript"<br /><strong>I ask:</strong> "What are the main concepts I need to understand to build a to-do list app? What should I learn first?"</p>
<p>This approach means I'm learning <em>with</em> AI rather than learning <em>from</em> AI. There's a massive difference.</p>
<h2 id="heading-a-challenge-for-fellow-developers-still-learning">A Challenge for Fellow Developers Still Learning</h2>
<p>If you're reading this and recognize yourself in the "ChatGPT copy-paste" description, I'm not judging you. I've been tempted too. The pressure to keep up, to have impressive projects, to feel like you're progressing quickly can be overwhelming.</p>
<p>But I want to challenge you: try building something from scratch this week without AI. It can be small—a simple landing page, a basic calculator, whatever. Just you, your code editor, and documentation.</p>
<p>Yes, it will be frustrating. Yes, it will take longer. Yes, your code might be messier than what ChatGPT would generate.</p>
<p>But you'll learn more from that one project than from ten AI-generated ones. And when you finally get it working, you'll have earned something real: the knowledge that you can actually do this.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Is web development worth learning in 2025 with AI everywhere? Absolutely. But only if you're actually learning it.</p>
<p>AI isn't going away. It's going to become even more powerful and integrated into development workflows. But the developers who thrive won't be the ones who learned to prompt AI well. They'll be the ones who learned to code well and <em>then</em> learned to use AI to amplify their skills.</p>
<p>Build your foundation first. Let AI be the tool that makes you faster and more productive, not the crutch that prevents you from learning to walk.</p>
<p>Your future self, sitting in that technical interview or debugging that production bug at 2 AM, will thank you.</p>
<hr />
<p><em>What's your take on using AI as a beginner developer? Have you found a balance that works for you? Drop your thoughts in the comments. I'm genuinely curious how other learners are navigating this.</em></p>
]]></content:encoded></item><item><title><![CDATA[Learning CSS? Stop Trying to Memorize Everything (And What to Do Instead)]]></title><description><![CDATA[If you're reading this, chances are you've just been introduced to CSS, and your brain might feel like it's about to explode. Flexbox? Grid? Position absolute? Z-index? Box model? Media queries?
I get it. I've been there.
When I first started learnin...]]></description><link>https://blog.sticobytes.com/learning-css-stop-trying-to-memorize-everything-and-what-to-do-instead</link><guid isPermaLink="true">https://blog.sticobytes.com/learning-css-stop-trying-to-memorize-everything-and-what-to-do-instead</guid><category><![CDATA[CSS]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[learning]]></category><category><![CDATA[Frontend Development]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Tue, 28 Oct 2025 05:38:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761629637649/51ee0777-860e-4afb-bb26-70219c0f1e66.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>If you're reading this, chances are you've just been introduced to CSS, and your brain might feel like it's about to explode. Flexbox? Grid? Position absolute? Z-index? Box model? Media queries?</p>
<p><strong>I get it. I've been there.</strong></p>
<p>When I first started learning CSS as a self-taught developer, I made the classic beginner mistake: I tried to memorize everything. Every property, every value, every syntax rule. I'd spend hours trying to cram flexbox properties, thinking "if I just memorize <code>justify-content</code> and <code>align-items</code>, I'll be fine."</p>
<p>Spoiler alert: <strong>I wasn't fine.</strong></p>
<p>The truth hit me hard when I sat down to build my first real project. I stared at my blank HTML file, knowing all these CSS "concepts" but having absolutely no idea where to start. That's when I realized something crucial about coding.</p>
<p>Now I'm in a bootcamp, and I see beginners making the same mistake I did—trying to memorize everything instead of understanding how to actually solve problems.</p>
<h2 id="heading-coding-isnt-about-memorization">Coding Isn't About Memorization</h2>
<p>Here's what nobody tells you when you start learning web development:</p>
<p><strong>Coding is not about cramming syntax. It never was, and it never will be.</strong></p>
<p>Even senior developers with 10+ years of experience Google basic CSS syntax. I've watched my instructor pull up MDN documentation for the hundredth time to check a flexbox property. And you know what? That's completely normal.</p>
<p>Think about it this way:</p>
<p>Would you rather be someone who:</p>
<ul>
<li>Can recite 50 CSS properties from memory but doesn't know when to use them?</li>
</ul>
<p>Or someone who:</p>
<ul>
<li>Understands how CSS works, knows where to find information when stuck, and can actually build things?</li>
</ul>
<p>The answer is obvious.</p>
<h2 id="heading-the-real-skills-you-need-to-develop">The Real Skills You Need to Develop</h2>
<p>After months of self-learning and now being in a bootcamp, here's what I've learned about what actually matters:</p>
<h3 id="heading-1-problem-solving-over-syntax">1. Problem-Solving Over Syntax</h3>
<p>Good programmers don't memorize code. They understand problems and figure out solutions. When you face a layout challenge, the question isn't "What's the exact syntax for flexbox?" It's "What problem am I trying to solve, and which CSS tool can help me?"</p>
<h3 id="heading-2-reading-documentation-is-a-superpower">2. Reading Documentation is a Superpower</h3>
<p>One of the most valuable skills you can develop is learning how to read documentation. MDN, CSS-Tricks, W3Schools—these aren't "cheat sheets" for beginners. They're professional tools that EVERYONE uses, from juniors to seniors.</p>
<p>Being able to:</p>
<ul>
<li><p>Search for what you need</p>
</li>
<li><p>Understand technical documentation</p>
</li>
<li><p>Apply examples to your own code</p>
</li>
</ul>
<p>...is literally 50% of the job.</p>
<p>I learned this the hard way during my self-taught journey. Now in my bootcamp, I see other beginners struggling with the same thing—thinking they need to memorize everything before they can build anything.</p>
<h3 id="heading-3-the-internet-is-your-co-pilot">3. The Internet is Your Co-Pilot</h3>
<p>"But isn't Googling things cheating?"</p>
<p><strong>Absolutely not.</strong></p>
<p>Professional developers Google things constantly. The difference between a beginner and an experienced developer isn't that one Googles less—it's that the experienced developer knows:</p>
<ul>
<li><p>What to search for</p>
</li>
<li><p>How to evaluate answers</p>
</li>
<li><p>How to adapt solutions to their specific problem</p>
</li>
</ul>
<h3 id="heading-4-understanding-beats-memorizing-every-single-time">4. Understanding Beats Memorizing Every Single Time</h3>
<p>Instead of memorizing that <code>display: flex</code> makes a container a flexbox, understand WHY you'd use flexbox. Instead of cramming grid properties, understand WHEN grid is better than flexbox.</p>
<p>When you understand the "why" and "how," the syntax becomes easy to look up.</p>
<h2 id="heading-my-journey-from-self-taught-to-building-real-projects">My Journey: From Self-Taught to Building Real Projects</h2>
<p>Let me share something real with you. I started learning web development on my own, and recently, during my bootcamp, I built my first complete multi-page portfolio website using HTML and CSS.</p>
<p><strong>🔗</strong> <a target="_blank" href="https://chinaydu01.github.io/my-portfolio/"><strong>View Live Portfolio</strong></a> <strong>|</strong> <a target="_blank" href="https://github.com/chinaydu01/my-portfolio"><strong>GitHub Repository</strong></a></p>
<p>Three pages: Home, About, and Contact. Fully responsive. Professional design. Smooth animations. The whole package.</p>
<p>Here's the kicker: <strong>I didn't know half of what I needed before I started.</strong></p>
<h3 id="heading-how-i-actually-built-it">How I Actually Built It</h3>
<p><strong>I didn't memorize CSS before building.</strong> Instead, I:</p>
<ol>
<li><p><strong>Broke down the problem:</strong> "I need a navigation bar that stays at the top when scrolling."</p>
</li>
<li><p><strong>Researched the solution:</strong> Googled "CSS sticky navigation" and found <code>position: sticky</code></p>
</li>
<li><p><strong>Understood the concept:</strong> Read about how sticky positioning works, when it applies, and its limitations</p>
</li>
<li><p><strong>Applied it to my code:</strong> Implemented it, tested it, broke it, fixed it</p>
</li>
<li><p><strong>Moved to the next problem:</strong> "How do I make these cards display in a grid?"</p>
</li>
</ol>
<p>I repeated this process dozens of times. Each time, I wasn't memorizing—I was understanding.</p>
<h3 id="heading-the-problems-i-solved">The Problems I Solved</h3>
<p>Throughout this project, I faced real challenges:</p>
<ul>
<li><p><strong>Making the hero section look good on mobile</strong> - Researched media queries and flexbox wrapping</p>
</li>
<li><p><strong>Creating a responsive grid that adapts to screen size</strong> - Learned about <code>repeat(auto-fit, minmax())</code></p>
</li>
<li><p><strong>Styling form inputs to look professional</strong> - Discovered <code>:focus</code> pseudo-class and input styling techniques</p>
</li>
<li><p><strong>Making navigation highlight the current page</strong> - Used the <code>.active</code> class strategically</p>
</li>
</ul>
<p>For EVERY single one of these challenges, I:</p>
<ul>
<li><p>Identified the problem</p>
</li>
<li><p>Searched for solutions</p>
</li>
<li><p>Read documentation</p>
</li>
<li><p>Experimented with code</p>
</li>
<li><p>Broke things</p>
</li>
<li><p>Fixed things</p>
</li>
<li><p>Learned</p>
</li>
</ul>
<p><strong>That's real coding.</strong></p>
<h2 id="heading-what-beginners-should-actually-focus-on">What Beginners Should Actually Focus On</h2>
<p>If you're just starting with CSS and feeling overwhelmed, here's my advice:</p>
<h3 id="heading-1-build-projects-not-just-study">1. Build Projects, Not Just Study</h3>
<p>Stop reading about CSS and start using CSS. Build things—even if they're ugly at first. Every problem you solve is worth more than hours of reading tutorials.</p>
<h3 id="heading-2-get-comfortable-being-uncomfortable">2. Get Comfortable Being Uncomfortable</h3>
<p>Not knowing something doesn't mean you're bad at this. It means you're learning. Every developer you admire was once exactly where you are, staring at their screen thinking "What does <code>z-index</code> even do?"</p>
<h3 id="heading-3-develop-your-research-skills">3. Develop Your Research Skills</h3>
<p>Practice searching for solutions. Learn to:</p>
<ul>
<li><p>Ask better questions ("How to center a div in CSS" vs "CSS not working")</p>
</li>
<li><p>Read documentation without panicking</p>
</li>
<li><p>Test code examples</p>
</li>
<li><p>Adapt solutions to your needs</p>
</li>
</ul>
<h3 id="heading-4-understand-concepts-not-just-syntax">4. Understand Concepts, Not Just Syntax</h3>
<p>When learning something new in CSS, ask yourself:</p>
<ul>
<li><p>What problem does this solve?</p>
</li>
<li><p>When would I use this?</p>
</li>
<li><p>What are the alternatives?</p>
</li>
<li><p>How does it actually work?</p>
</li>
</ul>
<p>Understanding these answers means you can always look up the syntax later.</p>
<h3 id="heading-5-embrace-the-struggle">5. Embrace the Struggle</h3>
<p>Spending 30 minutes figuring out why your flexbox isn't working isn't wasted time. That's learning. That frustration you feel when things don't work? That's your brain rewiring itself to think like a developer.</p>
<h2 id="heading-the-truth-about-learning-to-code">The Truth About Learning to Code</h2>
<p>Here's what I wish someone had told me when I started:</p>
<p><strong>You're not supposed to know everything.</strong></p>
<p><strong>You're not supposed to memorize everything.</strong></p>
<p><strong>You ARE supposed to get stuck.</strong></p>
<p><strong>You ARE supposed to Google things.</strong></p>
<p><strong>You ARE supposed to check documentation.</strong></p>
<p>The goal isn't to become a walking CSS reference manual. The goal is to become someone who can:</p>
<ul>
<li><p>Identify problems</p>
</li>
<li><p>Find solutions</p>
</li>
<li><p>Implement them effectively</p>
</li>
<li><p>Learn from the process</p>
</li>
</ul>
<h2 id="heading-my-portfolio-proof-that-this-works">My Portfolio: Proof That This Works</h2>
<p>My portfolio website isn't perfect. But it's real, it works, and I built it by doing exactly what I'm telling you:</p>
<ul>
<li><p>Understanding concepts over memorizing syntax</p>
</li>
<li><p>Researching when stuck</p>
</li>
<li><p>Breaking problems into smaller pieces</p>
</li>
<li><p>Learning by doing</p>
</li>
</ul>
<p><strong>🔗 Check it out here:</strong> <a target="_blank" href="https://chinaydu01.github.io/my-portfolio/">Live Demo</a> | <a target="_blank" href="https://github.com/chinaydu01/my-portfolio">GitHub Repository</a></p>
<p>The code is all there. You'll see:</p>
<ul>
<li><p>HTML structure using semantic tags</p>
</li>
<li><p>CSS with flexbox and grid</p>
</li>
<li><p>Responsive design with media queries</p>
</li>
<li><p>Animations and transitions</p>
</li>
<li><p>Form styling</p>
</li>
<li><p>And a lot of problem-solving</p>
</li>
</ul>
<h2 id="heading-to-everyone-feeling-lost">To Everyone Feeling Lost</h2>
<p>If you're learning on your own or in a bootcamp right now, staring at CSS and wondering if you'll ever "get it"—you will.</p>
<p>If you're trying to memorize every CSS property—stop. You're wasting your energy. (Trust me, I wasted months doing this)</p>
<p>If you feel like you should know more than you do—you're exactly where you should be.</p>
<p>The developers you look up to? They Google things daily. They check documentation constantly. They get stuck and have to figure things out. <strong>The difference is they're comfortable with that process.</strong></p>
<h2 id="heading-start-today">Start Today</h2>
<p>Don't wait until you've "learned enough CSS." Pick a project—any project—and start building. Get stuck. Google things. Read documentation. Try things. Break things. Fix things.</p>
<p><strong>That's how you actually learn to code.</strong></p>
<p>My portfolio took me several days of doing exactly this. Yours will too. And that's not just okay—that's perfect.</p>
<h2 id="heading-summary-the-real-path-to-learning-css">Summary: The Real Path to Learning CSS</h2>
<p>Let me leave you with this:</p>
<p><strong>Coding is not about cramming.</strong> It's about:</p>
<ul>
<li><p>Understanding how things work</p>
</li>
<li><p>Knowing where to find information</p>
</li>
<li><p>Problem-solving step by step</p>
</li>
<li><p>Building real projects</p>
</li>
<li><p>Learning from mistakes</p>
</li>
<li><p>Researching when stuck</p>
</li>
</ul>
<p>The internet is always here. Documentation isn't going anywhere. What matters is that you understand the concepts and know how to find what you need when you need it.</p>
<p>Stop trying to memorize everything. Start trying to understand anything.</p>
<p>Build something today. Get stuck. Figure it out. Repeat.</p>
<p>That's how real developers are made.</p>
<hr />
<h2 id="heading-resources-that-actually-help">Resources That Actually Help</h2>
<p>Here are the resources I used while building my portfolio:</p>
<ul>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS"><strong>MDN Web Docs</strong></a> - The CSS documentation bible</p>
</li>
<li><p><a target="_blank" href="https://css-tricks.com/"><strong>CSS-Tricks</strong></a> - Practical examples and explanations</p>
</li>
<li><p><a target="_blank" href="https://stackoverflow.com/"><strong>Stack Overflow</strong></a> - Real problems, real solutions</p>
</li>
<li><p><strong>Google</strong> - Your best friend, seriously</p>
</li>
</ul>
<hr />
<h2 id="heading-connect-with-me">Connect With Me</h2>
<p>I'm on the same journey as you—learning, building, and sharing. Let's connect and learn together!</p>
<p><strong>Portfolio:</strong> <a target="_blank" href="https://chinaydu01.github.io/my-portfolio/">https://chinaydu01.github.io/my-portfolio/</a><br /><strong>GitHub:</strong> <a target="_blank" href="https://github.com/chinaydu01">https://github.com/chinaydu01</a></p>
<p>Drop a comment below if you're also learning CSS. What's the biggest concept you're struggling with right now? Let's figure it out together!</p>
<hr />
<p><strong>Happy coding, and remember: Google is not cheating. It's how professionals work.</strong> 🚀</p>
<hr />
<p><em>P.S. - If this helped you, share it with someone else who's feeling overwhelmed by CSS. We all need this reminder sometimes.</em></p>
]]></content:encoded></item><item><title><![CDATA[Building Coding Muscles: Two More HTML Projects]]></title><description><![CDATA[If there's one thing my experience in web development has taught me, it's this: you can't build coding muscles by just reading tutorials or taking notes. You have to get your hands dirty and code, code, code.
Following up on my Week 1 bootcamp post, ...]]></description><link>https://blog.sticobytes.com/building-coding-muscles-two-more-html-projects</link><guid isPermaLink="true">https://blog.sticobytes.com/building-coding-muscles-two-more-html-projects</guid><category><![CDATA[webdev]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[bootcamp]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[coding]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Mon, 20 Oct 2025 23:19:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761002102136/ed2cbed7-ec5e-45f2-a4f9-50146fe79bc2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If there's one thing my experience in web development has taught me, it's this: <strong>you can't build coding muscles by just reading tutorials or taking notes.</strong> You have to get your hands dirty and code, code, code.</p>
<p>Following up on my <a target="_blank" href="https://codewithnaydu.hashnode.dev/week-1-in-bootcamp-revisiting-html-fundamentals">Week 1 bootcamp post</a>, I mentioned we'd be spending more time with HTML before diving into CSS. Well, I took that to heart and built not one, but <strong>two complete projects</strong> to really solidify what I've been learning.</p>
<h2 id="heading-why-i-built-two-projects-instead-of-one">Why I Built Two Projects Instead of One</h2>
<p>Here's the truth—understanding syntax and being able to build something functional are two very different things. You might watch a tutorial on HTML forms and think "I got this," but until you actually build a form from scratch, troubleshoot validation issues, and structure it properly, you don't really <em>know</em> it.</p>
<p>So instead of just completing the bootcamp assignment and moving on, I challenged myself to build two different projects that would force me to:</p>
<ul>
<li><p>Practice the same concepts in different contexts</p>
</li>
<li><p>Solve problems independently</p>
</li>
<li><p>Build muscle memory for HTML structure</p>
</li>
<li><p>Learn by doing, not just by reading</p>
</li>
</ul>
<h2 id="heading-project-1-comprehensive-registration-form">Project 1: Comprehensive Registration Form</h2>
<p><strong>🔗</strong> <a target="_blank" href="https://chinaydu01.github.io/boot_camp_registraion_form/"><strong>View Live Project</strong></a> <strong>|</strong> <a target="_blank" href="https://github.com/chinaydu01/boot_camp_registraion_form"><strong>GitHub Repository</strong></a></p>
<p>This project is a deep dive into HTML forms—and I mean <em>comprehensive</em>. It features:</p>
<ul>
<li><p>All major HTML5 input types (text, email, password, date, radio, checkbox, file, range, color, and more)</p>
</li>
<li><p>8 organized sections with logical grouping</p>
</li>
<li><p>Built-in HTML5 validation techniques</p>
</li>
<li><p>Accessibility best practices (proper labels, fieldsets, ARIA attributes)</p>
</li>
<li><p>Real-world form structure you'd actually use</p>
</li>
</ul>
<p><strong>What I learned:</strong></p>
<ul>
<li><p>How different input types behave and when to use each one</p>
</li>
<li><p>The importance of client-side validation for user experience</p>
</li>
<li><p>Proper form accessibility isn't optional—it's essential</p>
</li>
<li><p>How to structure complex forms so they're easy to navigate</p>
</li>
</ul>
<h2 id="heading-project-2-multi-page-recipe-website">Project 2: Multi-Page Recipe Website</h2>
<p><strong>🔗</strong> <a target="_blank" href="https://chinaydu01.github.io/recipe-website/"><strong>View Live Project</strong></a> <strong>|</strong> <a target="_blank" href="https://github.com/chinaydu01/recipe-website"><strong>GitHub Repository</strong></a></p>
<p>This one was all about understanding how multi-page websites work and how to maintain consistency across pages. The site includes:</p>
<ul>
<li><p><strong>Home page</strong> - Landing page with recipe highlights</p>
</li>
<li><p><strong>Recipe detail page</strong> - Step-by-step instructions with ingredients</p>
</li>
<li><p><strong>Nutrition table</strong> - Structured data using HTML tables</p>
</li>
<li><p><strong>Recipe submission form</strong> - User interaction and data collection</p>
</li>
<li><p><strong>About page</strong> - Information about the site</p>
</li>
</ul>
<p><strong>What I learned:</strong></p>
<ul>
<li><p>How to structure navigation across multiple pages</p>
</li>
<li><p>Maintaining consistent headers and footers</p>
</li>
<li><p>Organizing a larger project with multiple HTML files</p>
</li>
<li><p>Using semantic HTML to create meaningful page structure</p>
</li>
<li><p>Working with tables for actual tabular data (nutrition facts)</p>
</li>
<li><p>Creating intuitive user flows between pages</p>
</li>
</ul>
<h2 id="heading-the-real-lesson-practice-over-perfection">The Real Lesson: Practice Over Perfection</h2>
<p>Both projects are built with <strong>just HTML</strong>—no CSS, no JavaScript. And honestly? They look pretty basic. But that's not the point.</p>
<p>The point is that I can now:</p>
<ul>
<li><p>Structure a complex form without looking up syntax every 5 minutes</p>
</li>
<li><p>Navigate between pages confidently</p>
</li>
<li><p>Write semantic HTML without overthinking it</p>
</li>
<li><p>Understand accessibility from the ground up</p>
</li>
<li><p>Organize multi-file projects logically</p>
</li>
</ul>
<p><strong>This is what "building coding muscles" means.</strong> It's not about making something pretty right away—it's about repetition, making mistakes, fixing them, and doing it all over again until the patterns stick.</p>
<h2 id="heading-my-advice-to-fellow-beginners">My Advice to Fellow Beginners</h2>
<p>If you're just starting out or going through a bootcamp, here's what I'd tell you:</p>
<p><strong>1. Don't just take notes and move on</strong> Notes are helpful for reference, but they won't make you a developer. You need to write code—lots of it.</p>
<p><strong>2. Build the same thing multiple times</strong> Your first attempt will be messy. Your second will be better. By the third, you'll start seeing patterns and best practices naturally.</p>
<p><strong>3. Practice concepts in different contexts</strong> Building a form once? That's learning. Building forms for a registration page, contact page, and survey? That's mastery.</p>
<p><strong>4. Embrace the ugliness</strong> Your HTML-only projects won't look impressive, and that's okay. You're learning structure first. The styling comes later.</p>
<p><strong>5. Push to GitHub</strong> Even if you think your code is "not good enough," push it anyway. Your GitHub is a journal of your progress, not a portfolio of perfection.</p>
<h2 id="heading-whats-actually-next">What's Actually Next</h2>
<p>Now that I've really solidified my HTML fundamentals through these projects, I'm genuinely ready for CSS. Not because the bootcamp says it's time, but because I've built enough HTML structure to appreciate what CSS will do for it.</p>
<p>Next up: We're diving into CSS to bring these bare-bones HTML projects to life. I'll be styling the recipe website first and documenting the process.</p>
<p>The bio page from Week 1? The registration form? The recipe site? They're all about to get a complete visual makeover. Stay tuned.</p>
<hr />
<p><strong>Are you in a bootcamp or learning to code?</strong> What's your approach—build everything or move fast through tutorials? Drop a comment and let's discuss!</p>
<p><strong>Projects:</strong></p>
<ul>
<li><p><a target="_blank" href="https://chinaydu01.github.io/boot_camp_registraion_form/">Registration Form - Live Demo</a> | <a target="_blank" href="https://github.com/chinaydu01/boot_camp_registraion_form">GitHub</a></p>
</li>
<li><p><a target="_blank" href="https://chinaydu01.github.io/recipe-website/">Recipe Website - Live Demo</a> | <a target="_blank" href="https://github.com/chinaydu01/recipe-website">GitHub</a></p>
<p>  This is part of my ongoing bootcamp journey series. <a target="_blank" href="https://codewithnaydu.hashnode.dev/week-1-in-bootcamp-revisiting-html-fundamentals">Read Week 1: Revisiting HTML Fundamentals</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Week 1 in Bootcamp: Revisiting HTML Fundamentals]]></title><description><![CDATA[Week one of bootcamp is officially in the books! While HTML isn't entirely new territory for me as a self-taught developer, experiencing it in a structured bootcamp setting has been eye-opening. There's something different about learning alongside pe...]]></description><link>https://blog.sticobytes.com/week-1-in-bootcamp-revisiting-html-fundamentals</link><guid isPermaLink="true">https://blog.sticobytes.com/week-1-in-bootcamp-revisiting-html-fundamentals</guid><category><![CDATA[webdev]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[bootcamp]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Sat, 18 Oct 2025 13:32:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1760793684241/a56ef825-a1c8-4cd8-8505-951ea1e8d798.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Week one of bootcamp is officially in the books! While HTML isn't entirely new territory for me as a self-taught developer, experiencing it in a structured bootcamp setting has been eye-opening. There's something different about learning alongside peers and having instructors guide you through concepts you thought you already knew.</p>
<p>In my last post, I shared why I decided to join this bootcamp despite teaching myself to code. Now, let me walk you through what we've been building and the fresh perspectives I've gained in our first week.</p>
<h2 id="heading-what-we-covered">What We Covered</h2>
<p>Our first week focused on HTML5 fundamentals, including:</p>
<ul>
<li><p>HTML document structure and boilerplate</p>
</li>
<li><p>Semantic HTML elements (header, main, section, footer)</p>
</li>
<li><p>Working with forms and input types</p>
</li>
<li><p>Creating accessible tables</p>
</li>
<li><p>Image optimization with alt text</p>
</li>
<li><p>Best practices for accessibility</p>
</li>
</ul>
<p>Even though I'd worked with HTML before, revisiting these topics in a structured way helped me identify gaps in my knowledge and solidify best practices I'd been fuzzy on.</p>
<h2 id="heading-the-project-personal-bio-page">The Project: Personal Bio Page</h2>
<p>Our hands-on project was building a personal bio page using pure HTML5—no CSS, no JavaScript, just semantic markup.</p>
<p><strong>🔗</strong> <a target="_blank" href="https://chinaydu01.github.io/html-bootcamp-project/"><strong>View Live Project</strong></a> <strong>|</strong> <a target="_blank" href="https://github.com/chinaydu01/html-bootcamp-project"><strong>GitHub Repository</strong></a></p>
<p>The page includes:</p>
<ul>
<li><p>Personal profile section with image</p>
</li>
<li><p>About me biography</p>
</li>
<li><p>Hobbies and interests lists</p>
</li>
<li><p>Skills showcase (ordered list)</p>
</li>
<li><p>Weekly schedule table</p>
</li>
<li><p>Contact form with various input types</p>
</li>
</ul>
<p>Check out the live demo and feel free to explore the code on GitHub to see how everything comes together!</p>
<h2 id="heading-key-concepts-i-reinforced">Key Concepts I Reinforced</h2>
<h3 id="heading-semantic-html-structure">Semantic HTML Structure</h3>
<p>One thing the bootcamp emphasized is using semantic HTML for better accessibility and SEO. Instead of divs everywhere, we structured the page meaningfully using elements like <code>&lt;header&gt;</code>, <code>&lt;main&gt;</code>, <code>&lt;section&gt;</code>, and <code>&lt;footer&gt;</code>. This structure tells browsers and screen readers exactly what each part of the page represents—making it more accessible for everyone.</p>
<h3 id="heading-building-accessible-forms">Building Accessible Forms</h3>
<p>Forms were a big focus this week. The key learning here: every input needs a properly associated label for accessibility. Using the <code>for</code> attribute on labels that connects to the input's <code>id</code> helps screen readers and improves usability for all users. We also learned about fieldsets and legends to group related form elements logically.</p>
<h3 id="heading-tables-for-structured-data">Tables for Structured Data</h3>
<p>We used tables to display a weekly schedule, and I learned the importance of using tables only for tabular data, not layout. Using proper table elements like <code>&lt;thead&gt;</code>, <code>&lt;tbody&gt;</code>, <code>&lt;th&gt;</code>, and <code>&lt;td&gt;</code> adds semantic meaning and significantly improves accessibility.</p>
<h3 id="heading-images-and-alt-text">Images and Alt Text</h3>
<p>Every image needs descriptive alt text—not just for accessibility but also for SEO and scenarios where images fail to load. This was something I knew but didn't always practice consistently.</p>
<h2 id="heading-self-taught-vs-bootcamp-my-observations">Self-Taught vs. Bootcamp: My Observations</h2>
<p>Learning HTML in a bootcamp versus on my own has revealed some interesting differences:</p>
<p><strong>Structure matters</strong>: Having a curriculum removes the "what should I learn next?" paralysis I often faced when self-teaching.</p>
<p><strong>Filling knowledge gaps</strong>: I realized I'd been skipping over important concepts like proper form accessibility and semantic HTML. Self-teaching sometimes means you learn what you need in the moment, not necessarily what you <em>should</em> know.</p>
<p><strong>Community learning</strong>: Seeing how my peers approach problems differently has been invaluable. There's always more than one way to solve something, and bootcamp discussions expose you to different thinking patterns.</p>
<p><strong>Accountability</strong>: Having deadlines and projects due keeps me consistent. When self-teaching, it's easy to say "I'll do it tomorrow."</p>
<h2 id="heading-whats-next">What's Next</h2>
<p>Before we dive into CSS, we'll be spending more time with HTML. Next week, we're building a complete multi-page website using just HTML—no styling yet. This will help solidify our understanding of HTML structure, navigation between pages, and how to organize a larger project.</p>
<p>I'm excited to work on something more complex and see how all the pieces fit together. Once we've mastered HTML structure with a multi-page site, then we'll move into CSS to bring everything to life with styling and responsive design.</p>
<p>Stay tuned for the next update!</p>
<hr />
<p><strong>Following along on my bootcamp journey?</strong> Drop a comment below with your own experiences—whether you're self-taught, in a bootcamp, or considering one. Let's learn together!</p>
<p><strong>Project Repository:</strong> <a target="_blank" href="https://github.com/chinaydu01/html-bootcamp-project">GitHub</a><br /><strong>Live Demo:</strong> <a target="_blank" href="https://chinaydu01.github.io/html-bootcamp-project/">View Project</a></p>
]]></content:encoded></item><item><title><![CDATA[Why I'm Trading My Self-Taught Freedom for Bootcamp Structure: What I Wish I Knew Earlier]]></title><description><![CDATA[Two days from now, I'll be starting Techrise Cohort 2—an intensive 2-month bootcamp that will take me from frontend developer to full-stack engineer.I And honestly? I'm pumped.
But here's the thing: I didn't start here. For months now, I've been teac...]]></description><link>https://blog.sticobytes.com/why-im-trading-my-self-taught-freedom-for-bootcamp-structure-what-i-wish-i-knew-earlier</link><guid isPermaLink="true">https://blog.sticobytes.com/why-im-trading-my-self-taught-freedom-for-bootcamp-structure-what-i-wish-i-knew-earlier</guid><category><![CDATA[Web Development]]></category><category><![CDATA[bootcamp]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[full stack]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Mon, 06 Oct 2025 11:58:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759750682588/30ebfa16-9bf3-4080-81fc-9fb622edba8d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two days from now, I'll be starting Techrise Cohort 2—an intensive 2-month bootcamp that will take me from frontend developer to full-stack engineer.I And honestly? I'm pumped.</p>
<p>But here's the thing: I didn't start here. For months now, I've been teaching myself web development. I've built projects, watched countless tutorials, read documentation until my eyes glazed over, and coded through frustration and breakthroughs alike. I did it all on my own terms, at my own pace.</p>
<p>So why would someone who's already learned so much on their own choose to enter a structured bootcamp? And more importantly—if you're trying to decide between self-teaching and joining a bootcamp, what should you actually consider?</p>
<p>I've spent time on both sides of this debate (well, one side fully, and about to dive into the other). Here's what I wish someone had told me before I started this journey.</p>
<p>The Self-Taught Journey: What Actually Worked</p>
<p>Let me be clear: self-teaching isn't just viable—it's powerful. Some of the best developers I know never set foot in a classroom or bootcamp. They learned by doing, by breaking things, by Googling error messages at 2 AM.</p>
<p>Here's what made my self-taught journey valuable:</p>
<p>Freedom to Explore</p>
<p>When you're teaching yourself, you get to follow your curiosity. If something interests you—whether it's CSS animations, responsive design, or a new JavaScript framework—you can dive right in. No syllabus holding you back, no waiting for week 6 to learn the cool stuff. You set the pace, you choose the projects, you decide what matters.</p>
<p>I spent weeks just playing with Bootstrap, building page after page until responsive design became second nature. Nobody told me to do that—I just wanted to master it. That kind of self-directed learning builds genuine passion.</p>
<p>Building Real Discipline</p>
<p>Here's something people don't talk about enough: when you're self-taught, showing up is entirely on you. No teacher taking attendance. No classmates to keep you accountable. Just you, your laptop, and your commitment.</p>
<p>Every single line of code I wrote as a self-taught developer came from internal motivation. That's a superpower. It means I *chose* this path—it wasn't assigned to me. When the bootcamp gets tough (and I know it will), I'll have that foundation of self-discipline to fall back on.</p>
<p>Learning to Learn</p>
<p>Self-teaching forced me to develop one of the most critical skills in tech: learning how to learn. I became comfortable with being uncomfortable. I learned to read documentation, interpret error messages, and ask the right questions on Stack Overflow.</p>
<p>When you don't have a teacher to explain things, you get resourceful fast. You learn that "I don't know" isn't a dead end—it's the beginning of figuring it out.</p>
<p>Cost-Effective</p>
<p>Let's be real: not everyone has thousands of dollars to spend on education. Self-teaching gave me access to world-class resources for free—freeCodeCamp, YouTube, MDN documentation, countless blogs and tutorials. I built real skills without going into debt.</p>
<p>For where I was at the time, free resources were exactly what I needed to get started.</p>
<p>The Struggles: What Self-Teaching Couldn't Give Me</p>
<p>But if self-teaching was so great, why am I here? Why am I about to spend two months in an intensive bootcamp?</p>
<p>Because as powerful as self-teaching is, it has real limitations—and I hit most of them.</p>
<p>Lack of Structure (aka Tutorial Hell)</p>
<p>You know that feeling when you finish a tutorial and think, "Okay, cool… now what?" That was my life for months. I'd learn one thing, jump to another topic that seemed interesting, then circle back to something I'd have-learned before.</p>
<p>There was no clear path. No "here's what you need to master before moving to the next level." Just an overwhelming sea of content and no map to navigate it. I learned a lot of things *partially*, but never went deep enough to feel truly confident.</p>
<p>I was stuck in what people call "tutorial hell"—endlessly consuming content without building real mastery.</p>
<p>Imposter Syndrome Hit Different</p>
<p>When you're self-taught, there's no external validation. No grades, no certificates (well, not meaningful ones), no teacher saying, "Yes, you've got this." Just you and your nagging doubt: *Am I actually good enough? Am I learning the right things? Would a real developer laugh at my code?</p>
<p>I'd look at job descriptions asking for "proficiency in backend development" and think, "I've used Node.js a few times… does that count?" Spoiler: it didn't. I had surface-level knowledge, and I knew it.</p>
<p>Knowledge Gaps I Didn't Know I Had</p>
<p>Here's the dangerous part about self-teaching: you don't know what you don't know. I could build a decent frontend, sure. But did I understand how databases actually work? Could I set up a proper API? Did I know best practices for security, or deployment, or version control workflows?</p>
<p>Not really. I knew *how* to do some things, but I didn't understand the why behind them. I was copying patterns without understanding the principles.</p>
<p>And because I didn't know these gaps existed, I didn't know to fill them.</p>
<p>Isolation Was Real</p>
<p>Coding alone is… lonely. There's no one to celebrate with when something finally works. No one to commiserate with when you've been debugging the same issue for three hours. No one to review your code and say, "Hey, here's a better way to do this."</p>
<p>You miss out on the kind of learning that happens when two developers look at the same problem and approach it differently. You miss the "aha!" moments that come from explaining your code to someone else.</p>
<p>I didn't realize how much I needed a community until I didn't have one.</p>
<p>Decision Fatigue Is Exhausting</p>
<p>Should I learn React or Vue? Should I focus on frontend or dive into backend? Which course is actually good? Which tutorial isn't outdated? Do I need to learn TypeScript right now, or can I wait?</p>
<p>When every decision is yours alone, decision-making becomes exhausting. I spent more time *deciding what to learn* than actually learning. Analysis paralysis is real, and it stole weeks of progress from me.</p>
<p>Why I'm Choosing a Bootcamp Now</p>
<p>So here I am, two days away from starting Techrise Cohort 2. And I'm not doing it because self-teaching failed—I'm doing it because I've outgrown what it can offer me right now.</p>
<p>Here's what I'm hoping the bootcamp will give me:</p>
<p>A Clear, Structured Path</p>
<p>No more guessing. No more "what should I learn next?" The bootcamp has a curriculum designed to take me from where I am to where I need to be—systematically. I'll go deep instead of wide, mastering one concept before moving to the next.</p>
<p>Structure isn't limiting—it's liberating. It frees me from decision fatigue so I can focus all my energy on actually learning.</p>
<p>Accountability and Deadlines</p>
<p>Let's be honest: when you're learning alone, it's easy to skip the hard stuff. It's easy to say, "I'll tackle that tomorrow" and never get around to it.</p>
<p>A bootcamp keeps you accountable. There are deadlines, projects, milestones. You can't just coast through the easy parts—you have to do the work. And honestly? I need that. I need someone (or something) pushing me to show up even when it's tough.</p>
<p>Peer Learning and Collaboration</p>
<p>One of the things I'm most excited about is finally being around people who think like me—people who wake up thinking about code and go to sleep debugging in their dreams.</p>
<p>Learning alongside others means:</p>
<p>- Seeing how different people solve the same problem</p>
<p>- Getting real-time feedback on my code</p>
<p>- Collaborating on projects (the way real development teams work)</p>
<p>- Building a network of peers who'll still be around after the bootcamp ends</p>
<p>Development isn't a solo sport, and I'm ready to learn how to work with a team.</p>
<p>Filling the Gaps (Especially Backend)</p>
<p>I'm comfortable with HTML, CSS, and frontend frameworks. But backend? Databases? Prisma? Deployment pipelines? I've dabbled, but I've never gone deep.</p>
<p>The bootcamp is specifically designed to take me full-stack—to turn my half-knowledge of Node.js and databases into real, production-ready skills. I'll learn not just *how* to build backends, but *why* we make certain architectural decisions.</p>
<p>I'm also diving into Vue.js on the frontend, which will expand my toolkit and make me more versatile as a developer.</p>
<p>Real-World Practices</p>
<p>Here's something self-teaching rarely covers: how do professional developers actually work? What does a proper Git workflow look like? How do you write maintainable code? How do you handle code reviews, testing, deployment?</p>
<p>Bootcamps teach you the practices that make you employable, not just capable. And that's huge.</p>
<p>What I'm Bringing From Self-Learning</p>
<p>Here's the thing, though: my self-taught journey wasn't wasted time. In fact, I think it's given me a massive advantage going into this bootcamp.</p>
<p>I'm Not Starting From Zero</p>
<p>I already know HTML, CSS, JavaScript, and responsive design. I understand how the web works at a foundational level. That means I can focus my energy on the new stuff—backend, databases, advanced JavaScript—instead of struggling with syntax and basic concepts.</p>
<p>Self-learning gave me the foundation. The bootcamp will help me build the skyscraper.</p>
<p>I Know How to Be Self-Reliant</p>
<p>When I get stuck (and I will), I know how to unstick myself. I know how to read documentation, debug effectively, and Google my way to solutions. Bootcamp instructors won't always be available—but my self-taught resourcefulness will.</p>
<p>I Actually Want This</p>
<p>Because I chose this path myself—because I spent months learning on my own before committing to a bootcamp—I know this isn't just a phase. This is what I want to do. That internal motivation will carry me through the hard days.</p>
<p>The Verdict: It's Not Either/Or</p>
<p>So, self-taught or bootcamp—which one is better?</p>
<p>Honestly? That's the wrong question.</p>
<p>The right question is: What do you need right now, at this stage of your journey?*</p>
<p>When I was starting out, self-teaching was perfect. It let me explore, build a foundation, and figure out if I actually enjoyed coding. It cost me nothing but time, and it taught me how to learn independently.</p>
<p>But now? Now I need structure. I need depth. I need to fill the gaps and level up fast. A bootcamp is the right tool for the job.</p>
<p>The best developers I know didn't choose one path and stick to it forever—they used different learning methods at different stages. They self-taught when they needed flexibility. They took courses when they needed structure. They joined bootcamps when they needed intensity. They learned from mentors when they needed guidance.</p>
<p>Learning to code isn't a one-size-fits-all journey. It's a choose-your-own-adventure, and the smartest thing you can do is pick the right tool for the stage you're in.</p>
<p>What I'm Expecting (and Nervous About)</p>
<p>I'm excited, no doubt. But am I nervous? A little.</p>
<p>I'm excited about finally mastering backend development. I'm excited about working on real projects with a team. I'm excited about having a clear roadmap for the next two months.</p>
<p>But I'm also nervous about keeping up. What if everyone else is further ahead? What if I struggle with concepts that seem easy to others? What if I hit a wall and can't push through?</p>
<p>Honestly, though? That nervousness is a good sign. It means I care. It means this matters to me. And I'd rather be nervous and growing than comfortable and stagnant.</p>
<p>Two days from now, I'll walk into that bootcamp as a self-taught frontend developer. Two months from now, I'll walk out as a full-stack engineer ready to build real solutions.</p>
<p>And I'll be documenting every step of the journey right here on CodeWithNaydu.</p>
<p>Over to You</p>
<p>So what about you?</p>
<p>Are you self-taught? Bootcamp grad? Somewhere in between? What's worked for you? What hasn't?</p>
<p>If you're trying to decide between self-teaching and joining a bootcamp, I hope this helps. There's no wrong answer—just the right choice for where *you* are right now.</p>
<p>Drop a comment and let me know your story. Let's learn from each other.</p>
<p>And if you want to follow along as I navigate this bootcamp, hit that subscribe button. I'll be sharing weekly lessons, honest reflections, and everything I'm learning along the way.</p>
<p>Let's grow together—one line of code at a time.</p>
<p>Next up: Day 1 of bootcamp. The real work begins.</p>
<p>---</p>
<p>Follow my journey from self-taught frontend developer to full-stack engineer. Subscribe to get new posts delivered straight to your inbox.</p>
]]></content:encoded></item><item><title><![CDATA[Hello World: My Journey from Frontend to Full-Stack and Beyond]]></title><description><![CDATA[If you're reading this, welcome to CodeWithNaydu! Whether you stumbled here by accident or you're a fellow developer looking to level up, I'm glad you're here. This is my first post, and I want to share why I'm starting this blog and what we'll build...]]></description><link>https://blog.sticobytes.com/hello-world-my-journey-from-frontend-to-full-stack-and-beyond</link><guid isPermaLink="true">https://blog.sticobytes.com/hello-world-my-journey-from-frontend-to-full-stack-and-beyond</guid><category><![CDATA[Web Development]]></category><category><![CDATA[webdev]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[#learning-in-public]]></category><category><![CDATA[full stack]]></category><dc:creator><![CDATA[Chinedum Obia]]></dc:creator><pubDate>Sat, 04 Oct 2025 07:23:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cckf4TsHAuw/upload/285e2312c2e48031bb2ebdc9db40ab23.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you're reading this, welcome to CodeWithNaydu! Whether you stumbled here by accident or you're a fellow developer looking to level up, I'm glad you're here. This is my first post, and I want to share why I'm starting this blog and what we'll build together.</p>
<p>Who Am I?</p>
<p>My name is Naydu, and I'm a self-taught frontend developer based in Umuahia, Abia State. I currently work at Sticobytes, a digital service agency where I build web solutions using HTML, CSS, and frameworks like Bootstrap. I'm comfortable creating beautiful, responsive interfaces, but I've always known there's more to the story.</p>
<p>You see, frontend development is powerful, but it's only half the equation. I've dabbled in backend technologies—Node.js, jQuery, Express, SQL—enough to know what's possible, but not enough to feel truly confident. I want to solve real-life problems with code, not just make things look good. And to do that, I need to go deeper.</p>
<p>Why I'm Joining a Bootcamp</p>
<p>Next week, I'll officially begin Techrise Cohort 2, a 2-month intensive bootcamp facilitated by the Abia State Government in collaboration with the 17 Local Government Councils and Learn Factory. Right now, I'm already in camp, settling in and soaking up the prep talks, but the real work is about to begin.</p>
<p>You might wonder: "Why a bootcamp if you're already a developer?" Here's why:</p>
<p>Structure and Focus: Self-learning is powerful, but it can also be chaotic. A bootcamp provides a clear path, taking me from where I am to where I want to be—systematically.</p>
<p>Team Learning: Development isn't a solo sport. Working with others who share the same goals sharpens your skills, exposes you to different perspectives, and prepares you for real-world collaboration.</p>
<p>New Skills: I'll be diving deep into backend development with Node.js and Prisma, and exploring Vue.js on the frontend. These aren't just buzzwords—they're tools that will help me build complete, production-ready applications.</p>
<p>Accountability: When you're learning alone, it's easy to skip the hard stuff. A bootcamp keeps you accountable, pushing you to show up even when it's tough.</p>
<p>What Excites Me Most</p>
<p>I'll be honest—I'm excited. No doubts, no second-guessing. I'm excited about the possibility of connecting with people who share the same mindset, who wake up thinking about code and go to sleep debugging in their dreams. I'm excited about finally becoming comfortable with the backend, turning my half-knowledge into real expertise.</p>
<p>But beyond the technical skills, I'm excited about what comes after. I want to build projects that solve real-life problems—whether for my community here in Abia State, my region, or beyond. I want to contribute to something meaningful, something that makes a difference.</p>
<p>The Road Ahead: My Vision</p>
<p>This bootcamp is just the beginning. My goals are long-term:</p>
<p>In the next 2 months: Master full-stack JavaScript development, get comfortable with Prisma for database management, and build projects that showcase my skills.</p>
<p>In 1-2 years: Work with a team building impactful solutions. Create projects that address real problems—maybe improving local services, simplifying processes, or creating opportunities for others.</p>
<p>Beyond that: Dive into Web3 and blockchain technology. Our financial systems are going digital, and blockchain is the foundation. It's a new frontier, and I want to be part of building it.</p>
<p>Why I'm Blogging</p>
<p>Here's the thing: learning in public is one of the most effective ways to actually learn. When you commit to teaching others, you're forced to understand concepts deeply. You can't fake it when you're explaining something in writing.</p>
<p>But this blog isn't just for me—it's for you.</p>
<p>If you're a beginner, you'll find tutorials, explanations, and real talk about the struggles and wins of learning to code. I'll break down concepts in simple terms because I remember what it's like to be confused by jargon.</p>
<p>If you're an experienced developer, maybe you'll find value in my journey—or better yet, share your own insights in the comments. I believe we all learn from each other.</p>
<p>What to Expect from CodeWithNaydu</p>
<p>Starting next week, I'll be sharing:</p>
<p>Weekly lessons: As I progress through the bootcamp, I'll document what I'm learning—HTML, CSS, JavaScript deep dives, Node.js, Prisma, Vue.js, and more.</p>
<p>Beginner-friendly tutorials: Step-by-step guides that assume no prior knowledge. If I use a technical term, I'll explain it.</p>
<p>Real projects: Not just toy examples, but projects designed to solve actual problems.</p>
<p>Honest reflections: The wins, the bugs, the moments of frustration, and the breakthroughs.</p>
<p>My path to Web3: As I build my foundation, I'll be documenting my journey toward blockchain development.</p>
<p>I'm committing to posting at least twice a week. Consistency matters, and I want this blog to be a reliable resource for anyone on a similar path.</p>
<p>Let's Connect</p>
<p>This journey is better together. I'd love to hear from you:</p>
<p>Are you learning web development right now? Where are you in your journey?</p>
<p>What topics do you struggle with most?</p>
<p>What would you like me to write about?</p>
<p>Drop a comment below, connect with me on social media, or just follow along. Let's build something great—one line of code at a time.</p>
<p>And when I'm not coding? You'll probably find me reading, playing sports, or cheering on Manchester United (yes, even during the tough seasons).</p>
<p>Welcome to CodeWithNaydu. Let's learn, build, and grow together.</p>
<p>Next up: Week 1 of the bootcamp kicks off, and I'll be sharing everything I learn. Stay tuned!</p>
<p>Follow my journey as I go from frontend developer to full-stack engineer and beyond. Subscribe to get new posts delivered straight to your inbox…</p>
]]></content:encoded></item></channel></rss>