<?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: Dario Cuevas</title>
    <description>The latest articles on DEV Community by Dario Cuevas (@dario_cuevas_b59c9fb59f78).</description>
    <link>https://dev.to/dario_cuevas_b59c9fb59f78</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3583919%2F3579d97d-2b8f-4ba1-a01a-010a1b365dc6.jpeg</url>
      <title>DEV Community: Dario Cuevas</title>
      <link>https://dev.to/dario_cuevas_b59c9fb59f78</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dario_cuevas_b59c9fb59f78"/>
    <language>en</language>
    <item>
      <title>🎃 10 Spooky Engineering Antipatterns That Haunt Your Codebase (And How to Exorcise Them)</title>
      <dc:creator>Dario Cuevas</dc:creator>
      <pubDate>Fri, 31 Oct 2025 12:17:40 +0000</pubDate>
      <link>https://dev.to/dario_cuevas_b59c9fb59f78/10-spooky-engineering-antipatterns-that-haunt-your-codebase-and-how-to-exorcise-them-3jk4</link>
      <guid>https://dev.to/dario_cuevas_b59c9fb59f78/10-spooky-engineering-antipatterns-that-haunt-your-codebase-and-how-to-exorcise-them-3jk4</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;🎃 10 Spooky Engineering Antipatterns That Haunt Your Codebase (And How to Exorcise Them)&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;👻 When Fear Takes Control&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let me be honest with you from the start—this isn't going to be one of those perfectly academic blog posts filled with textbook definitions and pristine case studies. This is real talk about real engineering nightmares I've lived through, and I'm willing to bet you've experienced many of them too.&lt;/p&gt;

&lt;p&gt;Here's the terrifying truth: when deadlines loom and fear creeps in, we all commit similar antipatterns. It doesn't matter if you're a junior engineer or a seasoned tech lead—&lt;strong&gt;fear blocks our rational thinking&lt;/strong&gt;. That looming sprint deadline, that critical production release, that executive breathing down your neck—they all trigger the same response: shortcuts, compromises, and decisions we know we'll regret later.&lt;/p&gt;

&lt;p&gt;I've seen it countless times in standups, retrospectives, and 2 AM Teams messages. We become predictable in our panic. We skip the tests "just this once." We hard-code that value "temporarily." We tell ourselves we'll fix it later, knowing deep down that "later" rarely comes.&lt;/p&gt;

&lt;p&gt;This Halloween, I want to shine a light on these ghosts haunting our codebases and our processes. Some of these antipatterns are well-documented in books like &lt;a href="https://www.oreilly.com/library/view/clean-code-a/9780136083238/" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt; by Robert C. Martin. Others are more orthodox observations from the trenches—patterns I've noticed when fear takes the wheel and rational engineering takes the backseat.&lt;/p&gt;

&lt;p&gt;So grab your garlic and wooden stakes. Let's hunt some monsters.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🕷️ Technical &amp;amp; Coding Horrors&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. The Ghost of Bad Comments (or Worse—No Comments)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You know what's scarier than no comments? Misleading comments that lie. Comments outdated three refactorings ago that nobody bothered to update.&lt;/p&gt;

&lt;p&gt;Good comments explain the "why," not the "what." Your code should be self-explanatory. Comments should provide context, explain business logic, or warn about gotchas—not describe what the code does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Make code readable without comments, but use them strategically to explain intent, constraints, and non-obvious decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. "I Finished—Only Tests Are Missing"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If tests are missing, &lt;strong&gt;you haven't finished&lt;/strong&gt;. Period.&lt;/p&gt;

&lt;p&gt;TDD isn't just about having tests—it's about using them to think through the behaviors you're adding. Writing tests first forces you to consider the API, edge cases, and failure modes. Writing tests at the end? You're retrofitting tests onto code that wasn't designed to be testable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Write tests as you develop, not after. Make "tests passing" part of your definition of done.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. The Boy Scout Rule? Never Heard of Her&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;"Always leave the campground cleaner than you found it." But here's what actually happens: we see ugly code, add our own ugly code on top, and move on. "This isn't my problem" or "I don't have time."&lt;/p&gt;

