<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Micah Breedlove (druid628)</title>
    <description>The latest articles on Forem by Micah Breedlove (druid628) (@druid628).</description>
    <link>https://forem.com/druid628</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2849279%2F10202746-fcd7-4ef0-8709-d604e64feeb4.png</url>
      <title>Forem: Micah Breedlove (druid628)</title>
      <link>https://forem.com/druid628</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/druid628"/>
    <language>en</language>
    <item>
      <title>🌳 Watering the Bonsais</title>
      <dc:creator>Micah Breedlove (druid628)</dc:creator>
      <pubDate>Tue, 14 Apr 2026 14:30:00 +0000</pubDate>
      <link>https://forem.com/druid628/watering-the-bonsais-232g</link>
      <guid>https://forem.com/druid628/watering-the-bonsais-232g</guid>
      <description>&lt;p&gt;There was a point in my career where I had a dozen open pull requests.&lt;/p&gt;

&lt;p&gt;Not half-finished experiments.&lt;br&gt;
Not “I’ll get back to this later” work.&lt;/p&gt;

&lt;p&gt;Twelve branches.&lt;br&gt;
Each one solved a real problem.&lt;br&gt;
Each one was implemented, tested, and ready for the next step—code review, QA, or in some cases just validation.&lt;/p&gt;

&lt;p&gt;They just… weren’t a priority.&lt;/p&gt;

&lt;p&gt;One of them stands out.&lt;/p&gt;

&lt;p&gt;It was one of those problems everyone agreed needed to be fixed.&lt;br&gt;
The kind that shows up in conversations, gets a few nods, and then quietly gets pushed to “later” because it’s assumed to be expensive.&lt;/p&gt;

&lt;p&gt;“Probably a week of work.”&lt;br&gt;
“Maybe more.”&lt;br&gt;
“Let’s not disrupt the sprint.”&lt;/p&gt;

&lt;p&gt;One Friday afternoon, I had a few hours between tasks—too late to pick up anything substantial, too early to call it a day.&lt;/p&gt;

&lt;p&gt;So I took a swing at it.&lt;/p&gt;

&lt;p&gt;Four hours later, it was done. Tested. Ready for review.&lt;/p&gt;

&lt;p&gt;Not a week. Not a sprint.&lt;/p&gt;

&lt;p&gt;Four hours.&lt;/p&gt;

&lt;p&gt;And then it joined the others.&lt;/p&gt;

&lt;p&gt;Waiting.&lt;/p&gt;




&lt;p&gt;So once a month, usually on the first, I’d go through and rebase them all.&lt;/p&gt;

&lt;p&gt;Resolve conflicts.&lt;br&gt;
Update dependencies.&lt;br&gt;
Make sure nothing drifted too far from reality.&lt;/p&gt;

&lt;p&gt;I started calling it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watering the bonsais.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  What is a “bonsai branch”?
&lt;/h3&gt;

&lt;p&gt;A bonsai branch is work that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully (or nearly fully) implemented&lt;/li&gt;
&lt;li&gt;Solves a real, known problem&lt;/li&gt;
&lt;li&gt;But is blocked by prioritization, validation, or timing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not dead code.&lt;br&gt;
It’s not abandoned.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;maintained, deferred value&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  The part most teams don’t see
&lt;/h3&gt;

&lt;p&gt;From the outside, these branches look like:&lt;/p&gt;

&lt;p&gt;“Engineering started something and didn’t finish.”&lt;/p&gt;

&lt;p&gt;From the inside, it looks more like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The problem was identified&lt;/li&gt;
&lt;li&gt;The solution was designed&lt;/li&gt;
&lt;li&gt;The work was implemented and tested&lt;/li&gt;
&lt;li&gt;And then… it waited&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because it wasn’t useful.&lt;/p&gt;

&lt;p&gt;Because something else was more urgent.&lt;/p&gt;




&lt;h3&gt;
  
  
  The hidden cost
&lt;/h3&gt;

&lt;p&gt;Bonsais aren’t free.&lt;/p&gt;

&lt;p&gt;Every time you keep one alive, you’re paying for it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rebase time&lt;/li&gt;
&lt;li&gt;Merge conflict resolution&lt;/li&gt;
&lt;li&gt;Context switching (“what did this fix again?”)&lt;/li&gt;
&lt;li&gt;Mental overhead of tracking what’s “almost done”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re maintaining a solution that isn’t delivering value yet.&lt;/p&gt;

