<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: J Fleetwood</title>
    <description>The latest articles on DEV Community by J Fleetwood (@j_fleetwood_707a7933d4782).</description>
    <link>https://dev.to/j_fleetwood_707a7933d4782</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%2F3110386%2Fc78af763-41ae-4ae9-a690-43df0f7be354.png</url>
      <title>DEV Community: J Fleetwood</title>
      <link>https://dev.to/j_fleetwood_707a7933d4782</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/j_fleetwood_707a7933d4782"/>
    <language>en</language>
    <item>
      <title>Bots Don't Care About Money</title>
      <dc:creator>J Fleetwood</dc:creator>
      <pubDate>Mon, 05 May 2025 17:23:02 +0000</pubDate>
      <link>https://dev.to/j_fleetwood_707a7933d4782/bots-dont-care-about-money-1mk</link>
      <guid>https://dev.to/j_fleetwood_707a7933d4782/bots-dont-care-about-money-1mk</guid>
      <description>&lt;p&gt;If you're a non-technical founder or PM vibing your way to the next disruptor, you might be feeding your profits to the furnace.&lt;/p&gt;

&lt;p&gt;In my own project, using React, NextJS, Clerk, Tanstack, and Pusher, among other things, I was working on a simple notification system. User A interacts with User B's content, which sends a notification to B. Basic stuff.&lt;/p&gt;

&lt;p&gt;I spent over an hour writing up the rules and requirements to give the AI a very clear illustration of what to build and how it should work. The first pass was very promising, so I began the process of fine-tuning. Occasionally the counts would be out of sync, showing only 4 new notifications when there were 5. No big deal, this happens all the time in React. At this point the feature was nearly complete, about 90% functional, just this one last piece of peculiar bugginess. The bot was struggling to correct it though, and after numerous failed attempts, I started really digging deep into the code myself, line by line, where before I had allowed with a cursory glance. I literally gasped out loud (and added some color commentary to boot).&lt;/p&gt;

&lt;p&gt;The AI was using React &lt;code&gt;useEffect&lt;/code&gt; like duct tape on a hand-me-down Goldberg machine.&lt;/p&gt;

&lt;p&gt;
  This part is a little technical...
  &lt;br&gt;
This method will cause a component to update (re-render) whenever there's a change in state, like a notification count. I had given it direction to create a &lt;code&gt;Context Provider&lt;/code&gt;, which is a chunk of code that manages a complex piece of state across multiple components; since they all share context, each will update or re-render as needed to keep its own UI in sync. So in this example the &lt;code&gt;NotificationBell&lt;/code&gt;, a simple button on the user sidebar component, shows the count using the same data as the &lt;code&gt;NotificationList&lt;/code&gt;, which is a completely separate standalone component for displaying notifications, marking them as read, etc. Click on the bell to open the list, mark a notification as read to update the count on the bell, yeah?

&lt;p&gt;The bot built the Provider &lt;em&gt;inside&lt;/em&gt; a &lt;code&gt;useEffect&lt;/code&gt; (for you React engineers, you read that right: &amp;gt;200 lines of code declared as a single &lt;code&gt;const&lt;/code&gt;, and the entire provider, with all its Tanstack caching, socket connections, etc, all being recreated on &lt;em&gt;every render&lt;/em&gt;. I missed it at first since the &lt;code&gt;useEffect&lt;/code&gt; was near the top of the file, and the dependency array looked like a context value. For you non-engineers, this breaks common convention so egregiously that I didn't even look for it. You would never build a provider that way, nor even think to check that it wasn't.) Additionally, it was managing state binding through other &lt;code&gt;useEffects&lt;/code&gt;. As part of it, in order to keep the state "clean", it would unsubscribe from a Pusher channel and then promptly resubscribe a few lines later in the same function.&lt;/p&gt;

&lt;p&gt;In short, this resulted in exponential (potentially millions) of redundant calls to the database, Clerk, and Pusher. All of which charge for usage. Instead of using built-in caching provided by Tanstack, instead of using Pusher sockets to handle channel subscription, instead of using &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt; or any number of far more efficient  methods to manage state, it had scratch-built a Gordian Knot of &lt;code&gt;useEffects&lt;/code&gt; that would have ultimately cost a staggering amount of money in extraneous third-party integration calls.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Were I not an experienced engineer, I likely would not have caught it until my user base had grown large enough for it to be evident, by which point the entire system would have needed a rewrite, and I would have already lost &lt;strong&gt;a ton of money&lt;/strong&gt;, and would continue to until the fix was in place.&lt;/p&gt;

&lt;p&gt;Don't misunderstand me, I'm not saying not to use AI to build your dream project. I am! But if you're not technical, if you're relying on AI to work out nuanced, complex details and get it right, you need to understand that the technology just isn't ready for that yet. To wit: the cover image for this post was generated by AI. It took a dozen or so prompts to get it right, but it looks great, and I was ultimately really happy with the result.&lt;/p&gt;

&lt;p&gt;Until I counted the fingers and teeth. Did you notice that? I bet not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do yourself a favor: include an in-depth code review in your project roadmap and budget.&lt;/strong&gt; If you can't hire an engineer to build the thing, hire one to safeguard it at least. A good engineer will be able to find these kinds of scary hidden bugs, not to mention other &lt;em&gt;really important stuff&lt;/em&gt; like security, stability and observability. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The last thing you want is to launch your project with a six-fingered bot handling your costs and liabilities. You'll be lucky if all you lose is money.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>founder</category>
    </item>
    <item>
      <title>The Value of Code</title>
      <dc:creator>J Fleetwood</dc:creator>
      <pubDate>Wed, 30 Apr 2025 16:57:18 +0000</pubDate>
      <link>https://dev.to/j_fleetwood_707a7933d4782/the-value-of-code-17di</link>
      <guid>https://dev.to/j_fleetwood_707a7933d4782/the-value-of-code-17di</guid>
      <description>&lt;p&gt;Or: "A Spot of Encouraging Philosophy for your Wednesday Lunch"&lt;/p&gt;