&lt;p&gt;The Boy Scout Rule isn't about heroic refactorings. It's about small, incremental improvements—renaming a confusing variable, extracting a complex method, fixing a minor bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Make it a team habit. Every PR should leave the codebase slightly better—even if it's just one variable rename.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Over-Engineering: The Curse of Complexity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;"We need to make this flexible for future requirements!" Famous last words before building a framework when a simple function would do.&lt;/p&gt;

&lt;p&gt;Over-engineering bloats the codebase and introduces unnecessary risk. The best code I've written is code I later deleted because the feature didn't need code at all—just a config change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Always ask: "What's the simplest thing that could possibly work?" Build what you need today. Refactor tomorrow if requirements actually change.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. "The AI Generated This, So It's Probably Fine"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI coding assistants are incredible. I use them daily. But "vibe coding"—pasting AI-generated code without understanding it—is how amateur programmers work, not professionals.&lt;/p&gt;

&lt;p&gt;Treat AI as a pair programmer, not a replacement. Read every line it generates. Often, AI gives you something that works but isn't optimal for your context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Always review, understand, and validate AI-generated code. You're responsible for every line that ships, regardless of who (or what) wrote it.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🧟 Behavioral, Process &amp;amp; Collaboration Nightmares&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Forgetting Operational Readiness: The 2 AM Phone Call Horror&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You ship the feature. Everyone celebrates. Then at 2 AM, production breaks, and nobody knows what to do.&lt;/p&gt;

&lt;p&gt;Where's the observability? Where are the monitoring dashboards, the alerts, the runbooks or SOPs documenting how to handle incidents? When you ship without proper observability, you're saying: "Someone else will deal with it when it breaks."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Before production deployment, ensure monitoring is set up, alerting is configured, dashboards provide visibility, and runbooks are prepared. Make operational readiness a prerequisite for "done."&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Optimism Bias: "If That Happens, Something's Very Wrong"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;"Well, if the network fails at that point, we have bigger problems."&lt;/p&gt;

&lt;p&gt;Really? Networks fail. Services become unresponsive. External dependencies time out. These aren't edge cases—they're Tuesday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Design for failure. Add timeouts. Implement circuit breakers. Handle errors gracefully. Test your failure modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Implementation Over Outcome: The Cache Trap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The team spends two weeks debating how to implement a caching layer. Which library? Redis or Memcached? &lt;/p&gt;

&lt;p&gt;Meanwhile, nobody asks: "Do we actually need a cache, or could we solve the performance problem with database indexes?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Always start with the outcome. What problem are we solving? What's the simplest solution? Stay solution-agnostic until you've explored the problem space.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Horizontal Slicing: The Integration Nightmare&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You break down a feature "logically": one story for frontend, one for backend, one for database. &lt;/p&gt;

&lt;p&gt;Wrong. This creates dependencies, delays integration, and prevents early validation. The frontend team waits for the API. The backend discovers a fundamental database issue—after the frontend is "done." Now you rebuild both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Break stories vertically. Deliver thin slices across all layers. Get feedback early. Iterate.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Code Reviews as Gatekeeping, Not Coaching&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code reviews are one of the best opportunities to level up your team. Yet how often are they just rubber stamps or nitpicking sessions?&lt;/p&gt;

&lt;p&gt;When a senior engineer reviews a junior's code, they have a choice: approve quickly and move on, or invest time in teaching better patterns. The second option takes longer, but it compounds over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exorcism:&lt;/strong&gt; Treat every code review as a coaching opportunity. Ask questions instead of making demands. Explain the reasoning behind suggestions. Build a culture where learning is more valued than being right.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;💀 The Exorcism Guide—Banishing These Ghosts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We've identified the monsters. Now let's reflect on how to banish them from your codebase and your process.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fear and deadlines push us toward these antipatterns. But &lt;strong&gt;awareness is the first step to breaking the cycle&lt;/strong&gt;. When you feel that pressure mounting, when shortcuts start looking attractive—pause. Ask: "Am I about to create technical debt I'll regret?"&lt;/p&gt;

