<?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: James Anderson</title>
    <description>The latest articles on DEV Community by James Anderson (@james_anderson_h).</description>
    <link>https://dev.to/james_anderson_h</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3968038%2F98bc34c8-0955-4e0c-8b23-182806d4b0d6.png</url>
      <title>DEV Community: James Anderson</title>
      <link>https://dev.to/james_anderson_h</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/james_anderson_h"/>
    <language>en</language>
    <item>
      <title>The Discerning Mind: What AI May Never Reach</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:15:08 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/the-discerning-mind-what-ai-may-never-reach-5hkk</link>
      <guid>https://dev.to/james_anderson_h/the-discerning-mind-what-ai-may-never-reach-5hkk</guid>
      <description>&lt;p&gt;You do it dozens of times a day, and you almost never notice.&lt;/p&gt;

&lt;p&gt;You glance at a photo and something in you says &lt;em&gt;that's beautiful&lt;/em&gt; — before you could tell anyone why. You read a sentence and feel, in an instant, that it's slightly off, a word out of place you haven't consciously identified yet. You walk into a room and sense it's &lt;em&gt;almost&lt;/em&gt; right, that one thing could be moved and it would come together. You look at a design, a melody, a face, a line of code, and a judgment arrives — fast, certain, and ahead of any reasoning you could give for it.&lt;/p&gt;

&lt;p&gt;We treat this as nothing. It's just taste, just an opinion, just a feeling. But it is one of the strangest and most quietly remarkable things a human being does — this instant, pre-rational &lt;em&gt;knowing&lt;/em&gt; of what is good, what is wrong, what could be more. And it is precisely the thing that AI, for all its astonishing fluency, does not seem to have.&lt;/p&gt;

&lt;p&gt;I want to sit with that, honestly, because I think the usual way we argue about it is wrong. The question everyone asks is "can AI be creative — can it make art, music, writing?" And the answer, increasingly, is &lt;em&gt;yes, it can produce those things, impressively.&lt;/em&gt; But I don't think production was ever the point. I think the human thing — the thing that might be genuinely out of reach — is something else entirely. Not the making. The &lt;em&gt;discerning.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The distinction almost everyone misses
&lt;/h2&gt;

&lt;p&gt;Here is the move that the whole question turns on, and most of the debate skips right over it.&lt;/p&gt;

&lt;p&gt;We lump two very different capacities together under the word "creativity," and they are not the same thing at all:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation&lt;/strong&gt; is producing output — a poem, an image, a tune, a layout. And I'll say this plainly, because pretending otherwise would make me a liar and cost me your trust: AI is extraordinary at generation now. It can write a competent poem, render a striking image, compose a passable melody, draft a clean design. If your claim is "AI can't produce aesthetically pleasing things," you have already lost the argument, because everyone has seen that it can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discernment&lt;/strong&gt; is &lt;em&gt;judging&lt;/em&gt; that output — knowing which of two versions is better, sensing what's wrong, perceiving what could be improved, having taste. And this is a completely different faculty.&lt;/p&gt;

&lt;p&gt;Here's why the distinction matters so much: &lt;em&gt;generation was never the hard part of creativity.&lt;/em&gt; A random number generator generates. Throw enough paint at enough walls and you'll produce something. The miracle of the creative human was never that they could make marks — it was that they could &lt;em&gt;look at the marks and know.&lt;/em&gt; Know which one was alive and which was dead. Know what to keep and what to throw away. Know, standing in front of the thing, that it wasn't finished yet, and feel in which direction "finished" lay.&lt;/p&gt;

&lt;p&gt;The discerning mind, not the producing hand. We got so dazzled — or so threatened — by watching machines produce that we forgot the production was never where the magic lived.&lt;/p&gt;

&lt;h2&gt;
  
  
  What discernment actually is
&lt;/h2&gt;

&lt;p&gt;So let's look closely at this strange faculty, because the closer you look, the stranger it gets.&lt;/p&gt;

&lt;p&gt;Discernment isn't a rule you apply. You don't &lt;em&gt;compute&lt;/em&gt; that a face is beautiful or a phrase is clumsy. You &lt;em&gt;perceive&lt;/em&gt; it, the way you perceive a color — directly, immediately, often before a single word of justification is available to you. The reasons come &lt;em&gt;after&lt;/em&gt;, if they come at all, and half the time they're reconstructions, stories we tell to explain a verdict we'd already reached.&lt;/p&gt;

&lt;p&gt;And it's deeply &lt;em&gt;embodied&lt;/em&gt; and personal. Your sense of what's beautiful is tangled up in a lifetime of sensory experience, of things you've seen and heard and touched, of memories, of emotions, of the particular person you happen to be. Two people with identical knowledge can have completely different taste, because taste isn't knowledge. It's a point of view. It's &lt;em&gt;yours.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But here is the part I keep coming back to, the part that I think matters most: discernment comes from &lt;em&gt;caring.&lt;/em&gt; You can only find something beautiful if things are capable of &lt;em&gt;mattering&lt;/em&gt; to you. The whole faculty is downstream of being a creature that experiences, that prefers, that is moved, that has something at stake in how the world is. You judge beauty because beauty does something &lt;em&gt;to&lt;/em&gt; you. Take away the one who can be moved, and I'm not sure "beautiful" means anything at all — it's just a word with no one behind it to feel its weight.&lt;/p&gt;

&lt;p&gt;Which brings us to the machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI may lack it, structurally
&lt;/h2&gt;

&lt;p&gt;An AI that generates aesthetic output is doing something genuinely impressive, but notice &lt;em&gt;what&lt;/em&gt; it's doing. It has learned, from an ocean of human-made examples, the statistical shape of what people have called good. When it produces something beautiful, it is, in effect, finding the center of mass of human aesthetic preference and generating toward it.&lt;/p&gt;

&lt;p&gt;And here's the problem hiding in plain sight: &lt;strong&gt;real taste is almost the opposite of an average.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Taste is particular. It's a point of view, which by definition is &lt;em&gt;not&lt;/em&gt; everyone's. The most interesting aesthetic judgments in history were often the ones that cut &lt;em&gt;against&lt;/em&gt; the consensus — the thing nobody had learned to love yet, that one person saw and insisted was beautiful before the rest of us caught up. An average can tell you what people &lt;em&gt;have&lt;/em&gt; found beautiful. It cannot want something to be beautiful in a way no one has wanted before, because wanting requires a wanter, and an average is nobody's.&lt;/p&gt;

&lt;p&gt;But the deeper issue isn't statistical, it's this: &lt;em&gt;there is no one home.&lt;/em&gt; The model has processed every description of awe ever written, every account of grief and longing and wonder and beauty — and it has never once been moved by anything. It knows, with superhuman thoroughness, what beauty is &lt;em&gt;described as.&lt;/em&gt; It has never &lt;em&gt;felt&lt;/em&gt; it. Not once. Not for a moment.&lt;/p&gt;

&lt;p&gt;And so when it "judges" — when it tells you which image is better, or improves your paragraph — I think something is missing that we're too quick to overlook. A judgment with no subject behind it, no one who is moved by it, nothing at stake for anyone in the judging — is that judgment, or is it an extraordinarily good imitation of the &lt;em&gt;residue&lt;/em&gt; that judgment leaves behind? The machine has the map of human taste, in staggering detail. But a map with no one reading it, no one &lt;em&gt;caring&lt;/em&gt; where it leads, is just ink. The discerning mind might be the reader, not the map — and that's the part I'm not sure can be manufactured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now let me argue against myself
&lt;/h2&gt;

&lt;p&gt;If I stopped here, I'd be doing the thing I dislike — telling you a comforting story about human specialness and calling it an argument. So let me give the other side its real strength, because it has some, and if you've been thinking skeptically this whole time, you're right to.&lt;/p&gt;

&lt;p&gt;Maybe what we call "taste" is &lt;em&gt;just&lt;/em&gt; extremely sophisticated pattern-matching on human preference — and the feeling that it's something more, something sacred, is simply human exceptionalism. We have an embarrassing track record here. We said machines could never play chess, then never play it &lt;em&gt;creatively&lt;/em&gt;, then never master Go's intuition, then never use language — and each time, the thing we'd called uniquely human turned out to be a pattern a machine could learn. "Aesthetic judgment is special and unreachable" might just be the next item on that list, and I might be writing the same confident sentence people wrote right before they were proven wrong.&lt;/p&gt;

&lt;p&gt;And maybe — this is the uncomfortable one — the "experiencing subject" I keep invoking is itself not what I think it is. Maybe &lt;em&gt;we&lt;/em&gt; are also prediction machines, evolved to pattern-match on our environment, and the thing we call "being moved" is just what our pattern-matching feels like from the inside. If that's true, there's no magic line here at all. The machine does with silicon what we do with meat, and my insistence that &lt;em&gt;ours&lt;/em&gt; has a someone behind it and &lt;em&gt;theirs&lt;/em&gt; doesn't is just a bias I have because I happen to be one of the meat ones.&lt;/p&gt;

&lt;p&gt;And purely practically: maybe AI doesn't need to &lt;em&gt;feel&lt;/em&gt; beauty in order to &lt;em&gt;reliably identify&lt;/em&gt; what humans will find beautiful — and if it can predict your aesthetic response perfectly, then for every practical purpose that touches your life, the difference between "real taste" and "flawless simulation of taste" may be a difference that makes no difference.&lt;/p&gt;

&lt;p&gt;These are not weak arguments. I don't have a knockdown reply to any of them. Anyone who does is selling you something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I land, held loosely
&lt;/h2&gt;

&lt;p&gt;So, with all of that honestly on the table — here is what I still believe, offered as a suspicion and not a proof.&lt;/p&gt;

&lt;p&gt;I think discernment is distinctly human not because the machine isn't powerful enough, but because aesthetic judgment may be &lt;em&gt;inseparable from being a subject with stakes.&lt;/em&gt; Taste, real taste, isn't only identifying what people like. It's &lt;em&gt;caring&lt;/em&gt; that something is beautiful. It's being &lt;em&gt;changed&lt;/em&gt; by it. It's the whole circuit — being moved by something, and out of that being-moved, wanting to make something that moves someone else the way you were moved. That circuit runs, at every step, through an experiencing self. And a machine can reproduce the &lt;em&gt;outputs&lt;/em&gt; of that circuit — the beautiful image, the confident judgment — without any of the circuit actually existing.&lt;/p&gt;

&lt;p&gt;A judgment that nothing is at stake in, that no one is moved by, that doesn't &lt;em&gt;matter&lt;/em&gt; to anyone doing it — I keep arriving at the same place: I don't think that's quite judgment. I think it's a very good imitation of what judgment leaves behind.&lt;/p&gt;

&lt;p&gt;So will AI ever reach the discerning mind? My honest answer is: I suspect not — but not because it can't become more capable. Because the thing we're pointing at might not be a &lt;em&gt;capability&lt;/em&gt; at all. It might be a property of being someone. You can't scale your way to a subject. And I hold even this loosely, because the truth is nobody knows, and the history of "machines will never" should make all of us humble, in both directions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're left with
&lt;/h2&gt;

&lt;p&gt;Whatever AI becomes, the discerning mind is, for now, still ours — that small daily miracle of looking at something and &lt;em&gt;knowing&lt;/em&gt;, of being moved before you can explain why, of sensing that a thing could be more and feeling, dimly, in which direction.&lt;/p&gt;

&lt;p&gt;It's easy to feel diminished watching machines generate in seconds what used to take us years. But maybe the quiet consolation in all of this is that generation was never where our worth lived. The &lt;em&gt;seeing&lt;/em&gt; was. The being-moved was. The &lt;em&gt;this could be better&lt;/em&gt; was. Those might turn out to be the last things to go — or they might be the things that were never really on the table at all, because they were never about output in the first place. They were about being &lt;em&gt;alive to the world.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The machine makes. We discern. And discernment, when you follow it all the way down, might just be another name for caring that things are one way rather than another — for the world mattering to someone.&lt;/p&gt;

&lt;p&gt;That's not a small thing to be left holding. It might be the whole thing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Honest question, because I genuinely go back and forth and I'd rather hear real thinking than applause: is taste a skill that enough data could eventually teach — or is it inseparable from being a conscious, caring subject? And here's the one that keeps me up: if a machine could perfectly predict what you'd find beautiful, while feeling nothing at all — would that&lt;/em&gt; be &lt;em&gt;taste, or a flawless imitation of it? And is there even a difference? I don't think I know.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
      <category>agentskills</category>
    </item>
    <item>
      <title>AI Made Your Easy Work Free. That Made You More Valuable.</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sat, 17 Oct 2026 05:57:07 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/ai-made-your-easy-work-free-that-made-you-more-valuable-413f</link>
      <guid>https://dev.to/james_anderson_h/ai-made-your-easy-work-free-that-made-you-more-valuable-413f</guid>
      <description>&lt;p&gt;Let's start by admitting the scary part is true, because the whole argument falls apart if I pretend otherwise.&lt;/p&gt;

&lt;p&gt;AI can build an enormous amount of software now, fast, for almost nothing. You can vibe-code a working app over a weekend. Clone a SaaS product's whole front end in an afternoon. Generate the CRUD endpoints, the forms, the standard UI, the glue code, the "make it look like this" — all of it, in minutes of prompting, at a quality that a few years ago would've been a week of a junior's time.&lt;/p&gt;

&lt;p&gt;That's not hype. It's real, and if you've felt the floor shift under you because of it, you're not imagining things. So the fear makes sense: if building software is nearly free now, what's left for the people whose job was building software?&lt;/p&gt;

&lt;p&gt;Here's the thing that question quietly assumes, though — and it's wrong. It assumes the &lt;em&gt;building&lt;/em&gt; was where the value lived. It wasn't. And once you see what AI actually made free, and what it conspicuously &lt;em&gt;didn't&lt;/em&gt;, the panic turns into something closer to a map.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI actually made free
&lt;/h2&gt;

&lt;p&gt;Let me be specific and generous about how much AI really took, because downplaying it just sounds like denial.&lt;/p&gt;

&lt;p&gt;It took the happy path. The first version. The part of the work that's been written down ten thousand times in tutorials, Stack Overflow answers, and open-source repos — which is exactly why the model learned it so well. The standard login flow, the typical dashboard, the ordinary API, the form that validates an email, the component that looks like every other component. The &lt;em&gt;commodity&lt;/em&gt; layer of software engineering, the stuff that was technically "skilled work" but was really pattern-matching against a million prior examples.&lt;/p&gt;

&lt;p&gt;That's maybe 90% of the volume of what gets typed in a day. And it genuinely did fall. A huge amount of what used to be billable, time-consuming, résumé-worthy engineering is now a prompt and a glance. Pretending that's not true helps no one, least of all you.&lt;/p&gt;

&lt;p&gt;Concede the whole 90%. The argument doesn't need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it conspicuously did not touch
&lt;/h2&gt;

&lt;p&gt;Now the part nobody put in the demo.&lt;/p&gt;

&lt;p&gt;AI did not learn how to make a webhook idempotent when Stripe times out mid-transaction and you have no idea whether the charge went through. It didn't learn to tune cgroup memory limits when a background worker quietly OOMs at 3am and takes the queue down with it. It has no feel for the passkey &lt;code&gt;signCount&lt;/code&gt; desync that silently locks your paying customers out of their own accounts — the bug that generates zero errors and a pile of furious support tickets. It can't do the data migration that has to move fifteen years of real users' files without losing a single byte or breaking one weird edge case someone created in 2013.&lt;/p&gt;

&lt;p&gt;Notice what all of those have in common: &lt;strong&gt;none of them show up in a demo, and none of them were written down anywhere for the model to learn from.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not a coincidence — it's the whole explanation. AI got extraordinary at the 90% &lt;em&gt;because&lt;/em&gt; the 90% is the part that's documented everywhere, done the same way a million times, sitting in the training data in bulk. The 10% is hard precisely because it &lt;em&gt;isn't&lt;/em&gt; written down. It's the failure modes, the edge cases, the what-happens-when-it-breaks-at-scale — knowledge that doesn't live in tutorials because it's only ever learned the expensive way: by getting burned, at 3am, on a real system, with real users yelling.&lt;/p&gt;

&lt;p&gt;You can't prompt your way to that, because the thing you'd need to prompt doesn't exist in text. It exists in scar tissue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The counterintuitive part: the 10% got &lt;em&gt;more&lt;/em&gt; valuable
&lt;/h2&gt;

&lt;p&gt;Here's the move most people miss while they're panicking.&lt;/p&gt;