&lt;p&gt;And if you don’t maintain it?&lt;/p&gt;

&lt;p&gt;It dies.&lt;/p&gt;

&lt;p&gt;And when it dies, that work doesn’t just pause—it resets.&lt;/p&gt;




&lt;h3&gt;
  
  
  The hidden value
&lt;/h3&gt;

&lt;p&gt;Here’s the part that matters:&lt;/p&gt;

&lt;p&gt;A bonsai branch is &lt;strong&gt;already paid for&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The risk is mostly burned down.&lt;br&gt;
The unknowns have been explored.&lt;br&gt;
The implementation exists.&lt;/p&gt;

&lt;p&gt;When you finally prioritize it, you’re not starting from zero.&lt;/p&gt;

&lt;p&gt;You’re starting from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;almost done.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The tension
&lt;/h3&gt;

&lt;p&gt;Good engineers tend to move faster than prioritization cycles.&lt;/p&gt;

&lt;p&gt;They see a problem, they solve it, and they move on.&lt;/p&gt;

&lt;p&gt;Organizations don’t always move that way.&lt;/p&gt;

&lt;p&gt;They have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;competing priorities&lt;/li&gt;
&lt;li&gt;validation cycles&lt;/li&gt;
&lt;li&gt;timing constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you end up with this strange middle ground:&lt;/p&gt;

&lt;p&gt;Work that is finished… but not allowed to be done.&lt;/p&gt;




&lt;h3&gt;
  
  
  For engineers
&lt;/h3&gt;

&lt;p&gt;If you’ve got bonsais, be intentional about them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep them alive if they matter&lt;/li&gt;
&lt;li&gt;Document what they solve&lt;/li&gt;
&lt;li&gt;Don’t let them sprawl endlessly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And maybe most importantly:&lt;/p&gt;

&lt;p&gt;Don’t confuse “not prioritized” with “not valuable.”&lt;/p&gt;

&lt;p&gt;Those are not the same thing.&lt;/p&gt;




&lt;h3&gt;
  
  
  For product and business
&lt;/h3&gt;

&lt;p&gt;You might be sitting on solutions you’ve already paid for.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;What’s been built but not shipped?&lt;/li&gt;
&lt;li&gt;What’s been deferred but maintained?&lt;/li&gt;
&lt;li&gt;What could be delivered quickly because the work is already done?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because sometimes the fastest way forward isn’t a new initiative.&lt;/p&gt;

&lt;p&gt;It’s revisiting something that’s already been solved.&lt;/p&gt;




&lt;h3&gt;
  
  
  Closing
&lt;/h3&gt;

&lt;p&gt;Some teams let these branches rot.&lt;/p&gt;

&lt;p&gt;Others quietly maintain them—keeping them ready for the moment they’re needed.&lt;/p&gt;

&lt;p&gt;Not everything grows in the open.&lt;/p&gt;

&lt;p&gt;Some things are shaped, maintained, and patiently kept alive.&lt;/p&gt;

&lt;p&gt;Waiting for the right time.&lt;/p&gt;

&lt;p&gt;Sometimes the most valuable work in your system&lt;br&gt;
is the work that’s just been… waiting.&lt;/p&gt;

</description>
      <category>techculture</category>
      <category>productdevelopment</category>
      <category>leadership</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>array_map Is Not A Design Pattern</title>
      <dc:creator>Micah Breedlove (druid628)</dc:creator>
      <pubDate>Tue, 07 Apr 2026 11:18:00 +0000</pubDate>
      <link>https://forem.com/druid628/arraymap-is-not-a-design-pattern-43j9</link>
      <guid>https://forem.com/druid628/arraymap-is-not-a-design-pattern-43j9</guid>
      <description>&lt;h2&gt;
  
  
  The Moment It Clicked
&lt;/h2&gt;

&lt;p&gt;“Damn it Doug! array_map is not a design pattern!”&lt;/p&gt;

&lt;p&gt;I will never forget hearing that yelled across the office during a code review.&lt;/p&gt;

&lt;p&gt;And to this day, every time I run across code that’s trying a little too hard to be clever, that line pops back into my head.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Get There
&lt;/h2&gt;

&lt;p&gt;Doug was a smart engineer. Seriously smart.&lt;/p&gt;

&lt;p&gt;But he had a habit I’ve seen in a lot of really sharp developers — myself included, if I’m being honest. He’d find a tool, a pattern, or a concept he liked…&lt;/p&gt;