&lt;p&gt;These antipatterns aren't character flaws. They're natural human responses to stress. The difference between struggling teams and thriving teams isn't that thriving teams never feel the pressure—it's that they've built habits and guardrails to prevent fear-driven decisions.&lt;/p&gt;

&lt;p&gt;Remember: if we all follow simple rules like the Boy Scout Rule, we would see the end of the relentless deterioration of our software systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Share Your Horror Stories&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now it's your turn. What's the scariest antipattern you've encountered? Which ghost haunts your codebase? Have you seen any of these patterns in your own work?&lt;/p&gt;

&lt;p&gt;Please share your engineering horror stories. Sometimes the best exorcism is knowing we're not alone in fighting these demons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Halloween! May your code be bug-free and your deployments haunt-free.&lt;/strong&gt; 🎃👻&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources &amp;amp; Further Reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dariocuevas.com/blog/mcp-usb-c-moment-for-apis" rel="noopener noreferrer"&gt;My previous article on MCP and code comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Clean Code&lt;/em&gt; and other works by Robert C. Martin&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Software Engineer's Guidebook&lt;/em&gt; by Gergely Orosz&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;User Story Mapping&lt;/em&gt; by Jeff Patton&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Escaping the Build Trap&lt;/em&gt; by Melissa Perri&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codepipes.com/testing/software-testing-antipatterns.html" rel="noopener noreferrer"&gt;Software Testing Anti-patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deviq.com/principles/boy-scout-rule/" rel="noopener noreferrer"&gt;The Boy Scout Rule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.humanizingwork.com/the-humanizing-work-guide-to-splitting-user-stories/" rel="noopener noreferrer"&gt;Vertical Slicing Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cortex.io/post/how-to-create-a-great-production-readiness-checklist" rel="noopener noreferrer"&gt;Production Readiness Checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cleancode</category>
      <category>antipatterns</category>
      <category>bestpractices</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why I Changed My Mind About Code Comments</title>
      <dc:creator>Dario Cuevas</dc:creator>
      <pubDate>Mon, 27 Oct 2025 16:31:36 +0000</pubDate>
      <link>https://dev.to/dario_cuevas_b59c9fb59f78/why-i-changed-my-mind-about-code-comments-14k1</link>
      <guid>https://dev.to/dario_cuevas_b59c9fb59f78/why-i-changed-my-mind-about-code-comments-14k1</guid>
      <description>&lt;h1&gt;
  
  
  Why I Changed My Mind About Code Comments
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🎬 The Awakening — When Your Own Code Bites Back
&lt;/h2&gt;

&lt;p&gt;I still remember the day in 2011 when I found a piece of particularly nasty code in our codebase. I checked &lt;code&gt;git blame&lt;/code&gt;. It was me. A year earlier.&lt;/p&gt;

&lt;p&gt;This moment crystallized everything I'd learned since leaving consultancy in 2010. In consulting, you write code and move on. Someone else's problem. But in a product company? That code is &lt;em&gt;yours&lt;/em&gt;. You'll maintain it, extend it, and curse it at 2 AM when production goes down.&lt;/p&gt;

&lt;p&gt;That's when a senior engineer handed me Clean Code by Robert C. Martin. I devoured it. The book promised redemption through better naming, formatting, testing, and refactoring.&lt;/p&gt;

&lt;p&gt;At its heart was a radical idea: &lt;strong&gt;comments are failures&lt;/strong&gt;. If your code needs comments, you've failed to make it self-documenting. &lt;/p&gt;

&lt;p&gt;I became a fanatic.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧹 The Clean Code Years — When Comments Became the Enemy
&lt;/h2&gt;

