<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Yashodhan Singh</title>
    <description>The latest articles on Forem by Yashodhan Singh (@dsfx3d).</description>
    <link>https://forem.com/dsfx3d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F148785%2Ffb86937d-b445-431a-9e34-fd579cfd78ff.png</url>
      <title>Forem: Yashodhan Singh</title>
      <link>https://forem.com/dsfx3d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dsfx3d"/>
    <language>en</language>
    <item>
      <title>Resilience &gt; Perfection</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Fri, 22 Aug 2025 05:14:07 +0000</pubDate>
      <link>https://forem.com/dsfx3d/resilience-perfection-2d5h</link>
      <guid>https://forem.com/dsfx3d/resilience-perfection-2d5h</guid>
      <description>&lt;p&gt;Software engineering is mostly about &lt;strong&gt;decisions under uncertainty&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Every framework you choose, every abstraction you build, every quick fix you push to production is a decision under uncertainty.  &lt;/p&gt;

&lt;p&gt;The hard part isn’t writing code. It’s deciding when you don’t have perfect information.  &lt;/p&gt;

&lt;p&gt;A useful mental model for this comes from Donald Rumsfeld. He split knowledge into four categories:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Known Knowns&lt;/strong&gt;: things we know
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Known Unknowns&lt;/strong&gt;: things we know we don’t know
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknown Knowns&lt;/strong&gt;: things we know but have forgotten or buried
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknown Unknowns&lt;/strong&gt;: things we don’t even realize we don’t know
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how those quadrants show up in engineering work.  &lt;/p&gt;




&lt;h2&gt;
  
  
  1. Known Knowns
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“Use the linter.”&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Choosing between a &lt;code&gt;for&lt;/code&gt; loop and &lt;code&gt;.map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configuring a database connection string
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the obvious decisions. You already understand the trade-offs, and the outcome is predictable. The best way to handle known knowns is to automate them. Style guides, linters, and conventions remove the need to think about them at all, freeing engineers to focus on the problems that actually require judgment.  &lt;/p&gt;




&lt;h2&gt;
  
  
  2. Known Unknowns
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“Let’s spike it.”&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Which database fits a multi-tenant SaaS?
&lt;/li&gt;
&lt;li&gt;How to meet GDPR logging requirements?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where you’re aware of the gap in your knowledge. You know you don’t know, which means you can plan for it. Known unknowns are best approached with structured exploration: build a proof of concept, run a benchmark, or consult someone with domain expertise. The key is to turn uncertainty into learning, and to capture that knowledge so it doesn’t slip back into ambiguity later.  &lt;/p&gt;




&lt;h2&gt;
  
  
  3. Unknown Knowns
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“If it works, don’t touch it.”&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A scaling trick solved by an engineer three years ago
&lt;/li&gt;
&lt;li&gt;An API that looks weird but has a buried reason
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where legacy code thrives. The system works, but the original context has been forgotten. Maybe someone added a hack to prevent cascading failures, or maybe the odd-looking API was designed around an old constraint that isn’t obvious today. Unknown knowns create risk because you might break something you didn’t even realize had a purpose.  &lt;/p&gt;

&lt;p&gt;The best antidote is to preserve knowledge with documentation, ADRs, and mentorship so that wisdom doesn’t quietly disappear over time. This doesn’t mean you should never touch legacy code. It means you approach it with care, seeking to understand before rewriting. Refactoring from knowledge leads to progress; refactoring from ignorance often reopens old wounds.  &lt;/p&gt;




&lt;h2&gt;
  
  
  4. Unknown Unknowns
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“We’ll find out in production.”&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A user signs up with &lt;code&gt;🚀💥🔥&lt;/code&gt; as their username and the system breaks
&lt;/li&gt;
&lt;li&gt;A sudden traffic spike from going viral melts your caching layer
&lt;/li&gt;
&lt;li&gt;A timezone edge case shifts reports by a full day
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the landmines. Unknown unknowns are the problems you don’t even know exist until they explode in your face. You thought you had tested thoroughly, but reality exposes blind spots you never considered. The emoji username bug is a perfect case: Unicode normalization, surrogate pairs, and multi-byte storage were never even on your radar.  &lt;/p&gt;

&lt;p&gt;Unknown unknowns can’t be eliminated, but you can prepare for them: observability, tests with odd inputs, chaos drills, and a blameless culture make your systems and your team more adaptive when the unexpected happens.  &lt;/p&gt;




&lt;h2&gt;
  
  
  How to Build Resilient Software
&lt;/h2&gt;

&lt;p&gt;Resilience is the art of surviving the unknown. It doesn’t mean overengineering or locking everything down. It means buying yourself flexibility so that when surprises happen, they don’t turn into catastrophes.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical patterns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preserve optionality&lt;/strong&gt;
When you change a database schema, don’t flip everything at once. Support old and new fields side by side, migrate in phases, and only remove the old path when you’re confident nothing depends on it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture history before optimizing&lt;/strong&gt;
If you don’t have a fully fleshed-out auditing system, start by keeping every version of what matters, like storing every CSV upload. It may feel heavy-handed, but it means you won’t lose information. Later, when you understand the use cases better, you can design a slimmer system.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail gracefully&lt;/strong&gt;
Don’t assume success. Timeouts, retries, circuit breakers, and clear error handling keep failures local instead of global.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embrace feedback loops&lt;/strong&gt;
Logging, monitoring, and alerts aren’t just for outages. They help you discover edge cases you didn’t anticipate and feed those back into design and testing.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resilience rarely looks elegant at first. As engineers, we often aim for the most optimal, minimal, or clean design. But resilience requires flexibility, and flexibility often comes with a few rough edges. Temporary duplication, layered schemas, storing too much data, or supporting multiple code paths might feel like antipatterns. In reality, they are often what keep systems safe until the unknowns are better understood.  &lt;/p&gt;

&lt;p&gt;Resilience isn’t about perfection. It’s about giving your system the ability to bend without breaking, and your team the confidence to make changes even in the face of uncertainty.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most real failures come from the bottom half of the matrix: forgotten wisdom and surprise landmines. By naming these categories, the Rumsfeld Matrix gives us a way to think about uncertainty in engineering.&lt;/p&gt;