&lt;p&gt;…and then use it everywhere.&lt;/p&gt;

&lt;p&gt;At some point, that turned into what we started calling — half joking, half traumatized —&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The array_map design pattern&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which, to be clear, is not a thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem in Practice
&lt;/h2&gt;

&lt;p&gt;I remember reviewing a piece of code from his team where it was literally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;code&gt;array_map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;inside an &lt;code&gt;array_map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;calling another &lt;code&gt;array_map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;returning an &lt;code&gt;array_map&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I’m not exaggerating.&lt;/p&gt;

&lt;p&gt;It &lt;em&gt;worked&lt;/em&gt; and was technically correct. It was also an absolute nightmare to read, debug, and maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Clever vs Clear
&lt;/h2&gt;

&lt;p&gt;And that’s the part that matters. Because this isn’t really about array_map. It’s about what happens when we start optimizing for cleverness instead of clarity.&lt;/p&gt;

&lt;p&gt;I’ve been guilty of this too -- writing code that made me feel smart, code that looked elegant. Expressive. Maybe even impressive in a code review.&lt;/p&gt;

&lt;p&gt;And then six months later, someone else is digging through it trying to fix a bug, wondering what in the world I was thinking.&lt;/p&gt;

&lt;p&gt;Sometimes that “someone else” was me.&lt;/p&gt;




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

&lt;p&gt;The problem isn’t the tool or the technique. It’s how and when we choose to apply it.&lt;/p&gt;

&lt;p&gt;The problem is forgetting that code has a second life:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;being read, understood, and maintained by someone else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most systems don’t fail because they weren’t clever enough. They fail because no one can understand them anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complexity vs Control
&lt;/h2&gt;

&lt;p&gt;Now, to be fair — I’m not a fan of nested loops either.&lt;/p&gt;

&lt;p&gt;If I can avoid them, I will.&lt;/p&gt;

&lt;p&gt;I’ll happily spend extra time structuring data, reshaping inputs, or breaking problems apart so I don’t have to stack loops on loops.&lt;/p&gt;

&lt;p&gt;That’s not about performance as much as it is about clarity and control. But there’s a difference between avoiding complexity…&lt;/p&gt;

&lt;p&gt;…and hiding it behind layers of abstraction that make things harder to follow.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Good Looks Like
&lt;/h2&gt;

&lt;p&gt;Sometimes the right solution isn’t the most clever one. It’s the one that makes the intent obvious.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s not fancy, nor is is going to win you any style points.  But anyone who reads it knows exactly what it’s doing.&lt;/p&gt;

&lt;p&gt;And more importantly — they can change it without fear.&lt;/p&gt;

&lt;p&gt;That’s the real goal. Not just writing code that works. Writing code that survives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;Just because a tool exists doesn’t mean it should drive the design. Just because something is expressive doesn’t mean it’s appropriate. And just because it feels clever…&lt;/p&gt;

&lt;p&gt;doesn’t mean it’s a good idea.&lt;/p&gt;

&lt;p&gt;“&lt;code&gt;array_map&lt;/code&gt; is not a design pattern.”&lt;/p&gt;

&lt;p&gt;It’s a tool.&lt;/p&gt;

&lt;p&gt;Use it when it makes things clearer.  Put it down when it doesn’t.&lt;/p&gt;

&lt;p&gt;Cross-posted: &lt;a href="https://www.linkedin.com/pulse/arraymap-design-pattern-micah-breedlove-k1ube" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | Medium&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>codequality</category>
    </item>
    <item>
      <title>AI Didn’t Make Me Faster. It Made Me Think Better.</title>
      <dc:creator>Micah Breedlove (druid628)</dc:creator>
      <pubDate>Thu, 02 Apr 2026 11:30:18 +0000</pubDate>
      <link>https://forem.com/druid628/ai-didnt-make-me-faster-it-made-me-think-better-4022</link>
      <guid>https://forem.com/druid628/ai-didnt-make-me-faster-it-made-me-think-better-4022</guid>
      <description>&lt;p&gt;I wrote recently about &lt;a href="https://dev.to/druid628/the-balsam-of-fierabras-and-the-promise-of-ai-22o5"&gt;some concerns&lt;/a&gt; I have with how our industry is starting to treat AI.&lt;/p&gt;

&lt;p&gt;This isn’t that.&lt;/p&gt;

&lt;p&gt;Because the truth is, AI has also made me better at what I do. Not faster. Not necessarily more productive in the way people like to measure it.&lt;/p&gt;