&lt;p&gt;From 2010 to 2014, I practiced what Robert Martin preached with religious fervor: &lt;strong&gt;kill the comments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of writing &lt;code&gt;// Calculate the total price including tax and discount&lt;/code&gt;, I'd extract a function called &lt;code&gt;calculateFinalPriceWithTaxAndDiscount()&lt;/code&gt;. The function name became the comment.&lt;/p&gt;

&lt;p&gt;When I needed to explain a complex algorithm, I'd split it into smaller, well-named functions: &lt;code&gt;validateUserInput()&lt;/code&gt;, &lt;code&gt;processPaymentTransaction()&lt;/code&gt;, &lt;code&gt;sendConfirmationEmail()&lt;/code&gt;. Each name was documentation embedded in code.&lt;/p&gt;

&lt;p&gt;I had a killer argument against comments: &lt;strong&gt;they get outdated&lt;/strong&gt;. Comments that lie are worse than no comments. Let the code be the single source of truth.&lt;/p&gt;

&lt;p&gt;My code became cleaner. Functions smaller. Variable names ridiculously long but descriptive. I felt like a craftsman who'd mastered the technique.&lt;/p&gt;

&lt;p&gt;But there was a nagging feeling I couldn't shake...&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Philosophy Shift — When Everything Changed
&lt;/h2&gt;

&lt;p&gt;Then I read &lt;em&gt;A Philosophy of Software Design&lt;/em&gt; by John Ousterhout. My world turned upside down again.&lt;/p&gt;

&lt;p&gt;Ousterhout directly challenged Clean Code: "Comments do not represent failures. The information they provide is quite different from that provided by code, and this information can't be represented in code today."&lt;/p&gt;

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

&lt;p&gt;The key insight: &lt;strong&gt;Comments are fundamental to abstractions&lt;/strong&gt;. Without comments, you can't hide complexity. If users must read the code to use a method, then there is no abstraction—all complexity is exposed.&lt;/p&gt;

&lt;p&gt;Here's a real example of my evolution:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (Clean Code approach):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTimeRemaining&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;excludeWeekends&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Function name tells WHAT, but not WHY&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;After (Philosophy of Software Design approach):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Calculates business days remaining for project deadline.
 * 
 * We use business days because our SLA commitments to customers
 * are based on business days. Weekend exclusion handles our 24/5
 * support model. Holidays vary by region.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTimeRemaining&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;excludeWeekends&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Implementation...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function name tells you &lt;em&gt;what&lt;/em&gt;. The comment tells you &lt;em&gt;why&lt;/em&gt;, the business context, and the assumptions. &lt;strong&gt;Both are essential.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ousterhout demolished Martin's solution of extracting functions with longer names: "This results in names like isLeastRelevantMultipleOfNextLargerPrimeFactor. Even with all these words, names like this are cryptic and provide less information than a well-written comment."&lt;/p&gt;

&lt;p&gt;I suddenly saw all those ridiculously long function names for what they were: a workaround to avoid writing one clear sentence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The synthesis I reached:&lt;/strong&gt; Robert Martin was right about 80% of things. Clean code, expressive naming, small functions—all essential. But comments aren't failures. &lt;em&gt;Bad&lt;/em&gt; comments are failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My current practice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short, internal functions&lt;/strong&gt;: Minimal comments. The code speaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex functions&lt;/strong&gt;: Comments explain the &lt;em&gt;why&lt;/em&gt; and business context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public APIs&lt;/strong&gt;: Comments are &lt;em&gt;mandatory&lt;/em&gt;. They define the abstraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tricky workarounds&lt;/strong&gt;: Comments are &lt;em&gt;essential&lt;/em&gt;. They save hours of confusion.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤖 The AI Era — Why Comments Matter More Than Ever
&lt;/h2&gt;

&lt;p&gt;Now we're in 2025, and there's a new player: AI coding assistants.&lt;/p&gt;