&lt;p&gt;Great engineers don’t try to erase uncertainty. They accept that surprises will always show up and build systems and teams that can adapt when they do.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>resilience</category>
      <category>decisionmaking</category>
    </item>
    <item>
      <title>👽 Why AI Agents Write Alien Code — And How to Fix It</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Wed, 02 Jul 2025 07:59:44 +0000</pubDate>
      <link>https://forem.com/dsfx3d/why-ai-agents-write-alien-code-and-how-to-fix-it-4oh2</link>
      <guid>https://forem.com/dsfx3d/why-ai-agents-write-alien-code-and-how-to-fix-it-4oh2</guid>
      <description>&lt;p&gt;AI coding agents are getting absurdly good. Whether it's GPT-4, Claude Sonnet, or something else, having an AI pair-programmer can feel like magic.&lt;/p&gt;

&lt;p&gt;But here’s the thing nobody talks about:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The code they write often feels… alien.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not wrong — just &lt;em&gt;off&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Problem
&lt;/h2&gt;

&lt;p&gt;You ask the agent to write a component, a helper function, or even a config file — and what you get is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functional, yes.
&lt;/li&gt;
&lt;li&gt;Accurate, mostly.
&lt;/li&gt;
&lt;li&gt;But completely misaligned with your style.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Variable names don’t follow your naming conventions. Braces are in weird places. It destructures things you wouldn’t. The imports are ordered strangely. Sometimes it even uses APIs you’d never touch.&lt;/p&gt;

&lt;p&gt;At first, I thought the fix was simple:&lt;br&gt;&lt;br&gt;
📝 &lt;strong&gt;Write a coding conventions document.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created a clear markdown file with all my stylistic preferences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Naming rules
&lt;/li&gt;
&lt;li&gt;Folder structure
&lt;/li&gt;
&lt;li&gt;Syntax conventions
&lt;/li&gt;
&lt;li&gt;Patterns to avoid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I pasted it into the chat and told the agent:&lt;br&gt;&lt;br&gt;
“Follow these rules.”&lt;/p&gt;

&lt;p&gt;It worked for a few prompts.&lt;/p&gt;

&lt;p&gt;Then it forgot.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤖 Agents Follow Context, Not Suggestions
&lt;/h2&gt;

&lt;p&gt;Here’s the catch:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI agents don’t &lt;em&gt;remember&lt;/em&gt; your suggestions — they react to context.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unless you keep repeating your style guide every few prompts, it fades. You’re left copy-pasting reminders over and over, and even then, the agent might prioritize code patterns it’s seen more often on GitHub over your personal taste.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ The Real Fix: Let ESLint Speak For You
&lt;/h2&gt;

&lt;p&gt;What actually worked was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I created a strict, opinionated &lt;strong&gt;ESLint config&lt;/strong&gt; that embodied my coding style.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not just “use semi-colons” — I went all-in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom rules
&lt;/li&gt;
&lt;li&gt;Plugin overrides
&lt;/li&gt;
&lt;li&gt;Import ordering
&lt;/li&gt;
&lt;li&gt;JSX formatting
&lt;/li&gt;
&lt;li&gt;Naming conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once this config was active in my codebase, something amazing happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent started writing code that &lt;em&gt;fit&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;When it didn’t, the lint errors showed up — and the agent fixed them instantly.
&lt;/li&gt;
&lt;li&gt;I stopped explaining. The config did the talking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because most AI agents inside editors like VSCode see the same lint errors you do. They adjust their output in real-time based on what they see in your codebase.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Linting = Real-Time Reinforcement Learning
&lt;/h2&gt;

&lt;p&gt;Every lint error becomes a feedback signal. It’s like reinforcement learning — but inside your editor.&lt;/p&gt;

&lt;p&gt;Instead of telling the agent “please don’t use &lt;code&gt;any&lt;/code&gt;,” your linter throws a red squiggle. The agent fixes it. Done.&lt;/p&gt;

&lt;p&gt;The more you enforce style with tooling, the faster the agent adapts. No more alien code. No more babysitting.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Pro Tips
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Don’t be shy — be strict
&lt;/h3&gt;

&lt;p&gt;Go beyond Prettier defaults. Add ESLint rules that &lt;em&gt;actually&lt;/em&gt; reflect how you think.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint eslint-config-98kb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then build your eslint.config.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// eslint.config.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typescript&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-config-98kb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;typescript&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Enable auto-fix on save
&lt;/h3&gt;

&lt;p&gt;Your agent will see the output clean up as it works — another feedback loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use prompts for logic, not style
&lt;/h3&gt;

&lt;p&gt;Don’t waste tokens on stylistic instructions. Let the config guide the tone.&lt;/p&gt;




&lt;p&gt;✨ Conclusion&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Coding agents don’t care what you say.&lt;br&gt;
They care what your codebase enforces.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So stop asking them nicely to follow your style.&lt;br&gt;
Tell them with tooling.&lt;/p&gt;

&lt;p&gt;Linting isn’t just for humans anymore — it’s how you speak to your AI pair.&lt;/p&gt;




&lt;p&gt;💬 Your Turn&lt;/p&gt;

&lt;p&gt;Have you tried teaching your coding agent to match your style?&lt;br&gt;
Did you go the linter route — or something else?&lt;/p&gt;

&lt;p&gt;Would love to hear your take 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>eslint</category>
      <category>productivity</category>
      <category>linting</category>
    </item>
    <item>
      <title>You A̶l̶m̶o̶s̶t̶ Never Need useReducer</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Wed, 11 Jun 2025 06:57:26 +0000</pubDate>
      <link>https://forem.com/dsfx3d/you-almost-never-need-usereducer-1dpp</link>
      <guid>https://forem.com/dsfx3d/you-almost-never-need-usereducer-1dpp</guid>
      <description>&lt;p&gt;Let’s stop pretending &lt;code&gt;useReducer&lt;/code&gt; is some architectural upgrade over &lt;code&gt;useState&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;In the hands of most developers, it’s just &lt;strong&gt;overengineering theater&lt;/strong&gt;. A costume.&lt;/p&gt;

&lt;p&gt;An attempt to cosplay as a systems thinker in a CRUD world.&lt;/p&gt;

&lt;p&gt;But here’s the truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’re reaching for &lt;code&gt;useReducer&lt;/code&gt; in your React component, you're probably just adding ceremony to avoid writing &lt;code&gt;setState&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s talk about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why Devs Fall for &lt;code&gt;useReducer&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It looks structured.&lt;br&gt;
It feels scalable.&lt;br&gt;
It smells testable.&lt;/p&gt;