&lt;p&gt;Better.&lt;/p&gt;

&lt;p&gt;And the more I’ve thought about it, the closest analogy I’ve found isn’t in software at all. It’s in the forge.&lt;/p&gt;

&lt;p&gt;When I was learning blacksmithing, I wasn’t just being shown how to hit steel. I was learning how to think about it.&lt;/p&gt;

&lt;p&gt;How heat changes behavior. How structure forms over time. How small decisions early on show up later in ways you can’t undo. And more than anything, I learned by asking questions. Not just "how do I do this?" But "what would happen if I did it this way instead?"&lt;/p&gt;

&lt;p&gt;Sometimes the answer came from the person teaching me.&lt;/p&gt;

&lt;p&gt;Sometimes the answer came from trying it and seeing what happened.&lt;/p&gt;

&lt;p&gt;But the learning came from having a place where those questions could exist.&lt;/p&gt;

&lt;p&gt;Most of my career has been spent in backend engineering — working in ecosystems like Symfony, .NET, Spring. Environments where structure matters, where decisions compound, and where “we’ll fix it later” usually turns into “we’re still dealing with this six months from now.”&lt;/p&gt;

&lt;p&gt;A lot of the real work in that world isn’t typing code.&lt;/p&gt;

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

&lt;p&gt;It’s weighing trade-offs. It’s deciding which problems you’re solving today and which ones you’re intentionally leaving for later.&lt;/p&gt;

&lt;p&gt;And historically, that kind of thinking has been… a little isolated.&lt;/p&gt;

&lt;p&gt;You either grab time with another senior engineer, or you just sit with it yourself.&lt;/p&gt;

&lt;p&gt;AI changed that for me.&lt;/p&gt;

&lt;p&gt;The best way I can describe it is this:&lt;/p&gt;

&lt;p&gt;AI hasn’t felt like a replacement. It’s felt like something closer to an apprenticeship mirror.&lt;/p&gt;

&lt;p&gt;A way to throw ideas out and see them reflected back — sometimes clearly, sometimes distorted — but almost always enough to make you stop and think.&lt;/p&gt;

&lt;p&gt;There’s something incredibly valuable about being able to just… nerd out over a design.&lt;/p&gt;

&lt;p&gt;No meeting. No calendar. No worrying about whether you’re taking up someone’s time.&lt;/p&gt;

&lt;p&gt;Just throwing ideas out there:&lt;/p&gt;

&lt;p&gt;"What if I structure it this way?" "What happens if this scales?" "Is this clever, or is this going to bite me later?"&lt;/p&gt;

&lt;p&gt;And getting something back that isn’t trying to impress you — just trying to be useful.&lt;/p&gt;

&lt;p&gt;It’s not just solutions, either.&lt;/p&gt;

&lt;p&gt;Some of the most useful conversations I’ve had haven’t been about solving a specific problem at all. They’ve been about exploring different approaches, frameworks, and even languages.&lt;/p&gt;

&lt;p&gt;Just nerd-talking through things.&lt;/p&gt;

&lt;p&gt;Comparing trade-offs. Challenging assumptions. Asking "why not this?" instead of defaulting to "this is how I’ve always done it."&lt;/p&gt;

&lt;p&gt;That’s led to something I didn’t expect.&lt;/p&gt;

&lt;p&gt;Honestly, some of my favorite conversations I’ve had with AI have been around those exact moments — revisiting ideas, technologies, or approaches I had already written off.&lt;/p&gt;

&lt;p&gt;It’s made me more willing to reconsider tools and approaches I might have dismissed in the past.&lt;/p&gt;

&lt;p&gt;Not because AI told me I was wrong — but because it gave me a space to actually think through those decisions instead of relying on instinct or habit.&lt;/p&gt;

&lt;p&gt;There’s another angle to this that I didn’t expect.&lt;/p&gt;

&lt;p&gt;In the past, when I was working through a design or a tricky decision, the best thing you could do was grab another engineer — or a couple of them — and effectively red team it.&lt;/p&gt;

&lt;p&gt;"Alright, poke holes in this."&lt;/p&gt;

&lt;p&gt;And if you had good people around you, that was incredibly valuable.&lt;/p&gt;

&lt;p&gt;The problem is, time is expensive.&lt;/p&gt;

&lt;p&gt;Everyone’s busy. Calendars are full. And pulling someone into that kind of deep, focused thinking isn’t always easy.&lt;/p&gt;