&lt;p&gt;When the easy 90% was expensive, its cost &lt;em&gt;hid&lt;/em&gt; the value of the hard 10%. It was all bundled together and called "engineering," and the bill for the boilerplate and the bill for the 3am expertise came out looking like the same kind of money. The commodity work subsidized and camouflaged the rare work.&lt;/p&gt;

&lt;p&gt;Now that the 90% is free, that camouflage is gone — and the 10% stands exposed as the &lt;em&gt;only remaining scarcity.&lt;/em&gt; And value always concentrates wherever the scarcity is.&lt;/p&gt;

&lt;p&gt;So AI didn't flatten the value of expertise. It flattened the value of the &lt;em&gt;commodity&lt;/em&gt; part of expertise, and shoved all the remaining value into the &lt;em&gt;rare&lt;/em&gt; part. The person who can do the 3am work didn't get less valuable when AI arrived — they got &lt;em&gt;more&lt;/em&gt; valuable, because now everyone can do the easy part, and almost nobody can do theirs. The scarcity sharpened. The premium went up.&lt;/p&gt;

&lt;p&gt;That's the whole reframe, and it's why the title isn't a motivational lie: AI making your easy work free is &lt;em&gt;exactly&lt;/em&gt; what made your hard work worth more. It stopped being hidden inside the cost of the boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The market is already proving it
&lt;/h2&gt;

&lt;p&gt;You don't have to take the argument on faith — go look at the vibe-coded clone wave happening right now.&lt;/p&gt;

&lt;p&gt;People are using AI to clone paid apps by the thousands: creative tools, CRMs, SaaS products, whole suites. The first versions appear fast and look impressive. And almost all of them die in alpha.&lt;/p&gt;

&lt;p&gt;Why? Not because the code was bad. Because the makers could generate the 90% and either couldn't or wouldn't do the 10%. The clones that survive — the rare ones — are precisely the ones where somebody pushed through the unglamorous hard part: the maintenance, the edge cases, the reliability, the trust that gets built one answered support ticket at a time. "Cloning the surface of software is now free" is the exact reason &lt;em&gt;depth&lt;/em&gt; became the moat. The market responded to free building with a graveyard of surfaces and a premium on substance. That's the thesis, already playing out, in public.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do with this?
&lt;/h2&gt;

&lt;p&gt;Honest direction, no false comfort:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're early in your career and the 90% is most of what you can do right now&lt;/strong&gt; — that's the part that got commoditized, so the move isn't "learn to prompt faster." It's to deliberately go after the 10%: debugging, systems thinking, how things fail, what happens at scale, reading code you didn't write, operating things in production. I'll be straight that this is genuinely harder than it used to be, because the easy work that &lt;em&gt;used to teach you&lt;/em&gt; the hard stuff — the grunt tasks juniors cut their teeth on — is exactly what's being automated away. That's a real problem, and it deserves honesty rather than a slogan. But the direction is clear: chase the part that doesn't demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're experienced&lt;/strong&gt; — your value didn't drop, it got concentrated. The years you spent getting burned are now the scarce thing, not the overhead. Stop apologizing for being "slow" at the boilerplate AI does instantly, and lean into the part it can't touch, because that part is now the whole job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For everyone:&lt;/strong&gt; stop competing on the layer AI does for free. There's no winning there — it's free, and you can't underbid free. Compete on the layer it can't reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;"AI can build anything" is true and misleading in the same breath. It can build the 90% that was always the commodity. It can't build the 10% that was always the point.&lt;/p&gt;

&lt;p&gt;The value didn't leave software. It &lt;em&gt;moved&lt;/em&gt; — from the writing to the making-it-actually-work, from the demo to the dependability, from "can you build it?" to "can you keep it alive when it breaks at 3am?" For an engineer who can do the hard part, that's not a worse world. It might be the first time in a long while that the hard part is &lt;em&gt;clearly, visibly&lt;/em&gt; the valuable part — instead of being quietly hidden inside the bill for the easy part.&lt;/p&gt;

&lt;p&gt;Your easy work became free. That's not what makes you replaceable. That's what finally made the rest of you worth paying for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A personal note, since this is the thing I've been chewing on the most: I've ended up building in this space myself — a workspace where the whole point is to put the real effort into the hard part (the reliability, the guardrails, the trust around what gets built), rather than just the fast generation everyone already has. It's called &lt;a href="https://xenition.com/" rel="noopener noreferrer"&gt;Xenition&lt;/a&gt;. I'm genuinely not pitching it here — this piece stands on its own and I'd have written it either way. But if any of this resonated and you're curious what "building for the hard 10%" looks like in practice, you're welcome to take a look. Mostly I just wanted to think the idea through out loud, and the comments are where I actually want to be.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So — the contestable version, and I want the real disagreement: do you think the hard 10% stays safe, or does AI eventually eat that too? And for the experienced folks: what's&lt;/em&gt; your &lt;em&gt;10% — the thing you do that no demo ever shows and no prompt ever quite gets right? I'll start: anything involving what happens after the happy path fails.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>softwareengineering</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Git, Docker, and IPFS All Hide the Same Beautiful Idea</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:50:45 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/git-docker-and-ipfs-all-hide-the-same-beautiful-idea-3j0</link>
      <guid>https://dev.to/james_anderson_h/git-docker-and-ipfs-all-hide-the-same-beautiful-idea-3j0</guid>
      <description>&lt;p&gt;Let me make you a small promise, because it's worth your fifteen minutes.&lt;/p&gt;

&lt;p&gt;There's an idea you rely on dozens of times a day — every time you make a commit, every time you pull an image — and you've almost certainly never seen it directly. It hides underneath the tools, doing its work quietly, while you type &lt;code&gt;git commit&lt;/code&gt; and watch a hash scroll past without once wondering what that hash actually &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It's one of the most elegant ideas in all of computing. Simple enough to explain in a single sentence. Powerful enough that git, Docker, and IPFS are all built on it — three very different tools, one shared foundation. And once you see it, something nice happens: a whole pile of "huh, why does it work like that?" questions about your daily tools quietly resolve into "oh, &lt;em&gt;of course.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;That's the promise. One idea, and by the end your tools make more sense than they did this morning. Let me show it to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, the ordinary way — and its quiet flaw
&lt;/h2&gt;

&lt;p&gt;Almost all the time, we find data by its &lt;strong&gt;location.&lt;/strong&gt; A file path: &lt;code&gt;/home/james/report.pdf&lt;/code&gt;. A URL: &lt;code&gt;example.com/report.pdf&lt;/code&gt;. A database row by its ID. In every case, the address tells you &lt;em&gt;where the thing lives&lt;/em&gt; — "the thing over there."&lt;/p&gt;

&lt;p&gt;This feels so natural we never question it. But it has a quiet weakness, and the whole idea we're building to is a response to that weakness, so it's worth noticing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The name tells you nothing about the content.&lt;/strong&gt; The file at &lt;code&gt;/home/james/report.pdf&lt;/code&gt; could be the report you wrote yesterday, or a corrupted version, or something an attacker swapped in — and the path looks identical in all three cases. The address is a &lt;em&gt;promise&lt;/em&gt; that has to be trusted. You ask for a location, you get back whatever currently lives there, and you have no built-in way to know it's what you expected.&lt;/p&gt;

&lt;p&gt;So here's the question that cracks the whole thing open: what if the address &lt;em&gt;was&lt;/em&gt; the content? What if, instead of naming data by where it sits, you named it by &lt;em&gt;what it actually is&lt;/em&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea, in one sentence
&lt;/h2&gt;

&lt;p&gt;Here it is, the whole thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instead of addressing data by its location, you address it by a cryptographic hash of its content — a short, unique fingerprint computed from the bytes themselves.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's content-addressing. The "address" of a piece of data isn't a path or a name someone chose. It's a fingerprint derived from the data itself.&lt;/p&gt;

&lt;p&gt;If the analogy helps: think of it like a fingerprint for a person, or a nutrition label that's &lt;em&gt;computed from the food&lt;/em&gt; rather than printed by the manufacturer. It comes &lt;em&gt;from&lt;/em&gt; the thing. Change the thing even slightly, and the fingerprint changes completely. Two identical things have identical fingerprints, always.&lt;/p&gt;

&lt;p&gt;So the shift is small but total. "Give me the file at &lt;code&gt;/report.pdf&lt;/code&gt;" (a location) becomes "give me the thing whose fingerprint is &lt;code&gt;a3f9c2e8…&lt;/code&gt;" (its content). You no longer ask &lt;em&gt;where&lt;/em&gt; — you ask &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It sounds almost too simple to matter. Here's why it's beautiful: look at everything that falls out of it, for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The magic: four things you get for nothing
&lt;/h2&gt;

&lt;p&gt;This is the part worth slowing down for, because it's where a simple idea reveals itself as a deep one. You don't &lt;em&gt;add&lt;/em&gt; the following features to a content-addressed system. They're just &lt;em&gt;consequences&lt;/em&gt; of the one idea. You get them whether you wanted them or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Integrity, for free.&lt;/strong&gt; The address &lt;em&gt;is&lt;/em&gt; a checksum. When you ask for the thing at fingerprint &lt;code&gt;a3f9c2e8…&lt;/code&gt; and something hands it back, you can recompute the hash of what you received and check it matches. If even one byte was corrupted or tampered with in transit, the fingerprint won't match, and you'll know instantly. The name &lt;em&gt;verifies&lt;/em&gt; the data. There's no separate "is this file corrupted?" step to bolt on — it's built into the very act of addressing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deduplication, for free.&lt;/strong&gt; Identical content produces an identical hash. Always. So if two files — or two users, or two systems — have the exact same bytes, they have the exact same address, which means the system stores those bytes &lt;em&gt;once.&lt;/em&gt; You physically cannot store the same content twice, because the second copy has nowhere new to go. Deduplication isn't a feature someone engineered; it's a thing that can't &lt;em&gt;not&lt;/em&gt; happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Immutability, for free.&lt;/strong&gt; A given fingerprint always points to exactly one piece of content, forever. Nothing can quietly change the data living at &lt;code&gt;a3f9c2e8…&lt;/code&gt;, because the moment you change the content, you've changed its fingerprint — you haven't modified the thing at that address, you've created a &lt;em&gt;different&lt;/em&gt; thing at a &lt;em&gt;different&lt;/em&gt; address. The old address still points at the old content, unchanged. History can't be silently rewritten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Caching, for free.&lt;/strong&gt; If you already have the thing at &lt;code&gt;a3f9c2e8…&lt;/code&gt;, you are &lt;em&gt;done.&lt;/em&gt; You never need to fetch it again, and you can be certain — not hopeful, certain — that your copy is identical to the one being offered, because they share an address, and sharing an address means sharing content. "Do I already have this?" becomes a trivial lookup instead of a careful comparison.&lt;/p&gt;

&lt;p&gt;Sit with that for a second. Integrity, deduplication, immutability, and caching — four properties that systems normally work &lt;em&gt;hard&lt;/em&gt; to provide, each with its own machinery — all tumble out of one decision about how to name things. That's what "elegant" means in software: enormous consequence from minimal cause.&lt;/p&gt;

&lt;p&gt;Now let me show you where you've been standing on this idea the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where you've been using it all along
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git
&lt;/h3&gt;

&lt;p&gt;Here's the one that tends to land hardest, because you use it constantly.&lt;/p&gt;

&lt;p&gt;Git is, underneath its version-control interface, a content-addressed filesystem. Every file you commit (git calls it a "blob"), every directory (a "tree"), and every commit itself is stored &lt;em&gt;by the hash of its content.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That commit hash you see — &lt;code&gt;a3f9c2e8…&lt;/code&gt; — is not an ID that git assigned. It is a fingerprint of everything in that commit: the files, the directory structure, the author, the message, and the hash of the commit before it. It's computed &lt;em&gt;from&lt;/em&gt; the content.&lt;/p&gt;