&lt;p&gt;It lets you write fancy things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE_FIELD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now you feel like you're writing a framework instead of a component.&lt;/p&gt;

&lt;p&gt;But you're not building a state machine.&lt;br&gt;
You're updating a form input.&lt;/p&gt;

&lt;p&gt;This isn't clever. It's LARPing.&lt;/p&gt;


&lt;h2&gt;
  
  
  💬 The Famous Interview Trauma
&lt;/h2&gt;

&lt;p&gt;You've heard it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“My friend was rejected from a frontend role because they used useState instead of useReducer 😞”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That anecdote makes the rounds every 3 months — usually paired with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStartDate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEndDate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then comes the critique:&lt;/p&gt;

&lt;p&gt;Too many states!&lt;br&gt;
No validation!&lt;br&gt;
Inconsistent logic!&lt;br&gt;
Not enterprisey enough!&lt;/p&gt;

&lt;p&gt;So they slap on a reducer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateEvent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// This section will be bad for&lt;/span&gt;
  &lt;span class="c1"&gt;// your mental health in the real world&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations.&lt;br&gt;
You’ve replaced readable logic with a pseudo–Redux wormhole to feel more "correct."&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Why Coupling Validation with State Stinks&lt;/p&gt;

&lt;p&gt;You're baking validation logic into the state update mechanism. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every state change must trigger validation — even when it shouldn't&lt;/li&gt;
&lt;li&gt;You can’t test validation separately&lt;/li&gt;
&lt;li&gt;You can’t control when or how validation happens&lt;/li&gt;
&lt;li&gt;You’ve locked logic into an opaque reducer blob&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Validation is not a reducer's job. A reducer should handle transitions, not rules.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  ✅ The Clean Way (That Just Works)
&lt;/h2&gt;

&lt;p&gt;Let’s write boring, effective, adult code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStartDate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEndDate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;setStartDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;setEndDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setStartDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setEndDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;End date must be after start date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Title must be under 100 characters&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate on blur&lt;/li&gt;
&lt;li&gt;Show errors inline&lt;/li&gt;
&lt;li&gt;Test validateEvent independently&lt;/li&gt;
&lt;li&gt;Reuse the same validation in the backend&lt;/li&gt;
&lt;li&gt;Extend logic without digging through reducer guts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is code that’s actually maintainable.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤡 The Real Reason People Push useReducer
&lt;/h2&gt;

&lt;p&gt;You are probably an influencers trying to sell your &lt;strong&gt;"How to be a 10x dev? I know, you don't"&lt;/strong&gt; course when your only real skill is clearing interviews.&lt;/p&gt;

&lt;p&gt;You exploit the insecurities of innocent junior devs without providing them any real value in return and by making them feel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insecure about writing “basic” code.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useState&lt;/code&gt; looks amateur&lt;/li&gt;
&lt;li&gt;Abstracting everything into a reducer makes it “professional”&lt;/li&gt;
&lt;li&gt;More indirection = better architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the same mindset that leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overuse of design patterns&lt;/li&gt;
&lt;li&gt;Creating types.ts files for three enums&lt;/li&gt;
&lt;li&gt;Wrapping simple logic in ten layers of abstraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You're not a worse dev for writing &lt;code&gt;useState&lt;/code&gt;.&lt;br&gt;
You’re a better one for knowing when &lt;strong&gt;not&lt;/strong&gt; to reach for complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 When useReducer Actually Belongs
&lt;/h2&gt;

&lt;p&gt;Let’s be fair. Here’s when it makes sense:&lt;/p&gt;

&lt;p&gt;✅ Finite State Machines (e.g., multi-step wizards)&lt;br&gt;
✅ Undo/Redo logic&lt;br&gt;
✅ Pure state transitions you want to extract + test&lt;br&gt;
✅ Shared reducer logic across multiple components&lt;br&gt;
✅ You're modeling explicit transitions, not just storing values&lt;/p&gt;

&lt;p&gt;If that’s not you, and you’re still using useReducer, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Am I solving a real problem?&lt;br&gt;
Or just inventing stuff to feel clever?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✍️ The Rule of Thumb
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;useState&lt;/code&gt; is for values.&lt;br&gt;
Custom hooks are for reuse.&lt;br&gt;
&lt;code&gt;useReducer&lt;/code&gt; is for transitions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Write code that’s easy to read, not code that performs intellectual gymnastics.&lt;/p&gt;

&lt;p&gt;Break this rule of thumb if it gets in the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Final Thought
&lt;/h2&gt;

&lt;p&gt;You don’t get a promotion for writing &lt;code&gt;dispatch()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You don’t become a better engineer by mimicking Redux on your delete confirmation modal.&lt;/p&gt;

&lt;p&gt;You become a better engineer by writing &lt;strong&gt;clear&lt;/strong&gt;, &lt;strong&gt;boring&lt;/strong&gt;, &lt;strong&gt;durable code&lt;/strong&gt; your teammates can understand without context.&lt;/p&gt;

&lt;p&gt;So unless your state has &lt;strong&gt;explicit transitions&lt;/strong&gt;, &lt;strong&gt;interdependencies&lt;/strong&gt;, or &lt;strong&gt;reversibility&lt;/strong&gt; — just use &lt;code&gt;useState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Don't be a sheep 🐑.&lt;br&gt;
You almost never need &lt;code&gt;useReducer&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>hooks</category>
    </item>
    <item>
      <title>How LLMs Are Quietly Democratizing Intellect</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Tue, 10 Jun 2025 22:23:12 +0000</pubDate>
      <link>https://forem.com/dsfx3d/how-llms-are-quietly-democratizing-intellect-cgo</link>
      <guid>https://forem.com/dsfx3d/how-llms-are-quietly-democratizing-intellect-cgo</guid>
      <description>&lt;p&gt;Let’s not pretend everyone starts life with equal cognitive resources.&lt;/p&gt;

&lt;p&gt;Some people are born with great working memory, quick comprehension, sharp reasoning. Others aren’t — but that doesn’t mean they don’t have good ideas, drive, or creativity.&lt;/p&gt;

&lt;p&gt;Large Language Models (LLMs) are quietly helping bridge that gap.&lt;/p&gt;