&lt;p&gt;What I’ve found is that AI fills that gap surprisingly well.&lt;/p&gt;

&lt;p&gt;Not as a replacement for good engineers — but as a low-friction way to pressure-test your thinking. You can throw an idea out there and say:&lt;/p&gt;

&lt;p&gt;What am I missing?&lt;/p&gt;

&lt;p&gt;Where does this break?&lt;/p&gt;

&lt;p&gt;What happens if this assumption isn’t true?&lt;/p&gt;

&lt;p&gt;And you’ll get something back that isn’t trying to be clever. It’s not trying to win the argument. It’s just trying to work through the problem.&lt;/p&gt;

&lt;p&gt;It’s not perfect. It won’t catch everything.&lt;/p&gt;

&lt;p&gt;But it’s fast. It’s available. And it’s often enough to surface the kinds of questions you should be asking anyway.&lt;/p&gt;

&lt;p&gt;One thing I’ve come to appreciate is how often the best answer isn’t the most clever one. It’s the one that’s easiest to understand six months from now.&lt;/p&gt;

&lt;p&gt;More than once, I’ve ended up in a conversation where the feedback essentially boils down to:&lt;/p&gt;

&lt;p&gt;Future you is going to hate current you in six months if you do this.&lt;/p&gt;

&lt;p&gt;And it’s usually right.&lt;/p&gt;

&lt;p&gt;That’s the part that’s been the most valuable. Not the answers. The feedback loop.&lt;/p&gt;

&lt;p&gt;Sometimes the best part of using AI isn’t the answer it gives you — it’s the question it makes you ask. Or the hesitation it introduces.  Or the moment where you stop and think:&lt;/p&gt;

&lt;p&gt;"Why am I doing it this way?"&lt;/p&gt;

&lt;p&gt;That kind of interruption in your own thinking is hard to come by when you’re working alone.&lt;/p&gt;

&lt;p&gt;None of this replaces experience.&lt;/p&gt;

&lt;p&gt;If anything, it makes experience more valuable.&lt;/p&gt;

&lt;p&gt;Because the better your understanding is, the better you can evaluate the feedback you’re getting. The better you can separate useful pushback from noise. The better you can recognize when something is technically correct… but practically wrong.&lt;/p&gt;

&lt;p&gt;And sometimes, just wrong.&lt;/p&gt;

&lt;p&gt;That’s something I think is important — especially for engineers coming up behind me.&lt;/p&gt;

&lt;p&gt;It’s okay to push back on AI. It’s not always right.&lt;/p&gt;

&lt;p&gt;AI is useful — but only if you stay in charge of the thinking.&lt;/p&gt;

&lt;p&gt;I ran into this just yesterday. I moved a conversation into a new chat, and in doing that, a lot of the context got lost. The suggestions I got back were clean. Reasonable. Technically sound.&lt;/p&gt;

&lt;p&gt;But they were based on assumptions that weren’t true anymore. If I had just taken that answer and run with it — no pushback, no clarification — it would have worked just well enough to get through the moment…&lt;/p&gt;

&lt;p&gt;…and then turned into an absolute nightmare a year or two down the road.&lt;/p&gt;

&lt;p&gt;It only got better once I pushed back.&lt;/p&gt;

&lt;p&gt;That won’t work here because…&lt;/p&gt;

&lt;p&gt;You’re missing this constraint…&lt;/p&gt;

&lt;p&gt;This part of the system behaves differently…&lt;/p&gt;

&lt;p&gt;And once the context was corrected, the answer changed. That’s the difference. The value isn’t in getting an answer.&lt;/p&gt;

&lt;p&gt;It’s in being able to challenge it.&lt;/p&gt;

&lt;p&gt;Back at the forge, the person teaching me didn’t just give answers. They gave me space to ask better questions.  To try things. To think things through. To understand not just what worked — but why.&lt;/p&gt;

&lt;p&gt;That’s what this feels like.&lt;/p&gt;

&lt;p&gt;I still think there’s real risk in how our industry is starting to position AI. I still think we need to be careful about what we think it is. But at a personal level, the impact has been hard to ignore.&lt;/p&gt;

&lt;p&gt;AI hasn’t replaced my thinking.&lt;/p&gt;

&lt;p&gt;It’s made me more deliberate about it.&lt;/p&gt;

&lt;p&gt;It’s made me question decisions a little more.&lt;/p&gt;

&lt;p&gt;It’s made me a little less attached to being “right” and a little more focused on getting it right. And in a field where small decisions compound over time…&lt;/p&gt;