&lt;p&gt;I use Claude Code with a &lt;code&gt;claude.md&lt;/code&gt; file in my projects. Here's what I discovered: &lt;strong&gt;good comments make AI dramatically more effective&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GitHub Copilot, Claude, and other AI assistants use comments as crucial context. They parse not just syntax but interpret comments to understand intent and generate better suggestions.&lt;/p&gt;

&lt;p&gt;This changes everything. We're not just writing comments for humans—we're writing them for AI assistants that help us code faster.&lt;/p&gt;

&lt;p&gt;And let's remember: &lt;strong&gt;code is read far more than it's written&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Robert Martin himself said it: "The ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code."&lt;/p&gt;

&lt;p&gt;In my 15+ years, this rings absolutely true. I spend my days understanding code before changing it, fixing bugs, reviewing code, investigating incidents, and onboarding team members. We're not creating greenfield projects daily—we're maintaining, extending, and evolving existing systems. All of that requires &lt;em&gt;reading&lt;/em&gt; code.&lt;/p&gt;

&lt;p&gt;If code is read 10x more than it's written, making code easier to read has a 10x multiplier on productivity. &lt;strong&gt;Good comments make code dramatically easier to read.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 What Good Comments Look Like
&lt;/h3&gt;

&lt;p&gt;• &lt;strong&gt;Explain the "Why," Not the "What"&lt;/strong&gt; — Code shows what. Comments explain why, what business logic it serves, and what assumptions it makes.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Capture What Code Cannot Express&lt;/strong&gt; — Document context, constraints, trade-offs, and decisions invisible in code.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Stay Close to the Code&lt;/strong&gt; — Comments next to what they describe stay updated. Avoid distant documentation.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Don't Duplicate the Code&lt;/strong&gt; — If your comment restates the obvious (&lt;code&gt;// increment counter&lt;/code&gt;), delete it.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Document Edge Cases and Gotchas&lt;/strong&gt; — Weird workarounds? Input assumptions? Threading constraints? Comment them!&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Provide Examples&lt;/strong&gt; — One input/output example beats paragraphs of abstract description.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Keep Them Updated&lt;/strong&gt; — Change code, update comments. Make it part of code review.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Write During Development&lt;/strong&gt; — Don't leave for later. Write when context is fresh.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Use Standard Formats&lt;/strong&gt; — JSDoc, Javadoc, Python docstrings—use your language's conventions.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;The Bottom Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After 15 years and two philosophical earthquakes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Code is right&lt;/strong&gt;: Write expressive code with clear names and good structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Philosophy of Software Design is also right&lt;/strong&gt;: Comments capture essential information code alone cannot express.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the AI era&lt;/strong&gt;: Comments aren't just for humans. They're context for AI assistants. No excuse for skipping them.&lt;/p&gt;

&lt;p&gt;The best code isn't comment-free. The best code uses comments wisely—where they add value, explain context, and make code dramatically easier to understand.&lt;/p&gt;

&lt;p&gt;Robert Martin and John Ousterhout aren't enemies. They're two perspectives on the same problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write clean code. Use good names. Keep functions small. And write clear, valuable comments that explain what the code cannot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your future self—and your AI coding assistant—will thank you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your take? Have you evolved your philosophy over the years?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.goodreads.com/book/show/3735293-clean-code" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt; by Robert C. Martin&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web.stanford.edu/~ouster/cgi-bin/book.php" rel="noopener noreferrer"&gt;A Philosophy of Software Design&lt;/a&gt; by John Ousterhout
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bayrhammer-klaus.medium.com/you-spend-much-more-time-reading-code-than-writing-code-bc953376fe19" rel="noopener noreferrer"&gt;"Code is read more than written"&lt;/a&gt; - The 10:1 ratio&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot Documentation&lt;/a&gt; - How AI uses comments&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments/" rel="noopener noreferrer"&gt;Stack Overflow's Comment Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>codecomments</category>
      <category>cleancode</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