&lt;p&gt;They offer something rare:&lt;br&gt;
the ability to &lt;em&gt;punch above your intellectual weight.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You don’t need to remember all the edge cases, or how to word a formal request. The model helps scaffold that for you.&lt;/p&gt;

&lt;p&gt;It’s like getting to borrow someone else’s mental RAM and formatting skills, anytime you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  “It’s Making People Think Less” — or Is It?
&lt;/h2&gt;

&lt;p&gt;Sure, some people use it like a shortcut to avoid thinking and auto-reply to everything with “sounds good.”&lt;/p&gt;

&lt;p&gt;But the same was true of Wikipedia. Or Stack Overflow. Or calculators.&lt;/p&gt;

&lt;p&gt;Misuse doesn’t negate value — it just reveals something about how people use tools when left unreflective.&lt;/p&gt;

&lt;p&gt;In practice, the people getting the most out of LLMs aren’t thinking less.&lt;/p&gt;

&lt;p&gt;They’re thinking &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They’re testing assumptions faster. They’re seeing counterarguments they hadn’t considered.&lt;br&gt;
They’re experimenting with styles of thinking that didn’t come naturally before — analytical, concise, lateral.&lt;/p&gt;

&lt;p&gt;If you already have a decent thought process, LLMs let you upgrade it like a software patch.&lt;/p&gt;




&lt;h2&gt;
  
  
  It’s Not About Replacing Thinking — It’s About Scaling It
&lt;/h2&gt;

&lt;p&gt;We’re used to thinking of intellect as a fixed trait.&lt;br&gt;
But LLMs treat it more like compute.&lt;/p&gt;

&lt;p&gt;If you know how to ask good questions, you can now tap into a general-purpose reasoning engine that helps you go further.&lt;/p&gt;

&lt;p&gt;The internet gave us access to information.&lt;br&gt;
LLMs give us access to &lt;em&gt;synthesis&lt;/em&gt; — and to a kind of “on-demand second brain” that lets people without elite credentials or training produce surprisingly high-quality outcomes.&lt;/p&gt;

&lt;p&gt;This won’t make everyone brilliant.&lt;br&gt;
But it will shift the baseline.&lt;br&gt;
It’s already doing that.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>llm</category>
      <category>learning</category>
    </item>
    <item>
      <title>I Tried Vibe Coding a Semantic Layer From Scratch</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Wed, 04 Jun 2025 10:11:08 +0000</pubDate>
      <link>https://forem.com/dsfx3d/i-tried-vibe-coding-a-semantic-layer-from-scratch-4i3e</link>
      <guid>https://forem.com/dsfx3d/i-tried-vibe-coding-a-semantic-layer-from-scratch-4i3e</guid>
      <description>&lt;p&gt;Before this project, we already had reporting—dozens of fixed reports written in raw SQL. But our users kept coming back with one-off requests:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can I see this by region instead of by customer?”&lt;br&gt;&lt;br&gt;
“Can we compare Q1 vs Q2 just for this segment?”&lt;br&gt;&lt;br&gt;
“What about filtering this down to fleet customers only?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each request meant hand-tweaking SQL, validating the output, and adding yet another fork to our growing report list.&lt;/p&gt;

&lt;p&gt;Our team is lean. We don’t have many senior engineers. And honestly, I had never done data engineering before.&lt;br&gt;
I barely knew what “grain” meant, let alone how to design a scalable reporting system.&lt;/p&gt;

&lt;p&gt;But I was determined to solve the problem.&lt;br&gt;
And I had a secret weapon: &lt;strong&gt;long conversations with AI&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Isn’t This Already Solved?”
&lt;/h2&gt;

&lt;p&gt;In theory? Yes.&lt;br&gt;
Big BI vendors offer semantic layers. Big tech has internal tools. There are open source solutions like Cube.js and Apache Superset.&lt;/p&gt;

&lt;p&gt;But those solutions assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A team of experienced data engineers
&lt;/li&gt;
&lt;li&gt;Complex org-wide needs across many datasets
&lt;/li&gt;
&lt;li&gt;Dedicated data modeling cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We had none of that.&lt;/p&gt;

&lt;p&gt;What we had was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;well-scoped schema&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A stream of &lt;strong&gt;custom user requests&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;And the need for a solution with &lt;strong&gt;a low learning curve and high adaptability&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build something tailored—simple, durable, and easy to own by anyone, not just me.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1: Learning the Terrain with AI
&lt;/h2&gt;

&lt;p&gt;To get started, I did what I always do when entering unfamiliar territory: I asked a lot of questions.&lt;/p&gt;

&lt;p&gt;I fed AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The full schema
&lt;/li&gt;
&lt;li&gt;All business-defined metrics and dimensions
&lt;/li&gt;
&lt;li&gt;Role-based access rules and exceptions
&lt;/li&gt;
&lt;li&gt;Legacy SQL logic from old reports&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;How to resolve join paths safely
&lt;/li&gt;
&lt;li&gt;What makes certain metrics non-additive&lt;/li&gt;
&lt;li&gt;What is a non-additive metric&lt;/li&gt;
&lt;li&gt;When fan-out happens and how to prevent it&lt;/li&gt;
&lt;li&gt;Whether a derived metric should be nested or flattened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I got answers that made sense. Not code—but &lt;strong&gt;conceptual clarity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s how I went from knowing almost nothing about semantic layers…&lt;br&gt;&lt;br&gt;
To understanding the building blocks of semantic architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2: Vibe Coding My Way into Failure
&lt;/h2&gt;

&lt;p&gt;Armed with that new understanding, I did what most devs would do: I built fast.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt-driven join builders
&lt;/li&gt;
&lt;li&gt;Schema-agnostic query engines
&lt;/li&gt;
&lt;li&gt;Filters and dimensions as abstract objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It felt powerful—until it wasn’t.&lt;/p&gt;

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

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

&lt;p&gt;Soon, I hit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grain mismatches that caused inflated metrics
&lt;/li&gt;
&lt;li&gt;Derived KPIs breaking due to missing dependencies
&lt;/li&gt;
&lt;li&gt;Filters applied too early, too late, or not at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was clever code. But unstable.&lt;br&gt;&lt;br&gt;
Great for a demo. Bad for production. Worse for handoff.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'd gladly accept if vibe coding was a skill issue I can improve but I want to be sure if it's a skill issue or I was chasing shadows.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Phase 3: Burning It Down and Rebuilding with Contracts
&lt;/h2&gt;