&lt;p&gt;That might be the most valuable thing it can do.&lt;/p&gt;

&lt;p&gt;In the forge, iron sharpens iron. We make better tools through pressure, repetition, and refinement. I think there’s something similar happening here.&lt;/p&gt;

&lt;p&gt;We can make AI better by how we use it. But we have to be just as intentional about letting it make us better in return. Because at the end of the day, the tool doesn’t define the craft.&lt;/p&gt;

&lt;p&gt;The craftsman always has.&lt;/p&gt;

&lt;p&gt;Crossposted: &lt;a href="https://www.linkedin.com/pulse/ai-didnt-make-me-faster-made-think-better-micah-breedlove-hubfe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://medium.com/@druid628/ai-didnt-make-me-faster-it-made-me-think-better-326d6e16a0e0" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Balsam of Fierabras and the Promise of AI</title>
      <dc:creator>Micah Breedlove (druid628)</dc:creator>
      <pubDate>Mon, 30 Mar 2026 12:32:48 +0000</pubDate>
      <link>https://forem.com/druid628/the-balsam-of-fierabras-and-the-promise-of-ai-22o5</link>
      <guid>https://forem.com/druid628/the-balsam-of-fierabras-and-the-promise-of-ai-22o5</guid>
      <description>&lt;p&gt;Lately, I’ve been watching something happen in our industry that feels familiar in a way I can’t quite shake.&lt;/p&gt;

&lt;p&gt;Companies are talking about “efficiency gains” from AI. Numbers get thrown around — 20%, 30%, sometimes more. And alongside those numbers come decisions: smaller teams, fewer engineers, faster timelines.&lt;/p&gt;

&lt;p&gt;I’ve even heard stories — whether apocryphal or not — of companies laying off the majority of their engineering teams entirely. Product steps in, increasingly armed with AI tools, generating code directly. The few engineers that remain are no longer building systems so much as reviewing them, deploying them, and keeping the lights on.&lt;/p&gt;

&lt;p&gt;I understand the appeal. I really do. If I’m being honest, part of me wants it to be true. But I can’t help thinking about Don Quixote. In the novel, there’s a potion called the Balsam of Fierabras. It’s supposed to be a miracle cure — a remedy capable of healing any wound.&lt;/p&gt;

&lt;p&gt;Quixote believes in it completely.&lt;/p&gt;

&lt;p&gt;When he finally prepares it and drinks it, the result is… less miraculous. He becomes violently ill. It does not heal him. It does not restore him. It very nearly breaks him.&lt;/p&gt;

&lt;p&gt;And yet, he insists it worked.&lt;/p&gt;

&lt;p&gt;What stuck with me about that scene isn’t that the balsam failed. It’s that the belief didn’t. The promise of a cure was so powerful that the evidence didn’t matter.&lt;/p&gt;

&lt;p&gt;Right now, AI is starting to feel like that kind of promise. Not as a tool — but as a cure. A way to move faster, reduce cost, replace effort, and somehow come out ahead without trade-offs.&lt;/p&gt;

&lt;p&gt;To be clear, I use AI. I think it’s useful. In some cases, it’s incredibly useful. It can accelerate workflows, help explore ideas, and remove friction from parts of the development process that used to take longer than they should have.&lt;/p&gt;

&lt;p&gt;I do worry about engineers being replaced. Not completely, not overnight — but enough to matter. Enough to change who gets to stay, who gets to grow, and who never gets a chance to start.&lt;/p&gt;

&lt;p&gt;But what worries me more is something harder to see. I worry about engineering being redefined as something smaller than it actually is. Because software development isn’t just output. It’s judgment. It’s trade-offs. It’s understanding why something should exist, not just how to build it.&lt;/p&gt;

&lt;p&gt;When we reduce engineering to output, tools that accelerate output start to look like complete solutions.&lt;/p&gt;

&lt;p&gt;I’ve already started seeing hints of this in the wild.&lt;/p&gt;

&lt;p&gt;Engineers running into problems with AI that aren’t really code problems at all — but still burning time and credits trying to solve them like they are.&lt;/p&gt;

&lt;p&gt;One example I saw recently stuck with me. An engineer had an AI stuck in a loop, trying to fix the same issue over and over again. Different approaches, different variations — sometimes even repeating the same solution.&lt;/p&gt;

&lt;p&gt;The problem wasn’t the code.&lt;/p&gt;