&lt;p&gt;Code is only as good as the value it provides, say the Thought Leaders™&lt;/p&gt;

&lt;p&gt;"Architecture is pragmatic. Scalability is a function of purpose. So is stability. Craft is merely romantic, and love can't buy me money.&lt;/p&gt;

&lt;p&gt;You, the coder, and your product, the codebase, can both be Copy-Pasted."&lt;/p&gt;

&lt;p&gt;This is not a new topic. It is just a rehash of capitalist nonsense. An objective, algebraic, empirical, sterile, emotionless perspective for the greedy, the obtuse, the base. As Rand herself once said: "Consistency is the hobgoblin of small minds." (She was of course sarcastically paraphrasing Emerson, both ironically and pompously failing in so doing.)&lt;/p&gt;

&lt;p&gt;Profit != value.&lt;br&gt;
Money != value.&lt;br&gt;
&lt;strong&gt;Value is not objective.&lt;/strong&gt;&lt;br&gt;
Full stop.&lt;/p&gt;

&lt;p&gt;If you're #OpenToWork as an engineer, this won't help you make the mortgage. I know. If you're suffocating from the din of crickets, this is of small consolation. I know. But it's not of small import.&lt;/p&gt;

&lt;p&gt;Coding, engineering, is the craft of solving problems. As with art, it is the task of creating concrete from the abstract. Turning a concept into a thing. That's the craft part. Craft is art with purpose, corollary to &lt;em&gt;ars gratia artis&lt;/em&gt;, not exclusive; both are creative.&lt;/p&gt;

&lt;p&gt;If you're #OpenToWork as an engineer right now, in this shitshow of a market, welcome to the world of starving artists. We like Scotch and LoFi, you're one of us, don't be shy. (Or do, we're mostly introverts, too.)&lt;/p&gt;

&lt;p&gt;Like illustrators, musicians, et al, the value of code is not inseparable from its execution. There is brilliance and beauty in the simplicity of Pachelbel's &lt;em&gt;Canon&lt;/em&gt;. Brilliance and beauty in the line work of Gustav Doré and Shel Silverstein alike. There is tech in technique, if not validation. Tárrega's &lt;em&gt;Gran Vals&lt;/em&gt; was not legitimized by Nokia, no moreso than is your work legitimized by whether you worked on the React team, or McMaster Carr, or One Million Checkboxes. Code katas, enterprise frameworks, functional or elegant or goddamn login page, no matter; it is your craft, your name on the commit, whether aided by Claude or reviewed by the Principal. It is your time, your work. It is yours. IP be damned.&lt;/p&gt;

&lt;p&gt;So don't fall victim to Van Gogh's imposter syndrome. If you are told that your work is worth only the money it makes, know that Van Gogh sold only a single painting, ever. His entire life; one. Profit is &lt;em&gt;a measure&lt;/em&gt;, yes. It is not &lt;em&gt;the measure&lt;/em&gt;. Nor shalt thou fall victim to Rand's umbrage, i.e. allow your ego to steer logic...&lt;/p&gt;

&lt;p&gt;You must know that Claude is not your enemy. Not because AI is good or evil, for it is a tool and therefore neither; Claude is the product of other engineers. Claude can only copy-paste Monet, it cannot, by definition, be the next Monet. It cannot be the next Linus, the next Bob Martin. Claude cannot innovate. Claude cannot innovate. Claude has zero craft. Claude has no swag, no drip. That's all you, baby.&lt;/p&gt;

&lt;p&gt;Your enemy is what Ayn referred to as "&lt;em&gt;the looters and the moochers&lt;/em&gt;"; not the hungry and the downtrodden, no! It is those who would stand on your back to reach the top shelf Macallan, with little in the way of a sip for you. &lt;/p&gt;

&lt;p&gt;They do not value you.&lt;br&gt;
So your value cannot, &lt;em&gt;must&lt;/em&gt; not, be their value.&lt;/p&gt;

&lt;p&gt;Your value, your worth, is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;market demand&lt;/li&gt;
&lt;li&gt;profit&lt;/li&gt;
&lt;li&gt;most certainly not the moochers' profits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your value is your own.&lt;/p&gt;

&lt;p&gt;You alone determine it, so take joy in your craft, do what you love. Use ternaries and focus on brevity, if that pleases you. Write longform with all the comments in the footnotes of Poe. Be brutalist if you wish, but make it a choice of design, not a velocity metric.  Over-engineering is a term created by capitalists, not artists. If you love engineering, and the problem is to cross a river, solve it with the Golden Gate motherfucking Bridge!&lt;/p&gt;

&lt;p&gt;And when the day is done, wash it down with a dram. Know that it's not the price tag of the whisky that makes it sweet; it is the barrel: the craft that went into making it. Made all the sweeter as an ends to the means of your ability; the final ingredient.&lt;/p&gt;

&lt;p&gt;The purpose of art is neither adulation, accolade, nor value exchange (i.e. paycheck). It is the joy of the creating, the celebration of technique... for the ballerina and the software engineer alike.&lt;/p&gt;

&lt;p&gt;Is that romantic? Maybe, whatever. Craft qua craft doesn't pay the mortgage. I know. But it pays you, and there is value in that.&lt;/p&gt;

&lt;p&gt;Unless you value only money, you and your code are both worth more than an LLM. Go ye forth and craft.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Homo gratia hominis&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>career</category>
    </item>
  </channel>
</rss>