&lt;p&gt;So I reset. From scratch. Again.&lt;/p&gt;

&lt;p&gt;This time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Measures&lt;/strong&gt; explicitly declare their grain and aggregation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt; define their valid join paths and fact compatibility
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filters&lt;/strong&gt; are parsed in context—validated before execution
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Derived metrics&lt;/strong&gt; rely on dependency graphs and outer aggregations
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security rules&lt;/strong&gt; are baked into the query structure by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;join resolver&lt;/strong&gt; for composing minimal, valid paths
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;filter parser&lt;/strong&gt; that understands nesting and table origin
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;query compiler&lt;/strong&gt; that builds safe, predictable, performant SQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, AI was my &lt;strong&gt;code companion&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helping draft utility functions
&lt;/li&gt;
&lt;li&gt;Validating logic edge cases
&lt;/li&gt;
&lt;li&gt;Explaining odd query plan behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It wasn’t building the system.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;I was.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
But it helped me learn faster and write better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Things Stand Now
&lt;/h2&gt;

&lt;p&gt;The system is still in development—but the foundation is strong.&lt;/p&gt;

&lt;p&gt;Once done, the layer will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accept any compatible dimensions + metrics
&lt;/li&gt;
&lt;li&gt;Build dynamic, grain-safe SQL with reusable CTEs
&lt;/li&gt;
&lt;li&gt;Enforce multi-tenant access at the query layer
&lt;/li&gt;
&lt;li&gt;Return compatibility metadata for frontend UI guards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not fully feature-complete yet—but the hardest parts are solved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Data correctness
&lt;/li&gt;
&lt;li&gt;✅ Structural safety
&lt;/li&gt;
&lt;li&gt;✅ Extensibility
&lt;/li&gt;
&lt;li&gt;✅ Teachability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire thing is built with &lt;strong&gt;handoff in mind&lt;/strong&gt;—so that even a junior developer can understand it, extend it, and trust it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next: The AI Chatbot — My Next Challenge
&lt;/h2&gt;

&lt;p&gt;Once this layer is complete, I want to explore building an AI-powered chatbot on top of it.&lt;/p&gt;

&lt;p&gt;Something that can take a question like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Compare RO sales growth by segment over the last two quarters.”&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Parse the natural language
&lt;/li&gt;
&lt;li&gt;Map it to known dimensions, filters, and metrics
&lt;/li&gt;
&lt;li&gt;Validate the request
&lt;/li&gt;
&lt;li&gt;Run it safely through the semantic engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I know this will bring a &lt;strong&gt;whole new set of challenges&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ambiguity in user intent
&lt;/li&gt;
&lt;li&gt;Fuzzy synonyms vs structured fields
&lt;/li&gt;
&lt;li&gt;Invalid requests that sound perfectly valid
&lt;/li&gt;
&lt;li&gt;Performance and security trade-offs in real time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many ways, it’ll be like starting over—with &lt;strong&gt;unknown unknowns&lt;/strong&gt; waiting at every turn.&lt;br&gt;
And honestly? I’m looking forward to it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing: From Blank Slate to Ownership
&lt;/h2&gt;

&lt;p&gt;I started this project with zero background in data engineering.&lt;/p&gt;

&lt;p&gt;What I had was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curiosity
&lt;/li&gt;
&lt;li&gt;A well-scoped schema
&lt;/li&gt;
&lt;li&gt;Real pain points
&lt;/li&gt;
&lt;li&gt;And AI as my co-pilot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along the way, I learned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respect grain
&lt;/li&gt;
&lt;li&gt;Handle fan-out
&lt;/li&gt;
&lt;li&gt;Design for clarity
&lt;/li&gt;
&lt;li&gt;Build with the next developer in mind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s still in progress.&lt;br&gt;
But now I see the shape of the system, and I know how to complete it.&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;vibes → validation → vision&lt;/strong&gt;—with a whole lot of learning in between.&lt;br&gt;
That’s what this project gave me.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>devjournal</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>🧼 Help, I Have Clean Code OCD – A Functional Programming Horror Story</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Fri, 30 May 2025 06:05:45 +0000</pubDate>
      <link>https://forem.com/dsfx3d/help-i-have-clean-code-ocd-a-functional-programming-horror-story-61i</link>
      <guid>https://forem.com/dsfx3d/help-i-have-clean-code-ocd-a-functional-programming-horror-story-61i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hi, my name is Yash, and I haven’t mutated a variable in 147 days."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They say the first step is acceptance. But how do you accept that your life has become a series of pure functions and monads? That you've spent more time refactoring than writing actual features? That you once rejected a PR because someone used a &lt;code&gt;let&lt;/code&gt; instead of a &lt;code&gt;const&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Welcome to my story — a tale of one dev’s descent into the rabbit hole of &lt;strong&gt;functional programming and clean code purity&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 The Backstory: I Was Just a Developer Once
&lt;/h2&gt;

&lt;p&gt;I used to write code that worked. It wasn’t elegant, but it was honest. We called APIs. We mutated objects. We had deeply nested conditionals.&lt;br&gt;
It wasn’t beautiful — but it shipped.&lt;/p&gt;

&lt;p&gt;My files were big, my variables were vague, and my linter? Mostly decorative.&lt;/p&gt;

&lt;p&gt;And then one day... I discovered eslint --fix.&lt;/p&gt;

&lt;p&gt;That led me to Clean Code. Then FP. Then a YouTube video where someone used a curried function to build an entire REST API. I was horrified… and inspired. I thought, “If this guy can refactor CRUD into existential math, so can I.”&lt;/p&gt;

&lt;p&gt;What started as a pursuit of better code quickly became a full-blown personality trait.&lt;/p&gt;

&lt;p&gt;Last night, I spent two hours to refactor something that already works. Why?&lt;/p&gt;




&lt;h2&gt;
  
  
  🚿 It Started Innocently…
&lt;/h2&gt;

&lt;p&gt;Like all good horror stories, mine began with a desire to &lt;em&gt;do better&lt;/em&gt;. One day I saw a talk by Uncle Bob and thought, “Yes, I too want my codebase to be so clean it could do surgery.”&lt;/p&gt;