&lt;p&gt;It was the environment.&lt;/p&gt;

&lt;p&gt;One system was using a case-insensitive file system. The deployed environment was case-sensitive. A single character difference was enough to break everything.&lt;/p&gt;

&lt;p&gt;The AI never caught it.&lt;/p&gt;

&lt;p&gt;And that’s not a knock on AI — it’s just outside the kind of context it naturally understands.&lt;/p&gt;

&lt;p&gt;I’ve run into similar issues myself over the years. The kind of problems where experience matters. Where you’re not just reading code — you’re accounting for the messy, inconsistent, very human systems that code runs inside of.&lt;/p&gt;

&lt;p&gt;That’s the part that doesn’t translate cleanly.&lt;/p&gt;

&lt;p&gt;If we start removing experienced engineers from the equation — or replacing them with people who rely heavily on AI without that depth of experience — how often do we end up stuck in that loop?&lt;/p&gt;

&lt;p&gt;Burning time. Burning tokens. Trying solution after solution… when someone with the right context could spot the issue in minutes.&lt;/p&gt;

&lt;p&gt;Efficiency doesn’t just come from speed. It comes from knowing where to look. And that’s where I start to get uneasy. Because the danger isn’t that AI doesn’t work.&lt;/p&gt;

&lt;p&gt;The danger is believing it works without consequence.&lt;/p&gt;

&lt;p&gt;There’s another piece of this that I don’t hear talked about enough: what happens to the next generation of engineers.&lt;/p&gt;

&lt;p&gt;A lot of us didn’t learn this craft by writing perfect code the first time. We learned by struggling through problems. By debugging things that didn’t make sense. By following threads deep into systems until we finally understood what was actually happening.&lt;/p&gt;

&lt;p&gt;That process is slow. Sometimes frustrating. Occasionally painful. But it’s where the real skill comes from.&lt;/p&gt;

&lt;p&gt;If the day-to-day work of engineering shifts toward writing prompts and reviewing generated code, the skill curve changes. The barrier to producing code gets lower — which sounds like a win — but the opportunity to develop deeper understanding starts to shrink.&lt;/p&gt;

&lt;p&gt;And over time, that matters.&lt;/p&gt;

&lt;p&gt;Because troubleshooting is not a surface-level skill. It’s not something you pick up by reviewing code that already works. It’s something you earn by being lost, over and over again, until you aren’t anymore.&lt;/p&gt;

&lt;p&gt;If we reduce the number of engineers building systems from the ground up — if fewer people are forced to wrestle with complexity directly — we shouldn’t be surprised when deep troubleshooting ability becomes rare.&lt;/p&gt;

&lt;p&gt;Not gone. But smaller. Harder to find. Concentrated in fewer people.&lt;/p&gt;

&lt;p&gt;And that creates its own kind of fragility.&lt;/p&gt;

&lt;p&gt;Once decisions are made on the belief that we can do more with less — smaller teams, fewer experienced engineers, more reliance on generated output — the cost doesn’t show up immediately.&lt;/p&gt;

&lt;p&gt;It shows up later.&lt;/p&gt;

&lt;p&gt;In complexity. In fragility. In systems that no one fully understands anymore.&lt;/p&gt;

&lt;p&gt;Systems don’t stay healthy because they were generated quickly. They stay healthy because someone understands them deeply enough to take care of them.&lt;/p&gt;

&lt;p&gt;I don’t think this ends with engineering disappearing. But I do think it’s possible we create a gap. Companies optimize for smaller and smaller teams. More output per person. More reliance on generated code. On paper, it looks efficient. Maybe it even is — for a while.&lt;/p&gt;

&lt;p&gt;But over time, I can’t shake the feeling that we’re pushing toward a kind of critical mass. A point where the cost of all that generated output — in tokens, in credits, in complexity — starts to rival what it would have cost to simply have experienced engineers in the first place.&lt;/p&gt;

&lt;p&gt;And by the time that realization sets in, the landscape may have changed.&lt;/p&gt;

&lt;p&gt;Some of those engineers will have moved on. Not out of fear, but out of frustration. Burnout. Or simply because they saw the writing on the wall and chose something more stable.&lt;/p&gt;

&lt;p&gt;Others will still be here, but fewer. More spread out. Carrying more of the load.&lt;/p&gt;

&lt;p&gt;And the ones coming up behind them may not have had the same opportunities to learn the craft deeply. Not because they lacked ability, but because the environment around them changed.&lt;/p&gt;

