<?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: Adam - The Developer ✨</title>
    <description>The latest articles on DEV Community by Adam - The Developer ✨ (@adamthedeveloper).</description>
    <link>https://dev.to/adamthedeveloper</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%2F1002243%2F2c616028-c3f5-4013-87d5-2815b28aa1f3.jpeg</url>
      <title>DEV Community: Adam - The Developer ✨</title>
      <link>https://dev.to/adamthedeveloper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adamthedeveloper"/>
    <language>en</language>
    <item>
      <title>Redis vs Dragonfly: A Hands-On Comparison</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Tue, 06 Oct 2026 09:20:43 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/redis-vs-dragonfly-a-hands-on-comparison-22ko</link>
      <guid>https://dev.to/adamthedeveloper/redis-vs-dragonfly-a-hands-on-comparison-22ko</guid>
      <description>&lt;p&gt;I have used Redis on almost every backend project I can remember. Caching, sessions, rate limiting, queues, the occasional bit of temporary state that felt too awkward to put in Postgres. At some point it stopped being a decision and became a default.&lt;/p&gt;

&lt;p&gt;About 3 months ago, I came across Dragonfly, which keeps the Redis API but is built differently underneath. I was curious enough to run both on the same workload and see what happened. This post covers what I saw, what I learned about why each one works the way it does, and where I think each makes sense.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This is not a sponsored post, and I have no affiliation with DragonflyDB. I wrote it because I was genuinely impressed by Dragonfly when I tried it. It performed very well for me. Whether it is the right choice still depends on your workload, so treat this as a guide for evaluating it, not a recommendation to switch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A quick note on what Redis is
&lt;/h2&gt;

&lt;p&gt;Calling Redis a cache undersells it. Over the years I have used it for sessions, counters, distributed locks, leaderboards with sorted sets, pub/sub, streams, and plain queues. The reason it works so well for all of that is that it gives you useful data structures with very cheap operations. A command is usually a single call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET user:123
INCR rate_limit:user:123
ZADD leaderboard 9000 adam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no SQL to parse and no query planner involved. That simplicity is a big part of why it is fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, why is Redis single-threaded anyway?
&lt;/h2&gt;

&lt;p&gt;Redis executes commands on one main thread, and this tends to get described as a limitation. I think that undersells the original design.&lt;/p&gt;

&lt;p&gt;Redis was created in 2009. Servers back then typically had a handful of cores at most, and the main goal was a datastore that was simple, predictable, and very fast on that hardware. A single execution thread gave it several things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No locks around data structures.&lt;/li&gt;
&lt;li&gt;Commands run one at a time, so atomicity is easy to reason about.&lt;/li&gt;
&lt;li&gt;Behavior is predictable, which makes it easier to debug.&lt;/li&gt;
&lt;li&gt;The codebase stays small and understandable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given the hardware of the time, this was a sensible design, and it still holds up well. Node.js is a good comparison: being mostly single-threaded does not make it slow, and it avoids a whole category of concurrency bugs.&lt;/p&gt;

&lt;p&gt;Redis has also kept evolving. It has supported I/O threading since version 6, and Redis 8 improved that further. Networking work can be spread across threads while command execution stays serialized, so the core model is preserved and the obvious bottleneck is reduced.&lt;/p&gt;

&lt;p&gt;Redis is a good design for the constraints it was built around. Those constraints have shifted since then, which is where Dragonfly comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Dragonfly does differently
&lt;/h2&gt;

&lt;p&gt;Dragonfly started from a different assumption: servers now have 16, 32, or more cores, and a single execution thread leaves most of them idle. It uses a multi-threaded, shared-nothing architecture. The dataset is split into shards, each shard is owned by one thread, and requests are routed to the thread that owns the data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redis

  Requests --&amp;gt; [ Main thread ] --&amp;gt; [ Data ]