&lt;p&gt;So I started small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;console.log&lt;/code&gt; in production code ✅
&lt;/li&gt;
&lt;li&gt;One function per concern ✅
&lt;/li&gt;
&lt;li&gt;No mutation ever ✅
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But once I read about functional programming, that's when everything changed. I was already in the cult.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌀 The Pure Function Spiral
&lt;/h2&gt;

&lt;p&gt;At first, &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt; were fun little tools. Like new LEGO pieces.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Composing functions like an orchestral symphony 🎼
&lt;/li&gt;
&lt;li&gt;Refusing to write a single &lt;code&gt;if&lt;/code&gt; 💀
&lt;/li&gt;
&lt;li&gt;Judging colleagues for using variables with more than one responsibility
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually I was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turning state management into a philosophical debate about immutability
&lt;/li&gt;
&lt;li&gt;Writing code that passed all linter rules... and failed all human readability tests
&lt;/li&gt;
&lt;li&gt;Creating tiny functions with 100% test coverage that did absolutely nothing useful
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I even had a function called &lt;code&gt;normalizeData&lt;/code&gt; that was composed of 11 smaller functions — none of which were longer than 3 lines. Beautiful. Useless. Like modern art.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Symptoms
&lt;/h2&gt;

&lt;p&gt;You may also be infected with Clean Code OCD if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have more types than actual data
&lt;/li&gt;
&lt;li&gt;You use the word “side effect” in casual conversation
&lt;/li&gt;
&lt;li&gt;You believe &lt;code&gt;null&lt;/code&gt; is a personal insult
&lt;/li&gt;
&lt;li&gt;You’ve said, “I can’t approve this PR; it’s not referentially transparent”
&lt;/li&gt;
&lt;li&gt;You get physically uncomfortable around uncurried functions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Worst of all, this obsession spreads.&lt;/strong&gt; One code review at a time. One Slack thread about "function purity" at a time. I've seen strong, pragmatic devs fall under its spell after just a single exposure to &lt;code&gt;fp-ts&lt;/code&gt;.&lt;/p&gt;




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

&lt;p&gt;They say perfect is the enemy of done. But in software, perfect is often just a clean code compulsion hiding behind &lt;code&gt;eslint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So here’s to all of you who’ve spent two hours renaming variables for the sake of clarity — may your purity bring you peace, or at least pass CI.&lt;/p&gt;

&lt;p&gt;And if your teammates start repeating your patterns, just remember: &lt;strong&gt;Clean Code OCD is contagious&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>humor</category>
      <category>cleancode</category>
      <category>devlife</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We Are Not Code Monkeys</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Wed, 21 May 2025 10:45:18 +0000</pubDate>
      <link>https://forem.com/dsfx3d/we-are-not-code-monkeys-52j9</link>
      <guid>https://forem.com/dsfx3d/we-are-not-code-monkeys-52j9</guid>
      <description>&lt;p&gt;Let’s be honest.&lt;/p&gt;

&lt;p&gt;Some days it feels like all we do is pick up tickets and crank out features.&lt;br&gt;
Another bug, another UI tweak, another "quick fix." Sprint after sprint.&lt;br&gt;
Ship it and move on.&lt;/p&gt;

&lt;p&gt;And somewhere in all that motion, it’s easy to forget:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We’re not just here to code.&lt;br&gt;
We’re here to &lt;em&gt;create&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 You're more than a ticket machine
&lt;/h2&gt;

&lt;p&gt;You’ve got ideas. You see the patterns. You know when something feels off in the codebase or the product. That voice in your head saying &lt;em&gt;“There’s a better way to do this”&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;That’s not noise. That’s your engineering instinct kicking in.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏭 Feature factories don’t kill creativity — apathy does
&lt;/h2&gt;

&lt;p&gt;Yeah, maybe you're not in every product meeting. Maybe the roadmap isn’t something you get to shape yet.&lt;br&gt;&lt;br&gt;
But here’s the truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Culture doesn’t change from the top. It changes when the people doing the work start doing it differently.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask &lt;strong&gt;why&lt;/strong&gt; before you start coding.&lt;/li&gt;
&lt;li&gt;Suggest a better way.&lt;/li&gt;
&lt;li&gt;Clean up something messy.&lt;/li&gt;
&lt;li&gt;Pair up. Learn something. Share something.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need permission to care.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Code monkeys follow orders. Engineers ask questions.
&lt;/h2&gt;

&lt;p&gt;Engineers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think about users.&lt;/li&gt;
&lt;li&gt;Think about systems.&lt;/li&gt;
&lt;li&gt;Think ahead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to be a senior dev to think like one.&lt;br&gt;
Ownership doesn’t start with a promotion — it starts with a mindset.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Be the spark
&lt;/h2&gt;

&lt;p&gt;Every team has someone who raises the bar. Someone who nudges the culture a little closer to better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not you?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Care about quality, not just speed.&lt;/li&gt;
&lt;li&gt;Speak up when something doesn’t make sense.&lt;/li&gt;
&lt;li&gt;Push for smarter decisions — not just faster ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When enough people take that attitude, the team shifts. The work gets better.&lt;br&gt;
Suddenly, you're not in a feature factory anymore.&lt;br&gt;
You're on a team that &lt;em&gt;builds cool stuff and gives a crap.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🙅‍♂️ You are not a code monkey.
&lt;/h2&gt;

&lt;p&gt;You’re a builder.&lt;br&gt;
A thinker.&lt;br&gt;
A problem-solver.&lt;br&gt;
An engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start acting like it. Others will follow.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🗣️ Let’s hear it — what small things have &lt;em&gt;you&lt;/em&gt; done to make your team better? Drop them in the comments. Someone else might need the spark.&lt;/p&gt;

</description>
      <category>culture</category>
      <category>career</category>
      <category>motivation</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Bun 1.0: A No-Nonsense Look at the New Kid on the JavaScript Block?</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Thu, 14 Sep 2023 10:04:06 +0000</pubDate>
      <link>https://forem.com/dsfx3d/bun-10-a-no-nonsense-look-at-the-new-kid-on-the-javascript-block-184b</link>
      <guid>https://forem.com/dsfx3d/bun-10-a-no-nonsense-look-at-the-new-kid-on-the-javascript-block-184b</guid>
      <description>&lt;p&gt;Alright, let's hop on the hype train for a moment and talk about Bun 1.0! 🚂 Choo-choo, all aboard!&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Cooking in the Bun Oven?
&lt;/h3&gt;