&lt;p&gt;Fewer chances to struggle through problems. Fewer chances to build systems from the ground up. Fewer mentors with the time, the mandate, the desire — or the instinct — to teach.&lt;/p&gt;

&lt;p&gt;That’s the part I keep coming back to. Not the tools. Not the efficiency. But the long-term shape of the profession. &lt;/p&gt;

&lt;p&gt;Don Quixote didn’t just believe in the Balsam of Fierabras — he doubled down on it. Even when the results didn’t match the promise. &lt;/p&gt;

&lt;p&gt;I don’t think we’re there. Not yet. But I do think we’re at a point where it’s worth asking harder questions. &lt;/p&gt;

&lt;p&gt;Not just “can we do this faster?”&lt;/p&gt;

&lt;p&gt;But “what are we losing in the process?”&lt;/p&gt;

&lt;p&gt;Because if we’re not careful, we may eventually find ourselves trying to rebuild something we quietly let slip away — and realizing the people who knew how to do it are no longer around to ask.&lt;/p&gt;

&lt;p&gt;I’m not charging windmills here. Just trying to call it how I see it — and maybe ask a few questions before we all start drinking the balsam.&lt;/p&gt;

&lt;p&gt;CrossPosted: &lt;a href="https://www.linkedin.com/pulse/balsam-fierabras-promise-ai-micah-breedlove-eulse/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://medium.com/@druid628/the-balsam-of-fierabras-and-the-promise-of-ai-19ed0fe1a333" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Value of Value Objects in Symfony</title>
      <dc:creator>Micah Breedlove (druid628)</dc:creator>
      <pubDate>Tue, 11 Feb 2025 23:52:00 +0000</pubDate>
      <link>https://forem.com/druid628/the-value-of-value-objects-in-symfony-58a0</link>
      <guid>https://forem.com/druid628/the-value-of-value-objects-in-symfony-58a0</guid>
      <description>&lt;p&gt;Recently, I was working on an article - similar to this one - focused on Domain-Driven Design (DDD) in Symfony. To illustrate the concepts, I spun up a demo project and brought in one of my commonly used libraries, which includes a collection of data type objects.&lt;br&gt;
That's when I had an epiphany: my primitive and composite data-type objects were essentially just Value Objects with a different name. This realization led me to shift the focus of my article to Value Objects - an essential but often overlooked concept outside of DDD.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Value Object?&lt;/strong&gt;&lt;br&gt;
At its core, a Value Object is exactly what it sounds like - an object that encapsulates a value. But why use them? While there's no single reason that will blow your socks off, they offer clear advantages in making code more expressive, maintainable, and domain-focused.&lt;br&gt;
That said, not every value in your entity needs to become a standalone Value Object. Overusing them can lead to unnecessary complexity - like the "array_map() Design Pattern." 😀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Practical Example: Email as a Value Object&lt;/strong&gt;&lt;br&gt;
Consider an entity with a field that you frequently perform operations on - an email address, for example. Instead of keeping it as a simple string, we can define a dedicated Value Object that encapsulates its behavior and logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Creating the Email Value Object&lt;/strong&gt;&lt;br&gt;
For simplicity, I created it in App\Entity\Embeddable:&lt;/p&gt;

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

&lt;p&gt;If you want to create your Value Objects outside of App\Entity then you will need to make modifications to your Doctrine ORM mapping configuration inside &lt;code&gt;config/packages/doctrine.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Embedding it in the Contact Entity&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;By leveraging the Embedded attribute (&lt;code&gt;Doctrine\ORM\Mapping\Embedded&lt;/code&gt;), we seamlessly integrate the Value Object within our entity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this useful?&lt;/strong&gt;&lt;br&gt;
Now that we've structured our Email as a Value Object, extracting specific parts - like the user, domain, or TLD - becomes much cleaner, as the logic is all contained within the Value Object:&lt;/p&gt;

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

&lt;p&gt;Now when dealing with your Contact object you can execute the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblf8rgezz7cly6h8s56v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblf8rgezz7cly6h8s56v.png" alt="Example of contact entity getting the domain for an email via Value Object method" width="800" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By encapsulating logic within a Value Object, we reduce duplication, improve code readability, and reinforce domain concepts within our applications.&lt;/p&gt;

&lt;p&gt;How do you approach Value Objects in your projects? Do you find them useful, or do they add unnecessary complexity?&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>php</category>
      <category>doctrine</category>
    </item>
  </channel>
</rss>