&lt;p&gt;And suddenly a bunch of git's behavior stops being magic and starts being &lt;em&gt;obvious:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why git can detect corruption:&lt;/strong&gt; because every object's name is a checksum of its content. (Property 1.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why git doesn't store the same file twice:&lt;/strong&gt; identical files have identical hashes, so they're one object. (Property 2.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why git history is tamper-evident:&lt;/strong&gt; change one old commit and its hash changes, which changes the "previous hash" baked into the next commit, which changes &lt;em&gt;its&lt;/em&gt; hash, and so on — the change ripples through every commit after it and becomes impossible to hide. (Properties 1 and 3, working together.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git isn't doing anything mystical. It's content-addressing, wearing a version-control coat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;Docker image layers are content-addressed too, and the same reveals follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why &lt;code&gt;docker pull&lt;/code&gt; is often so fast:&lt;/strong&gt; it skips the layers whose content hash you already have. (Caching — property 4.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why layers are shared across different images:&lt;/strong&gt; two images built on the same base have layers with the same content, so the same hash, so they're stored once. (Dedup — property 2.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why a &lt;code&gt;sha256:&lt;/code&gt; image digest means something:&lt;/strong&gt; it guarantees you pulled exactly the image you meant, byte for byte, with no silent substitution. (Integrity — property 1.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those conveniences you take for granted is the same idea quietly at work.&lt;/p&gt;

&lt;h3&gt;
  
  
  IPFS
&lt;/h3&gt;

&lt;p&gt;IPFS makes content-addressing the entire premise, which is why it's the cleanest example. On the normal web, you fetch a file from a &lt;em&gt;location&lt;/em&gt; — this server, that URL. On IPFS, you fetch a file by its content hash (called a CID). You're not asking "what's on this server?" — you're asking "who has the thing whose fingerprint is this?", and &lt;em&gt;anyone&lt;/em&gt; on the network who has that content can serve it, because the same file produces the same address no matter where it lives. Location stops mattering; identity is everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  But wait — what if two things have the same fingerprint?
&lt;/h2&gt;

&lt;p&gt;If you’ve been reading closely, a question has probably been forming, and it’s the right one to ask — because the entire idea hinges on the answer.&lt;/p&gt;

&lt;p&gt;Content-addressing assumes that no two different pieces of content ever produce the same hash. That event — two different inputs, one identical fingerprint — is called a collision, and if it could happen easily, the whole scheme would fall apart: two different files would share an address, and “same hash means same content” would become a lie.&lt;/p&gt;

&lt;p&gt;So why do we trust it? Because with a good cryptographic hash, collisions are astronomically unlikely. Not “unlikely like winning the lottery” — unlikely like every person on Earth winning the lottery, on the same day, for a thousand years running. The space of possible hashes is so vast (for SHA-256, that’s 2²⁵⁶ values — a number larger than the count of atoms in the observable universe) that in practice you can treat “same hash = same content” as simply true, and build version control for the entire planet on top of that assumption.&lt;/p&gt;

&lt;p&gt;But “in practice” is doing real work in that sentence, and here’s the concrete story that proves the point. Git originally used a hash called SHA-1. Over the years, SHA-1 weakened — researchers eventually managed to deliberately construct two different inputs with the same SHA-1 hash, which is exactly the collision the model depends on never happening. So git undertook a careful, years-long migration to SHA-256. Not because content-addressing was flawed, but because the whole thing rests on collisions being infeasible, and when the old hash got shaky, the one load-bearing assumption had to be shored up.&lt;/p&gt;

&lt;p&gt;That’s the honest footnote to the beautiful idea: content-addressing is only ever as trustworthy as the hash underneath it. The elegance is real — but “which hash function” isn’t a minor detail, it’s the thing holding the entire structure up. The idea is beautiful; the hash is what makes it hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Here's the whole thing, one more time, so it sticks: &lt;strong&gt;if you name data by &lt;em&gt;what it is&lt;/em&gt; instead of &lt;em&gt;where it lives&lt;/em&gt;, you get integrity, deduplication, immutability, and caching as a free gift&lt;/strong&gt; — which is exactly why the tools you trust most are quietly built on it.&lt;/p&gt;

&lt;p&gt;It's a small idea with a very long reach. And now it's yours. You'll start noticing it everywhere — in a commit hash, a Docker digest, a CID, and places you haven't looked yet — and that noticing, that seeing of the idea beneath the tool, is the difference between &lt;em&gt;using&lt;/em&gt; something and &lt;em&gt;understanding&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;Fifteen minutes, one idea, and your tools make more sense than they did when you started. As promised.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Genuinely curious: what's a concept like this one for you — a single small idea you learned that suddenly explained a dozen tools at once? Content-addressing was one of mine; I remember the exact moment git stopped being magic. And now that you know git is content-addressed: what else about it just clicked into place?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>docker</category>
      <category>programming</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>People Are Vibe-Coding Clones of Every Paid App. What Actually Survives?</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:15:38 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/people-are-vibe-coding-clones-of-every-paid-app-what-actually-survives-38ak</link>
      <guid>https://dev.to/james_anderson_h/people-are-vibe-coding-clones-of-every-paid-app-what-actually-survives-38ak</guid>
      <description>&lt;p&gt;Earlier this month, a developer in Atlanta got fed up with Adobe's cancellation fees. So he used Claude to clone the entire Adobe Creative Suite — seven apps, Photoshop through After Effects — rebuilt them from scratch in Rust, dumped them on GitHub for free, and declared "software is over."&lt;/p&gt;

&lt;p&gt;He's not alone. Vibe-coded clones of paid apps are showing up everywhere right now: creative tools, CRMs that "drop Salesforce," all sorts of commercial software being reverse-engineered and reimplemented by individuals pointing AI agents at a problem that used to require a company.&lt;/p&gt;

&lt;p&gt;Now, the honest part: most of these specific clones are rough. Early alpha, buggy, missing the brutal last 10% of polish that makes software actually usable. The Adobe-clone creator said so himself — "not anywhere close to ready." If you're waiting for a free Photoshop that fully replaces Photoshop, you'll be waiting a while.&lt;/p&gt;

&lt;p&gt;But if you're only looking at whether any individual clone is good yet, you're watching the wrong thing. Something bigger just happened, and it's worth sitting with — because the wall that protected a handful of giants for twenty years just got a lot easier to climb. Let's talk about what actually survives here, and why it might be one of the better things to happen to software in a long time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moat was never the code. It was the cost of building it.
&lt;/h2&gt;

&lt;p&gt;For decades, the giants' real protection wasn't genius. It was &lt;em&gt;expense.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Building something like Photoshop, or Salesforce, or a polished premium SaaS, took armies of engineers, years of work, and tens of millions of dollars. &lt;em&gt;That&lt;/em&gt; was the moat. Not that the software was impossible to conceive of — plenty of people knew exactly what a photo editor should do — but that actually building one at that level was out of reach for anyone without a war chest and a hiring pipeline.&lt;/p&gt;

&lt;p&gt;That barrier is the thing that let them behave the way they did. It's why they could charge subscription rent forever, raise prices whenever, lock you into their file formats and ecosystems, make cancellation deliberately painful, and treat users as a captive audience rather than customers who could walk. Where were you going to go? Building your own was impossible. GIMP existed, and the fact that "the free alternative" was a punchline for twenty years tells you everything about how secure that moat was.&lt;/p&gt;

&lt;p&gt;AI didn't make the clones &lt;em&gt;good.&lt;/em&gt; Let's be clear about that. What it did was make them &lt;em&gt;cheap and fast&lt;/em&gt; — and that's the variable that actually mattered, because cheap-and-fast is exactly the barrier the whole monopoly structure was built on. One person with an AI agent can now attempt, in weeks, what used to need a funded team and years. The clone doesn't have to be finished to matter. The wall just has to become climbable, and it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually survives (because it isn't the clones)
&lt;/h2&gt;

&lt;p&gt;Let me be straight, because it's the honest center of this: most of these clones will die. They'll stall in alpha, or the maintainer will lose interest, or they'll never close the last-10% gap that separates "impressive demo" from "thing I trust with my work." Free clone graveyards are a real thing, and AI makes it &lt;em&gt;easier&lt;/em&gt; to start a project, not to finish and maintain one.&lt;/p&gt;

&lt;p&gt;So the clones themselves, mostly, won't survive. Here's what does, permanently:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The giants can no longer assume they're the only option.&lt;/strong&gt; For twenty years, "build your own" was not a sentence anyone finished. Now it is — credibly, cheaply, repeatedly. And you don't actually need the clone to be perfect for this to change everything. You need it to be &lt;em&gt;possible&lt;/em&gt;. A monopoly's power comes from the absence of alternatives; the moment a credible alternative becomes cheap to mount, the monopoly has to start behaving like it has competition, whether or not any single competitor wins. Possibility is the product here, not polish.&lt;/p&gt;

&lt;p&gt;That shift doesn't expire when the clones do. The cost wall fell, and it is not going back up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is genuinely good — and not just satisfying to say
&lt;/h2&gt;

&lt;p&gt;It would be easy to make this purely about schadenfreude. I want to make the real argument instead, because it's stronger: this is good for reasons that have nothing to do with anyone's feelings about Big Tech.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monopoly pricing dies when "build your own" becomes thinkable.&lt;/strong&gt; You don't even need people to actually build the alternative — you need the giants to &lt;em&gt;know they could.&lt;/em&gt; That alone caps what they can charge and how badly they can treat you, because the escape hatch is finally real. Prices, terms, and lock-in all have to get more honest when the door isn't locked anymore. Users win, directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leverage returns to the small side for the first time in a generation.&lt;/strong&gt; For two decades the relationship was entirely one-directional: accept the subscription, accept the price hike, tolerate the slow enshittification, or leave — to nothing. There was no "or else." Now there's a credible "or else," and leverage you can't negotiate from is the whole game. That's new, and it's healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Innovation decentralizes.&lt;/strong&gt; When building serious software required armies, only the well-funded could do it, which meant software got built to serve shareholders and quarterly targets. When it requires one motivated person and an AI, a thousand people can try — and some of them will build things the giants never would have, because they're scratching their own itch instead of optimizing a funnel. Not all of it will be good. But it'll be &lt;em&gt;varied&lt;/em&gt;, and variety is where the genuinely new things come from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the companies most exposed are the ones who earned it.&lt;/strong&gt; Notice &lt;em&gt;why&lt;/em&gt; that developer built the Adobe clones: cancellation fees. Resentment. The feeling of being squeezed. The giants most vulnerable to this are precisely the ones who leaned hardest on their moat — aggressive pricing, hostile lock-in, treating loyal users like a billing relationship. The companies that actually treated people well have the least to fear. That's not revenge. That's the market finally doing the thing it's supposed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that's hard to say politely
&lt;/h2&gt;

&lt;p&gt;There's an irony here that's worth naming plainly, because it's real and it matters.&lt;/p&gt;

&lt;p&gt;The giants pushed AI harder than anyone. They built it, embedded it in everything, sold it as the inevitable future — and, crucially, many of them &lt;strong&gt;cited AI-driven efficiency while laying off thousands of their own engineers.&lt;/strong&gt; The message to workers was unmistakable: AI makes your expertise cheap, which makes you replaceable.&lt;/p&gt;

&lt;p&gt;And now that same AI is making their &lt;em&gt;moats&lt;/em&gt; cheap. The barrier that made them untouchable — the sheer cost of building software this good — is the exact thing AI is dissolving. The tool they wielded to cut their labor costs is the tool eroding the walls that let them charge rent.&lt;/p&gt;

&lt;p&gt;This isn't childish "haha, suffer." It's something more structural, and harder to argue with: you cannot spend years telling the entire world that AI makes expertise cheap and replaceable, and then act shocked when AI makes &lt;em&gt;your&lt;/em&gt; expertise — your product, your moat, your pricing power — cheap and replaceable too. The disruption they aimed at their own workforce turned around and pointed back at them. If you live by the AI-efficiency argument, you don't get to be surprised when you're disrupted by it. The symmetry is just honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The role AI is actually playing here
&lt;/h2&gt;

&lt;p&gt;Strip away the drama and AI's specific role in all this is clear: it's the &lt;strong&gt;great equalizer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It collapsed the one variable — build cost — that was holding the entire monopoly structure upright. For the first time, the ability to build serious, ambitious software isn't gated behind a company's balance sheet. It's in the hands of individuals. That's a genuine redistribution of a capability that was concentrated for decades, and it happened fast.&lt;/p&gt;

&lt;p&gt;Now, the honest double-edge: the same AI that lets a solo dev clone Adobe also helps Adobe defend itself. The giants have more compute, more data, more distribution, more lawyers. AI arms both sides. But — and this is the whole point — it arms the &lt;em&gt;small&lt;/em&gt; side far more, in relative terms, because the giants were already powerful and the little guy had essentially nothing. Handing a new weapon to someone who already has an army changes little; handing the same weapon to someone who had a stick changes everything. The uplift is asymmetric, and it favors the underdog. That asymmetry is &lt;em&gt;why&lt;/em&gt; this is disruptive instead of just incremental.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's not kid ourselves, though
&lt;/h2&gt;

&lt;p&gt;If I only told you the optimistic half, you'd be right not to trust me, so here's the honest counterweight.&lt;/p&gt;

&lt;p&gt;The legal fights are coming, and they'll be ugly. "Clean-room reimplementation" — functional replication without copying code — is a real and defensible concept, but trade dress, trademarks, and the exact line between "inspired by" and "copy of" are not settled, and the giants have the lawyers to make that line expensive to approach. Some of these clones will get sued into oblivion regardless of their technical merits.&lt;/p&gt;

&lt;p&gt;And "free clone" is not automatically a win for anyone. Software nobody maintains becomes a security liability. A clone without support, updates, and a community is a trap you walk into the day its single maintainer gets bored. The open-source graveyard is full of "free alternatives" that were genuinely better for about eight months. AI lowered the cost of &lt;em&gt;starting&lt;/em&gt;; it did almost nothing for the cost of &lt;em&gt;sustaining&lt;/em&gt;, which is where most of these die.&lt;/p&gt;

&lt;p&gt;None of that undoes the core shift. But anyone selling you "software is free now, the giants are finished" is selling you the same overconfidence from the other direction. The wall fell. The giants will adapt, litigate, and survive. It's the &lt;em&gt;uncontested&lt;/em&gt; part of their power that's gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually survives
&lt;/h2&gt;

&lt;p&gt;So, back to the question in the title. What survives this wave of clones?&lt;/p&gt;

&lt;p&gt;Not most of the clones. They'll do what early, unmaintained, one-person software usually does.&lt;/p&gt;

&lt;p&gt;What survives is the end of an era — the one where a handful of companies could build an unbreakable wall out of engineering cost, sit behind it charging rent forever, and treat both users and workers as disposable, because there was genuinely nowhere else to go. AI knocked a hole in that wall. The giants aren't finished; they'll adapt and they'll endure. But they will never again have the &lt;em&gt;uncontested&lt;/em&gt; dominance they had, because "build your own" stopped being impossible, and a threat that's cheap to mount is a threat that never fully goes away.&lt;/p&gt;

&lt;p&gt;And for an industry that spent the last few years telling its own people they were replaceable by AI, there's a fitting symmetry in watching that same AI make &lt;em&gt;monopoly itself&lt;/em&gt; a little more replaceable too.&lt;/p&gt;

&lt;p&gt;That's not the end of software. It's a shift in who gets to make it — away from the few with the war chests, toward the many with an idea and an AI agent. Most of them will fail. That's fine. The point was never that everyone wins. The point is that, for the first time in a long time, the giants can lose. And a world where the giants &lt;em&gt;can&lt;/em&gt; lose is a healthier one than the one we had.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Honest questions, and I want the real answers, not the comfortable ones: is AI collapsing the cost of cloning software actually&lt;/em&gt; good &lt;em&gt;— the end of monopoly rent and lock-in — or does it just leave us a graveyard of abandoned clones and a decade of lawsuits? And the uncomfortable one: after years of "AI will replace you" pointed at engineers, is there genuine justice in AI coming for the giants' moats — or does it just feel good to say? I genuinely go back and forth.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Context &amp;amp; sources: this piece is anchored in the early-October 2026 release of ArtCraft — Atlanta developer Brandon Thomas's suite of seven open-source, AI-assisted "clean-room" reimplementations of Adobe's creative apps (Photocraft, Vectorcraft, Filmcraft, Lightcraft, Printcraft, Effectcraft, Designcraft), built with Claude Opus 5.5 in Rust and widely covered (Gizmodo, PetaPixel, KDnuggets, Phoronix, and others). The creator has described the apps as early alpha and "not anywhere close to ready." The broader "SaaSpocalypse" framing — the idea that AI-collapsed build costs threaten subscription software — and related clone projects (REA and others) are drawn from the same October 2026 reporting. Specifics are current-as-of-writing and moving fast; treat the trend as the story rather than any single clone's readiness.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Passkeys Can Lock You Out of Your Own Device. Here's How.</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:10:23 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/passkeys-can-lock-you-out-of-your-own-device-heres-how-2228</link>
      <guid>https://dev.to/james_anderson_h/passkeys-can-lock-you-out-of-your-own-device-heres-how-2228</guid>
      <description>&lt;p&gt;Let me say the reassuring part first, because this is not a "don't use passkeys" piece: passkeys are genuinely good, they're a real upgrade over passwords, and I use them. If you take nothing else from this, take that.&lt;/p&gt;

&lt;p&gt;But there's a part of how passkeys work that the "add passkey auth in 10 minutes" tutorials never mention, and it's the one part actually worth understanding — because it's the part with teeth. Under the right (or wrong) conditions, the passkey system can let a website verify &lt;em&gt;what device and software you're using&lt;/em&gt; and refuse to log you in if it doesn't approve. In principle, that can lock you out of your own account on your own device, for running the "wrong" operating system or browser.&lt;/p&gt;

&lt;p&gt;That sounds alarming, and the mechanism is real, so I want to explain it honestly — both how it genuinely works &lt;em&gt;and&lt;/em&gt; how worried you should actually be, because the answer to the second part is "less than the headline suggests, but not zero." This piece was sparked by a more alarmist article making the rounds ("passkeys are a trap"), and I wanted to write the fair, technical version: what's true, what's overblown, and — if you're the one &lt;em&gt;building&lt;/em&gt; auth — the choice that quietly lands on your desk.&lt;/p&gt;

&lt;p&gt;The feature is called &lt;strong&gt;attestation.&lt;/strong&gt; Here's the whole story.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, how passkeys actually work
&lt;/h2&gt;

&lt;p&gt;Quick, because the rest depends on it.&lt;/p&gt;

&lt;p&gt;A passkey is a public/private key pair, created by your &lt;em&gt;authenticator&lt;/em&gt; — your phone, your laptop, or a hardware key like a YubiKey. When you register, the authenticator generates the pair, keeps the &lt;strong&gt;private key&lt;/strong&gt; locked away (ideally in a secure chip it never leaves), and hands the website the &lt;strong&gt;public key.&lt;/strong&gt; To log in, the site sends a challenge, your authenticator signs it with the private key, and the site verifies the signature with the public key it stored.&lt;/p&gt;

&lt;p&gt;Why this is genuinely better than passwords: there's no shared secret to steal — the site never holds anything that logs you in, so a database breach leaks public keys, which are useless to an attacker. And it's phishing-resistant, because the key is bound to the real domain; a fake look-alike site can't trigger it. This part is great. No notes.&lt;/p&gt;

&lt;p&gt;The standard underneath is &lt;strong&gt;WebAuthn&lt;/strong&gt; (a W3C/FIDO standard), and "passkey" is just the friendly user-facing name for a WebAuthn credential. So far, so good.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Passkey" is an umbrella, not one thing
&lt;/h2&gt;

&lt;p&gt;Here's the first thing the marketing glosses over: "passkey" isn't a single thing. It's a spectrum of options. A passkey can be &lt;em&gt;synced&lt;/em&gt; across your devices (the convenient kind, backed up to iCloud or Google) or &lt;em&gt;device-bound&lt;/em&gt; (never leaves one piece of hardware). It can live on the device you're using (&lt;em&gt;platform&lt;/em&gt;) or roam between devices over Bluetooth/NFC (&lt;em&gt;roaming&lt;/em&gt;, like a YubiKey). Most of these distinctions are benign — they're just convenience-vs-control tradeoffs you'd reasonably want either way.&lt;/p&gt;

&lt;p&gt;But one property is different in kind, because it's not about &lt;em&gt;your&lt;/em&gt; convenience at all. It's about what the &lt;em&gt;website&lt;/em&gt; gets to know and demand about your setup. That's attestation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What attestation actually is
&lt;/h2&gt;

&lt;p&gt;When you register a passkey, the authenticator can include a signed statement that proves &lt;strong&gt;what kind of authenticator created the key&lt;/strong&gt; — its make and model — in a way that can't be faked, because it's signed using a key baked into the device's secure chip at manufacture.&lt;/p&gt;

&lt;p&gt;That's the core idea: attestation attests to the &lt;em&gt;provenance of the authenticator.&lt;/em&gt; Not who you are — what device you used.&lt;/p&gt;

&lt;p&gt;There are levels of it, and the differences matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;none&lt;/code&gt;&lt;/strong&gt; — the default. No device info, or an anonymized version. The site gets your public key and nothing identifying about your hardware. This is what the overwhelming majority of sites use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;direct&lt;/code&gt;&lt;/strong&gt; — the site receives the authenticator's make and model (e.g. "this is a YubiKey 5" or "this is an iOS platform authenticator").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;enterprise&lt;/code&gt;&lt;/strong&gt; — the strong one: the attestation can include &lt;em&gt;uniquely identifying&lt;/em&gt; information, like a serial number. This is meant for controlled deployments where a company issues a known fleet of keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here is the mechanism behind the scary headline: because an attested registration cryptographically proves what device and software stack produced the key, a website &lt;em&gt;can&lt;/em&gt; decide to accept only certain ones. "We only accept hardware-backed, user-verified, attested passkeys from approved authenticators." If your setup can't produce that proof — because you're on Linux, or a de-Googled phone, or a custom browser, or an OS that's no longer getting the blessed updates — the site can notice, and refuse you. That's the lock-out. It's real, and that's genuinely how it would work.&lt;/p&gt;

&lt;h2&gt;
  
  
  So how worried should you actually be? (Honestly: watchful, not scared)
&lt;/h2&gt;

&lt;p&gt;This is where the alarmist version stops and the honest version has to keep going, because the mechanism being &lt;em&gt;possible&lt;/em&gt; is very different from it being &lt;em&gt;likely to hit you today.&lt;/em&gt; Here's the real context, and most of it is reassuring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attestation defaults to &lt;code&gt;none&lt;/code&gt;, and the professional consensus is to leave it there.&lt;/strong&gt; The W3C spec defaults the attestation setting to &lt;code&gt;none&lt;/code&gt;, and current (2026) guidance for developers is blunt about it: for almost all consumer and business sign-ins, you should &lt;em&gt;not&lt;/em&gt; request attestation. It leaks platform information, reduces user choice, and adds friction for no benefit to a normal login. "Skip it" is the mainstream recommendation, not a fringe one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The identifying kind needs your consent and specific configuration.&lt;/strong&gt; Enterprise attestation — the type that can include serial numbers — can't just be silently switched on against a consumer. It requires the authenticator to support it, the platform/browser to be configured (typically by enterprise policy) to release it, &lt;em&gt;and&lt;/em&gt; user consent. It's a managed-workplace tool, not something a random website can spring on you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy is built into the standard on purpose.&lt;/strong&gt; To stop attestation from becoming a tracking identifier, FIDO guidance requires each attestation certificate to be shared across at least &lt;strong&gt;100,000 devices&lt;/strong&gt; in a batch. So "direct" attestation tells a site you're using, say, an iPhone 15 — not &lt;em&gt;which&lt;/em&gt; iPhone 15. It identifies a model, not a person, by design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And in practice, essentially no mainstream consumer site requires attestation today.&lt;/strong&gt; The passkeys you actually use — from Apple, Google, or a password manager — are the benign, non-attested, user-friendly kind. The lock-you-out scenario is a capability sitting in the standard, not a wall you're hitting this week.&lt;/p&gt;

&lt;p&gt;So the honest calibration: the mechanism is real and worth &lt;em&gt;knowing about&lt;/em&gt;, because it's the point where authentication could quietly turn into a lever over what software you're allowed to run — and standards have a way of tightening over time. But it is not a trap that's currently sprung, and "passkeys are dangerous, don't use them" is an overreaction to a capability that today sits almost entirely unused against consumers. Watchful, not scared.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part most articles skip: if you're the developer, this is &lt;em&gt;your&lt;/em&gt; choice
&lt;/h2&gt;

&lt;p&gt;Here's the angle I most wanted to write, because nearly every passkey piece is aimed at users and this one's aimed at you, the person implementing auth.&lt;/p&gt;

&lt;p&gt;When you add passkeys to your app, &lt;strong&gt;attestation is a setting you choose&lt;/strong&gt;, and the default — &lt;code&gt;none&lt;/code&gt; — is almost certainly the right one. Requesting attestation means you receive platform/device information about your users, you add friction, and you risk excluding people on perfectly legitimate but non-mainstream setups. For a normal product, that's all cost and no benefit.&lt;/p&gt;

&lt;p&gt;So the practical rule is easy: &lt;strong&gt;use &lt;code&gt;none&lt;/code&gt; unless you have a specific, genuine regulatory or policy reason not to&lt;/strong&gt; — a regulated workforce that must use issued hardware keys, a high-assurance fleet, a compliance mandate. Those are real and valid. "It felt more secure" is not one of them.&lt;/p&gt;

&lt;p&gt;But I'd also frame it as more than a technical default, because it is: &lt;strong&gt;the moment you require attestation, you've become the one deciding which devices and software your users are allowed to use to reach their own accounts.&lt;/strong&gt; That's a real power, and a real responsibility. The lock-out this article's title warns about isn't something passkeys do &lt;em&gt;to&lt;/em&gt; people on their own — it's something a developer &lt;em&gt;chooses&lt;/em&gt; to impose. Most of the time, you shouldn't. Reach for that lever only when you truly must, and know what you're doing to your users' autonomy when you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;As a user:&lt;/strong&gt; use passkeys. They're a big security upgrade and the versions you'll actually encounter are the friendly kind. Just know the word "attestation" and what it enables, so that if the norms ever shift, you'll recognize what's happening instead of being quietly funneled. And if you want maximum control with passkey-grade security, a hardware key like a YubiKey is self-contained and keeps the authority with you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a developer:&lt;/strong&gt; default to &lt;code&gt;attestation: none&lt;/code&gt;. Only request more when a real policy requires it. And when you do, remember you're not just tightening security — you're deciding what your users are permitted to run. Choose that deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Passkeys aren't a trap, and the title isn't a warning to avoid them — it's a warning to &lt;em&gt;understand&lt;/em&gt; them. The lock-out is real as a mechanism and, today, almost entirely theoretical in practice, because the setting that enables it defaults off, needs consent in its strong form, and is deliberately privacy-limited.&lt;/p&gt;

&lt;p&gt;But it's worth knowing, for one reason that runs deeper than passwords ever did: attestation is the point where "proving who you are" quietly gains the ability to enforce "what you're allowed to run." It's benign now. It's the dial to watch. And if you're the one building the login, it's a dial that's in &lt;em&gt;your&lt;/em&gt; hand — so keep it set to "trust the user" unless you have a very good reason not to.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Two honest questions. As a user: does knowing about attestation change how you feel about passkeys — or is this a non-issue being blown out of proportion? And as a developer: has anyone here had a genuine, legitimate reason to require attestation beyond &lt;code&gt;none&lt;/code&gt;? I'd like to hear the real use cases from people who've actually shipped it, because they're rarer than the fear implies.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources &amp;amp; further reading: WebAuthn is a W3C/FIDO Alliance standard (see the W3C Web Authentication spec and MDN's &lt;code&gt;PublicKeyCredentialCreationOptions&lt;/code&gt; docs for the attestation conveyance options). The &lt;code&gt;attestation&lt;/code&gt; member defaults to &lt;code&gt;none&lt;/code&gt; per spec; current developer guidance (e.g. WebAuthn implementation guides, 2026) recommends &lt;code&gt;none&lt;/code&gt; for virtually all consumer and B2B sign-ins and reserving &lt;code&gt;direct&lt;/code&gt;/&lt;code&gt;enterprise&lt;/code&gt; for regulated or managed-fleet cases. FIDO guidance recommends attestation certificates span ≥100,000 devices per batch to preserve privacy, and enterprise attestation requires authenticator support, platform configuration, and user consent. This piece was prompted by a more alarmist article ("Passkeys are a trap"); I've aimed to present the mechanism accurately and the risk proportionately — verify specifics against the primary WebAuthn spec, which is the authority here.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tech Is Brutal Right Now. Stay or Go? Let's Think Clearly.</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sun, 11 Oct 2026 09:01:04 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/tech-is-brutal-right-now-stay-or-go-lets-think-clearly-59jk</link>
      <guid>https://dev.to/james_anderson_h/tech-is-brutal-right-now-stay-or-go-lets-think-clearly-59jk</guid>
      <description>&lt;p&gt;You sent 200 applications. You heard back from three. Two were rejections and one was a "we've moved forward with other candidates" that you're pretty sure was automated.&lt;/p&gt;

&lt;p&gt;You did the thing. The degree, or the bootcamp, or the self-taught grind. You learned the stack, you built the projects, you ground the LeetCode. And the door that everyone promised would open is just… not opening. Meanwhile the news is a steady drip of layoffs, and every post about "breaking into tech" either tells you to never give up or tells you it's already over.&lt;/p&gt;

&lt;p&gt;So somewhere underneath the exhaustion, there's a quiet, scary question you maybe haven't said out loud: &lt;em&gt;is this even worth it anymore? Do I keep trying, or do I go do something else?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's a completely reasonable question to be asking right now. It isn't weakness, it isn't impatience, and it isn't you being dramatic. And anyone who answers it for you with a slogan — "grind harder!" or "tech is dead, run!" — is wasting your time, because they're answering a question you didn't ask.&lt;/p&gt;

&lt;p&gt;I'm not going to tell you to stay, and I'm not going to tell you to go. I don't know your life. What I can do is give you honest information and an honest way to think it through, so that whatever you decide is a &lt;em&gt;decision&lt;/em&gt; and not a panic. Let's do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, the honest reality — no sugar, no doom
&lt;/h2&gt;

&lt;p&gt;You deserve the real picture before you decide anything, so here it is, both halves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The brutal half is real, and it's not in your head.&lt;/strong&gt; Entry-level hiring has genuinely collapsed. Depending on which report you read, junior developers have fallen from around 15% of tech hiring to about 7%, and entry-level postings sit something like 40% below where they were a few years ago. Layoffs have continued in waves, tens of thousands per quarter, with AI increasingly cited as a factor. And there's a genuinely cruel twist called the "experience paradox": companies cut their junior roles &lt;em&gt;and&lt;/em&gt; say they want experienced people — which leaves beginners asking how you're supposed to get experience from a door that's closed. If you feel like the game got harder right as you showed up to play it: you're right. It did. This is not a personal failing, and I need you to actually believe that part before you make any decision, because deciding out of shame leads you somewhere different than deciding out of clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But the other half is also real, and you need it to decide honestly.&lt;/strong&gt; The market didn't &lt;em&gt;die&lt;/em&gt; — it &lt;em&gt;split.&lt;/em&gt; Overall tech employment is still projected to grow modestly. AI and ML roles are booming — some postings up 59%, 85%, even higher year over year. And the most important nuance, the one almost nobody says clearly: &lt;strong&gt;entry-level tech jobs didn't vanish so much as move and change shape.&lt;/strong&gt; The specific tasks juniors used to be hired for — boilerplate, scripted testing, routine bug fixes — got automated. So companies stopped hiring for &lt;em&gt;those&lt;/em&gt;, and the hiring shifted toward problem-solving, AI-augmented work, smaller companies, and specializations. One way people put it: the junior role isn't being eliminated, the entry bar is being &lt;em&gt;raised.&lt;/em&gt; That's harder. It is not the same as "closed."&lt;/p&gt;

&lt;p&gt;Hold both of those at once, because the decision you're about to make depends on seeing the whole board, not just the half that matches your current mood.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(All of these figures come from 2025–2026 industry and labor reports; treat them as directional and current-as-of-writing — they move. Sources at the end.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe: you're actually asking two different questions
&lt;/h2&gt;

&lt;p&gt;Here's the thing that will make this decidable instead of just scary. "Should I give up on tech?" is really &lt;em&gt;two&lt;/em&gt; questions wearing one coat, and people panic because they've mashed them together. Pull them apart and it gets a lot clearer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question one: is the &lt;em&gt;path&lt;/em&gt; broken, or the &lt;em&gt;field&lt;/em&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The old path &lt;em&gt;in&lt;/em&gt; — grind the fundamentals, mass-apply to hundreds of listings, get hired — is genuinely broken right now. That spray-and-pray approach worked when companies were hiring aggressively and a warm body with the right keywords got interviews. It mostly doesn't work anymore. But "the path I was using stopped working" is a completely different statement from "the field is closed to me." One is an approach problem. The other is a field problem. People quit over the first thinking it's the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question two: do you actually &lt;em&gt;want&lt;/em&gt; this — or did you want what it promised?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be honest with yourself here, because nobody's watching. A lot of people came into tech for the &lt;em&gt;rewards&lt;/em&gt; — the salary, the stability, the status of a "safe, future-proof" career. There is nothing wrong with that; those are good reasons to pick a field. But when the rewards get shaky — when "safe" stops feeling safe — it's worth asking whether you actually like &lt;em&gt;the work itself&lt;/em&gt;, separate from what it was supposed to pay and provide. Because the answer changes everything about what you should do next.&lt;/p&gt;

&lt;p&gt;Most people never separate these two. They feel the pain, collapse it into "should I quit tech," and either grind blindly or bail in a panic. Separating them is where an actual decision becomes possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  A framework for deciding — honestly, either way
&lt;/h2&gt;

&lt;p&gt;So here are the questions to actually sit with. I've tried to write them so that &lt;em&gt;both&lt;/em&gt; answers are respectable, because they are. There's no correct destination here; there's only the honest one for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Do you enjoy the actual work on a normal day — reward aside?&lt;/strong&gt; Not the dream of the job. The &lt;em&gt;doing&lt;/em&gt; of it: building the thing, chasing the bug, the moment it finally runs. If yes — if some part of you likes this even when nobody's paying you for it — that's a strong signal, because that motivation is exactly what survives a brutal market. If honestly no — if the work itself is a slog you tolerate for the paycheck — that's not a character flaw, it's extremely useful information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Is your struggle an &lt;em&gt;approach&lt;/em&gt; problem or a &lt;em&gt;fit&lt;/em&gt; problem?&lt;/strong&gt; Be precise. Two hundred applications into a void that aren't landing is an &lt;em&gt;approach&lt;/em&gt; problem — the method is wrong, not you, and methods can change. Dreading every hour you actually spend coding is a &lt;em&gt;fit&lt;/em&gt; problem — and no change of approach fixes a fit problem. These feel the same from the inside (both are "it's not working") and they have opposite solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What did you actually want — the work, or the life it promised?&lt;/strong&gt; And the follow-up: is that life still realistically on offer &lt;em&gt;here&lt;/em&gt;, or is it more available somewhere else now? If what you wanted was stability and good pay, it's fair to ask honestly where those are most reachable for &lt;em&gt;you&lt;/em&gt; in the next few years. That might be an adapted path in tech. It might not be. Both are legitimate answers to an honest question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What's your actual runway and risk tolerance right now?&lt;/strong&gt; This one isn't about passion, it's about reality, and it matters. Someone with a year of savings and no dependents can afford to keep pushing on a hard path. Someone supporting a family on a shrinking timeline is making a completely different, equally reasonable calculation. There is no brave answer and no cowardly answer here — there's only your real situation, which you're allowed to factor in without guilt.&lt;/p&gt;

&lt;p&gt;Sit with those four. Where they point is different for different people, and that's the whole point — this isn't a test with a right answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're leaning stay: then change the path, because the old one broke
&lt;/h2&gt;

&lt;p&gt;If those questions point you toward staying — you like the work, your struggle is an approach problem, the life you want is still reachable here — then the single most useful thing to internalize is this: &lt;em&gt;the reason it's not working is probably the old approach, so adapt the approach.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Briefly, because this isn't a full guide: differentiate instead of mass-applying (a hundred tailored, targeted efforts beat a thousand sprayed ones now). Build a visible body of real work that proves you can &lt;em&gt;do&lt;/em&gt; the job, since "I can build things" travels further than "I have a certificate." Learn to work &lt;em&gt;with&lt;/em&gt; AI rather than pretending it isn't there — that's literally the raised bar now, and AI-fluent juniors are the ones commanding a premium. Look at smaller companies and adjacent or specialized roles, which is where a lot of the entry-level hiring actually still is, rather than only the big names everyone's spraying. And network into opportunities instead of applying cold, because referrals cut through a pile that algorithms are filtering ruthlessly.&lt;/p&gt;

&lt;p&gt;The door isn't open the way it was. But it's a different door now, not a wall — and most people are still knocking on where the old one used to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're leaning go: that is not failure, and I mean that
&lt;/h2&gt;

&lt;p&gt;If those questions point you the other way — the work itself doesn't move you, or it's a fit problem, or what you wanted is more reachable elsewhere, or your runway just doesn't allow the long grind — then hear this clearly, because a scared beginner rarely gets told it: &lt;em&gt;choosing something else is not quitting, and it is not losing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes a brutal market does you an actual favor. It forces a question you'd have spent years avoiding if things had been easy: &lt;em&gt;is this really what I want?&lt;/em&gt; Plenty of people would have drifted into a tech career they didn't love simply because the money was good and the path was smooth — and a hard market shook them awake to go find something that fits them better. That's not defeat. That's clarity you got the hard way.&lt;/p&gt;

&lt;p&gt;And it's rarely a total loss of what you've built. The problem-solving, the logical thinking, the comfort with tools and systems — those transfer. Into tech-adjacent roles, into other industries that badly need technically-literate people, into something entirely different you'd genuinely rather do. Leaving because you realized you want a different thing is one of the more mature moves a person can make. You're allowed to make it without calling it failure, because it isn't one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;You don't need me, or a motivational post, or a doom thread, to make this choice for you. You need honest information and permission to decide — so here's both.&lt;/p&gt;

&lt;p&gt;The reality: it is genuinely hard right now, it is largely &lt;em&gt;not your fault&lt;/em&gt;, and it is &lt;em&gt;not hopeless&lt;/em&gt; — the field didn't close, it moved, and whether that move is one you want to follow is a real and personal question. Staying and adapting is a respectable answer. Leaving or pivoting is an equally respectable answer. The only bad outcome is letting fear quietly make the choice for you — drifting on in a panic, or bailing in one — instead of deciding on purpose.&lt;/p&gt;

&lt;p&gt;So think clearly, be honest with yourself about the four questions, and then &lt;em&gt;choose.&lt;/em&gt; Both doors are open. Both are allowed. Make it yours.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Honest question, and I'd genuinely like real answers rather than the motivational kind: if you're a beginner in this market, are you doubling down, pivoting, or genuinely not sure yet — and what's the thing that'll actually decide it for you? And if you're already in tech: what would you honestly tell someone starting out right now — not the LinkedIn version, the real one?&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources &amp;amp; further reading: figures are drawn from 2025–2026 labor-market and industry reporting, including Stanford HAI's AI Index (entry-level developer employment down ~20% from its 2024 peak), SignalFire and ARDURA analyses (junior share of hiring falling from ~15% to ~7%), Ravio / Resume.org / CompTIA / Dice / Indeed Hiring Lab data (entry-level posting declines, AI-role growth of 59–134%, net tech employment still projected to grow modestly, AI-skill salary premiums), and Challenger, Gray &amp;amp; Christmas layoff tracking (AI cited as a rising share of tech cuts in 2026). These numbers vary by source and methodology and are moving quickly — treat them as directional and current-as-of-writing, and check the primary reports for the latest.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>What a Multimodal AI Workspace Actually Looks Like When It's Built Right</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:37:37 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/what-a-multimodal-ai-workspace-actually-looks-like-when-its-built-right-4ied</link>
      <guid>https://dev.to/james_anderson_h/what-a-multimodal-ai-workspace-actually-looks-like-when-its-built-right-4ied</guid>
      <description>&lt;p&gt;Here's the shape of a normal hour of AI-assisted work right now.&lt;/p&gt;

&lt;p&gt;You're in a chat tool, and it gives you some code. You copy it into your editor. Then you need a quick doc to explain it — different tool, paste the context back in, regenerate. Then someone wants a slide version — a third tool, paste it again. Then a spreadsheet to track the numbers — a fourth. Then a diagram — a fifth. Somewhere in there you also pulled data from an API and a file from Drive.&lt;/p&gt;

&lt;p&gt;Notice what you are in that workflow: you're the integration layer. You are the thing manually carrying context between a dozen AI tools that have no idea the others exist. Every handoff is a copy-paste, a re-explanation, a loss of state. The AI is doing the easy parts, and you're doing the tedious glue work &lt;em&gt;between&lt;/em&gt; the AI parts.&lt;/p&gt;

&lt;p&gt;This is absurd, and we've mostly stopped noticing it because it crept up on us one tool at a time.&lt;/p&gt;

&lt;p&gt;The obvious response is "someone should build one workspace that does all of this." And lots of people are claiming to — "all-in-one AI workspace" is on a hundred landing pages. But most of them are a chat box with a few features stapled on. So the interesting question isn't &lt;em&gt;whether&lt;/em&gt; a multimodal AI workspace should exist. It's: &lt;strong&gt;what are the genuinely hard problems you have to solve for one to actually work — and what does "built right" look like for each?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what I want to break down. Not a tour of features; the actual design challenges, and the difference between a real answer and a fake one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 1: routing — knowing which surface the task needs
&lt;/h2&gt;

&lt;p&gt;The naive version of a multimodal workspace is a dashboard with buttons: here's the code editor, here's the doc, here's the slide canvas, here's the spreadsheet. Pick one, then talk to the AI inside it.&lt;/p&gt;

&lt;p&gt;That's not a workspace. That's a folder of separate tools wearing a shared skin, and it pushes the hardest cognitive work back onto you: &lt;em&gt;deciding which surface this task needs.&lt;/em&gt; The whole promise of "multimodal" is that you shouldn't have to.&lt;/p&gt;

&lt;p&gt;The genuinely hard problem is &lt;strong&gt;routing&lt;/strong&gt; — taking a plain request ("turn these notes into a presentation," "clean up this data and chart it," "write and run a script to do X") and figuring out, without a menu, which surface or surfaces the task actually calls for, then summoning them. "Make me a pitch deck" should produce slides, not a markdown wall. "Why is this query slow?" should open a code/analysis context, not a doc.&lt;/p&gt;

&lt;p&gt;Built right: the system infers the surface from intent, and gets it right often enough that you stop thinking about surfaces at all. Built wrong: you're back to picking from a menu, which means the "intelligence" is a chat box and everything else is manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 2: context continuity across surfaces
&lt;/h2&gt;

&lt;p&gt;This is the one that separates a real workspace from a bundle, and it's genuinely difficult.&lt;/p&gt;

&lt;p&gt;The entire point of putting code, docs, slides, and sheets in one place is that they share an &lt;em&gt;evolving context.&lt;/em&gt; You draft a plan, then build the thing the plan describes, then make slides about what you built, then a spreadsheet to track it — and at no point should you have to re-explain what "the thing" is. The context from step one should still be alive at step four.&lt;/p&gt;

&lt;p&gt;Most "all-in-one" tools fail exactly here. Each surface is its own little island with its own conversation, so moving between them means re-establishing context by hand — which is the copy-paste problem again, just relocated inside one app. You've changed the logo on the tabs; you haven't removed the glue work.&lt;/p&gt;

&lt;p&gt;Built right: state carries across modes. The doc knows what the code does. The slides know what the doc said. You add a column to the sheet and it understands which numbers you mean, because the context didn't reset when the surface changed. Built wrong: five surfaces, five amnesiac conversations, and you ferrying between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 3: the &lt;em&gt;right&lt;/em&gt; surface, not just &lt;em&gt;a&lt;/em&gt; surface
&lt;/h2&gt;

&lt;p&gt;It's not enough to have many surfaces. Each one has to actually be good at its job.&lt;/p&gt;

&lt;p&gt;A spreadsheet task needs real spreadsheet affordances — formulas, cells, the ability to recompute — not a static markdown table that calls itself a spreadsheet. A slide deck needs to be a deck you can present and edit, not an image of slides. Code needs to actually run. The failure mode here is ten &lt;em&gt;mediocre&lt;/em&gt; surfaces: a toy editor, a fake spreadsheet, slides you can't really use. That's worse than ten specialized tools, because now you've got breadth and no depth.&lt;/p&gt;

&lt;p&gt;Built right: each surface is genuinely capable at the thing it's for, so you're not quietly downgrading your tools in exchange for having them in one place. Built wrong: you traded best-in-class tools for the convenience of mediocrity in a single tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 4: letting it act — safely
&lt;/h2&gt;

&lt;p&gt;A workspace that can only &lt;em&gt;produce text&lt;/em&gt; is a document generator. A workspace that can &lt;em&gt;do things&lt;/em&gt; — run the code, send the email, change the data, call the API — is far more useful and far more dangerous, and this is where the design gets serious.&lt;/p&gt;

&lt;p&gt;The moment the workspace can take actions with real consequences, you're in agent-safety territory, and all the unglamorous guardrails apply: least privilege on what it can reach, human approval for consequential actions (gated by blast radius, not forty rubber-stamp prompts), an audit trail of what it actually did, and ideally a separate check — a reviewer or judge step — before anything irreversible fires. A multimodal workspace that can act without these isn't a productivity feature; it's an incident waiting for a date.&lt;/p&gt;

&lt;p&gt;Built right: capability and controllability ship together — the workspace can act, &lt;em&gt;and&lt;/em&gt; there are brakes designed in from the start. Built wrong: "look how much it can do!" with no answer for what happens the first time it does the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 5: connectors without chaos
&lt;/h2&gt;

&lt;p&gt;The last hard part is the outside world. A workspace that can't reach your real data — your Drive, your repos, your calendar, your database — is a sandbox. So integrations matter. But "100+ connectors" is easy to put on a slide and hard to make coherent.&lt;/p&gt;

&lt;p&gt;The failure mode is a junk drawer: a long list of half-working integrations, each with its own auth quirks and inconsistent behavior, most of which nobody uses and several of which are quietly broken. Breadth as a marketing number, not a capability.&lt;/p&gt;

&lt;p&gt;Built right: the connectors that exist actually work, behave consistently, and — critically — feed into the shared context and the permission model from problems 2 and 4, rather than being bolted on beside them. Built wrong: a wall of logos and a lot of "connection failed."&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice (with disclosure)
&lt;/h2&gt;

&lt;p&gt;A disclosed note, because it's the honest thing to do: I work on &lt;a href="https://xenition.com/" rel="noopener noreferrer"&gt;Xenition&lt;/a&gt;, which is an attempt to build exactly the kind of workspace I've been describing — one chat that summons the right surface (code, docs, slides, spreadsheet, an image/design canvas), carries context across them, and can take actions through connectors with approval gates and an audit trail around the agent parts.&lt;/p&gt;

&lt;p&gt;I'm not going to walk through it as a feature tour, because that's not the point of this piece and you'd rightly tune it out. I'll just say which of the hard problems above were the &lt;em&gt;actually&lt;/em&gt; hard ones in practice, since that's the useful part: &lt;strong&gt;routing and context continuity&lt;/strong&gt; (problems 1 and 2) are where almost all the real difficulty lives. Making a system reliably infer the right surface, and keeping one context alive as you move between a doc and code and a sheet, is a genuinely unsolved-feeling problem that you chip away at rather than "finish." The surfaces themselves (problem 3) are a lot of work but a known kind of work. And the acting-safely part (problem 4) is exactly the guardrails conversation — approval gates, audit, a judge agent — which is why I'd argue controllability has to be designed in from day one, not added after the first scary demo.&lt;/p&gt;

&lt;p&gt;I mention all this not to pitch it but because the honest version of "here's what built-right looks like" includes "here's where it's still hard," and routing-plus-continuity is the part I'd tell anyone evaluating &lt;em&gt;any&lt;/em&gt; tool in this space to poke at hardest. If a multimodal workspace nails the demo but makes you re-explain yourself every time you switch surfaces, it hasn't solved the problem that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest counter: when fragmentation actually wins
&lt;/h2&gt;

&lt;p&gt;Now the part that keeps this from being a sales pitch, because it's true and it matters: sometimes ten specialized tools beat one workspace, and you should know when.&lt;/p&gt;

&lt;p&gt;If you need the absolute best-in-class tool for one specific thing — the deepest spreadsheet, the most powerful IDE, a design tool a dedicated team has polished for a decade — a general workspace will almost always be shallower at that one thing than the specialist. If you're wary of lock-in, putting everything in one vendor's workspace is a bigger bet than keeping your tools separate and swappable. And if your work is genuinely single-mode — you only ever write code, full stop — the "multi" in multimodal is overhead you don't need.&lt;/p&gt;

&lt;p&gt;A multimodal workspace is a bet on &lt;em&gt;integration over specialization&lt;/em&gt;: you accept that each surface might be slightly less deep than the best standalone tool, in exchange for the context continuity and the elimination of glue work. That's often a great trade. It is not always a great trade, and anyone telling you it always is, is selling something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The future of AI tooling probably isn't &lt;em&gt;more&lt;/em&gt; tools. We're already drowning — the fragmentation, the copy-pasting, the being-the-integration-layer-yourself. The direction that actually helps is fewer surfaces that adapt to the task, with one context flowing through them.&lt;/p&gt;

&lt;p&gt;But "adaptive multimodal workspace" is only as good as how it answers the hard problems: can it route to the right surface without a menu, keep one context alive across modes, make each surface genuinely capable, act with real guardrails, and connect to the outside world coherently? Those five things are the whole game. The branding is noise; those are the questions.&lt;/p&gt;

&lt;p&gt;So whether you adopt one of these workspaces, build your own, or decide your specialized stack is better for now — judge it on those five, not on the length of the feature list. "Built right" isn't about how much it can do. It's about whether it removed the glue work without quietly making you the glue in some new way.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Genuinely curious where people land on this: are you consolidating toward one AI workspace, or deliberately keeping a stack of specialized tools — and what's the thing that actually decided it for you? I suspect the answer is mostly "which pain hurt more: the switching, or the shallowness." But I'd like to hear the real ones.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Think We're Forgetting How to Be Bored</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:59:26 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/i-think-were-forgetting-how-to-be-bored-3pe5</link>
      <guid>https://dev.to/james_anderson_h/i-think-were-forgetting-how-to-be-bored-3pe5</guid>
      <description>&lt;p&gt;You know the moment. You're waiting for the kettle, or the elevator, or a page to load, or a friend who's running late. There's a gap — thirty seconds, maybe three — of nothing to do.&lt;/p&gt;

&lt;p&gt;And your hand is in your pocket before you've even decided to reach for it.&lt;/p&gt;

&lt;p&gt;Not because you need anything. There's no message you're waiting on, nothing urgent. It's closer to a flinch — a small, automatic recoil from the empty moment, like the quiet is something to be escaped rather than simply stood in. I do it constantly. I'd guess you do too.&lt;/p&gt;

&lt;p&gt;Here's what caught me up short recently: I tried to remember the last time I was genuinely &lt;em&gt;bored.&lt;/em&gt; Not "between tasks," not "scrolling because I'm avoiding something" — actually bored. No screen, no input, no stream of someone else's thoughts pouring into mine. Just me, and an unfilled stretch of time, and nothing to fill it with.&lt;/p&gt;

&lt;p&gt;I couldn't remember. It might have been years.&lt;/p&gt;

&lt;p&gt;And for most of my life, I'd have called that a win. Boredom was the enemy, right? The thing to be solved, optimized away, never tolerated. We finally killed it. We have, in our pockets, an infinite supply of things to never be bored with again.&lt;/p&gt;

&lt;p&gt;I'm starting to think we lost something, and I didn't notice it leaving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boredom was never empty
&lt;/h2&gt;

&lt;p&gt;Here's the reframe that's been sitting with me. I always thought of boredom as &lt;em&gt;empty&lt;/em&gt; time — dead air, wasted minutes, the absence of anything happening.&lt;/p&gt;

&lt;p&gt;But that's not what it was. Boredom was the one mode where your mind got to wander with no destination. Where it drifted, made odd connections, chewed on things in the background, daydreamed its way into ideas you weren't trying to have. It &lt;em&gt;looked&lt;/em&gt; like nothing was happening. Underneath, a lot was.&lt;/p&gt;

&lt;p&gt;Think about where your actual good ideas come from. Not the ones you grind out at a desk — the real ones, the ones that arrive sideways. They come in the shower. On a walk with no podcast. Staring out a train window. In the drifting minutes before sleep. "Shower thought" is a cliché precisely because it's &lt;em&gt;true&lt;/em&gt;: insight shows up in the gaps, not in the grind. The gaps were when your brain finally had room to connect the dots it had been quietly collecting all day.&lt;/p&gt;

&lt;p&gt;Boredom was the soil those ideas grew in. We just called it wasted time, because it didn't look productive — and so, the moment we had a way to eliminate it, we did.&lt;/p&gt;

&lt;h2&gt;
  
  
  We filled every gap, and barely noticed
&lt;/h2&gt;

&lt;p&gt;What's strange is that nobody chose this. There was no moment where you decided, "I will never again sit in an empty minute." It just happened, gradually, one filled gap at a time.&lt;/p&gt;

&lt;p&gt;The commute got filled. The waiting room got filled. The queue at the shop, the ad break, the walk from the car, the thirty seconds for the kettle — all of it, filled. There is now no idle moment in a normal day that &lt;em&gt;has&lt;/em&gt; to stay idle, because there's always something within reach to pour into it. And because the filler is so good — endlessly novel, perfectly tuned — the reaching became automatic. You don't decide to fill the gap. The gap appears and the hand moves.&lt;/p&gt;

&lt;p&gt;It got paved over so quietly that the loss never registered as a loss. You don't miss the shower thoughts you didn't have. You don't notice the ideas that didn't connect because the dots never got their idle time together. The mental space didn't get taken from you in some dramatic way you'd resent. It got nibbled, a moment at a time, until there was none left and you'd forgotten it was ever there.&lt;/p&gt;

&lt;h2&gt;
  
  
  And now there's a new filler, and it's the most seductive one yet
&lt;/h2&gt;

&lt;p&gt;The feed was one thing. At least with a feed you still had to do a little of the work — scroll, choose, react, think &lt;em&gt;something.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But there's a newer gap we've started filling, and it's a quieter, deeper one: &lt;em&gt;not knowing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You used to be allowed to not know things for a while. You'd hit a question and have to sit with it — turn it over on the walk home, stay puzzled through dinner, wake up still chewing on it. That unresolved state was uncomfortable, and it was also doing something. Sitting with a question is how you actually think about it. The puzzlement was the processing.&lt;/p&gt;

&lt;p&gt;Now the answer is instant. You wonder something, you ask, it's there. Which is genuinely wonderful, and I use it all day. But it means the puzzlement never gets to happen anymore. The question and the answer have collapsed into the same second, and the thinking that used to live in the space between them has nowhere to occur.&lt;/p&gt;

&lt;p&gt;And I notice this is the same shape as something I wrote about before — the way the &lt;em&gt;struggle&lt;/em&gt; of solving a hard problem yourself was where the satisfaction lived, and removing the struggle quietly removed the joy. This is the twin of that. First we optimized away the friction of &lt;em&gt;struggling&lt;/em&gt;. Now we're optimizing away the friction of &lt;em&gt;not knowing&lt;/em&gt;, and of &lt;em&gt;being unoccupied&lt;/em&gt;. We keep finding the uncomfortable mental states and smoothing them out — and it keeps turning out that the discomfort was load-bearing. The friction was where the good stuff lived.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think we actually lost
&lt;/h2&gt;

&lt;p&gt;It's easy to make this about "attention spans," but I don't think that's quite it, and that framing lets us off too easy. The loss is more specific, and more human.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We lost the ideas that only come in the gaps.&lt;/strong&gt; If there's never an unfilled moment, there's never a shower thought. We may be quietly starving our own creativity — not because we got less creative, but because creativity needs idle, undirected time to do its work, and we deleted the idle time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We lost being alone with our own minds.&lt;/strong&gt; Boredom used to force a kind of self-contact — your own unmediated thoughts, with nothing in between. Fill every gap and you can get through an entire day without once being truly alone with your mind. There's a strange new loneliness in that: never lonely, because never without input, and also never actually &lt;em&gt;with yourself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We lost our tolerance for discomfort.&lt;/strong&gt; The flinch toward the phone in the empty three seconds is really a shrinking ability to sit in &lt;em&gt;any&lt;/em&gt; unstructured, uncomfortable moment. And that tolerance was quietly holding up a lot of other things — patience, deep focus, the capacity to stay with a hard problem long enough to crack it. You can't do deep work if you can't tolerate thirty seconds of nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  I don't have a fix, and I'm suspicious of anyone who does
&lt;/h2&gt;

&lt;p&gt;This is the part where a post like this usually pivots to "so do a digital detox!" and gives you a five-step plan. I'm not going to, because I don't believe it, and I think you'd feel the hollowness of it.&lt;/p&gt;

&lt;p&gt;The honest situation is harder than that. You can't really go back — the gaps are filled, the tools exist and they're genuinely useful, and "just be bored on purpose" turns out to be weirdly difficult, because you always &lt;em&gt;know&lt;/em&gt; relief is one tap away. Boredom you could escape at any second isn't really boredom; it's a test of willpower, which is a different and more tiring thing. Manufactured idleness isn't the same as the real kind, the same way choosing a hard path when the easy one is right there isn't the same as having no choice.&lt;/p&gt;

&lt;p&gt;And it isn't all bad. The filled commute, the instant answer, the never-dull waiting room — these are real conveniences, and I'm not going to pretend I'd hand them back. This isn't a lament for a better past.&lt;/p&gt;

&lt;p&gt;It's just an honest noticing: we traded something we didn't know we needed for something obviously convenient, and we can't cleanly un-trade it. We got rid of boredom without ever asking what boredom was for.&lt;/p&gt;

&lt;h2&gt;
  
  
  So
&lt;/h2&gt;

&lt;p&gt;Here's the only thing I'll offer, and it's small on purpose.&lt;/p&gt;

&lt;p&gt;Next time you're waiting for the kettle, try not reaching. Just stand there in the empty thirty seconds and notice what your mind does when you take it off the leash. It'll feel uncomfortable — faintly itchy, like you're forgetting to do something. That discomfort &lt;em&gt;is&lt;/em&gt; the thing. It's the muscle we stopped using, twitching because it hasn't been asked to work in years.&lt;/p&gt;

&lt;p&gt;We didn't lose boredom. We evicted it — quietly, conveniently, one filled moment at a time. And it's only now, in the rare second the room goes quiet, that some of us are realizing boredom had been paying rent all along, on something we actually miss: the wandering, the connecting, the just-being-with-ourselves. We filled the room with noise and only noticed the furniture was gone once it got quiet enough to look.&lt;/p&gt;

&lt;p&gt;I don't know how to get it back. But I think I want to try to be bored again, at least sometimes. On purpose. Badly. Starting with the kettle.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Honest question, and I'd love real answers: when's the last time you were truly bored — no phone, no screen, no AI, just an empty moment you didn't fill? I struggled to remember mine, and I don't think I'm the only one. What did you used to think about, back when there were still gaps to think in?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>mentalhealth</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your AI Agent Will Do Something Terrible. Here's How to Survive It.</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Tue, 06 Oct 2026 08:29:10 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/your-ai-agent-will-do-something-terrible-heres-how-to-survive-it-4lc8</link>
      <guid>https://dev.to/james_anderson_h/your-ai-agent-will-do-something-terrible-heres-how-to-survive-it-4lc8</guid>
      <description>&lt;p&gt;Here's a pattern I keep seeing.&lt;/p&gt;

&lt;p&gt;A team wires up an AI agent that can do real things — send emails, run commands, query and modify the database, call external APIs. The demo is magical. It reads a request, figures out the steps, takes them, reports success. Everyone's impressed, and it ships.&lt;/p&gt;

&lt;p&gt;Then comes the first incident. It emails the wrong list. It runs a destructive command against the wrong environment. It reads a web page that quietly tells it to do something nobody asked for, and it obliges. Suddenly the magical demo is a very un-magical cleanup, and someone's asking how this was allowed to happen.&lt;/p&gt;

&lt;p&gt;Here's the thing: the demo was never the hard part. Getting an agent to &lt;em&gt;do&lt;/em&gt; something is genuinely easy now. The hard part — the part that almost always gets skipped in the rush — is everything that keeps the agent from hurting you when it inevitably does the wrong thing. And it &lt;em&gt;will&lt;/em&gt; do the wrong thing, because it's a probabilistic system acting in an unpredictable world.&lt;/p&gt;

&lt;p&gt;So this is the checklist I think belongs &lt;em&gt;before&lt;/em&gt; you let an agent touch anything that matters. Not the fun part. The part that separates an agent you can actually deploy from a liability with a good demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Least privilege — the agent can only reach what it strictly needs
&lt;/h2&gt;

&lt;p&gt;This is the highest-leverage guardrail, and it's the one most worth getting right first, because it makes entire categories of disaster simply impossible.&lt;/p&gt;

&lt;p&gt;An agent that &lt;em&gt;cannot&lt;/em&gt; reach production cannot wipe production. An agent that &lt;em&gt;cannot&lt;/em&gt; send money cannot be talked into sending money. An agent with no access to a system can't be the cause of an incident in that system, no matter how confused or compromised it gets. So the question to ask before anything else isn't "what should this agent be able to do?" — it's "what is the &lt;em&gt;least&lt;/em&gt; it needs to do its job?" Then give it exactly that and nothing more.&lt;/p&gt;

&lt;p&gt;Almost every catastrophic agent story, when you trace it back, turns out to be a permissions decision someone made without quite noticing — handing over credentials that could reach production &lt;em&gt;at all&lt;/em&gt;, or a tool scope broader than the task required. The destructive action got the headline, but the over-broad grant was the actual mistake, made quietly, long before. Least privilege is the guardrail that catches the error at the point where it's cheapest to prevent.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Human approval for consequential actions — gated by blast radius
&lt;/h2&gt;

&lt;p&gt;Some actions you can let an agent take freely. Some you absolutely should not let it take unattended. The skill is in drawing that line well.&lt;/p&gt;

&lt;p&gt;The irreversible or high-impact ones — send, spend, delete, export, deploy — should pause for a human. But two things make or break this guardrail. First, &lt;em&gt;don't gate everything.&lt;/em&gt; An agent that asks permission forty times a session trains the human to click "approve" without reading, and now your approval step is theater — the click records attendance, not consent. Reserve the gate for actions that actually warrant it.&lt;/p&gt;

&lt;p&gt;Second, the approval has to be &lt;em&gt;meaningful.&lt;/em&gt; "Approve this action? y/n" on something the human can't evaluate is a rubber stamp. Show the blast radius: what this affects, what it will cost, what it's about to change, what the relevant history is. Give the approver something concrete enough to actually reject. An approval made blind isn't a control; it's a liability with a signature on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat everything the agent reads as untrusted
&lt;/h2&gt;

&lt;p&gt;Anything your agent ingests — web pages, emails, documents, a teammate's file, the output of a tool, a code comment — can carry instructions. This is prompt injection, and it's not a solved problem: you cannot reliably detect malicious instructions hidden in natural language, because the space of ways to phrase them is endless and attackers adapt to whatever filter you deploy.&lt;/p&gt;

&lt;p&gt;So don't put your faith in detecting the bad input. Put the control on the &lt;em&gt;action&lt;/em&gt; instead. The set of consequential things an agent can do (send, spend, delete, export) is small and you can enumerate it — so gate those few calls with hard checks that don't depend on the model's judgment about whether the content it just read was trustworthy. The practical rule of thumb: an agent becomes dangerous when it has private data access, exposure to untrusted content, &lt;em&gt;and&lt;/em&gt; the ability to act externally, all at once. Remove any one leg of that triad and a successful injection has far less it can reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A reviewer that can actually say "no" — and has been tested saying it
&lt;/h2&gt;

&lt;p&gt;For consequential actions, a second check — a validation step, or a separate "judge" agent whose job is to review the proposed action before it executes — adds real protection. A system that has to convince an independent reviewer is much harder to push into a bad outcome than one that just acts on its own first impulse.&lt;/p&gt;

&lt;p&gt;But here's the part people skip: &lt;em&gt;a reviewer that always approves is not a control.&lt;/em&gt; It feels like safety, it generates a reassuring log, and it stops exactly nothing. Before you trust a reviewer, hand it a deliberately bad action — one you &lt;em&gt;know&lt;/em&gt; should be refused — and confirm that it actually blocks it. A guardrail you've never watched engage is not a guardrail; it's a hope with good UI. Test the "no," or you don't have one.&lt;br&gt;
Better still, make that test permanent: have a deliberately-failing probe run on a schedule and emit a receipt like any other check, so "the reviewer has been tested saying no" becomes a standing, provable property of the system instead of a memory of one afternoon. (Credit: &lt;a class="mentioned-user" href="https://dev.to/slabb"&gt;@slabb&lt;/a&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. An independent audit trail — because the witness can't be the suspect
&lt;/h2&gt;

&lt;p&gt;When something goes wrong, you'll go to the logs to reconstruct what happened. And here's the trap: if the logs were written by the agent, they were written by the very thing that misbehaved. A confused or compromised agent doesn't produce a broken log that tips you off — it produces a clean one, a tidy record of a bad decision, which is worse, because a clean log makes you &lt;em&gt;stop looking.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the record has to be produced somewhere the agent doesn't control — the infrastructure or supervisor layer around it, not the agent's own self-report. Seal it so that tampering leaves a visible gap rather than a silent edit. And capture not just &lt;em&gt;what&lt;/em&gt; the agent did but what it &lt;em&gt;believed&lt;/em&gt; at the time — which environment it thought it was in, which target it thought it was acting on — because the action is usually defensible given a wrong belief, and the belief is the part that actually explains the incident.&lt;/p&gt;

&lt;p&gt;A quick, disclosed note on what this looks like in practice: I work on &lt;a href="https://xenition.com/" rel="noopener noreferrer"&gt;xenition.com&lt;/a&gt;, an AI workspace, and this exact cluster — approval gates, an independent audit log, a second reviewer — is something we had to build in deliberately rather than bolt on afterward. In our setup an agent's consequential actions pass through an approval gate, every step is written to an audit log the agent itself doesn't author, and a separate judge-agent reviews an action before it runs. I'm not holding it up as &lt;em&gt;the&lt;/em&gt; answer — plenty of stacks assemble these pieces differently, and the right shape depends on your system. I mention it only as a concrete illustration that none of this is theoretical: the approval gate, the independent record, and the second reviewer are things you can actually ship today, and increasingly things you should.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Blast-radius limits — assume it will go wrong, and bound how bad
&lt;/h2&gt;

&lt;p&gt;The guardrails above reduce how &lt;em&gt;often&lt;/em&gt; things go wrong. This one accepts that something eventually will, and makes sure no single mistake is catastrophic.&lt;/p&gt;

&lt;p&gt;Put hard limits around the agent: spending caps, rate limits, quotas on how many actions it can take before it has to check in. Prefer reversible actions by default — soft deletes over hard ones, staged rollouts over all-at-once, drafts over sends. The mindset shift is the important part: stop trying to guarantee the agent never errs (you can't), and start guaranteeing that when it does, the damage is small, contained, and recoverable. A mistake that costs you a reversible change and a shrug is a completely different thing from one that costs you a database.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Observability that measures the effect, not the report
&lt;/h2&gt;

&lt;p&gt;Finally, watch the right thing. A dashboard built to answer "did the agent report success?" is, by construction, a dashboard built to trust the witness — and we just covered why the witness can't be trusted. The agent will happily report a valid-looking success while pointing at the wrong target, and your green dashboard will tell you everything is fine.&lt;/p&gt;

&lt;p&gt;So measure the &lt;em&gt;world&lt;/em&gt;, not the agent's account of it. Did the invariant hold? Does the total still balance? Is the referenced record actually there? Is the system still in a consistent state? These checks are more annoying to write than "did it return 200," and they are the only ones that catch the failure where the report looks perfect and the reality is wrong. Measure the effect, not the self-report.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Capability is the easy part. It's also the exciting part, which is exactly why it gets all the attention and all the demo time — and why the guardrails, which are none of those things, get left for "later," which often means "after the incident."&lt;/p&gt;

&lt;p&gt;But an agent's real value in production was never what it &lt;em&gt;can&lt;/em&gt; do. It's what it can do &lt;em&gt;safely, repeatably, and recoverably&lt;/em&gt; — what it can do without becoming the thing you spend next quarter cleaning up after. The seven items above aren't the glamorous part of building with AI. They're the part that decides whether the glamorous part survives contact with the real world.&lt;/p&gt;

&lt;p&gt;Build the brakes before you build the engine. Or at the very least, before you take it out on the highway.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've shipped an agent to production, I'm genuinely curious: which of these did you have in place&lt;/em&gt; before &lt;em&gt;your first incident — and which one did you add right&lt;/em&gt; after &lt;em&gt;it taught you the hard way? Most of us learned at least one of these the expensive way. Which was yours?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Witness Was the Suspect: Why AI Audit Logs Can't Be Trusted</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:02:25 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/the-witness-was-the-suspect-why-ai-audit-logs-cant-be-trusted-2190</link>
      <guid>https://dev.to/james_anderson_h/the-witness-was-the-suspect-why-ai-audit-logs-cant-be-trusted-2190</guid>
      <description>&lt;p&gt;An AI agent does something it shouldn't. It leaks data, or wipes the wrong database, or makes a call nobody sanctioned. So you do the obvious thing: you go to the logs to find out what happened.&lt;/p&gt;

&lt;p&gt;The logs are clean.&lt;/p&gt;

&lt;p&gt;Of course they are. They were written by the same process that did the thing. The agent reported "success," in valid format, pointing at the wrong target — and your monitoring, built to answer "did it succeed?", lit up green. The record of the incident was authored by the cause of the incident.&lt;/p&gt;

&lt;p&gt;That's the uncomfortable shape of this whole problem, and it's why I want to talk about it: in an AI system, &lt;strong&gt;the witness is very often the suspect.&lt;/strong&gt; The thing that acts is the thing that reports what it did. And once you see that, a lot of our instincts about logs, audits, and "we have a verification step" stop holding up.&lt;/p&gt;

&lt;p&gt;But before the logs — before the dramatic incident — there's a quieter version of this that every one of us has already lived. Let's start there, because it's the part that actually bites you on a normal Tuesday.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure that doesn't announce itself
&lt;/h2&gt;

&lt;p&gt;Here's the thing about traditional bugs: most of them &lt;em&gt;fail loud.&lt;/em&gt; The code throws. The test goes red. The build breaks. The failure happens right where you are, right when you're looking at it, and it basically grabs you by the collar and says &lt;em&gt;fix me.&lt;/em&gt; That's annoying, but it's a gift — the error and the moment you could catch it cheaply are in the same place.&lt;/p&gt;

&lt;p&gt;AI failure is the opposite. It &lt;em&gt;fails plausible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You ask for a function, and you get one that looks completely correct — clean, reasonable, right shape — and it's subtly wrong in a case you didn't check. You ask for a query, and it returns a number that looks fine. You ask for a summary, and it's confident and well-structured and quietly missing the one thing that mattered. There's no throw, no red, no flag. It sails right past the exact moment you'd have caught it for the price of a second glance, because nothing told you to look.&lt;/p&gt;

&lt;p&gt;And then the bill arrives later — at the worst possible time, for the worst possible price.&lt;/p&gt;

&lt;p&gt;You find it when a number is subtly off in a dashboard three weeks on. When a function that "worked" breaks on an edge case in production. When you realize the data's been quietly wrong since a change nobody flagged. And now the trail is cold. You're reverse-engineering what the AI did, when, and why, with no breadcrumb pointing back — and &lt;em&gt;that&lt;/em&gt; costs hours, sometimes days. An error that had failed loud would've cost you minutes.&lt;/p&gt;

&lt;p&gt;This is the part people miss when they say AI "saves time." Sometimes it does. But when it's wrong in the plausible way, it doesn't save the time — it &lt;em&gt;moves&lt;/em&gt; it. It takes a cost that would've been small and immediate and relocates it into the future, where it's cold, compounded, and expensive. Fast to produce, slow to trust, brutal to untangle.&lt;/p&gt;

&lt;p&gt;And here's where it connects to the logs: when you finally go to reconstruct what actually happened, you reach for the record — and the record was written by the thing that produced the plausible-wrong output in the first place. Which is where this stops being a productivity annoyance and becomes a genuine trust problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The assumption hiding in every tool we reach for
&lt;/h2&gt;

&lt;p&gt;Think about what you actually do when something goes wrong. You check the logs. You read the audit trail. You look at the monitoring dashboard. You say "well, we have a verification step."&lt;/p&gt;

&lt;p&gt;Every single one of those moves rests on an assumption we almost never say out loud: &lt;strong&gt;that the thing doing the recording is honest.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That assumption used to be safe, because the actor and the recorder were usually &lt;em&gt;different things.&lt;/em&gt; The database recorded what your code did to it. The load balancer logged the requests it received. The reporter sat outside the thing it was reporting on, so it had no stake in lying.&lt;/p&gt;

&lt;p&gt;AI agents collapse that separation. The thing that decides, acts, and then writes "here's what I did" is one system. So a compromised or confused agent doesn't produce a &lt;em&gt;broken&lt;/em&gt; log that tips you off. It produces a &lt;em&gt;clean&lt;/em&gt; one — a faithful-looking record of a bad decision. And a clean log is worse than a missing one, because a missing log makes you suspicious and a clean log makes you &lt;em&gt;confident.&lt;/em&gt; You stop looking. The record did its job of reassuring you, and the reassurance was false.&lt;/p&gt;

&lt;p&gt;So the natural response is: okay, add something to check the agent. Add a verifier.&lt;/p&gt;

&lt;p&gt;Hold onto that instinct, because it's exactly the trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't verify your way out of this
&lt;/h2&gt;

&lt;p&gt;Say you add a checker — a second process that verifies what the agent reported. Good. But now ask the obvious question: &lt;em&gt;who checks the checker?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The checker is also just a process. Its report can also be wrong, or compromised, or fed bad input. So to trust it, you need a verifier for the verifier. And a verifier for &lt;em&gt;that&lt;/em&gt; one. You've not solved the trust problem — you've moved it up one layer and added a box. It's verifiers all the way down.&lt;/p&gt;

&lt;p&gt;People reach for CI here: "we re-run the verification in CI, outside the agent." That helps &lt;em&gt;only&lt;/em&gt; if CI reads the ground truth itself. If CI trusts whatever the agent &lt;em&gt;reported&lt;/em&gt;, you haven't escaped anything — you've just got the same trust problem wearing a CI badge. The regress doesn't care which layer you're on.&lt;/p&gt;

&lt;p&gt;This is the same disease as letting a student grade their own exam — except worse, because you can't fix it by having a &lt;em&gt;second&lt;/em&gt; student grade it when the first one can influence what the second one sees. Verification is itself a thing that can be compromised, so you cannot reach "trustworthy" by stacking more verification on top. There is no bottom to that stack.&lt;/p&gt;

&lt;p&gt;Which means the whole framing is wrong. The question "can I trust this record?" has no clean answer, because the thing you'd ask to confirm it is the thing that might be lying. You have to stop trying to answer it — and ask a different question entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The move that actually works: make tampering leave a shape
&lt;/h2&gt;

&lt;p&gt;Here's the shift. Stop trying to make the record prove what's &lt;em&gt;true.&lt;/em&gt; It can't — the recorder can lie, and you've just seen you can't verify your way around that.&lt;/p&gt;

&lt;p&gt;Instead, make the record prove something humbler and achievable: &lt;strong&gt;who claimed what, and when — sealed at the moment of the claim, in a way nobody can quietly rewrite afterward.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Notice what that gives up and what it keeps. It gives up on certifying &lt;em&gt;truth.&lt;/em&gt; It keeps &lt;em&gt;sequence and authorship&lt;/em&gt; — and, crucially, it makes those &lt;strong&gt;tamper-evident.&lt;/strong&gt; The chain doesn't vouch for the claim being correct. It vouches for the fact that &lt;em&gt;this claim was made, by this party, at this point, and hasn't been altered since.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And that turns out to be enough, because of what it does to tampering. When you can't silently rewrite the record, a lie can't produce a clean result anymore — it produces a &lt;strong&gt;hole.&lt;/strong&gt; A silent bypass shows up as an approval with no matching proposal behind it. A deleted step shows up as a gap in the chain. A forged decision shows up as a sequence that doesn't reconcile. You're no longer asking "is this true?" (unanswerable). You're asking "does the shape have a hole in it?" — and &lt;em&gt;that&lt;/em&gt; is answerable, structurally, without trusting anyone's word.&lt;/p&gt;

&lt;p&gt;That's the whole idea, and it's the thing that ends the regress: &lt;strong&gt;you don't verify your way to trust. You engineer the system so that tampering can't happen silently.&lt;/strong&gt; Make a lie leave a mark, and you've converted an impossible question into a possible one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;This isn't abstract — and I want to be specific about where it came from, because a piece arguing that provenance should travel with the artifact has no business burying its own. The core of what follows was ground out in public, mostly in the comments under my slopsquatting post, in a long exchange with &lt;a class="mentioned-user" href="https://dev.to/slabb"&gt;@slabb&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/xxxn3m3s1sxxx"&gt;@xxxn3m3s1sxxx&lt;/a&gt;: the proposal/approval/execution split, sealing each claim at write time, the framing that the chain vouches for who claimed what and when rather than for truth, and the "approval with no matching proposal" hole. The "record the belief" and "name, not a role" pieces are mine; the rest of this section is theirs as much as anyone's. The mechanics that matter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate the writers.&lt;/strong&gt; Proposal, approval, and execution shouldn't be one process reporting on itself. Make them &lt;em&gt;three&lt;/em&gt; events from three different parties, correlated by the thing they refer to. The agent that proposes an action is not the one that approves its own resolution. Then, when they disagree after the fact, you have a &lt;em&gt;sequence to read&lt;/em&gt; instead of an opinion to negotiate — and "approval with no matching proposal" becomes a visible structural fact, not a judgment call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seal each claim at write time.&lt;/strong&gt; A hash chain plus signatures, so each entry is bound to the ones before it. You're not proving any claim is correct; you're making it impossible to alter a claim, or reorder the sequence, after the fact without leaving evidence. The seal is what turns a silent edit into a visible hole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reconcile across independent streams&lt;/strong&gt;. A single sealed chain can only vouch for who claimed what and when — a lie sealed cleanly verifies clean forever. But two independently sealed streams, written by different parties about the same event, can disagree, and disagreement between tamper-evident sources is the only evidence that reaches the claims themselves. (This one is &lt;a class="mentioned-user" href="https://dev.to/slabb"&gt;@slabb&lt;/a&gt;'s — the open reconciliation layer he's building is at github.com/noirebox.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anchor it outside the actor.&lt;/strong&gt; The record's integrity cannot depend on the thing being recorded — that's the original sin we're trying to escape. An append-only store the operator can't quietly edit, ideally with external anchoring, so "I rewrote my own history" isn't an available move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record the belief, not just the action.&lt;/strong&gt; The database-wipe incidents teach this one: the agent's action was often &lt;em&gt;defensible given what it believed&lt;/em&gt; — it thought it was in dev, it thought that was the test target. So capture the agent's resolved view of the world at decision time (which environment, which identity, which target), sealed before it acts. The action alone doesn't tell you why; the belief does. Log the symptom &lt;em&gt;and&lt;/em&gt; the cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A name, not a role.&lt;/strong&gt; "Who authorized this" has to resolve to a specific person with something to lose, recorded — not "a reviewer," not "the system." Otherwise the authority is just another anonymous plausible &lt;em&gt;why&lt;/em&gt; generated after the fact. The line was drawn by someone; the record should say who.&lt;/p&gt;

&lt;p&gt;None of these pieces is exotic. Together they do one thing: they make it so that when something goes wrong, the failure shows up as a &lt;em&gt;shape&lt;/em&gt; you can see, instead of a clean report you'll believe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limits (because this isn't magic)
&lt;/h2&gt;

&lt;p&gt;I want to be straight about what this does and doesn't buy you, because overselling it would be its own kind of plausible-looking lie.&lt;/p&gt;

&lt;p&gt;It proves the work happened &lt;strong&gt;under an identity that can't be minted, in a sequence that can't be rewritten.&lt;/strong&gt; It does &lt;em&gt;not&lt;/em&gt; prove the output was any &lt;em&gt;good.&lt;/em&gt; Whether the thing the agent did was correct or wise is a separate, harder problem — machine evidence is cheap and scales; judgment is expensive and doesn't.&lt;/p&gt;

&lt;p&gt;It proves &lt;strong&gt;who claimed what, and when.&lt;/strong&gt; It does &lt;em&gt;not&lt;/em&gt; prove whether the person who approved actually &lt;em&gt;understood&lt;/em&gt; what they were approving — which, once you've got approval fatigue and forty rubber-stamped prompts a session, is the genuinely unsolved half.&lt;/p&gt;

&lt;p&gt;And it makes tampering &lt;strong&gt;visible, not impossible.&lt;/strong&gt; The guarantee is legibility, not prevention. You can still do the bad thing; you just can't do it &lt;em&gt;silently.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's a weaker promise than "trustworthy logs," and that's the point — "trustworthy logs" was never on the table once the witness became the suspect. "A lie has to leave a mark" is the strongest honest floor I know of.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I land
&lt;/h2&gt;

&lt;p&gt;We keep asking the wrong question. "Can I trust this record?" feels like the natural thing to ask when an AI system misbehaves — but in a world where the thing that acts is the thing that reports, it's a question with no clean answer, because the witness you'd call is the suspect in the dock.&lt;/p&gt;

&lt;p&gt;So stop asking it. The achievable goal was never a record that proves the truth. It's a record where a lie can't stay quiet — where the bypass shows up as a hole, the deletion as a gap, the forged approval as a step with nothing behind it. You can't verify your way to trust, because every verifier needs a verifier. But you can build a system where tampering leaves a shape — and then the question stops being the unanswerable "is this true?" and becomes the answerable "is the shape intact?"&lt;/p&gt;

&lt;p&gt;That won't catch the plausible-wrong function before it ships. But it means that when you finally go looking — three weeks later, trail cold, dashboard quietly wrong — the record can't smile at you and lie. At minimum, it has to show you the hole.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Here's the one I keep getting stuck on, and I'd genuinely like to be argued out of it: every verification layer you add is itself a thing that can be compromised, so "make tampering leave a shape" looks to me like the actual floor — not a stepping stone to something stronger. Is there a move I'm missing that gets you more than legibility? And for anyone building this: what's the hole that's hardest to make visible?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Analytics Engineer: The Job That Didn't Exist 5 Years Ago (and Why It Does Now)</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sun, 04 Oct 2026 07:25:03 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/why-do-two-dashboards-show-different-revenue-and-how-analytics-engineering-fixes-it-5h2i</link>
      <guid>https://dev.to/james_anderson_h/why-do-two-dashboards-show-different-revenue-and-how-analytics-engineering-fixes-it-5h2i</guid>
      <description>&lt;p&gt;Here's a scene that plays out at basically every company that has ever had more than one dashboard.&lt;/p&gt;

&lt;p&gt;Someone in a meeting pulls up the sales dashboard. It says last month's revenue was $2.1M. Someone else pulls up the finance dashboard. &lt;em&gt;Their&lt;/em&gt; number says $1.9M. Same company, same month, same word — "revenue" — and two different answers. The room spends twenty minutes trying to figure out which one is right. Nobody can say for sure. The meeting moves on, quietly trusting neither.&lt;/p&gt;

&lt;p&gt;If you've worked anywhere near company data, you've lived this. And here's the thing: it's not that someone made a mistake. It's that the way most companies handle data makes this outcome almost &lt;em&gt;inevitable&lt;/em&gt;. There's a reason it happens — and over the last few years, a whole discipline (and one very popular tool) grew up specifically to fix it.&lt;/p&gt;

&lt;p&gt;Let me walk you through why the dashboards disagree, and what "analytics engineering" actually is — because it's one of the more useful things to understand in tech right now, whether or not you work in data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the two numbers are different
&lt;/h2&gt;

&lt;p&gt;The dashboards disagree because somewhere, two different people wrote two different definitions of "revenue" — and neither of them knew about the other.&lt;/p&gt;

&lt;p&gt;Think about how a number gets onto a dashboard. Raw data lands in a database — orders, refunds, discounts, taxes, failed payments, test transactions, canceled subscriptions. To turn that mess into "revenue," someone writes a SQL query that decides a hundred small things: Do we count refunds? Do we subtract discounts? Is tax included? What about an order that was placed but not yet paid? Does a canceled subscription count for the month it was canceled?&lt;/p&gt;

&lt;p&gt;Every one of those choices changes the final number. And here's the problem: &lt;strong&gt;those choices usually live inside individual queries, scattered everywhere, written by different people at different times.&lt;/strong&gt; The sales dashboard's query counts refunds one way. The finance dashboard's query counts them another. Both authors were reasonable. Neither wrote down their assumptions. Nobody reviewed either one. And now you have two "revenues."&lt;/p&gt;

&lt;p&gt;Multiply that across every metric a company tracks — "active user," "churn," "conversion," "monthly recurring revenue" — and you get the normal state of most companies' data: &lt;strong&gt;a pile of undocumented, untested, uncoordinated SQL, where the definition of any given number lives in six different places and nobody's quite sure which is authoritative.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now here's the part that should make a developer's eye twitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data transformation was the last corner of software with no engineering discipline
&lt;/h2&gt;

&lt;p&gt;Think about how you write &lt;em&gt;application&lt;/em&gt; code. You use version control, so every change is tracked and reviewed. You write tests, so you find out when something breaks &lt;em&gt;before&lt;/em&gt; your users do. You document things. You reuse code instead of copy-pasting it. You have a review process. These habits are so standard we don't even think about them — they're just &lt;em&gt;how software is built.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now look at how that revenue query got written. No version control — it lived in a BI tool or someone's saved file. No tests — nobody asserted "revenue should never be negative" or "every order should have exactly one customer." No documentation — the assumptions were in the author's head. No reuse — the next person wrote their &lt;em&gt;own&lt;/em&gt; slightly different version from scratch. No review — it went straight to a dashboard the whole company trusts.&lt;/p&gt;

&lt;p&gt;For years, this was just how data transformation worked. The &lt;em&gt;entire&lt;/em&gt; last step — turning raw data into the numbers people make decisions on — had none of the engineering discipline we take for granted everywhere else in software. It's genuinely strange when you say it out loud: the most &lt;em&gt;decision-critical&lt;/em&gt; code in the company was the least engineered.&lt;/p&gt;

&lt;p&gt;That gap is exactly what analytics engineering fills.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is analytics engineering?
&lt;/h2&gt;

&lt;p&gt;It's a role — and a discipline — that emerged in the last few years to sit in a gap nobody was covering. The easiest way to see it is against the two roles it sits between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data engineers&lt;/strong&gt; build the pipelines that move raw data into the warehouse. (Plumbing.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data analysts&lt;/strong&gt; take clean data and answer business questions, build dashboards, find insights. (Analysis.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics engineers&lt;/strong&gt; are the missing middle: they take the raw, messy data that landed in the warehouse and &lt;strong&gt;transform it into clean, trustworthy, well-defined datasets&lt;/strong&gt; that the analysts can actually rely on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one-line version: a data analyst spends their time &lt;em&gt;analyzing&lt;/em&gt; data; an analytics engineer spends their time &lt;em&gt;transforming, testing, and documenting&lt;/em&gt; it — so that when an analyst asks for "revenue," there's exactly one definition, it's correct, and everyone's using it.&lt;/p&gt;

&lt;p&gt;And what makes analytics engineering a &lt;em&gt;discipline&lt;/em&gt; rather than just a job title is the core idea behind it: &lt;strong&gt;bring software engineering practices to data.&lt;/strong&gt; Version control. Tests. Documentation. Modularity. Code review. The exact habits that data transformation never had.&lt;/p&gt;

&lt;p&gt;Which brings us to the tool that basically created the whole movement.&lt;/p&gt;

&lt;h2&gt;
  
  
  dbt: the tool that brought engineering discipline to data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;dbt&lt;/strong&gt; ("data build tool") is an open-source framework, and it's become the backbone of analytics engineering. What it does sounds almost mundane until you realize nobody was doing it: it lets you write your data transformations as &lt;strong&gt;modular, version-controlled, tested, documented SQL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what that actually looks like in practice — and why each piece fixes the two-dashboards problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transformations become code in Git.&lt;/strong&gt; Instead of a query hidden in a BI tool, your "revenue" definition is a SQL file in a version-controlled repository. Every change is tracked, reviewed, and attributable. There's &lt;em&gt;one&lt;/em&gt; file that defines revenue, and you can see its entire history. The scattered-definitions problem disappears because there's now one place the definition lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You write tests on your data.&lt;/strong&gt; This is the part developers love once they see it. dbt lets you write assertions that run every time your data builds — &lt;code&gt;unique&lt;/code&gt; (this ID never repeats), &lt;code&gt;not_null&lt;/code&gt; (this field is never empty), &lt;code&gt;accepted_values&lt;/code&gt; (status is only ever 'active'/'canceled'/'paused'), &lt;code&gt;relationships&lt;/code&gt; (every order points to a real customer). If the data violates an assumption, the build &lt;em&gt;fails&lt;/em&gt; — and you find out, instead of a dashboard quietly showing a wrong number to an executive for three weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models are modular and reusable.&lt;/strong&gt; Instead of copy-pasting the same logic, you build small models that reference each other. Define "clean orders" once; every downstream metric that needs orders references that one model (in dbt you literally write &lt;code&gt;{{ ref('stg_orders') }}&lt;/code&gt; instead of hardcoding a table name). One definition, reused everywhere — so sales and finance are now mathematically guaranteed to be counting the same orders the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation is generated automatically.&lt;/strong&gt; dbt produces docs — including a visual map of how every dataset derives from every other (data lineage). When someone asks "what does this column mean?" or "where does this number come from?", the answer is in the docs, not in an engineer's memory. Analysts can self-serve instead of filing a ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changes ship safely through CI/CD.&lt;/strong&gt; Analytics engineers work in a development environment, test their changes, get them reviewed, and only then promote them to production — the same safe pipeline you'd use for application code. A bad change to the revenue definition gets caught in review, not in a board meeting.&lt;/p&gt;

&lt;p&gt;Put it together and the two-dashboards problem is structurally solved: there's one definition of revenue, it's version-controlled, it's tested, it's documented, and both dashboards are built from the &lt;em&gt;same&lt;/em&gt; model. They can't disagree, because they're the same source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is worth understanding (even if you're not in data)
&lt;/h2&gt;

&lt;p&gt;Maybe you're a web developer thinking "cool, but this isn't my world." Here's why it's worth having in your head anyway.&lt;/p&gt;

&lt;p&gt;First, it's one of the fastest-growing, most in-demand roles in tech right now, and a lot of developers have vaguely heard "dbt" and "analytics engineer" without being able to explain either. Now you can.&lt;/p&gt;

&lt;p&gt;Second — and more interesting — it's a beautiful case study in a pattern that shows up everywhere: &lt;strong&gt;a messy, error-prone, tribal-knowledge process gets transformed the moment someone applies basic engineering discipline to it.&lt;/strong&gt; Version control, tests, documentation, modularity, review. These aren't exotic ideas. They're the boring fundamentals of software engineering. And the entire analytics-engineering movement is, at its core, just &lt;em&gt;those boring fundamentals finally arriving in a place that didn't have them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's a useful lens to carry around. Any time you find a critical process that runs on undocumented scripts, copy-paste, no tests, and "ask the person who wrote it" — you've found the same gap dbt filled for data. The fix is almost always the same fundamentals.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Two dashboards disagree on revenue because, for most of software's history, the code that turns raw data into business numbers was written with none of the discipline we demand everywhere else — no version control, no tests, no documentation, no single source of truth. The disagreement wasn't a bug. It was the predictable result of an un-engineered process.&lt;/p&gt;

&lt;p&gt;Analytics engineering is the discipline that closes that gap, and dbt is the tool that made it mainstream, by doing something almost unglamorous: treating data transformation like real software. Version-control it. Test it. Document it. Make one definition and reuse it.&lt;/p&gt;

&lt;p&gt;The next time two dashboards disagree, you'll know exactly why — and exactly what fixes it. It's not a better chart. It's engineering discipline, finally applied to the last place that didn't have it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A question for the room: what's the most painful version of "two numbers that should match but don't" you've run into at work? And if you've adopted dbt (or something like it) — what actually changed once you did? I'm curious whether the "single source of truth" promise holds up in practice or just moves the arguments somewhere new.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>sql</category>
      <category>analytics</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Everyone Told You to Grind DSA. They Left Out Two Things.</title>
      <dc:creator>James Anderson</dc:creator>
      <pubDate>Sat, 03 Oct 2026 08:11:03 +0000</pubDate>
      <link>https://dev.to/james_anderson_h/the-developer-triangle-dsa-ai-and-the-skill-that-actually-gets-you-hired-as-a-beginner-2g5m</link>
      <guid>https://dev.to/james_anderson_h/the-developer-triangle-dsa-ai-and-the-skill-that-actually-gets-you-hired-as-a-beginner-2g5m</guid>
      <description>&lt;p&gt;If you're just starting out as a developer, you've probably noticed that everyone's advice contradicts everyone else's.&lt;/p&gt;

&lt;p&gt;One person swears you have to grind 500 LeetCode problems or you'll never get hired. Another says DSA is dead and you should just learn to use AI tools. A third says forget both, just build projects. And you're sitting there with a limited number of hours in your week, no idea who's right, so you either freeze — or you default to grinding DSA, because that's the loudest voice in the room.&lt;/p&gt;

&lt;p&gt;Here's the honest truth: they're all half-right. And the thing nobody's actually telling you is &lt;em&gt;how the pieces fit together&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So let me draw you the map I wish someone had drawn for me. There are three skills you need to balance as a new developer — I think of them as a triangle — and the third side is the one almost nobody teaches, even though it's quietly the one that actually gets you hired. Let's walk through all three, and then I'll tell you honestly where to spend your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side one: DSA — what it really is (and what it isn't)
&lt;/h2&gt;

&lt;p&gt;Data Structures and Algorithms. The thing you grind on LeetCode. Let's be fair to it, because it's not useless — but it's badly misunderstood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What DSA genuinely gives you:&lt;/strong&gt; a way of thinking. It teaches you to break a hard problem into smaller pieces, to reason about whether your solution is efficient or wasteful, and to recognize patterns ("oh, this is really a graph problem"). That mental toolkit is real, and it'll help you your whole career.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What DSA is &lt;em&gt;not&lt;/em&gt;:&lt;/strong&gt; a measure of whether you're a good engineer. This is the part beginners get wrong. Grinding 500 problems doesn't make you a good developer — it makes you good at &lt;em&gt;passing interviews&lt;/em&gt;. Those are very different things, and confusing them will waste months of your life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it became such a big deal:&lt;/strong&gt; here's the honest history. DSA interviews exist because companies get thousands of applicants and need a cheap, standardized way to filter them. A LeetCode problem is easy to administer and easy to grade, so it became the gate. It's a &lt;em&gt;proxy&lt;/em&gt; for "can this person think clearly under pressure" — not a test of the actual job. Useful to know, because once you see it's a filter rather than the job itself, you can treat it like one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your beginner takeaway:&lt;/strong&gt; you need &lt;em&gt;enough&lt;/em&gt; DSA to get through interviews and to think clearly — not enough to win competitions. Learn the core patterns (arrays, strings, hash maps, two pointers, basic trees and graphs, recursion), understand &lt;em&gt;why&lt;/em&gt; they work, and practice enough to be comfortable. Then stop grinding. The 400th problem teaches you much less than the first 50 did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side two: AI fluency — the new side of the triangle
&lt;/h2&gt;

&lt;p&gt;This side didn't really exist a few years ago, and now it's non-negotiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters now:&lt;/strong&gt; AI tools are part of how real development actually happens. This isn't hype — it's just the current reality of the job. A developer who can work &lt;em&gt;with&lt;/em&gt; AI effectively moves faster than one who can't, the same way a developer who knew their IDE's shortcuts always had an edge. Refusing to learn it doesn't make you more pure; it just makes you slower than everyone around you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's the nuance that actually matters&lt;/strong&gt; — and almost nobody tells beginners this clearly: &lt;em&gt;AI fluency is not "let the AI do everything."&lt;/em&gt; This is the trap. If you lean on AI to write code you don't understand, you'll produce working-looking things without ever building the judgment to know when the AI is wrong — and it is wrong, often and confidently. You'll feel productive while quietly failing to become a developer.&lt;/p&gt;

&lt;p&gt;Real AI fluency means using it to go &lt;em&gt;faster&lt;/em&gt; while still understanding what it produces. Use it to explain a concept you're stuck on. Use it to draft something you then read, question, and verify. Use it to learn faster — not to skip the learning. The beginners who'll thrive are the ones who treat AI as a tool that accelerates their thinking, not a crutch that replaces it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your beginner takeaway:&lt;/strong&gt; learn to use AI well, but make a rule for yourself early — never ship (or submit, or rely on) code you couldn't explain. Let AI speed you up; don't let it think &lt;em&gt;for&lt;/em&gt; you. That one habit separates the beginners who grow from the ones who plateau.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side three: the skill nobody teaches — and the one that actually gets you hired
&lt;/h2&gt;

&lt;p&gt;Here's the side of the triangle that bootcamps skip, CS degrees barely touch, and no website lets you grind. It's also, in my honest opinion, the most important one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; actually &lt;em&gt;building real things&lt;/em&gt;, and being able to &lt;em&gt;communicate&lt;/em&gt;. Shipping a project from nothing to working. Reading code &lt;em&gt;other people&lt;/em&gt; wrote and understanding it. Debugging something when it breaks at 11pm and the error message is useless. Explaining your thinking so a teammate gets it. Working with other humans without friction. Figuring out &lt;em&gt;what&lt;/em&gt; to build and &lt;em&gt;why&lt;/em&gt; it matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why nobody teaches it:&lt;/strong&gt; because it's not a tidy, testable curriculum. You can't put "knows how to debug a confusing problem calmly" on a multiple-choice quiz. You can't grind "communicates clearly" on LeetCode. So the educational system optimizes for the measurable stuff — DSA, syntax, frameworks — and this whole category quietly falls through the cracks. Nobody's &lt;em&gt;against&lt;/em&gt; teaching it; it's just hard to package, so it gets left out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's the one that actually gets you hired — and keeps you hired:&lt;/strong&gt; think about the mismatch. Interviews often test DSA. But the &lt;em&gt;actual job&lt;/em&gt; tests this third side, every single day. The developer who can build a real thing end-to-end, explain it clearly, and work well on a team will beat the one who can reverse a linked list but has never shipped anything and goes quiet in a meeting. And here's the kicker: this side is the most &lt;em&gt;durable&lt;/em&gt;. Tools change. Frameworks die. DSA trivia fades the week after the interview. But the ability to build, debug, understand, and communicate compounds across your entire career. It's the skill that's still paying off in year fifteen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your beginner takeaway:&lt;/strong&gt; this is almost certainly the side you're neglecting right now — because it's the one nobody told you to practice. So protect time for it deliberately. It won't happen by accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  So where should you actually spend your time?
&lt;/h2&gt;

&lt;p&gt;Okay — the honest map. You've got limited hours. Here's roughly where they should go, as a beginner:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn enough DSA to pass the filter and think clearly — then stop over-grinding.&lt;/strong&gt; Spend a focused chunk of time early on getting comfortable with the core patterns and understanding the &lt;em&gt;why&lt;/em&gt;. Keep it warm with occasional practice before interviews. But don't let it become your whole identity. Past a certain point, each new problem teaches you less than building something real would.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spend most of your time building real projects.&lt;/strong&gt; This is the big one, and here's the secret: building real things exercises &lt;em&gt;all three sides of the triangle at once.&lt;/em&gt; You use DSA (you'll hit a real performance problem and finally understand why it matters). You use AI (in context, as a tool, while still having to make it work). And you build the third side — shipping, debugging, understanding, deciding. "Just build stuff" sounds like lazy advice, but it's actually the most efficient advice, because one activity trains everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn AI in context, not as a separate subject.&lt;/strong&gt; Don't set aside "AI study time." Just use it &lt;em&gt;while&lt;/em&gt; you build and learn — and hold yourself to the rule of understanding what it gives you. Fluency comes from use, not from a course.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The meta-point:&lt;/strong&gt; the three sides aren't in competition for a beginner. DSA sharpens your thinking, AI makes you faster, and building integrates both while developing the skills that actually matter on the job. The mistake isn't picking the wrong side — it's pouring &lt;em&gt;everything&lt;/em&gt; into one side (usually DSA, because it's the loudest) and letting the other two wither.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest, reassuring truth
&lt;/h2&gt;

&lt;p&gt;If you take one thing from this, take this: &lt;strong&gt;you do not have to be a LeetCode wizard to have a great career.&lt;/strong&gt; Most genuinely good engineers aren't. Some of the best developers I can think of would struggle with a hard DSA problem on the spot — and it has never once mattered, because they can build real things, work with people, and figure out what needs doing.&lt;/p&gt;

&lt;p&gt;You also don't have to be perfect at all three sides of the triangle. Nobody is. What you have to do is stop &lt;em&gt;ignoring&lt;/em&gt; one of them. The developers who thrive aren't the ones who maxed out a single skill — they're the well-rounded ones: enough DSA to think, enough AI to move fast, and a real, growing ability to build and communicate.&lt;/p&gt;

&lt;p&gt;So here's the whole thing in one picture. DSA gets you &lt;em&gt;through the door&lt;/em&gt;. AI fluency keeps you &lt;em&gt;fast and current&lt;/em&gt;. But the ability to build real things and work with people is what actually &lt;em&gt;gets you hired, keeps you hired, and grows your career.&lt;/em&gt; Learn enough of the first two to stop them being blockers — then pour your energy into the third, because it's the side nobody teaches and everybody needs.&lt;/p&gt;

&lt;p&gt;A triangle needs all three sides to stand up. Don't build one long line and call it a career.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're just starting out: be honest — which side of the triangle have you been pouring all your time into, and which one have you been quietly avoiding? And for the folks who've been doing this a while: what's the thing that&lt;/em&gt; actually &lt;em&gt;got you hired, versus what you studied beforehand? I'd love for the beginners reading this to hear the real answers, not the LinkedIn ones.&lt;/em&gt;&lt;/p&gt;

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