&lt;p&gt;So, Bun wants to be your one-stop-shop for all things JavaScript and TypeScript. It's like the Swiss Army knife of coding, but without the awkwardness of actually trying to use a Swiss Army knife for anything serious. 🤣&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Many Cooks in the Kitchen?
&lt;/h3&gt;

&lt;p&gt;JavaScript has more tools than a hardware store, and let's be honest, it can be a mess. Node.js, npm, webpack, Jest—sounds like the lineup for a nerdy music festival. Bun aims to declutter your life by replacing all these tools without making you learn a new programming language or ditch your favorite libraries. 🎸🔨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp8o6vuznbi9ay161x90.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp8o6vuznbi9ay161x90.jpg" alt="bunjs killing node and deno" width="509" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Speedy Gonzales
&lt;/h3&gt;

&lt;p&gt;Bun claims to be faster than a caffeinated squirrel, starting up 4x faster than Node.js. It's like the Usain Bolt of JavaScript runtimes. 🏃‍♂️💨&lt;/p&gt;

&lt;h3&gt;
  
  
  One Ring to Rule Them All
&lt;/h3&gt;

&lt;p&gt;Compatibility is the name of the game here. Bun wants to be your new BFF, fitting into your life like that one friend who's always up for anything. It's a drop-in replacement for Node.js and plays nice with both CommonJS and ES modules. 🤝&lt;/p&gt;

&lt;h3&gt;
  
  
  Customization Station
&lt;/h3&gt;

&lt;p&gt;You can trick out Bun with plugins, just like you'd add spinning rims to a car (if you're into that sort of thing). Most esbuild plugins will work with Bun, so you can make it as fancy or as simple as you like. 🚗✨&lt;/p&gt;

&lt;h3&gt;
  
  
  Windows to the Soul
&lt;/h3&gt;

&lt;p&gt;Mac and Linux users, you're already in the club. Windows users, you're getting your VIP pass soon. Bun is working on a native Windows build, so everyone can join the party. 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  The Final Bun, I Mean, Run
&lt;/h3&gt;

&lt;p&gt;So, is Bun 1.0 the future of JavaScript development, or is it just the flavor of the month? Only time will tell (I mean react is still the king when it should actually be 6 feet under the ground). But hey, bun's got some pretty cool tricks up its sleeve, and it's worth keeping an eye on. 👀&lt;/p&gt;

</description>
      <category>bunjs</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Avoid the Refactor Tractor 🚜</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Thu, 14 Sep 2023 06:27:00 +0000</pubDate>
      <link>https://forem.com/dsfx3d/avoid-the-refactor-tractor-457e</link>
      <guid>https://forem.com/dsfx3d/avoid-the-refactor-tractor-457e</guid>
      <description>&lt;h2&gt;
  
  
  What is the Refactor Tractor? 🤔
&lt;/h2&gt;

&lt;p&gt;We've all been there. You're working on a multi-year project, and you start to feel the itch to refactor everything. You look at the codebase and think, "I could make this so much better!" (How cute 🥹) That urge to refactor is what we affectionately call the "Refactor Tractor".&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Why Do We Jump On? 🤷‍♂️
&lt;/h2&gt;

&lt;p&gt;The reasons are many: new technologies emerge, coding standards evolve, or maybe (we think) we've just become better developers. The temptation is real, but before you jump on that tractor, let's weigh the pros and cons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros 🌈
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Improved Code Quality&lt;/strong&gt;: Cleaner, more maintainable code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Performance&lt;/strong&gt;: Optimizations often come with refactoring (in your dreams).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Opportunity&lt;/strong&gt;: A chance to implement new technologies or patterns (the actual reason for buying a new tractor).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cons 😬
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time-Consuming&lt;/strong&gt;: Refactoring can take a lot of time away from new features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk of Bugs&lt;/strong&gt;: Changing existing code can introduce new issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Disruption&lt;/strong&gt;: Everyone has to get on board with the new changes, affecting productivity.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  How to Minimize the Urge 🛑
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prioritize 📝
&lt;/h3&gt;

&lt;p&gt;Not all code needs refactoring. Prioritize what really needs it and what can wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small Iterations 🔄
&lt;/h3&gt;

&lt;p&gt;Instead of a complete overhaul, make small, incremental changes over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discuss with the Team 👥
&lt;/h3&gt;

&lt;p&gt;Before making any major changes, discuss them with your team. A collective decision is often better than a unilateral one.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Actually Do It 🕒
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;When It Blocks Progress&lt;/strong&gt;: If the current architecture is hindering progress, it might be time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Debt is Piling Up&lt;/strong&gt;: If you're spending more time fixing bugs than developing, take it as a sign.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Consensus&lt;/strong&gt;: If everyone agrees that it's time, then it's probably time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tips 🎩
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automated Testing&lt;/strong&gt;: Make sure you have a good suite of tests to catch any bugs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Document what you're changing and why, for the sake of your future self and others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Reviews&lt;/strong&gt;: Get multiple eyes on the changes to catch issues early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the Churn&lt;/strong&gt;: Prioritise refactoring components with a high churn and low maintainability.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Jumping on the Refactor Tractor can be tempting, but it's not always the best course of action in a multi-year project. Weigh the pros and cons, consult with your team, and make disciplined decisions to ensure you're doing it for the right reasons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F450mwfv32yokxznqajdu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F450mwfv32yokxznqajdu.jpg" alt="de Caprio with a whiskey glass" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>code</category>
      <category>maintainability</category>
    </item>
    <item>
      <title>Conquering the Learning Curve of Bazel: My Ongoing Struggles and Hopeful Horizon 📈🌅</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Mon, 20 Feb 2023 05:57:58 +0000</pubDate>
      <link>https://forem.com/dsfx3d/conquering-the-learning-curve-of-bazel-my-ongoing-struggles-and-hopeful-horizon-1866</link>
      <guid>https://forem.com/dsfx3d/conquering-the-learning-curve-of-bazel-my-ongoing-struggles-and-hopeful-horizon-1866</guid>
      <description>&lt;p&gt;Hey everyone! 🤗 Today, I wanted to talk about something that's been on my mind lately: 🤔 Bazel! This amazing build tool has SO much potential, but for me, there's been a bit of a learning curve 😩📈.&lt;/p&gt;