Dragonfly

  Requests --&amp;gt; [ Thread 1 ] --&amp;gt; [ Shard A ]
           --&amp;gt; [ Thread 2 ] --&amp;gt; [ Shard B ]
           --&amp;gt; [ Thread 3 ] --&amp;gt; [ Shard C ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real implementation is more involved, especially for operations that touch several shards, but that is the idea. The gain comes from spreading work across every core on the machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it out
&lt;/h2&gt;

&lt;p&gt;The first thing I liked was how little effort it took to start. Dragonfly speaks the Redis protocol, so I pointed an existing connection string at it and my client libraries worked without changes.&lt;/p&gt;

&lt;p&gt;I didn't run some elaborate benchmark suite for this article. Honestly, you should benchmark it against &lt;strong&gt;your own workload&lt;/strong&gt; anyway. A synthetic &lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;SET&lt;/code&gt; benchmark tells you very little about whether Dragonfly will improve your actual application.&lt;/p&gt;

&lt;p&gt;The interesting part is what happens when your Redis workload becomes CPU or memory bound. That's where Dragonfly's multi-threaded architecture and memory efficiency start to matter.&lt;/p&gt;

&lt;p&gt;If your Redis instance is barely using one core and isn't under memory pressure, there may be little reason to switch.&lt;/p&gt;

&lt;p&gt;And that's fine. Not every piece of infrastructure needs to be replaced just because something newer exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Dragonfly is still rough
&lt;/h2&gt;

&lt;p&gt;Once the initial excitement wore off, I went through the Dragonfly docs and GitHub issues to see what could go wrong. Here is what stood out. None of it ruled Dragonfly out for me, and all of it is worth knowing before you put real data on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistence is snapshot-only
&lt;/h3&gt;

&lt;p&gt;Redis gives you RDB snapshots and AOF logging. Dragonfly's docs say plainly that &lt;a href="https://dragonflydb.io/docs/managing-dragonfly/aof" rel="noopener noreferrer"&gt;AOF is not supported&lt;/a&gt;, and the stated reason is a lack of high-priority demand from the community. If you need every acknowledged write to survive a crash, that matters.&lt;/p&gt;

&lt;p&gt;Snapshots have had their own problems for some users. One &lt;a href="https://github.com/dragonflydb/dragonfly/issues/4257" rel="noopener noreferrer"&gt;GitHub issue&lt;/a&gt; describes snapshots to S3 silently stopping for a week, after which a crash restored week-old data. It was closed as a duplicate of another issue, and I could not tell from the thread what the root cause was, so treat it as one user's report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lua scripts need a closer look
&lt;/h3&gt;

&lt;p&gt;Dragonfly uses &lt;a href="https://www.dragonflydb.io/docs/managing-dragonfly/scripting" rel="noopener noreferrer"&gt;Lua 5.4&lt;/a&gt;, while &lt;a href="https://dragonflydb.io/blog/running-bullmq-with-dragonfly-part-1-announcement" rel="noopener noreferrer"&gt;Redis uses Lua 5.1&lt;/a&gt;. Most scripts will run fine, but a language version change is worth testing for.&lt;/p&gt;

&lt;p&gt;The bigger difference is how keys are handled. By default, Dragonfly rejects scripts that touch keys they did not declare, and returns an error saying so. You can allow it with the &lt;code&gt;allow-undeclared-keys&lt;/code&gt; flag, but the docs warn that &lt;a href="https://www.dragonflydb.io/docs/managing-dragonfly/scripting" rel="noopener noreferrer"&gt;Dragonfly then has to stop all other operations while the script runs&lt;/a&gt;. Scripts that build key names dynamically are the ones to watch if you migrate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-key operations work, with a coordination cost
&lt;/h3&gt;

&lt;p&gt;I expected multi-key commands to be a weak spot, since the data lives on different threads. Dragonfly handles them with a transaction framework based on the VLL algorithm, and the project says this gives &lt;a href="https://github.com/dragonflydb/dragonfly" rel="noopener noreferrer"&gt;atomic multi-key operations without mutexes or spinlocks&lt;/a&gt;. So atomicity holds.&lt;/p&gt;

&lt;p&gt;The cost is coordination. In the team's own &lt;a href="https://dragonflydb.io/blog/transactions-in-dragonfly" rel="noopener noreferrer"&gt;write-up on transactions&lt;/a&gt;, multi-key operations take a shard lock, and other transactions on that shard wait while it is held. Single-threaded Redis does not pay this cost. I did not measure how much it matters, so if your workload leans on large multi-key commands or scripts, test that path specifically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clustering works differently
&lt;/h3&gt;

&lt;p&gt;Dragonfly's &lt;a href="https://dragonflydb.io/docs/managing-dragonfly/cluster-mode" rel="noopener noreferrer"&gt;cluster mode&lt;/a&gt; is built to look the same to Redis Cluster clients, but it does not self-manage the way Redis Cluster does. In Redis Cluster, nodes talk to each other to discover cluster state. Dragonfly Cluster uses &lt;a href="https://www.dragonflydb.io/blog/a-preview-of-dragonfly-cluster" rel="noopener noreferrer"&gt;centralized management&lt;/a&gt;, so you set it up and operate it differently. If your plan is to run dozens of nodes, Redis Cluster has the longer track record.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modules
&lt;/h3&gt;

&lt;p&gt;Dragonfly's own comparison guide notes that &lt;a href="https://www.dragonflydb.io/guides/dragonfly-vs-redis-for-real-time-feature-stores-an-in-memory-database-comparison" rel="noopener noreferrer"&gt;some advanced Redis modules may not have full compatibility yet&lt;/a&gt;. If your stack depends on modules such as search or time series, check your exact use case before planning a migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bugs
&lt;/h3&gt;

&lt;p&gt;Dragonfly is a younger project and it shows in the issue tracker. A few examples from the &lt;a href="https://github.com/dragonflydb/dragonfly/releases" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;, all listed as fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A crash on the master when an older replica reconnected to a promoted master (#7491).&lt;/li&gt;
&lt;li&gt;Replication divergence with hash field expiry commands like &lt;code&gt;HEXPIRE&lt;/code&gt; and &lt;code&gt;HSETEX&lt;/code&gt; on lazily expired fields (#7948).&lt;/li&gt;
&lt;li&gt;A crash when Lua scripts called &lt;code&gt;GET&lt;/code&gt; on large string values (#7934).&lt;/li&gt;
&lt;li&gt;A cross-thread data race in command squashing (#7927).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also open or unresolved user reports, such as a &lt;a href="https://github.com/dragonflydb/dragonfly/issues/4811" rel="noopener noreferrer"&gt;SIGSEGV crash during load testing&lt;/a&gt; on a 31 GiB dataset in v1.28.0, which showed up on a replica running &lt;code&gt;BGSAVE&lt;/code&gt; and on a newly promoted master during full resyncs. The reporter could not reproduce it on demand.&lt;/p&gt;

&lt;p&gt;Every database has a bug list and Redis does too. The point is that Dragonfly's list is newer and shorter on history, and a lot of the replication and persistence paths are where the issues cluster. That is worth keeping in mind if this is your primary datastore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Redis still comes out ahead
&lt;/h2&gt;

&lt;p&gt;None of that makes Redis the worse choice in general. After using both, here is where I think Redis still wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maturity.&lt;/strong&gt; Redis has years of production use behind it, and the failure modes are well understood. When something breaks at 3 AM, there is a huge body of knowledge to lean on. Dragonfly is still building that history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durability options.&lt;/strong&gt; AOF, RDB, and all the configuration around them are well tested. If you need stronger durability guarantees than periodic snapshots, Redis gives you more to work with today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecosystem.&lt;/strong&gt; Client libraries, framework integrations, monitoring tools, managed services on every major cloud, local dev setups, CI containers. All of it already supports Redis, and your team almost certainly knows it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavior you can predict.&lt;/strong&gt; Dragonfly is compatible with the protocol and most commands, but compatibility does not guarantee identical behavior. Scripting, clustering, persistence, and replication are the areas above where it differs. Test the specific commands you rely on before trusting it with anything important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enough headroom.&lt;/strong&gt; If your Redis instance sits at 8% CPU and your app spends most of its time waiting on Postgres, Dragonfly will not make your app noticeably faster. A benchmark chart does not tell you what is limiting your system. Profiling does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would choose
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I would stay with Redis when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the workload is comfortably within what Redis handles&lt;/li&gt;
&lt;li&gt;the team already operates it and knows it well&lt;/li&gt;
&lt;li&gt;I depend on a specific Redis feature, module, or managed service&lt;/li&gt;
&lt;li&gt;I need AOF-level durability&lt;/li&gt;
&lt;li&gt;familiarity is worth more than extra hardware efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I would evaluate Dragonfly when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the workload is CPU-heavy&lt;/li&gt;
&lt;li&gt;I am running large multi-core machines&lt;/li&gt;
&lt;li&gt;memory cost matters&lt;/li&gt;
&lt;li&gt;Redis Cluster complexity is becoming a burden&lt;/li&gt;
&lt;li&gt;vertical scaling looks more attractive than adding nodes&lt;/li&gt;
&lt;li&gt;snapshot-based persistence is acceptable for the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replacing something that works has a cost, so it needs a measurable reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ending
&lt;/h2&gt;

&lt;p&gt;I don't think Dragonfly makes Redis obsolete. And I don't think Redis being older makes it a bad choice either.&lt;/p&gt;

&lt;p&gt;They are solving a similar problem with different architectural decisions. Redis optimized heavily around simplicity and predictable command execution. Dragonfly is taking a different approach and making much better use of the hardware we have today.&lt;/p&gt;

&lt;p&gt;That's what I found interesting about it.&lt;/p&gt;

&lt;p&gt;The question isn't really which one is better. It's &lt;strong&gt;why was it built this way in the first place?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you understand that, a lot of the design decisions stop looking strange.&lt;/p&gt;

&lt;p&gt;If Redis is working fine for you, keep using it. If you're starting to hit CPU, memory, or scaling limits, Dragonfly is absolutely worth putting next to it and seeing what happens with your workload.&lt;/p&gt;

&lt;p&gt;Sometimes the best way to understand a piece of infrastructure is to stop reading benchmarks and just ask what problem its architecture was trying to solve.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>programming</category>
      <category>architecture</category>
      <category>performance</category>
    </item>
    <item>
      <title>Things I Used to Be Excited About as a Kid, But Not Anymore</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Sun, 04 Oct 2026 10:47:53 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/things-i-used-to-be-excited-about-as-a-kid-but-not-anymore-24p5</link>
      <guid>https://dev.to/adamthedeveloper/things-i-used-to-be-excited-about-as-a-kid-but-not-anymore-24p5</guid>
      <description>&lt;p&gt;Hi guys! It's been, what, two weeks now since I last wrote something, I guess.&lt;/p&gt;

&lt;p&gt;Honestly, I haven't really thought of much to write about lately. I just joined a new company (a bank), and at the same time, I've been debating whether this week's article should be about something completely random like this, or whether I should write another one about Piper.&lt;/p&gt;

&lt;p&gt;I decided to go with this one. I know it's a bit unconventional.&lt;/p&gt;

&lt;p&gt;Writing about Piper after fixing around 40 DDL &amp;amp; IR related bugs is exhausting. I love the project, but man, I need to get away from it for a while. I don't even think it's a hobby project anymore.&lt;/p&gt;

&lt;p&gt;Not giving up on it. Not even close.&lt;/p&gt;

&lt;p&gt;I just need to breathe. Breatheeeee.&lt;/p&gt;

&lt;p&gt;Anyway, let's start!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Getting a phone call, video call and text
&lt;/h2&gt;

&lt;p&gt;I don't know, maybe it's just me? A lot of adults still seem genuinely happy when they get a phone call.&lt;/p&gt;

&lt;p&gt;Context matters, obviously. I'd be pretty happy if someone called me to tell me I just won the lottery jackpot. But realistically, that's probably not happening.&lt;/p&gt;

&lt;p&gt;I'm not necessarily an introvert either.&lt;/p&gt;

&lt;p&gt;When I was a kid, getting a phone call, a text, or even a video call meant someone wanted to talk to you. Maybe it was your aunt, uncle, grandma, or grandpa. And kid me was probably 30% happier whenever the phone rang, regardless of who was on the other end.&lt;/p&gt;

&lt;p&gt;Now?&lt;/p&gt;

&lt;p&gt;I usually forget to charge my phone.&lt;/p&gt;

&lt;p&gt;Making phone calls isn't something I look forward to anymore. Neither are random texts or video calls, because when someone reaches out, it's usually because they want something from me. "Hey Adam, can I have this?" "Hey Adam, can you do that?" No one ever says, "Hey Adam, how are you? I heard you haven't been feeling well. Can I interest you in a no-strings-attached opportunity to earn a million dollars?"&lt;/p&gt;

&lt;p&gt;But I answer anyway, because, well... I'm a salaried adult.&lt;/p&gt;

&lt;p&gt;Apparently, getting paid every month comes with the hidden requirement of occasionally answering phone calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Staying up late
&lt;/h2&gt;

&lt;p&gt;Staying up late back then, to me, meant I was a good boy. Good enough that I was allowed to stay up with the adults.&lt;/p&gt;

&lt;p&gt;I thought adults were living the best life ever. They got to stay up late with no rules, while I had to go to bed early.&lt;/p&gt;

&lt;p&gt;What I didn't know was that my dad had work to do on his computer, while my mom was staying up with her sisters, making pastries to prepare for our early-dawn customers.&lt;/p&gt;

&lt;p&gt;I thought they were staying up because they were adults.&lt;/p&gt;

&lt;p&gt;Turns out, they were just busy. or to make it harsher, they had no choice. they were the source of income.&lt;/p&gt;

&lt;p&gt;Big me now would be happy out of this world if he got tucked into bed by 9:00pm, Netflix on, enjoying that post-shower coolness.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Waking up early on weekends
&lt;/h2&gt;

&lt;p&gt;Kid me woke up early on purpose.&lt;/p&gt;

&lt;p&gt;No alarm, no one shaking me awake. I'd just open my eyes, sneak into the living room, and turn the TV on with the volume low enough that only dogs could hear. Cartoon Network in the early 2010s was my whole weekend.&lt;/p&gt;

&lt;p&gt;We also had a PS3, but it lived in my dad's closet, locked up, with the key on him at all times. He knew me too well.&lt;/p&gt;

&lt;p&gt;And here's the thing: the best ones always aired early in the morning. Chowder. Flapjack. It was like the channel knew only the dedicated ones would be awake. If you slept in, you got whatever was left, usually a Tom &amp;amp; Jerry episode I'd seen more times than I can count digits of pi.&lt;/p&gt;

&lt;p&gt;Now? I still wake up early. Maybe it's the trauma of my alarm clock. Maybe it's the kid in me, still hoping for a good cartoon. Or maybe my body is adjusting to adulthood, and I still don't feel like it. Some times I'd pull a 10 - 12 hours sleep as well.&lt;/p&gt;

&lt;p&gt;8:00am on a Saturday, wide awake, no TV, and there's nothing waiting for me but laundry, dishes, and a phone full of notifications from people who "just have a quick question." (See #1.)&lt;/p&gt;

&lt;p&gt;The funny part is that kid me wanted to stay up late (#2) and wake up early at the same time, and somehow had the energy for both. Adult me has the freedom to do either, and wants neither.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Waiting for things to load
&lt;/h2&gt;

&lt;p&gt;Kid me had the patience of a monk.&lt;/p&gt;

&lt;p&gt;I grew up on YouTube with terrible internet. Pressing play meant watching that little circle spin for what felt like a geological era, then getting ten seconds of video before it buffered again. My strategy was to pause it, let the gray bar crawl forward, go do something else, and come back when enough of the video had loaded. Not once did I think, "this is unacceptable."&lt;/p&gt;

&lt;p&gt;Games were the same. My dad introduced 12-year-old me to GTA Vice City, which is a wild thing to hand a kid, especially from the same man who locked the PS3 in a closet. (See #3. The man had a system, apparently.) Nothing about it was instant. Installing, loading, waiting. I sat there and waited, because the reward was worth it.&lt;/p&gt;

&lt;p&gt;Back then, I'd watch a progress bar like it was a movie.&lt;/p&gt;

&lt;p&gt;Now?&lt;/p&gt;

&lt;p&gt;Everything loads instantly, and I get impatient after two seconds. A video takes three seconds to start and I'm already checking if the wifi is down. A page hesitates and I close the tab like it personally insulted me.&lt;/p&gt;

&lt;p&gt;I went from waiting twenty minutes for a video to rage-quitting a spinner. Somewhere along the way, faster internet made me slower at being patient.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Wanting to grow up
&lt;/h2&gt;

&lt;p&gt;Kid me couldn't wait to be an adult.&lt;/p&gt;

&lt;p&gt;Every time someone asked what I wanted, the answer was basically "to be older." I wanted to stay up late with the grown-ups. I wanted my own money, and nobody telling me when to sleep, what to watch, or which closet the PS3 was locked in. Adults looked like they had all the answers and all the keys.&lt;/p&gt;

&lt;p&gt;Now I'm old enough, and I'd like to speak to whoever was in charge of the brochure.&lt;/p&gt;

&lt;p&gt;Nobody mentioned that "freedom" comes with a calendar full of deadlines. Or that the phone I couldn't wait to own would mostly ring with people who need something (#1). Or that the late nights I envied were just people working while the rest of the house slept (#2). Or that I'd wake up at 6:00am on a Saturday with no cartoons to wake up for (#3). Or that I'd get impatient with a two-second loading screen after growing up on buffering (#4).&lt;/p&gt;

&lt;p&gt;and somewhere in all of this, I realized the adults I looked up to weren't living the best life ever. They were just carrying a lot, quietly, so the kids could stay excited about things. My parents did it with pastries and late nights. My relatives did it with envelopes. My dad did it with a very strategic closet key.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now?
&lt;/h2&gt;

&lt;p&gt;What do you mean, what now? There's nothing you can do about it. I traded the state of worrying about nothing for an adult life, and while it's not the most pleasant experience of all, kid me doesn't get to say, "I wanna take a dirt bike and ride it across a Cambodian jungle, then eat junk food after I'm done."&lt;/p&gt;

&lt;p&gt;Adult me can. No one's locking that in a closet.&lt;/p&gt;

&lt;p&gt;Sure, the phone still rings with people who need something. I still stay up late because I have to, and I still wake up early with no cartoons waiting. But I also have the keys now. Every closet in the house is mine to open, and nobody can tell me not to.&lt;/p&gt;

&lt;p&gt;So maybe the excitement didn't disappear. Maybe it just moved. It used to be in a Saturday morning cartoon, and now it's in the things I get to choose.&lt;/p&gt;

&lt;p&gt;Live. Take risks. You never truly know you're living the moment while you're in it. Kid me didn't know either. He was too busy watching a buffering bar like it was a movie.&lt;/p&gt;

&lt;p&gt;Anyway, that's it for this one. Now if you'll excuse me, I need to go charge my phone.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>discuss</category>
      <category>nostalgia</category>
      <category>career</category>
    </item>
    <item>
      <title>Resilient and Battle-Tested Are Not the Same Word</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Tue, 15 Sep 2026 11:16:16 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/resilient-and-battle-tested-are-not-the-same-word-589o</link>
      <guid>https://dev.to/adamthedeveloper/resilient-and-battle-tested-are-not-the-same-word-589o</guid>
      <description>&lt;h2&gt;
  
  
  Unnecessary information that's safe to ignore
&lt;/h2&gt;

&lt;p&gt;Hi. So I've been away for a couple of weeks. I was up in the remote highlands of Cambodia's Mondulkiri province, where it's cold, quiet, and surrounded by mountains, jungles, and elephants.&lt;/p&gt;

&lt;p&gt;It was so relaxing that coming back to the city has made me unnecessarily toxic and grumpy. Imagine spending a few days surrounded byone of mother nature's greatest creations, only to return to traffic, emails, deadlines, and the unfortunate realization that I'm an adult with a job and people to manage.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq4zdc6fhm3o3i4zycud0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq4zdc6fhm3o3i4zycud0.png" alt="PIDA Resort" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also trekked through remote jungle, mountains, waterfalls, streams, and rocks for 17km in a pair of Crocs with the indigenous people, by the way. I survived and I don't recommend it. I did it because I forgot to bring proper trekking shoes. That's it, No deeper meaning.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sle6jcpgdcmfrb7ge4e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sle6jcpgdcmfrb7ge4e.png" alt="Crocs" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyway, while I haven't been completely off the internet, I've been reading a lot of content about people building and shipping things aggressively with AI, then immediately labeling them "production-grade" and "battle-tested."&lt;/p&gt;

&lt;p&gt;And maybe it's because I just spent 17km learning what the word "survived" actually feels like, but...&lt;/p&gt;

&lt;p&gt;What???&lt;/p&gt;

&lt;p&gt;Slow down, big man.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Demo Is Not a Battlefield
&lt;/h2&gt;

&lt;p&gt;AI tools have made it faster than ever to go from an idea to a working app, and honestly, that's a great thing. Having more people building things is a good thing.&lt;/p&gt;

&lt;p&gt;And if you know me, you know I'm not here to do the whole "real engineers write everything by hand" bit. Sure, that mindset is still somewhat embedded in my identity as a developer, but I try to keep an open mind. Tools change, the way we build changes, and I'm perfectly fine with that.&lt;/p&gt;

&lt;p&gt;But there's a word being attached to a lot of these projects that implies a level of reliability you simply can't get from "I shipped it and a few people liked it."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production-grade.&lt;/strong&gt; Or its cousin, &lt;strong&gt;battle-tested.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These aren't just your Uncle Joe's enthusiastic adjectives that you throw around because something looks cool, not a vibe. They're empirical claims about what a system has survived — and surviving a demo is not the same as surviving Tuesday.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different claims, constantly conflated
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Complete, functional, and resilient"&lt;/strong&gt; means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The features work as specified&lt;/li&gt;
&lt;li&gt;It handles the errors you thought to handle (this clause is doing a lot of work)&lt;/li&gt;
&lt;li&gt;It doesn't crash under normal use&lt;/li&gt;
&lt;li&gt;It has decent test coverage&lt;/li&gt;
&lt;li&gt;It looks done in a demo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a real, valuable milestone and with modern tools, they get you here faster than ever. Celebrate it. Put it on the README. Just maybe don't reach for the war metaphors yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Production-grade" and "battle-tested"&lt;/strong&gt; are a different axis entirely. Not "more polished" or "fewer bugs." They're about exposure to conditions you can't fully anticipate or simulate. &lt;/p&gt;

&lt;p&gt;A few dimensions people underestimate:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Failure modes nobody designed for
&lt;/h3&gt;

&lt;p&gt;Resilient code handles the errors you anticipated. Battle-tested code has lived through the ones nobody put on it, a dependency that silently returns malformed data instead of erroring, clock skew between servers, a queue backing up 10,000x during a spike, a connection pool exhausted by one slow query three services upstream.&lt;/p&gt;

&lt;p&gt;Nobody designs for "the third-party API started returning 200 with garbage in it." You find that out the hard way, usually at an hour that makes the logs feel personal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Observability under duress
&lt;/h3&gt;

&lt;p&gt;When something breaks at 3 am, can an on-call engineer figure out &lt;em&gt;what's happening&lt;/em&gt; from logs, metrics, and traces or does someone have to SSH in and guess? Which is a spiritual experience, btw. not an architecture.&lt;/p&gt;

&lt;p&gt;Logging that satisfies a code review and logging that lets you debug a live incident are not the same thing. You usually can't tell which one you have until the incident happens. The incident is happy to tell you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Graceful degradation, not collapse
&lt;/h3&gt;

&lt;p&gt;When a downstream service dies, does your app fall over completely, or degrade — cached data, reduced functionality, queued retries? Designing for partial failure is invisible work. Almost nobody does it until they've been burned by not doing it. pretty expensive curriculum if you ask me.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Concurrency and scale edge cases
&lt;/h3&gt;

&lt;p&gt;Imagine a payment endpoint that checks whether a transaction has already been processed before crediting an account. Looks safe enough.&lt;/p&gt;

&lt;p&gt;Then the provider retries the same webhook twice, milliseconds apart. Both requests check the database, both see "not processed," and both credit the account.&lt;/p&gt;

&lt;p&gt;Your tests passed. Staging was fine. Production was fine for months. Then one unlucky retry turns a race condition into a real financial bug.&lt;/p&gt;

&lt;p&gt;That's the kind of failure that doesn't show up until the system is under conditions you didn't anticipate.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Exposure to abuse, not just correctness
&lt;/h3&gt;

&lt;p&gt;Functional code handles legitimate input. Battle-tested code has been prodded, rate limits tested, auth edges probed, injection vectors thrown at it, resources hammered. This isn't something you test for once. It's sanded down over actual incidents.&lt;/p&gt;

&lt;p&gt;Friendly users do not do this. Friendly users say "nice UI" and close the tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Operational maturity
&lt;/h3&gt;

&lt;p&gt;Zero-downtime deploys. Safe rollbacks. Migrations that don't lock the table for 40 minutes while the app quietly suffocates. These are organizational capabilities as much as code capabilities, and they take time and infrastructure history to build up, they don't show up in a codebase on day one no matter how clean the architecture diagram looks.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. A record of having been wrong
&lt;/h3&gt;

&lt;p&gt;This is the literal meaning of "battle-tested": it has failed in production before, someone fixed it, and there's a postmortem, a monitor, or a regression test that exists &lt;em&gt;because of that specific scar&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A brand-new system — however well-written — hasn't accumulated this yet. There is no "generate scars" button.&lt;/p&gt;

&lt;h2&gt;
  
  
  They're not a ladder
&lt;/h2&gt;

&lt;p&gt;Easy to read all of this as a sequence: first you make it resilient, then time makes it battle-tested. That's tidy. It's also wrong.&lt;/p&gt;

&lt;p&gt;You can have code that is battle-tested and not resilient. Years in production. Real users, real load, real incidents. It works perfectly, until an unexpected external API goes down, and the whole system falls over because nobody ever designed for that. The scars are real. The fault tolerance is not. Survival is not the same as a plan.&lt;/p&gt;

&lt;p&gt;You can also have code that is resilient and not battle-tested. Fresh deploy. Timeouts, retries, circuit breakers, cached fallbacks, the whole poster. Excellent fault-tolerant architecture. It has not yet faced real-world traffic. The design is a hypothesis. A very well-written hypothesis. Still a hypothesis.&lt;/p&gt;

&lt;p&gt;One is a history while the other is a design. You want both and you don't get to borrow the word for one because you have the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the distinction is worth defending
&lt;/h2&gt;

&lt;p&gt;Building was always the easy part of the job — the visible 20% you can show in a demo. The other 80% is judgment: knowing which design choices will quietly rot in eight months, knowing when &lt;em&gt;not&lt;/em&gt; to build something, reading a system that's been touched or contaminated by many hands and understanding why it looks the way it does, estimating honestly, responding well when production is on fire. None of that shows up in a working prototype. It only shows up after time, real users, real failures, and a few scars.&lt;/p&gt;

&lt;p&gt;And none of this means you should undersell a functional, well-tested app. Call it well-engineered. Call it ready for early users. Those are good things. nothing wrong with that.&lt;/p&gt;

&lt;p&gt;"Battle-tested" is a different sentence. It requires the battle. Somewhere there's a team that's actually run something through years of incidents and hard-won fixes, and their "production-grade" deserves to mean something different from a weekend project's. The words still have to mean something, or they stop meaning anything.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Go Doesn't Force Clean Architecture. That's Your Job.</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Fri, 28 Aug 2026 09:17:32 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/go-doesnt-force-clean-architecture-thats-your-job-116</link>
      <guid>https://dev.to/adamthedeveloper/go-doesnt-force-clean-architecture-thats-your-job-116</guid>
      <description>&lt;p&gt;The criticism of this is everywhere. Open any Go thread long enough and someone will show up to perform the same ritual:&lt;/p&gt;

&lt;p&gt;"Go projects become messy. There's no framework to guide you. Nest, Django, Spring, they all tell you exactly where to put things. Go? It just says 'organize it somehow.'"&lt;/p&gt;

&lt;p&gt;It's a fair criticism. Go &lt;em&gt;is&lt;/em&gt; unusually permissive about structure. I just think blaming Go for a messy codebase is like blaming the empty document for the bad essay.&lt;/p&gt;

&lt;p&gt;I don't think Go encourages bad architecture but rather it exposes it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hell Is A Perfect Folder Structure??
&lt;/h2&gt;

&lt;p&gt;Ask a hundred Go developers where to put business logic and you'll get a hundred answers (and 200 opinions).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Should I use &lt;code&gt;internal/&lt;/code&gt;?"&lt;/li&gt;
&lt;li&gt;"Is everything supposed to live under &lt;code&gt;pkg/&lt;/code&gt;?"&lt;/li&gt;
&lt;li&gt;"Should I follow Clean Architecture?"&lt;/li&gt;
&lt;li&gt;"What about the &lt;code&gt;cmd/&lt;/code&gt; directory?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We spend so much time debating folder structures as if the arrangement of directories somehow determines code quality. As if renaming &lt;code&gt;utils/&lt;/code&gt; to &lt;code&gt;pkg/shared/&lt;/code&gt; is going to save us. God.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;folders don't create architecture. Dependencies do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can meticulously organize your project like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
  cmd/main.go
  internal/
    handler/
    service/
    repository/
  pkg/domain/
  pkg/utils/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And still write tightly coupled garbage. Handlers calling repositories directly. Services importing database drivers. Business logic mixed with HTTP concerns. Everything circular.&lt;/p&gt;

&lt;p&gt;Beautiful folders, though. Very organized looking on GitHub.&lt;/p&gt;

&lt;p&gt;There are better projects I've seen with just 5 packages, they just don't screenshot as well.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Is About Dependency Direction
&lt;/h2&gt;

&lt;p&gt;The architecture is about making intentional decisions about how code depends on other code.&lt;/p&gt;

&lt;p&gt;Have a look at this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Handler
    ↓
Business Service
    ↓
Data Repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't sacred because of folder names. It's valuable because of what it represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The handler &lt;em&gt;only&lt;/em&gt; knows how to translate HTTP&lt;/li&gt;
&lt;li&gt;The service &lt;em&gt;only&lt;/em&gt; knows business rules&lt;/li&gt;
&lt;li&gt;The repository &lt;em&gt;only&lt;/em&gt; knows how to fetch data&lt;/li&gt;
&lt;li&gt;Each layer depends on the layer below, never upward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That flow is intentional. If you reverse it, everything breaks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository
    ↓
Service
    ↓
Handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the repository needs to know about HTTP? Nice, you've invented a database driver that also speaks REST and I think it's also a cry for help.&lt;/p&gt;

&lt;p&gt;This flow works in a three-file project, a monolith, or a microservice with 50 packages. Go does not care how impressive your tree looks in the README.&lt;/p&gt;




&lt;h2&gt;
  
  
  Interfaces Belong to the Consumer
&lt;/h2&gt;

&lt;p&gt;This is the part where people coming from Java have a small identity crisis.&lt;/p&gt;

&lt;p&gt;In languages like Java, interfaces are typically defined alongside the implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// repository package&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PostgresUserRepository&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feels natural. For me, it was the default. The repository defines the contract, the implementation fulfills it, everyone goes home happy. Except the consumer, who now depends on an abstraction it didn't ask for, including &lt;code&gt;delete&lt;/code&gt; even though it only wanted &lt;code&gt;find&lt;/code&gt;. Very generous. Very unhelpful.&lt;/p&gt;

&lt;p&gt;Go flips this around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// service package&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UserFinder&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UserStorage&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UserService&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;finder&lt;/span&gt;  &lt;span class="n"&gt;UserFinder&lt;/span&gt;
    &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="n"&gt;UserStorage&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The consumer defines exactly what it needs. The implementation simply satisfies those interfaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;PostgresUserRepository&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;PostgresUserRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;PostgresUserRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The consumer owns the interface, not the implementation.&lt;/strong&gt; Don't define an interface for what you provide; define one for what you need.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UserService&lt;/code&gt; doesn't care whether its dependencies are backed by Postgres, Redis, a file, or an API. It asked for Find and Save. That's the whole relationship. Very healthy, honestly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Go Gives You Freedom
&lt;/h2&gt;

&lt;p&gt;Both a feature and a burden.&lt;/p&gt;

&lt;p&gt;Terrifying if you like to be told what to do. Freedom if you want to build thoughtfully. A trap if you thought "no framework" meant "no thinking."&lt;/p&gt;

&lt;p&gt;The tradeoff is: &lt;strong&gt;frameworks prevent bad decisions by restricting your choices&lt;/strong&gt;, or well, not really; you can still screw things up. The restriction is mostly psychological. Go makes you responsible for your choices, which is less comforting and more honest.&lt;/p&gt;

&lt;p&gt;That means your team can't hide behind "the framework made us do it." You can't blame poor architecture on Rails conventions. If your Go project is a mess, it's because your team made it that way. There's no framework to pin it on. That's the whole feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  Clean Architecture Isn't a Framework
&lt;/h2&gt;

&lt;p&gt;A common misconception I see constantly: someone reads a Clean Architecture blog post, copies the folder tree into their repo, and waits for the cleanliness to arrive. It does not arrive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd/
internal/
  application/
  domain/
  infrastructure/
  entity/
  repository/
  usecase/
pkg/
tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean Architecture is about &lt;strong&gt;keeping business rules independent from implementation details&lt;/strong&gt;. You can do that in three files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd/main.go
internal/
  service.go
  postgres.go
pkg/models.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As long as &lt;code&gt;service.go&lt;/code&gt; doesn't know about Postgres, business logic doesn't know about HTTP, and concrete implementations are swappable. That's it. You don't get extra architecture points for the folder named &lt;code&gt;usecase&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Simplicity Doesn't Mean Lack of Discipline
&lt;/h2&gt;

&lt;p&gt;Go lets you write less boilerplate but that doesn't mean less discipline. It means the discipline has to come from you, which is annoying, because boilerplate at least felt like progress, I know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clear package boundaries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every package should have a single, defensible purpose. Importing a package should make semantic sense: &lt;code&gt;import "user/service"&lt;/code&gt; says something. &lt;code&gt;import "user/pkg1/internal/common/helpers"&lt;/code&gt; says you gave up and started a junk drawer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal public APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Go, a capital letter exports. Think about what you export from each package. If you're exporting everything, you're not making choices. You're just shouting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency inversion where appropriate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This doesn't mean "use interfaces for everything." Premature abstraction is real. But when you have external dependencies (database, API, file system), invert them. Let the business logic define the interface the dependency must satisfy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small interfaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best interfaces in Go are two or three methods, max. An interface with ten methods is usually a hint that you're mixing concerns, or that you ported a Java interface and hoped nobody would notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code reviews focused on design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your standard code review checklist probably has: "tests?" "error handling?" "efficiency?" Add: "Does this dependency flow make sense? Is this the right abstraction?" Design is as important as correctness. Also easier to miss, because the tests still pass while the architecture quietly dies.&lt;/p&gt;




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

&lt;p&gt;Architecture doesn't live in a programming language. It lives in the decisions engineers make.&lt;/p&gt;

&lt;p&gt;Frameworks can enforce consistency. They can't enforce good judgment. Go just gives you fewer guardrails and assumes you'll use them.&lt;/p&gt;

&lt;p&gt;Sometimes that pays off spectacularly. Sometimes it leaves you debugging a mess when you should be sleeping.&lt;/p&gt;

&lt;p&gt;Either way, it's on you. That's not a bug in the language. That's the deal.&lt;/p&gt;

</description>
      <category>go</category>
      <category>architecture</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Portfolio Update, I Guess</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Wed, 26 Aug 2026 06:35:44 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/portfolio-update-i-guess-4ob3</link>
      <guid>https://dev.to/adamthedeveloper/portfolio-update-i-guess-4ob3</guid>
      <description>&lt;p&gt;This isn't my main piece for the week, it's more of a "contributes nothing to knowledge" kind of post.&lt;/p&gt;

&lt;p&gt;Last week I took another look at my portfolio and thought, "Hey, why not make this feel a bit more like me?" So I set out to give it a makeover, stuffed as much of my personality into it as I could, and et voilà, done.&lt;/p&gt;

&lt;p&gt;The old one was kinda too formal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I gave my portfolio a personality transplant. If you'd rather just look than read: &lt;a href="https://a-thedeveloper.vercel.app" rel="noopener noreferrer"&gt;a-thedeveloper.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rzq11abgqo4vwcj8o40.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rzq11abgqo4vwcj8o40.png" alt="Updated portfolio" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe / Tone Option
&lt;/h2&gt;

&lt;p&gt;By default, the professional option is enabled. But if you're not too sensitive and want to have a little fun, try toggling over to the unfiltered version of me, lol.&lt;/p&gt;

&lt;p&gt;I don't actually talk like that in real life anymore, but having grown up speaking English, that's pretty much how I sounded back in my teenage years. I was a grumpy teenager like everyone else, the difference is I was &lt;strong&gt;extra&lt;/strong&gt; grumpy compared to most. 😭 I also lost access to my Instagram account, so all of it is still sitting there, public, for anyone to see. Every day I hope that account just quietly gets deleted.&lt;/p&gt;

&lt;p&gt;And if you're wondering whether that same energy has been erased, nope, it's still very much here. I just keep it contained to appropriate contexts now, lol.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ntephjqr2mduwqwhrkw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ntephjqr2mduwqwhrkw.png" alt="Tone" width="414" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also found these while digging through my old microsoft drive, weird 16 year old me stuff. I actually said this in a debate, by the way. Can't remember if my team won that one or lost.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuglw1y2am7sxt4q4i7p.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuglw1y2am7sxt4q4i7p.png" alt="Debate opening" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cu9ct7l2vsm4r0qb1ic.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cu9ct7l2vsm4r0qb1ic.png" alt="absolutely unhinged" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Weather Options
&lt;/h2&gt;

&lt;p&gt;Kinda irrelevant to how it actually describes my portfolio, but I initially wanted to make &lt;strong&gt;rainy&lt;/strong&gt; the only option, because I'm a big fan of dark, gloomy, cloudy weather — the kind that makes England look like heaven to me. 😭&lt;/p&gt;

&lt;p&gt;Then I thought, &lt;em&gt;why not just have all of them?&lt;/em&gt; So now each weather option comes with its own falling elements based on the selection, plus music that I feel fits the atmosphere.&lt;/p&gt;

&lt;p&gt;Again, it doesn't really serve any practical purpose, but I think it's a nice little touch to have, haha.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fubhx4lcwsa7k8q2qio7h.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fubhx4lcwsa7k8q2qio7h.png" alt="Weather options" width="442" height="506"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rotyfp9650ip26hw482.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rotyfp9650ip26hw482.png" alt="Music Bar" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  DEV Writing Views with an API Key
&lt;/h2&gt;

&lt;p&gt;When I joined DEV in 2023, I saw the option to generate an API key. I had no idea what it was for and didn't bother checking the docs, I just assumed that to display your articles on your own site, you'd need one. Turns out: yes and no. DEV already gives you a public URL you can use to showcase your articles without any API key at all but they don't give you the views.&lt;/p&gt;

&lt;p&gt;I was browsing around and came across this &lt;a href="https://dev.to/ketanchavan/devto-api-fetch-public-private-data-effortlessly-1nba"&gt;article&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/ketanchavan"&gt;@ketanchavan&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;and I thought, ohhh, maybe it'd be nice to show view counts on the articles displayed on my portfolio too. So I did.&lt;/p&gt;

&lt;p&gt;With this block of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchFromUpstream&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DevToArticle&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEVTO_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DEVTO_API_KEY is not configured&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upstreamResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DEVTO_PUBLISHED_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;upstreamResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed to fetch dev articles (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;upstreamResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;upstreamResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;DevToArticlePayload&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;mapArticles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&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;I got this!!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzwqbg74zj5flshjasyb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzwqbg74zj5flshjasyb.png" alt="DEV articles" width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beautiful!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally, The Archives
&lt;/h2&gt;

&lt;p&gt;Of course I know version control, but it's way better when I can see all of them at once, in pictures.&lt;/p&gt;

&lt;p&gt;I've changed my portfolio's design multiple times over the years, ever since I first built one back in 2023, just two years into my professional career. Yeah, I already had a portfolio after landing my second job as a software engineer. Looking back, that's kinda crazy.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotetnwzhxdjzawo9gmfm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotetnwzhxdjzawo9gmfm.png" alt="Archives" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Greatness Is Forged by Limitation</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Wed, 19 Aug 2026 13:04:47 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/greatness-is-forged-by-limitation-e20</link>
      <guid>https://dev.to/adamthedeveloper/greatness-is-forged-by-limitation-e20</guid>
      <description>&lt;p&gt;Can't believe I spent 2 weeks writing this.&lt;/p&gt;

&lt;p&gt;Last week, I gave a talk at a Cursor community event about AI and how it's changing the way we build software. The event went great, and after the talk, quite a few people came up to me for 1:1 conversations.&lt;/p&gt;

&lt;p&gt;One particular guy caught my attention. He wasn't a technical person, but he asked me something interesting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"With so many tools and technologies available today, how do you even navigate all of this and pick the right ones?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He thought it must be overwhelming. Then he smiled and said that with so many options available, he hopes many great things be built.&lt;/p&gt;

&lt;p&gt;I thought about it for a second and smiled too, and before I could answer, he had to leave... but his question stuck with mi.&lt;/p&gt;

&lt;p&gt;A few days later, sitting in a library looking for something to read, I ran into an answer: &lt;em&gt;&lt;a href="https://www.amazon.com/UNIX-Network-Programming-Networking-Sockets/dp/013490012X" rel="noopener noreferrer"&gt;UNIX Network Programming&lt;/a&gt;&lt;/em&gt; by W. Richard Stevens. (Great book btw, give it a read!)&lt;/p&gt;

&lt;p&gt;90s tech, limited memory, limited processing power, limited bandwidth and limited tooling... etc.&lt;/p&gt;

&lt;p&gt;Yet somehow, we got things like UNIX, TCP/IP, early operating systems, incredible mathematical breakthroughs, massive engineering projects, and some of the most elegant pieces of technology ever built.&lt;/p&gt;

&lt;p&gt;It made me wonder:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the things that limited us were also the things that forced us to become better?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;What if greatness isn't always created by having more, but by being forced to do more with less?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The guy assumed more tools meant a better shot at greatness, but the book in my hands was proof of the opposite.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paradox of Limitation
&lt;/h2&gt;

&lt;p&gt;I believe there's a reason having less can sometimes make us better.&lt;/p&gt;

&lt;p&gt;We usually think of limitations as something to overcome: less money, less time, fewer resources, less knowledge. All of it standing between us and what we want to achieve.&lt;/p&gt;

&lt;p&gt;But there's another side to limitation we don't talk about enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A limitation doesn't just take something away. It also takes away what could have been.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And maybe that's exactly what we need. Because when everything is available, when every direction is possible, every tool is at hand, every approach is open to us, it sounds like freedom.&lt;/p&gt;

&lt;p&gt;But freedom without boundaries can be surprisingly hard to live inside.&lt;/p&gt;

&lt;p&gt;You give someone unlimited resources and they can spend a lifetime deciding what to do with them. Give them nothing and the question suddenly gets simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much can I achieve with what I have?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question changes how you think. You stop searching for the perfect tool, because it doesn't exist, and start building with what's in front of you. You notice details that would otherwise stay invisible, not because you're more observant by nature, but because you no longer have the luxury of not noticing.&lt;/p&gt;

&lt;p&gt;Maybe that's the real gift of limitation. Narrowing down your options but also sharpening your attention.&lt;/p&gt;

&lt;p&gt;Perhaps that's the paradox: the fewer doors we have, the more clearly we see the one we're standing in front of.&lt;/p&gt;

&lt;p&gt;And btw, this isn't a new idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints Force Creativity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The book
&lt;/h3&gt;

&lt;p&gt;Let's take a look at Stevens' book for a moment. The book is essentially a walkthrough of the sockets API: &lt;code&gt;socket()&lt;/code&gt;, &lt;code&gt;bind()&lt;/code&gt;, &lt;code&gt;listen()&lt;/code&gt;, &lt;code&gt;accept()&lt;/code&gt;, &lt;code&gt;connect()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;, and &lt;code&gt;close()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's the whole vocabulary for making two machines on opposite sides of the planet talk to each other reliably.&lt;/p&gt;

&lt;p&gt;But Stevens didn't invent those calls. The Berkeley sockets came out of UC Berkeley's CSRG in 4.2BSD, around 1983. Stevens wrote the book that taught a generation of programmers how they actually worked.&lt;/p&gt;

&lt;p&gt;He wasn't designing for a world of infinite compute. He was documenting an API built in an era of expensive memory, slow CPUs, and unreliable, low-bandwidth links and there was no room for mistakes, sprawling do-everything interfaces, or generic, accept-all contracts.&lt;/p&gt;

&lt;p&gt;Every function had to earn its place.&lt;/p&gt;

&lt;p&gt;And with those constraints forced upon the people who designed it, the result is an API so minimal and well-composed that, four decades later, in a world where none of those original constraints exist anymore, it's still the interface nearly every programming language wraps for networking.&lt;/p&gt;

&lt;p&gt;Take Python's &lt;code&gt;socket&lt;/code&gt; module, Node's &lt;code&gt;net&lt;/code&gt; module, or Go's &lt;code&gt;net&lt;/code&gt; package, they all trace their shape back to those same eight or so primitives.&lt;/p&gt;

&lt;p&gt;The paradox in miniature: by not having the luxury of building something bloated, they had no choice but to build something timeless instead. BSD built it under scarcity. Stevens documented why it was that tight.&lt;/p&gt;

&lt;p&gt;And of course, this is also what surprised &lt;em&gt;mi&lt;/em&gt; when I decided to pick up a book from the 90s. I expected it to feel dated but instead, I ended up learning a great deal from it, much of which I can still apply to the software I'm building today.&lt;/p&gt;

&lt;h3&gt;
  
  
  C
&lt;/h3&gt;

&lt;p&gt;The language that started it all, laying the foundation for everything we have today.&lt;/p&gt;

&lt;p&gt;C is a good example here, a language so elegant yet it gives you remarkably little. no GC, no elaborate standard abstractions, no safety net between you and memory. want something? you often have to understand what's happening underneath.&lt;/p&gt;

&lt;p&gt;By today's standards, we'd call it unsafe or labeling it a weakness but that limitation also forces a certain kind of thinking, you have to pay more attention to details, you become more conscious of memory, data layout, ownership and what the machine's actually doing.&lt;/p&gt;

&lt;p&gt;The language doesn't give you many options or answers but it makes you ask better questions and make better, timeless decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go
&lt;/h3&gt;

&lt;p&gt;Let's come back to the future, let's look at Go. Go takes a different direction, Its constraints weren't imposed by hardware, they were largely chosen by its designers.&lt;/p&gt;

&lt;p&gt;With all the things available by its time, the language was designed with its featured kept deliberately minimal &amp;amp; simple. syntax wise, type system wise, fewer ways to express the same idea.&lt;/p&gt;

&lt;p&gt;When a language gives you fewer ways to solve a problem, you spend less time debating which clever abstraction to use and more time solving the problem itself.&lt;/p&gt;

&lt;p&gt;Go's restraint is the feature, What it leaves out is just as intentional as what it includes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Music
&lt;/h3&gt;

&lt;p&gt;I play the piano, so this one isn't theoretical.&lt;/p&gt;

&lt;p&gt;Today you can put a DAW, a thousand plugins, and an AI vocal fixer on a laptop and make a record anywhere. In the 70s and 80s, a lot of that work was physical. Cut the wrong stretch of tape and it was gone. Limited tracks, limited studio time, expensive gear. The band had to know the part. Screw up a take and sometimes everyone started over.&lt;/p&gt;

&lt;p&gt;When recording time costs real money, you don't spend six hours on a snare. When you have eight tracks, you decide what deserves one. You can hear that in the records: the performances, the imperfections, the decisions.&lt;/p&gt;

&lt;p&gt;I'm not arguing we go back to splicing tape. I'm saying the constraint did work that infinite undo doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Having Everything
&lt;/h2&gt;

&lt;p&gt;Abundance can create complacency, endless choices... which creates the temptation to solve every problem by simply throwing more at it.&lt;/p&gt;

&lt;p&gt;Let's come back to our topic regarding AI. Like a modern DAW, I believe AI is a wonderful partner in our work. But next to that, it is also removing a great deal of constraints faster than almost anything we've seen before.&lt;/p&gt;

&lt;p&gt;Just a few years ago, a requested feature would take around 1-2 months. Trying a different architecture meant actually building it. Rewriting a block of code took time, and if it wasn't mine, I had to understand the context first.&lt;/p&gt;

&lt;p&gt;Now I can ask AI to do all of that in seconds. The thing that used to stop you was effort. When that cost drops, it's easy to stop asking whether you should do it at all. You generate five versions instead of picking one. You add another library because the model already knows it. You rewrite working code because the new draft looks cleaner.&lt;/p&gt;

&lt;p&gt;The shift isn't "can I build this?" anymore. it's &lt;strong&gt;"Should I?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you have nothing, the limits are imposed on you. When you have everything, &lt;strong&gt;you have to impose some on yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Do You Do With That
&lt;/h2&gt;

&lt;p&gt;I never got to answer that guy at the event. If I could now, I wouldn't give him a list of tools.&lt;/p&gt;

&lt;p&gt;I'd tell him more options don't guarantee better work and they just make it easier to never decide. The 90s didn't produce UNIX because people had more. They produced it because they had less, and less forced the work to get honest.&lt;/p&gt;

&lt;p&gt;That doesn't mean throw AI away, or go back to cutting tape, or write everything in C. It means the environment won't hand you a limit for free anymore. If you want the sharpening, you have to pick one. Ship one use case. Let the model generate the boring parts and keep the core decision yours. Give yourself a deadline ugly enough that you can't keep adding.&lt;/p&gt;

&lt;p&gt;Cap the stack this week.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Understanding Over Origin: The Missing Friction</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Tue, 04 Aug 2026 04:36:13 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/understanding-over-origin-the-missing-friction-55ag</link>
      <guid>https://dev.to/adamthedeveloper/understanding-over-origin-the-missing-friction-55ag</guid>
      <description>&lt;p&gt;A few days ago, I wrote &lt;a href="https://dev.to/adamthedeveloper/understanding-over-origin-4685"&gt;"Understanding Over Origin"&lt;/a&gt; and it got alot of engagement and I'm really happy that it did because it means people took the time to read, understand my perspective and I get to engage with every one of them in the comments as well. Of course, not everyone agrees but that's irrevelant, the point is a healthy discussion between various perspective from different developers around the world.&lt;/p&gt;

&lt;p&gt;But what I haven't told anyone is this: the more I engage, the more I realized something that I still do. I still write a lot of my code by hand and those are the parts I'm more proud of "&lt;/p&gt;

&lt;p&gt;Not gatekeeping, not me being nostalgic or identity-defensive ( well, a little nostalgic ), that's me admitting the article I published was &lt;em&gt;incomplete&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Some conversations don't end when the replies stop. My discussion with &lt;a class="mentioned-user" href="https://dev.to/darkwiiplayer"&gt;@darkwiiplayer&lt;/a&gt;  was probably my favorite of all because more we talked, the more I found myself wrestling with an incomplete idea that refused to stay unfinished and this essay is the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Discussion Clarified
&lt;/h2&gt;

&lt;p&gt;First, I need to thank the people who actually engaged with the core argument.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/unitbuilds"&gt;@unitbuilds&lt;/a&gt; gave his take that seams everything together and concludes the core idea of modern software enigeering: " &lt;em&gt;If it can run a standardized benchmarking suite against competition, it's provable and reproducible. If that's good enough for a scientific discovery, it's good enough for programming."&lt;/em&gt;, they're not defending AI, they're saying with better standards available, we shouldn't choose to ignore them. He also pointed out something I'd missed, the burden of correctness has always been on the developer who signs off on the PR. &lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/madsendev"&gt;@madsendev&lt;/a&gt; who wrote the original article that sparked this whole discussion, showed genuine class. He came back, said the argument had "gone further," and proposed an idea that's stuck with me: what if AI-assisted projects included a standard where you quiz yourself on your own repository? Not to prove you didn't use AI, but to prove you actually understand what you built.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/reidmarlow"&gt;@reidmarlow&lt;/a&gt;  hit on something important and i think it's my favorite takeaway from the discussion: &lt;strong&gt;"Maintenance receipts are much harder to fake."&lt;/strong&gt; That single sentence reframes the entire debate. Tests. Bug fixes. Production incidents. Responding to issues. Refactoring. Every one of those leaves a trail of evidence that someone not only built the project but continues to understand, improve, and take responsibility for it. That's the kind of ownership that matters. It's earned over time, and it's far harder to fake than explaining code in an interview or claiming you wrote every line by hand.&lt;/p&gt;

&lt;p&gt;I'm absolutely grateful that people gave in their thoughts but you can never have a good discussion without a pushback ⚔️&lt;/p&gt;

&lt;p&gt;the pushback's always my favorite part of any technical discussion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge That Made Me Think
&lt;/h2&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/darkwiiplayer"&gt;@darkwiiplayer&lt;/a&gt; showed up and said something like: "Training AI on stolen code without consent is theft. Everything built with AI carries that theft in its DNA. You're overlooking this."&lt;/p&gt;

&lt;p&gt;She wasn't being rhetorical, she was actually making a philosophical point about training data, consent, and what "learning" means when it's done at scale without permission.&lt;/p&gt;

&lt;p&gt;We went back and forth. I argued that training data and generated output aren't automatically equivalent to copying and she countered that if you removed all stolen code from training data, the models wouldn't exist as they do. Which is... probably true? And that matters.&lt;/p&gt;

&lt;p&gt;I don't think it invalidates the &lt;em&gt;engineering&lt;/em&gt; argument. But it does mean the conversation has two layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The technical layer&lt;/strong&gt;: is the work maintained, understood, and good?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ethical layer&lt;/strong&gt;: how should we feel about tools built on potentially non-consensual training data?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most people in that thread were debating layer 1 and she dragged me down to layer 2 into the conversation. Both are real. Neither invalidates the other.&lt;/p&gt;

&lt;p&gt;But it also made me realize my original article &lt;em&gt;didn't address&lt;/em&gt; why handwritten code felt different to me because honestly? it does.&lt;/p&gt;

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

&lt;p&gt;The argument I made: origin doesn't determine quality. Understanding, testing, maintainability, accountability, that's what matters.&lt;/p&gt;

&lt;p&gt;My own experience reflects that. I started writing code around 2018, and back then the only AI most of us could name was Sophia, the humanoid robot from Hong Kong. I learned the traditional way: by writing everything myself. Even today, when I write code by hand, I understand it differently. More deeply. I notice edge cases I might have overlooked if I'd generated the first draft with AI. And when I'm done, I'm genuinely more proud of what I've built.&lt;/p&gt;

&lt;p&gt;These aren't compatible statements if you think about them too hard.&lt;/p&gt;

&lt;p&gt;Either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My pride is just ego (origin bias)&lt;/li&gt;
&lt;li&gt;Handwritten code actually &lt;em&gt;is&lt;/em&gt; better (proving the gatekeepers right)&lt;/li&gt;
&lt;li&gt;Both are true, but for reasons I didn't examine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/fromzerotoship"&gt;@fromzerotoship&lt;/a&gt; helped me see option 3 clearly. They're not a developer but they've shipped 20+ working internal tools using AI. A hospital runs them. By my standards, they'd "fail" the understanding test, there are parts of their system they couldn't explain line-by-line.&lt;/p&gt;

&lt;p&gt;But then they said something that shifted everything: &lt;em&gt;"Demonstrable behavior under deliberate failure is another form of earning trust, and it's the only one available to me. It's also harder to fake."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Plant defects, watch the guards catch them, restore the guards and watch them go green and then deploy and check the URLs a few seconds later.&lt;/p&gt;

&lt;p&gt;they demonstrate that they can keep it alive.&lt;/p&gt;

&lt;p&gt;And that made me realize the real distinction wasn't about who typed the code. It was about &lt;strong&gt;&lt;em&gt;friction&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Friction Actually Matters
&lt;/h2&gt;

&lt;p&gt;In my earlier &lt;a href="https://dev.to/adamthedeveloper/i-could-review-it-i-couldnt-write-it-3gfj"&gt;piece&lt;/a&gt; I wrote a few weeks ago, I described not being able to write some logic from scratch despite reviewing it perfectly, that wasn't just skill loss. It was proof that I'd skipped the friction that builds actual understanding.&lt;/p&gt;

&lt;p&gt;When I write code by hand, &lt;strong&gt;I encounter problems in real-time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hit a wall. My approach doesn't work. I refactor. I discover the problem space through constraint and failure. I make decisions &lt;em&gt;about decisions&lt;/em&gt;, not just typing, but choosing between paths I've actually explored. this is the learning path that I unknowingly go through whenever I write code by hand and Wii reminded me of this.&lt;/p&gt;

&lt;p&gt;When I use AI, I describe what I want. I get options. I pick the one that looks right. &lt;strong&gt;I'm curating, not exploring.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both can produce good code. But the &lt;em&gt;path to understanding&lt;/em&gt; is fundamentally different.&lt;/p&gt;

&lt;p&gt;With handwritten code: friction, insight, better next decisions&lt;br&gt;&lt;br&gt;
With AI-assisted: selection, implementation, validation&lt;/p&gt;

&lt;p&gt;The friction is the learning mechanism.&lt;/p&gt;

&lt;p&gt;So when I say I'm more proud of handwritten code? I'm not being romantic about suffering. I'm noting that &lt;strong&gt;the code I'm proudest of is the code I fought for&lt;/strong&gt;, and handwriting forces the fight.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Here's the Problem With That Logic
&lt;/h2&gt;

&lt;p&gt;If friction is the mechanism, then the &lt;em&gt;type&lt;/em&gt; of friction matters more than &lt;em&gt;who did the typing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You could write AI-assisted code where you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fight with the prompt&lt;/li&gt;
&lt;li&gt;Critique every generated option&lt;/li&gt;
&lt;li&gt;Refactor aggressively&lt;/li&gt;
&lt;li&gt;Hit walls and redesign&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That has friction and it also builds understanding.&lt;/p&gt;

&lt;p&gt;Conversely, you could hand-write code where you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autopilot through a familiar pattern&lt;/li&gt;
&lt;li&gt;Never question assumptions&lt;/li&gt;
&lt;li&gt;Copy-paste from Stack Overflow&lt;/li&gt;
&lt;li&gt;Never understand &lt;em&gt;why&lt;/em&gt; it works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That has no friction and it builds nothing.&lt;/p&gt;

&lt;p&gt;So the honest version of my position isn't "handwritten code is better." It's: &lt;strong&gt;"friction builds understanding, and handwriting &lt;em&gt;tends to create friction&lt;/em&gt; because you're forced to think through every line."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But that's a contingent truth, not an absolute one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Realization
&lt;/h2&gt;

&lt;p&gt;The critics ( gatekeepers, but we'll stick with this from now on ) were partially right and I was too generous in my original position.&lt;/p&gt;

&lt;p&gt;Not about the gatekeeping itself, no, that's still wrong. But about the &lt;em&gt;tendency&lt;/em&gt;: AI &lt;em&gt;does&lt;/em&gt; make it easier to produce low-understanding code. Not because AI is bad, but because &lt;strong&gt;removing friction is literally what AI does, and friction is what builds understanding.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer isn't "use less AI" or "never use AI." It's "if you use AI to skip engagement with the problem, whether that's the code, the failure modes, or the maintenance, you build worse systems.&lt;/p&gt;

&lt;p&gt;That applies to humans too but humans have an inherent friction cost, we get bored, we hate typing, we make mistakes. That friction is annoying, but it forces us to stay engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Changed?
&lt;/h2&gt;

&lt;p&gt;Nothing about the original argument was &lt;em&gt;wrong&lt;/em&gt;. But I was treating "understanding + accountability" as if they were just checkboxes you could verify at the end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding isn't a property you can inspect, it's a &lt;em&gt;process&lt;/em&gt; and that process requires friction. Real engagement with the problem. Mistakes you learn from.&lt;/p&gt;

&lt;p&gt;The reason I'm prouder of handwritten code is because I &lt;em&gt;earned&lt;/em&gt; the understanding in a way that's harder to fake.&lt;/p&gt;

&lt;p&gt;Does that mean every line should be handwritten? No. Boilerplate is boilerplate. Some friction is just noise.&lt;/p&gt;

&lt;p&gt;But the core logic? The architecture decisions? The places where "understanding this code" actually matters? &lt;strong&gt;Yeah, I want to have fought for that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And I want the same from anyone shipping code that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Middle Ground
&lt;/h2&gt;

&lt;p&gt;Here's where I land:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To the critics:&lt;/strong&gt; You're using the wrong filter. "AI or no AI" doesn't tell you anything but you're accidentally right that there's something real to be concerned about, it's the &lt;em&gt;laziness&lt;/em&gt; that AI enables, not the tool itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To AI enthusiasts:&lt;/strong&gt; Yeah, your tooling is amazing. But it's worth asking whether you're using it to think better or think less. Those feel the same until you try to maintain the code six months later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To myself:&lt;/strong&gt; The pride I feel in handwritten code isn't ego, It's legitimate. every line that I typed out isn't some sort of magical unicorn mythological Godly line but it's the friction that comes with it, the learning I build that comes with it.&lt;/p&gt;

&lt;p&gt;Sometimes the answer requires admitting you skipped and sometimes that's fine for routine work. But if you're building something that matters, you should want to have fought for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choose Where You Fight
&lt;/h2&gt;

&lt;p&gt;I still write a lot of code by hand. I still use AI every day. Those aren't contradictions anymore.&lt;/p&gt;

&lt;p&gt;The original article was right: origin doesn't determine quality. What it missed is that understanding isn't a checkbox you tick at the end. It's something you earn through friction. Handwriting tends to create that friction. AI tends to remove it. Neither is inherently good or bad. Both are choices about how you engage with the problem.&lt;/p&gt;

&lt;p&gt;So I'm not asking "Did you use AI?" anymore.&lt;/p&gt;

&lt;p&gt;I'm asking: Did you fight for the parts that matter?&lt;/p&gt;

&lt;p&gt;And if the tool answered that for you, you'll find out the next time something breaks.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>My favorite article of the week. for someone who's where he is today by breaking things, painfully manually writing CRUD apps and having no choice but to learn how to read people's code, this hits too close to home.</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Wed, 29 Jul 2026 16:12:45 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/my-favorite-article-of-the-week-for-someone-whos-where-he-is-today-by-breaking-things-painfully-18gg</link>
      <guid>https://dev.to/adamthedeveloper/my-favorite-article-of-the-week-for-someone-whos-where-he-is-today-by-breaking-things-painfully-18gg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-story__hidden-navigation-link"&gt;The Junior Developer Pipeline Is Broken... And AI Broke It&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Deletes the career ladder&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/nazar-boyko" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1875383%2F1b3f5dc9-df1c-4551-9f6e-e3b6234b3d6c.gif" alt="nazar-boyko profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/nazar-boyko" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nazar Boyko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nazar Boyko
                
                
              
              &lt;div id="story-author-preview-content-4240237" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/nazar-boyko" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1875383%2F1b3f5dc9-df1c-4551-9f6e-e3b6234b3d6c.gif" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nazar Boyko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" id="article-link-4240237"&gt;
          The Junior Developer Pipeline Is Broken... And AI Broke It
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;267&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              217&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>beginners</category>
      <category>career</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Understanding Over Origin</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Tue, 28 Jul 2026 09:36:21 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/understanding-over-origin-4685</link>
      <guid>https://dev.to/adamthedeveloper/understanding-over-origin-4685</guid>
      <description>&lt;p&gt;Many of developers communities are asking the wrong question.&lt;/p&gt;

&lt;p&gt;Not because they're wrong to worry about low-effort work, no, but the filter they're using doesn't actually separate maintained engineering from generated slop. It just separates projects based on which tools were involved in their creation.&lt;/p&gt;

&lt;p&gt;Imagine trying to share a work that you're really proud of, with the help of AI assisting it, the idea's yours but your work gets flagged, rejected, or buried under comments like &lt;em&gt;"no you didn't"&lt;/em&gt; and &lt;em&gt;"I hate how there's so many AI projects these days."&lt;/em&gt; Someone definitely felt righteous after saying this, believing they're protecting themselves from low-effort slop. &lt;/p&gt;

&lt;p&gt;Except that's not actually what they're protecting against. They're protecting against &lt;em&gt;a label&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Distinction
&lt;/h2&gt;

&lt;p&gt;I read &lt;a class="mentioned-user" href="https://dev.to/madsendev"&gt;@madsendev&lt;/a&gt; 's article regarding &lt;a href="https://dev.to/madsendev/i-built-something-good-with-ai-now-some-developer-communities-dont-want-to-see-it-20mo"&gt;Open Vectorizer&lt;/a&gt; and Madsen wants to share the project with other people and in hope that someone would like to contribute as well.&lt;/p&gt;

&lt;p&gt;Apparently, difference between "AI-generated" and "maintained engineering" has become invisible to gatekeepers who've simplified the filter down to a single binary question.&lt;/p&gt;

&lt;p&gt;the wrong question.&lt;/p&gt;

&lt;p&gt;" AI or no AI "? ( they didn't literally ask this but that's the filter in practice )&lt;/p&gt;

&lt;p&gt;Here's why: imagine two projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project A:&lt;/strong&gt; Someone spends two years redesigning a vectorization algorithm, investigates whether machine learning could improve it, decides against it, implements a deterministic approach, discovers their own benchmark was inflated (and fixes it anyway), publishes reproducible results, and actively maintains the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project B:&lt;/strong&gt; Someone types "make me a music streaming app" into an AI prompt, publishes whatever emerges without testing it, and disappears.&lt;/p&gt;

&lt;p&gt;Both used AI. Both are labeled "AI-generated." One belongs in a developer community. The other is exactly what communities should be filtering out.&lt;/p&gt;

&lt;p&gt;Guess which one gets rejected? yah, both get rejected. The luckiest you can get is being rejected later because the gatekeeper was busy arguing with you and changing their community name to: " i miss what was it like to program on punch cards and a ciggy in my mouth " ahhh yes, the identity crisis.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Using "AI-Generated" as a Quality Filter
&lt;/h2&gt;

&lt;p&gt;The gatekeeping argument seems reasonable at first glance. But it has real problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The dismissal:&lt;/strong&gt; &lt;em&gt;"no you didn't&lt;/em&gt; (via &lt;a class="mentioned-user" href="https://dev.to/deammer"&gt;@deammer&lt;/a&gt;). This response requires ignoring the actual technical work, but Madsen rewrote an entire algorithm pipeline, tested it against established tools, and caught a bug that made his own benchmarks look better, then published the worse numbers anyway. That's not  someone slapping a prompt onto Claude and calling it a day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The broader concern:&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/blakebeckcoding"&gt;@blakebeckcoding&lt;/a&gt; points out something real, unvetted AI-generated code has introduced security vulnerabilities. That's a legitimate worry about maintainability and accountability. Where the argument breaks down is treating that as sufficient reason to reject &lt;em&gt;every&lt;/em&gt; AI-assisted project before evaluating its technical merits. The concern about low-quality code is valid. The heuristic of "reject based on tool choice" doesn't actually address it. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think of it differently:&lt;/strong&gt; we don't reject all Rust packages because Rust makes memory safety easier, nor do we assume all C projects are insecure because C makes memory errors possible. Language choice affects probabilities, but it doesn't determine quality. The same applies to AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The nostalgia play:&lt;/strong&gt; &lt;em&gt;"Dev.to used to be good"&lt;/em&gt; (same dude, you know who, bro's just nostalgic). There's an assumption that developer communities were higher-quality before AI tooling arrived. But humans have been publishing terrible code since the 1980s, spamming them has always been a problem and it isn't new, AI just makes it easier and cheaper to spam.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem (And Why It Requires Actual Work)
&lt;/h2&gt;

&lt;p&gt;Developer communities &lt;em&gt;are&lt;/em&gt; being flooded and it's not the AI-generated projects specifically but &lt;em&gt;low-effort projects&lt;/em&gt;, period. and like I said up there, the flood's rising fast at an overwhelming rate because AI made it cheaper to produce them.&lt;/p&gt;

&lt;p&gt;The solution, though? It's not "ban the AI ones."&lt;/p&gt;

&lt;p&gt;It's understanding what actually separates signal from noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the maintainer explain the architecture, or does it sound like they're reading stack overflow?&lt;/li&gt;
&lt;li&gt;Are there meaningful tests?&lt;/li&gt;
&lt;li&gt;Can claims be independently reproduced?&lt;/li&gt;
&lt;li&gt;Are benchmarks transparent?&lt;/li&gt;
&lt;li&gt;Are weaknesses disclosed?&lt;/li&gt;
&lt;li&gt;Does the maintainer actually review changes and take responsibility?&lt;/li&gt;
&lt;li&gt;Will this be maintained in six months, or is it a one-off lab experiment?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions work equally well for human-written code. And they're &lt;em&gt;expensive to verify&lt;/em&gt;, they require actual reading, thinking, and judgment.&lt;/p&gt;

&lt;p&gt;"Was AI used?" is cheap. One checkbox. Feels principled. Lets moderators move on.&lt;/p&gt;

&lt;p&gt;"Is this maintained engineering?" requires actually engaging with the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pointed Out Irony
&lt;/h2&gt;

&lt;p&gt;In the comment thread, &lt;a class="mentioned-user" href="https://dev.to/unitbuilds"&gt;@unitbuilds&lt;/a&gt; delivered the most sensible take on all of this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Software development is an orchestration process where the ultimate value is the working, audited, and tested software—not just human typing time."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If that's the kind of comments you leave, go to X and join the cesspool, or Reddit, they'll love you there. Please keep Dev.to a safe space for all developers."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;hits good, doesn't it? it's not defending AI in the abstract. It's defending &lt;em&gt;communities staying communities&lt;/em&gt;, places where people can share work and get feedback, not face purity tests based on which tools they used.&lt;/p&gt;

&lt;p&gt;The person who said they used 99% AI to ship a 3000-line game while working full-time deserves to share that. So does someone who used GitHub Copilot for routine completions. So does the Open Vectorizer author who made architectural decisions with AI assistance but wouldn't ship something they couldn't explain.&lt;/p&gt;

&lt;p&gt;What none of them deserve is dismissal based on a label that tells you nothing about the quality of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Historical Perspective
&lt;/h2&gt;

&lt;p&gt;This is something that might seem beside the point but isn't: software development has &lt;em&gt;always&lt;/em&gt; worked this way.&lt;/p&gt;

&lt;p&gt;We moved from assembly to C and nobody said &lt;em&gt;"You didn't really code because you're using a compiler."&lt;/em&gt; We moved from manual memory management to garbage collection. From raw SQL to ORMs. From writing Dockerfiles by hand to templates. From Stack Overflow copy-paste to IDE refactoring to GitHub Copilot autocomplete.&lt;/p&gt;

&lt;p&gt;Each step increased abstraction. Each step generated concern that developers were getting lazy, that standards were dropping, that the craft was being diluted.&lt;/p&gt;

&lt;p&gt;Each time, the question that actually mattered wasn't &lt;em&gt;"What abstraction level did you use?"&lt;/em&gt; It was &lt;em&gt;"Do you understand what was generated? Can you defend it? Will you maintain it?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's been the real standard all along.&lt;/p&gt;

&lt;p&gt;AI is just the next step on that continuum. It's more aggressive, more visible, and it generates more mediocre output faster. But it's not fundamentally different from any other tool that lets developers offload rote work to focus on decisions that matter.&lt;/p&gt;

&lt;p&gt;The question isn't whether AI should be accepted.&lt;/p&gt;

&lt;p&gt;In short, people have been saying software development is dead since the first high level programming language was invented... just, circling around the same anxiety cycle over and over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Good Moderation Requirements
&lt;/h2&gt;

&lt;p&gt;no, it's not "open the floodgates." it's about what you're really filtering&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good moderation would:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require disclosure of substantial AI involvement (transparency matters)&lt;/li&gt;
&lt;li&gt;Judge projects on reproducibility, test coverage, and maintainer accountability&lt;/li&gt;
&lt;li&gt;Fast-track projects with public benchmarks or active bug resolution&lt;/li&gt;
&lt;li&gt;Catch obvious slop &lt;em&gt;by its lack of depth&lt;/em&gt;, not its origin story&lt;/li&gt;
&lt;li&gt;Create space for people who are learning while filtering out low-effort republishing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bad moderation does what's happening now:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blanket bans that assume all AI-assisted work is equivalent to prompt-and-publish&lt;/li&gt;
&lt;li&gt;Dismissive comments that never engage with technical substance&lt;/li&gt;
&lt;li&gt;Rejection based on the presence of a tool, not the absence of rigor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DEV's shift toward requiring disclosure rather than banning AI-assisted content is great. It puts the burden on the creator to be honest, then lets the community decide based on the actual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Matters
&lt;/h2&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/unitbuilds"&gt;@unitbuilds&lt;/a&gt; had it right: a developer community's job is to share work and get substantive feedback, not police the method.&lt;/p&gt;

&lt;p&gt;The questions that separate good engineering from slop are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you explain the architectural decisions?&lt;/li&gt;
&lt;li&gt;What broke, and how did you fix it?&lt;/li&gt;
&lt;li&gt;Are benchmarks reproducible?&lt;/li&gt;
&lt;li&gt;Will you maintain this?&lt;/li&gt;
&lt;li&gt;Are you willing to be corrected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They work regardless of whether code was typed by a human, generated by Claude, or mixed. Because they're about understanding and accountability - what has always determined quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering should be evaluated on understanding, correctness, maintainability, testing, and accountability. Not keystrokes.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The World's Oldest Communication Protocol Is Music</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:52:53 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/the-worlds-oldest-communication-protocol-is-music-3njg</link>
      <guid>https://dev.to/adamthedeveloper/the-worlds-oldest-communication-protocol-is-music-3njg</guid>
      <description>&lt;p&gt;This is going to be a very different article from what I usually write. No technical discussions, architecture deep dives, or engineering practices today. Instead, we're talking about something much older than software itself: music.&lt;/p&gt;

&lt;p&gt;We treat language like it's the default mode of human communication, like it's the &lt;em&gt;real&lt;/em&gt; and only thing used to communicate, everything else is secondary, emotional, aesthetic, nice to have.&lt;/p&gt;

&lt;p&gt;But language is actually the outlier. It's the new protocol layered on top of something much older.&lt;/p&gt;

&lt;p&gt;Music is the original standard and we've basically forgotten how to read it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Protocol Stack
&lt;/h2&gt;

&lt;p&gt;Think of communication like a network stack. Language is high-level. It's TCP/IP. Built on assumptions, needs learning, breaks the second you cross a boundary. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A shared vocabulary&lt;/li&gt;
&lt;li&gt;Syntactic understanding&lt;/li&gt;
&lt;li&gt;Cultural context&lt;/li&gt;
&lt;li&gt;Years of study if you actually want fluency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's powerful but It's also fragile. And it's &lt;em&gt;recent&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Written language is a few thousand years old. Spoken language is older, sure, but both are late abstractions compared to the hundreds of thousands of years humans have been syncing bodies to shared sound. Relative to that timeline? Language is yesterday's patch.&lt;/p&gt;

&lt;p&gt;Music? That's the lower-level protocol. The physical layer everything else runs on.&lt;/p&gt;

&lt;p&gt;A Japanese teenager at a Michael Jackson concert doesn't need to speak English. She doesn't need to understand what "Man in the Mirror" means as a concept. She also doesn't need a music degree.  &lt;/p&gt;

&lt;p&gt;Music isn't &lt;em&gt;zero&lt;/em&gt;-cost. Genre, culture, convention still shape how we hear it. But the entry barrier for emotional communication is way lower. A rhythm can hit urgency, celebration, sadness, or tension long before anyone understands the formal structure behind it.&lt;/p&gt;

&lt;p&gt;Her nervous system speaks that fluently. And so does everyone else in that stadium.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Protocol Works
&lt;/h2&gt;

&lt;p&gt;Here's what happens when the song starts: 70,000 people stop being individuals and start being a distributed system synchronizing to the same signal.&lt;/p&gt;

&lt;p&gt;The bass hits. Her heartbeat starts matching it. Involuntarily. Her neurons fire in sync with the guy three rows over. The girl next to her moves when the rhythm says move — not because she decided to, but because the protocol sits lower than conscious decision-making.&lt;/p&gt;

&lt;p&gt;This isn't mystical. This isn't the "universal language of music" in the poetic sense. This is just biology.&lt;/p&gt;

&lt;p&gt;Babies respond to rhythm before they understand words. Crowds clap together without a conductor. Soldiers march to drums. Rituals across cultures use singing and percussion to pull a group into the same tempo. The pattern shows up everywhere because the hardware is shared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The protocol specs, if we're being nerdy about it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses mostly rhythm, tempo, and frequency&lt;/li&gt;
&lt;li&gt;Hits the nervous system, not the cognitive layer&lt;/li&gt;
&lt;li&gt;Needs way less shared context than language&lt;/li&gt;
&lt;li&gt;Backward compatible across human brains for 300,000+ years&lt;/li&gt;
&lt;li&gt;Works at scale (70,000 synchronizations at once)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Language, meanwhile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preprocessing (learning)&lt;/li&gt;
&lt;li&gt;Translation (if you're cross-language)&lt;/li&gt;
&lt;li&gt;Cognitive overhead (your brain has to &lt;em&gt;think&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;High latency (meaning takes time)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Music? Low preprocessing. No translation step. Near-zero latency. Your body gets the signal before your mind finishes negotiating what it means.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We Don't See This
&lt;/h2&gt;

&lt;p&gt;We're obsessed with meaning. We assume communication = transfer of semantic content. You encode an idea into words, I decode it, boom: we've connected.&lt;/p&gt;

&lt;p&gt;So when we see that girl screaming English lyrics she doesn't understand, we quietly reframe it. "Oh, the &lt;em&gt;message&lt;/em&gt; transcends language. She understands on a &lt;em&gt;deeper level&lt;/em&gt;."&lt;/p&gt;

&lt;p&gt;Nah. She's not understanding the message at all. She's on a different protocol entirely. Language is offline. The lower-level stuff is handling it.&lt;/p&gt;

&lt;p&gt;We miss this because we've built an entire civilization on top of language. We think the higher-level protocol is the "real" one. Which is like saying TCP/IP is more real than the electrical signals it runs on.&lt;/p&gt;

&lt;p&gt;Music isn't poetry. It isn't transcendence. It's infrastructure. It's what everything else runs on.&lt;/p&gt;

&lt;p&gt;And no, it's not &lt;em&gt;better&lt;/em&gt; than language. It solves a different problem. Music synchronizes systems. Language coordinates them.&lt;/p&gt;

&lt;p&gt;A drumbeat can make people march together. It won't tell them why they're marching, what they believe, or what to do when the song ends. Language is powerful because it encodes abstractions. Music is powerful because it doesn't need to.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Part
&lt;/h2&gt;

&lt;p&gt;Here's the part that gets weird: you can sync humans at massive scale without them sharing &lt;em&gt;any&lt;/em&gt; values, beliefs, or understanding.&lt;/p&gt;

&lt;p&gt;That stadium full of people moving together? They don't agree on anything. They might hate each other politically. They might speak no common language. They might have zero common ground.&lt;/p&gt;

&lt;p&gt;But for three minutes, their nervous systems are linked. That's a connection. Just not the kind we like to talk about.&lt;/p&gt;

&lt;p&gt;We want connection to require understanding. We want it to mean something. We want it to prove that underneath all our differences, we're fundamentally united in shared meaning.&lt;/p&gt;

&lt;p&gt;What music actually shows us is simpler and weirder: humans are pattern-matching machines wired to sync with other humans. You don't need shared values for that. You don't need agreement. You don't need understanding.&lt;/p&gt;

&lt;p&gt;You just need a rhythm everyone can feel.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means
&lt;/h2&gt;

&lt;p&gt;Language will always need translation and will always be high-friction, high-latency, high-failure-rate across boundaries and... that's not a bug, it's what gives it power, precision requires friction.&lt;/p&gt;

&lt;p&gt;But for raw synchronization, getting lots of humans moving together, feeling together, breathing together, language is overkill. Also unreliable.&lt;/p&gt;

&lt;p&gt;Music is the protocol that works when nothing else does.&lt;/p&gt;

&lt;p&gt;An orchestra where nobody shares a language. A protest with thousands of strangers chanting. A stadium of people from different countries, different beliefs, different everything, all moving as one.&lt;/p&gt;

&lt;p&gt;These aren't examples of music "transcending barriers." They're examples of a lower-level protocol just... working, while the higher-level ones fail.&lt;/p&gt;

&lt;p&gt;We've built everything on top of language. We've made it the primary. And we've kind of forgotten what it's sitting on.&lt;/p&gt;

&lt;p&gt;Language lets us share thoughts. Music lets us share states.&lt;/p&gt;

&lt;p&gt;And every time a girl who doesn't speak English screams an English song in perfect sync with 70,000 other people, she's reminding us: the infrastructure was always there. We just stopped noticing it.&lt;/p&gt;

&lt;p&gt;The oldest communication protocol is still the most reliable one. We just got distracted by the newer layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  And sooooo, Here's my favorite song of the week
&lt;/h2&gt;

&lt;p&gt;✨🎶 &lt;strong&gt;Love Hurts&lt;/strong&gt; — Nazareth&lt;/p&gt;

&lt;h2&gt;
  
  
    &lt;iframe src="https://www.youtube.com/embed/Vj2AlaQcW40" width="710" height="399"&gt;
  &lt;/iframe&gt;

&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Drop your favorite music down below, let's hear what gets your system in sync!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>music</category>
      <category>distributedsystems</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Stop Saying You Want Ownership Mindset</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Tue, 14 Jul 2026 05:59:52 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/stop-saying-you-want-ownership-mindset-34nf</link>
      <guid>https://dev.to/adamthedeveloper/stop-saying-you-want-ownership-mindset-34nf</guid>
      <description>&lt;p&gt;My 2nd article this week, I'm supposed to keep it to just once per week but whateverrr, I've had this in drafts for a while now, let's get straight into it.&lt;/p&gt;

&lt;p&gt;Here's the thing about "ownership mindset" that nobody on the management side wants to admit: you love the slogan. You hate the behavior.&lt;/p&gt;

&lt;p&gt;You want engineers who care. Who think about scale. Who ask "wait, will this melt in four months?" Who treat the product like it's theirs.&lt;/p&gt;

&lt;p&gt;Cool. Then someone &lt;em&gt;actually does that&lt;/em&gt; in a meeting, and suddenly they're "being difficult," "not a team player," "too negative," or my personal favorite — "can you just build what I asked for?"&lt;/p&gt;

&lt;p&gt;I've sat through this movie enough times that I can recite the script.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Script
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Manager / PM / whoever is currently wearing the "decider" hat:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need someone with real ownership on this. Someone who cares whether the product actually works.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Someone raises a real concern about the architecture. Not vibes. Constraints. Data model. Failure modes. The stuff that will wake someone up at in the middle of the night later.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same person, 90 seconds later:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why are you pushing back so hard? Why are you being so difficult? We're already behind. Just ship it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So which is it?&lt;/p&gt;

&lt;p&gt;You asked for ownership. They gave you ownership. Now you're mad that ownership came with opinions.&lt;/p&gt;




&lt;h2&gt;
  
  
  You're Not Confused. You're Convenient.
&lt;/h2&gt;

&lt;p&gt;I used to think this was a communication problem. It's not. It's incentives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You feel the delay today. You don't feel the outage later.&lt;/strong&gt; Design pushback slows the thing you want shipped &lt;em&gt;this sprint&lt;/em&gt;. The mess it prevents shows up next quarter, under someone else's KPI. Of course you optimize for the pain that's in the room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hierarchy feels like efficiency when you're on top of it.&lt;/strong&gt; A senior decision getting questioned doesn't feel like engineering. It feels like disrespect. Even when the question is "this will corrupt data under concurrent writes." You wanted a yes. You got a reason. Those feel different to the ego.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance feels like progress.&lt;/strong&gt; An engineer saying "yeah, I'll build it" gives you a hit of motion. An engineer saying "we should rethink the data model" feels like friction. Your brain does lazy math: less friction = better leadership. No. Less friction = quieter failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And "ownership" means two different things depending on who's talking.&lt;/strong&gt; When you say it, you often mean "make sure it ships and don't bother me." When I hear it, I mean "make sure it doesn't screw us." Those conflict. You keep using the same word like that's my problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quiet Engineer Is Not Owning Anything
&lt;/h2&gt;

&lt;p&gt;Here's the part that should piss you off more than it does: the engineer who just implements what you ask, every time, with a smile, is not demonstrating ownership.&lt;/p&gt;

&lt;p&gt;They're optimizing for approval.&lt;br&gt;
They're minimizing confrontation.&lt;br&gt;
They're following orders.&lt;/p&gt;

&lt;p&gt;None of that is ownership. That's liability transfer.&lt;/p&gt;

&lt;p&gt;When it breaks, they've got the perfect line: "I built exactly what was specified." Clean hands. Diffused responsibility. You got the compliant builder you rewarded.&lt;/p&gt;

&lt;p&gt;The person who says "this is going to bite us" is the one actually treating the outcome like theirs. They're spending social capital in a room that usually punishes that spend. If you punish them, don't act shocked when the next three people learn to shut up.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Ownership Actually Looks Like From Our Side
&lt;/h2&gt;

&lt;p&gt;It's not being a dick in design reviews. It's this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concerns come early.&lt;/strong&gt; During design. Not three weeks into implementation when changing direction costs a sprint and a relationship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning, not vibes.&lt;/strong&gt; "This N+1 dies at 10k users on our current growth curve" beats "this feels off." If an engineer can't explain the failure mode, push back. If they can — listen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternatives, not just no.&lt;/strong&gt; "What if we index on user_id?" is ownership. "This won't work, good luck" is theater.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing when to escalate vs. when to build-and-learn.&lt;/strong&gt; Sometimes you need to ship something imperfect to learn. Sometimes you're walking into a known footgun. A good owner can tell you which meeting you're in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staying for the outcome.&lt;/strong&gt; "I told you so" is not ownership. Owning it means if you were wrong, you help clean it up. If you were right and ignored, you still help clean it up — and you remember who ignored you.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Get When You Train That Out of People
&lt;/h2&gt;

&lt;p&gt;I've watched this culture settle in. It's not subtle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engineers who optimize for "not getting blamed" instead of "building something that lasts"&lt;/li&gt;
&lt;li&gt;Debt that accumulates in silence because speaking up is career-limiting&lt;/li&gt;
&lt;li&gt;Smart people quietly updating their LinkedIn&lt;/li&gt;
&lt;li&gt;Meltdowns that somehow still surprise leadership&lt;/li&gt;
&lt;li&gt;"Team player" becoming code for "doesn't question bad decisions"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You buy short-term speed. You pay medium-term chaos. Then you schedule a retrospective where everyone agrees "we should have spoken up earlier," and nobody asks why they stopped.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You Actually Want It
&lt;/h2&gt;

&lt;p&gt;Stop asking for ownership like it's a personality trait. Build the conditions where it's safe to exercise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate design talk from implementation talk.&lt;/strong&gt; Let people think out loud about whether something will work before you've already committed the sprint. Thinking hard and shipping fast aren't enemies. Collapsing them into one meeting is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reward the pushback you say you want.&lt;/strong&gt; If someone raised a legitimate concern and you overrode them, make that a &lt;em&gt;visible decision&lt;/em&gt;. Don't pretend the conversation didn't happen. If they were right later, say so. Out loud. In front of people. If they were wrong, they learn the domain. Either way, the signal is: speaking up was the job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be specific.&lt;/strong&gt; "Take ownership" is useless. Do you mean "ship this by Friday even if it's dirty"? Then say that. Do you mean "this has to survive 10x traffic"? Say that. Vague slogans produce people guessing what will get them yelled at least.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listen when we push back.&lt;/strong&gt; Not because we're always right — we're not. Because we live in the codebase you only see through tickets. That's not attitude. That's the job you hired us for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normalize disagreement.&lt;/strong&gt; The best teams I've been on argue about design and still trust each other the next morning. Disagreement isn't personal. Making it personal is how you get yes-men and broken systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;You probably do want engineers with an ownership mindset.&lt;/p&gt;

&lt;p&gt;What you don't want, and keep accidentally selecting for, is engineers who smile, implement, and let you walk into the wall so they can stay popular.&lt;/p&gt;

&lt;p&gt;Ownership is annoying. It asks inconvenient questions. It slows the "just ship it" meeting. It makes seniors defend decisions they wanted to treat as settled.&lt;/p&gt;

&lt;p&gt;If that sounds exhausting, good. That's the cost of building something that doesn't fall apart the second real users touch it.&lt;/p&gt;

&lt;p&gt;You don't get "people who care" and "people who never push back." Pick one.&lt;/p&gt;

&lt;p&gt;And if you pick compliance, at least stop calling it ownership. That word still means something to the rest of us.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>architecture</category>
      <category>software</category>
    </item>
    <item>
      <title>I Could Review It. I Couldn’t Write It.</title>
      <dc:creator>Adam - The Developer ✨</dc:creator>
      <pubDate>Mon, 13 Jul 2026 07:52:12 +0000</pubDate>
      <link>https://dev.to/adamthedeveloper/i-could-review-it-i-couldnt-write-it-3gfj</link>
      <guid>https://dev.to/adamthedeveloper/i-could-review-it-i-couldnt-write-it-3gfj</guid>
      <description>&lt;p&gt;...now, I pride myself on being good at my job, I'm fast at catching mistakes, I'm efficient at reviewing code and I'm quick to spot patterns across systems. But ever since I knew how to use AI ( maybe around mid 2024, I was still doing the old trad way when i started in 2018 ), I've been letting AI write ALOT of my code.&lt;/p&gt;

&lt;p&gt;And I thought I was still learning.&lt;/p&gt;

&lt;p&gt;Then one day I sat down to write an HTTP handler in Go from scratch, and I froze... and I can't describe how scary this was.&lt;/p&gt;

&lt;p&gt;Not because I don't understand HTTP or because I don't know Go because I recognize these patterns instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;handleJobNext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can review it, spot mistakes, discuss the design. But build it from scratch? I found myself thinking: "Wait... is it &lt;code&gt;http.HandleFunc&lt;/code&gt;? &lt;code&gt;ServeMux&lt;/code&gt;? How do I start the server?"&lt;/p&gt;

&lt;p&gt;That's when I realized something was wrong, I realized the trap I'd fallen into and I had to do something about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recognition is not Production
&lt;/h2&gt;

&lt;p&gt;This biggest illusion that AI makes much easier to fall into is the thinking that goes:&lt;br&gt;&lt;br&gt;
"I understand this" and it feels &lt;em&gt;exactly&lt;/em&gt; like "I can produce this."&lt;/p&gt;

&lt;p&gt;I also wanna clarify that AI isn't the first one to inven this problem, Stack Overflow, copy-pasted frameworks and tutorials all created it first and AI's just accelarating the distance.&lt;/p&gt;

&lt;p&gt;Recognizing a solution is just one skill. Your brain does pattern matching beautifully and way effortlessly than you think once you get used to it, you see &lt;code&gt;http.HandleFunc&lt;/code&gt;, think "yep, that's how you register routes," and feel confident.But try retriving that knowledge from scratch, constructing it... that's a whole other level, those are completely different neural pathways because the ability to review code, design &amp;amp; architecture aren't the same as writing it from memory and it should never be mistaken.  &lt;/p&gt;

&lt;p&gt;I got really good at reviewing, too good I guess, I am fast &amp;amp; efficient, I could critique architecture, spot edge cases, ask the right questions and basically start a whole drunken bar vibe conversation with it but you know what scares me despite being able to do all of this? I couldn't write an HTTP handler from memory.&lt;/p&gt;

&lt;p&gt;I WAS practicing &lt;em&gt;some&lt;/em&gt; skills. just some. just not the ones I thought.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gap and I Started A Series
&lt;/h2&gt;

&lt;p&gt;There's also a dangerous confidence trap here: convincing yourself you're still learning because you're the "architect" or "reviewer", you're making decisions, you understand the system.&lt;/p&gt;

&lt;p&gt;But how would you feel if knowing you can't write what the AI wrote, not without looking. that's the gap.&lt;/p&gt;

&lt;p&gt;Anyway, a few months ago, I started writing distributed systems algorithms in Go from scratch, each algorithm belonging to their own repo. No AI. I write entirely, then ask it to review and I tell you it's very rewarding!  &lt;/p&gt;

&lt;p&gt;I am doing the series for 2 reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This will help me strengthen my skill in Go, I love Go but it's also the least used language of mine too but a very important one.&lt;/li&gt;
&lt;li&gt;I hope to help others understand algorithms in distributed systems where it's written with as much as simplicity as I could but also not leaving out edge cases and failure modes. Many developers work with one unknowingly and wonder why their simple code causes data corruption as soon as someone adds another instance of the backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will be releasing the article one by one each after I'm done where I will document every hell and tasmanian devil I would've had gone through, no filters with the exception of bad languages.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Can't Download Experience
&lt;/h2&gt;

&lt;p&gt;Great software doesn't come from perfect code, It comes from &lt;em&gt;surviving&lt;/em&gt; bad code.&lt;/p&gt;

&lt;p&gt;Engineering intuition is built from mistakes, failed designs, debugging at 2 AM, edge cases that shouldn't exist, trade-offs that haunt you for years. The final code is just the artifact. The scar tissue is the education.&lt;/p&gt;

&lt;p&gt;Take a system like PostgreSQL represents decades of accumulated engineering decisions.&lt;/p&gt;

&lt;p&gt;I'm picking on Postgres specifically because I saw someone tried to rewrite Postgres with Rust nearly entirely with agents. It's not a bad thing, in fact, it's improving Postgres tremendously: with Rust, it's moving from the historic &lt;em&gt;process-per-connection&lt;/em&gt; to &lt;em&gt;thread-per-connection,&lt;/em&gt; massive performance gain and some of the long-standing postgres pain points.&lt;/p&gt;

&lt;p&gt;You can rewrite it. You can reproduce the behavior. But you won't reproduce the journey that created that understanding—the bugs fixed, the performance lessons learned, the constraints that forced particular designs.&lt;/p&gt;

&lt;p&gt;Letting an agent write everything and you get the artifact without the scar tissue.&lt;/p&gt;

&lt;p&gt;And expertise lives in the scar tissue.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;The skills you practice will grow. The skills you outsource will weaken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I outsourced writing and my writing muscle atrophied. I got better at reviewing and architecture, but lost something important.&lt;/p&gt;

&lt;p&gt;Now I'm deliberate: distributed systems algorithms in Go, I write. from scratch.&lt;/p&gt;

&lt;p&gt;Not because I am better than AI but because I'm choosing which muscles to exercise and the choice matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Not Saying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI is not bad. I use it daily. Heck, I still use it for work because businesses' deadlines now are unrealistic standards compared to what they were a few years ago.&lt;/li&gt;
&lt;li&gt;Code review is still critical work.&lt;/li&gt;
&lt;li&gt;AI is still my thinking partner and my force multiplier, I still consult it from time to time when making decisions, it builds me up and makes me a better developer and I make decisions faster because I'm not the only one thinking when no one's around.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I'm saying is: &lt;strong&gt;Be intentional about which parts of expertise you allow to change.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every tool reshapes what engineers need to know. The goal isn't to preserve manual typing forever. The goal is to ensure that the parts of engineering &lt;em&gt;you want to own&lt;/em&gt; are still exercised by you.&lt;/p&gt;

&lt;p&gt;If you want to stay sharp at writing, you have to pick code you're not going to outsource.&lt;/p&gt;

&lt;p&gt;Because expertise follows exercise. Always.&lt;/p&gt;

&lt;p&gt;The question isn't whether you can write without AI.&lt;/p&gt;

&lt;p&gt;The question is: &lt;em&gt;Will you?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