&lt;p&gt;One particular challenge I've faced is with rules_nodejs 🚫. As a developer, one of my go-to tools is Storybook JS 📚🤓, but it seems almost IMPOSSIBLE to run it with rules_nodejs 😵. I've spent COUNTLESS hours trying to get it to work, but it's just not happening.&lt;/p&gt;

&lt;p&gt;BUT, there's hope on the horizon! 🌅 I've been hearing great things about rules_js, and I'm optimistic that it will fix all the problems I'm facing with rules_nodejs. 🙏🤞 Fingers crossed! I'll be sure to share my experiences with rules_js soon.&lt;/p&gt;

&lt;p&gt;Overall, I think it's important to remember that learning a new technology takes time and patience. 🕰️🧘 Even though I'm struggling with Bazel right now, I know that with persistence and a bit of help from the community, I'll get there eventually. 🤝&lt;/p&gt;

</description>
      <category>devmeme</category>
    </item>
    <item>
      <title>Functional Reactive Programming: My Love-Hate Relationship 💔</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Thu, 16 Feb 2023 08:28:43 +0000</pubDate>
      <link>https://forem.com/dsfx3d/functional-reactive-programming-my-love-hate-relationship-59lc</link>
      <guid>https://forem.com/dsfx3d/functional-reactive-programming-my-love-hate-relationship-59lc</guid>
      <description>&lt;p&gt;As a software developer, I've always been on the lookout for new and exciting technologies to dive into. However, my first introduction to functional reactive programming (FRP) wasn't exactly love at first sight 🙈.&lt;/p&gt;

&lt;p&gt;You see, my first exposure to FRP was through Angular + RxJS, and let's just say it was a bit of a mess 🤯. The code was bloated, the documentation was scarce, and I just couldn't seem to wrap my head around the concept.&lt;/p&gt;

&lt;p&gt;But then, something interesting happened. I stumbled upon a talk about FRP and things started clicking! 💡 The elegant simplicity of FRP was finally revealed to me, and I was hooked! 🎉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here it is: &lt;a href="https://youtube.com/watch?v=rfmkzp76M4M&amp;amp;feature=shares" rel="noopener noreferrer"&gt;The Essence and origins of Functional Reactive Programming • Conal Elliot •YOW! 2015&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;FRP, at its core, is a programming paradigm that allows you to model your application state as a stream of events in &lt;strong&gt;continuous time&lt;/strong&gt;. This means that you can easily track changes in your data and respond to them in real-time. It's like having a superpower 🦸‍♀️ that makes your application more responsive, scalable, and predictable!&lt;/p&gt;

&lt;p&gt;And while my love-hate relationship with Angular + RxJS is still ongoing 💔, I've found that FRP has revolutionized the way I approach software development. I've been able to write cleaner, more maintainable code and solve complex problems with ease 💻.&lt;/p&gt;

&lt;p&gt;So, if you're feeling frustrated with your current development process, give functional reactive programming a try! 💪 You might just find yourself even more frustration with eventual peace once you catch up with it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Checkout &lt;a href="https://dev.to/dsfx3d/unleash-the-power-of-frp-for-secure-authentication-in-typescript-582l"&gt;how FRP changed the way I do authentication&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>functionalreactiveprogramming</category>
      <category>frp</category>
      <category>softwaredevelopment</category>
      <category>codequality</category>
    </item>
    <item>
      <title>I Used to be a 💩 Coder 💻 Until I Re-discovered SOLID Principles 🌟</title>
      <dc:creator>Yashodhan Singh</dc:creator>
      <pubDate>Wed, 15 Feb 2023 00:51:57 +0000</pubDate>
      <link>https://forem.com/dsfx3d/i-used-to-be-a-coder-until-i-discovered-solid-principles-jn6</link>
      <guid>https://forem.com/dsfx3d/i-used-to-be-a-coder-until-i-discovered-solid-principles-jn6</guid>
      <description>&lt;p&gt;I remember when I first heard about SOLID principles, I thought to myself "what a load of 💩, who needs that many rules to write good code?" 🤔 Little did I know, it was my code that was 💩. Eventually, those principles became the cornerstone of my development practice and elevated my coding skills tenfold 🚀.&lt;/p&gt;

&lt;p&gt;It wasn't until my CTO 🧔 started making "amazing" remarks in code review and explained the value of SOLID principles that I really understood their importance. He showed me how they made my code more maintainable, scalable and easier to understand. And trust me, that's when I really started to see the value in SOLID.&lt;/p&gt;

&lt;p&gt;Here's how each SOLID principle leveled up my skills:&lt;/p&gt;

&lt;p&gt;Single Responsibility Principle (SRP) 💼&lt;br&gt;
This principle taught me to write code that only has one responsibility, making it much easier to maintain and understand. It's like having a neat and organized workspace, everything has its place and it's much easier to find what you need!&lt;/p&gt;

&lt;p&gt;Open/Closed Principle (OCP) 🚪&lt;br&gt;
This principle taught me to write code that can be easily extended, but not modified. It's like having a building that can be added on to, but still remains sturdy and secure.&lt;/p&gt;

&lt;p&gt;Liskov Substitution Principle (LSP) 🔗&lt;br&gt;
This principle taught me to write code that is easily interchangeable, like building with LEGOs! It's like being able to switch out parts without affecting the overall structure.&lt;/p&gt;

&lt;p&gt;Interface Segregation Principle (ISP) 🌐&lt;br&gt;
This principle taught me to write code that is flexible, allowing me to create interfaces that can be used by different parts of my code without affecting the others. It's like having multiple languages that can communicate with each other!&lt;/p&gt;

&lt;p&gt;Dependency Inversion Principle (DIP) 💪&lt;br&gt;
And my personal favourite, DIP taught me to write code that is easily adaptable, by depending on abstractions instead of concrete implementations. It's like having a toolbox that can be used for any job, no matter how complex!&lt;/p&gt;

&lt;p&gt;In conclusion, SOLID principles may seem overwhelming at first, but they're worth taking the time to understand. Trust me, your code will thank you! 😊&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.S. 📢 Don't stress about memorizing each principle, even I had to Google them to write this article! But in practice, they've already become second nature to me, like muscle memory 💪. Just keep using SOLID principles in your development and you'll see the benefits for yourself! 💻&lt;/p&gt;
&lt;/blockquote&gt;

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

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

</description>
      <category>solidprinciples</category>
      <category>codingskills</category>
      <category>softwaredevelopment</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
