<?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: Mauro Damian Perez Garcia</title>
    <description>The latest articles on DEV Community by Mauro Damian Perez Garcia (@maroneta).</description>
    <link>https://dev.to/maroneta</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%2F829224%2F849933f8-cd5a-4bca-a822-69e7284a5477.png</url>
      <title>DEV Community: Mauro Damian Perez Garcia</title>
      <link>https://dev.to/maroneta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maroneta"/>
    <language>en</language>
    <item>
      <title>Most of My Retrieval Problems Were Never About Retrieval</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:40:58 +0000</pubDate>
      <link>https://dev.to/maroneta/most-of-my-retrieval-problems-were-never-about-retrieval-1epf</link>
      <guid>https://dev.to/maroneta/most-of-my-retrieval-problems-were-never-about-retrieval-1epf</guid>
      <description>&lt;p&gt;A post arguing that RAG is simpler than people think made the rounds, and I nodded through the whole thing with the specific satisfaction of someone who learned it the expensive way.&lt;/p&gt;

&lt;p&gt;If you built a retrieval-augmented system in the last couple of years, you probably did what I did. You compared vector databases. You read about chunking strategies. You tuned the embedding model. You added a reranker. You drew a diagram with six boxes in it and felt like a serious engineer.&lt;/p&gt;

&lt;p&gt;Then you shipped it and the answers were mediocre, and almost none of the mediocrity came from the parts you spent your time on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the failures actually came from
&lt;/h3&gt;

&lt;p&gt;For me, in rough order of how much damage they caused:&lt;/p&gt;

&lt;p&gt;The documents were bad. Outdated pages sat next to current ones with no way to tell them apart. The same policy existed in three versions across a wiki, a PDF, and a Slack thread. Retrieval worked perfectly and confidently handed the model a document from 2023. No amount of embedding quality fixes a corpus that contradicts itself.&lt;/p&gt;

&lt;p&gt;Permissions were an afterthought. The moment a system can surface any document, it can surface the wrong document to the wrong person. Retrieving with the user's own access rights rather than a service account's is not a feature to add later. It is a property of the architecture, and retrofitting it is miserable.&lt;/p&gt;

&lt;p&gt;The prompt assembly was sloppy. I had spent weeks on which chunks to retrieve and about ten minutes on how to present them to the model. Whether sources are labeled, whether the model is told what to do when the context does not contain the answer, whether the ordering implies priority — these mattered more than the retrieval nuance.&lt;/p&gt;

&lt;p&gt;And I had no way to tell whether a change helped. That one is the real killer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation is the whole game
&lt;/h3&gt;

&lt;p&gt;If you take one thing from this: write down thirty real questions with known good answers before you optimize anything.&lt;/p&gt;

&lt;p&gt;It does not need to be sophisticated. A spreadsheet is fine. What it gives you is the ability to make a change and know whether it helped, which is the difference between engineering and redecorating. Without it, every tuning decision is a vibe, and you will happily add a reranker that makes things slightly worse while feeling productive.&lt;/p&gt;

&lt;p&gt;Thirty questions from actual users beats three hundred synthetic ones, because real questions are weirder. They are ambiguous, they use internal jargon, they assume context, and they ask about things that are genuinely not in your documents. That last category is where most systems embarrass themselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  The boring baseline is stronger than it looks
&lt;/h3&gt;

&lt;p&gt;The other thing I underrated: plain keyword search, plus metadata filtering, plus a modest amount of context, gets you remarkably far.&lt;/p&gt;

&lt;p&gt;Not always. Semantic search genuinely helps when users and documents use different vocabulary, which is common. But keyword matching is precise, debuggable, and instant to explain when someone asks why a particular result showed up. Hybrid approaches win in practice partly because they let you reason about failures.&lt;/p&gt;

&lt;p&gt;Metadata filtering may be the most underrated component in the entire stack. Restricting retrieval by date, document type, product area, or team eliminates a whole class of confidently wrong answers, and it costs almost nothing. I have seen a filter on "current version only" improve output more than a model upgrade did.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I would start over
&lt;/h3&gt;

&lt;p&gt;If I were building this again from zero, I would spend the first week on the corpus, not the code. Find out what documents exist, which are authoritative, what the access rules are, and how stale things get. That work is unglamorous and it determines the ceiling of everything downstream.&lt;/p&gt;

&lt;p&gt;Then I would build the dumbest possible pipeline: search, take the top handful of results, put them in a prompt with clear labels and an explicit instruction to say when the answer is not present. Measure it against the question set. Only then start adding machinery, one piece at a time, keeping whatever the numbers justify.&lt;/p&gt;

&lt;p&gt;My suspicion is that a lot of teams have complex retrieval systems where a simple one would perform the same, and the complexity persists because nobody can prove which parts are earning their keep.&lt;/p&gt;

&lt;p&gt;The pattern is not unique to this technology. When a field is new, we mistake the interesting part for the important part. The interesting part was the vector math. The important part was knowing which document is true.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A Vote About Bots Is Really a Vote About Trust</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:40:23 +0000</pubDate>
      <link>https://dev.to/maroneta/a-vote-about-bots-is-really-a-vote-about-trust-f3k</link>
      <guid>https://dev.to/maroneta/a-vote-about-bots-is-really-a-vote-about-trust-f3k</guid>
      <description>&lt;p&gt;Debian is polling its developers on how to handle AI-assisted contributions, with options that range from broadly permitting them to banning them outright. Whatever the outcome, I think this is one of the more consequential governance conversations in open source right now, and not for the reason the headlines suggest.&lt;/p&gt;

&lt;p&gt;The framing everyone reaches for is philosophical. Is generated code authored? Is it derivative? Does using a model make you less of a contributor? Those are real questions and I do not have confident answers to them.&lt;/p&gt;

&lt;p&gt;But if I imagine actually being a Debian maintainer, my problem is not philosophical at all. It is that my queue is full and my reviewing hours are finite.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bottleneck was never writing code
&lt;/h3&gt;

&lt;p&gt;Volunteer projects have always been constrained by review capacity, not by supply of patches. The scarce resource is someone knowledgeable enough to say "this is correct, this fits our conventions, I will own the consequences if it breaks."&lt;/p&gt;

&lt;p&gt;Assistants change the ratio between those two things dramatically. The cost of producing a plausible patch has fallen much faster than the cost of evaluating one. That asymmetry is the whole story. A project can absorb a lot of contributors when each contributor's output is roughly proportional to their understanding. It struggles when someone can submit a large, fluent, superficially reasonable change to a subsystem they have never read.&lt;/p&gt;

&lt;p&gt;I want to be careful here: plenty of experienced maintainers use these tools well, and their patches are better for it. The failure mode is not the tool. It is the decoupling of confidence from comprehension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why detection is the wrong axis
&lt;/h3&gt;

&lt;p&gt;A ban sounds like a clean answer, and I understand the appeal. But I am skeptical it can be enforced in a way that means anything.&lt;/p&gt;

&lt;p&gt;You cannot reliably detect generated code, especially after a human has edited it, and especially for the kind of small idiomatic patch that makes up most of a distribution's traffic. A rule you cannot enforce does not produce compliance. It produces silence: people stop disclosing, which is strictly worse than a norm that encourages honesty.&lt;/p&gt;

&lt;p&gt;So the more useful axis is accountability rather than provenance. Not "did a machine help you write this," but "do you understand this well enough to defend it, and are you the one who will be here when it breaks?"&lt;/p&gt;

&lt;p&gt;That shifts the question to things a project can actually check. Can the contributor explain why this approach and not the obvious alternative? Did they test it on real hardware or just assert that they did? Is the changelog honest about scope? Have they engaged with review feedback in a way that shows they read the code?&lt;/p&gt;

&lt;p&gt;Those signals have always separated good contributors from noisy ones. They just matter more now, because fluency no longer implies effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disclosure as a courtesy, not a confession
&lt;/h3&gt;

&lt;p&gt;I have come around to thinking that disclosure norms are worth having anyway, even though they are unenforceable, because of what they do culturally rather than technically.&lt;/p&gt;

&lt;p&gt;If saying "I used an assistant for the boilerplate here, and I verified the parsing logic by hand" is normal and unremarkable, reviewers get useful information about where to focus. If it is treated as an admission of laziness, nobody says it, and reviewers get nothing.&lt;/p&gt;

&lt;p&gt;The projects I expect to handle this well are the ones that write down what they want from a contribution rather than what they forbid. Something closer to: you are responsible for every line you submit, you must be able to explain it, large changes need prior discussion, and tests are not optional. None of that mentions AI. All of it addresses the actual risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is really being decided
&lt;/h3&gt;

&lt;p&gt;A distribution like Debian is infrastructure for a staggering amount of the world's computing, maintained largely by people doing it in their spare time. Its trust model is social: humans vouching for humans, over decades, with reputations that took years to build.&lt;/p&gt;

&lt;p&gt;The question on the table is not really about tooling policy. It is whether that social fabric can survive a sharp increase in the volume of plausible contributions from people with no accumulated stake in it.&lt;/p&gt;

&lt;p&gt;I do not know the answer. I do know that a permit-or-ban vote is a blunt instrument for a problem that is fundamentally about attention and accountability. Whatever the ballot says, the projects that come out healthy will be the ones that got explicit about what a maintainer owes the code and what a contributor owes the maintainer.&lt;/p&gt;

&lt;p&gt;That conversation was overdue regardless of the machines.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Miss Reviewing Changes, Not Branches</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:40:17 +0000</pubDate>
      <link>https://dev.to/maroneta/i-miss-reviewing-changes-not-branches-535</link>
      <guid>https://dev.to/maroneta/i-miss-reviewing-changes-not-branches-535</guid>
      <description>&lt;p&gt;Someone posted a tool that brings a Gerrit-style review workflow to GitHub and the other forges, and I felt a small pang of recognition. Not because I want to relitigate which review tool is best, but because it named a frustration I had stopped noticing.&lt;/p&gt;

&lt;p&gt;The pull request model quietly conflated two different things: the branch you are working on and the unit of change you want reviewed. For a long time I assumed that was just how code review works. It is not. It is one choice among several, and it has costs we have all agreed to pay without discussing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The unit of review should be a decision, not a container
&lt;/h3&gt;

&lt;p&gt;In a change-centric workflow, the thing under review is a single logical change. It has an identity that survives rewriting. You can amend it, rebase it, improve it after feedback, and the review conversation stays attached to the change itself rather than to a pile of commits that happen to share a branch name.&lt;/p&gt;

&lt;p&gt;The practical consequence is that stacking becomes natural. Change A introduces the interface. Change B implements it. Change C migrates the callers. Each one is small, each one is reviewable in ten minutes, and each one can move forward at its own pace.&lt;/p&gt;

&lt;p&gt;In a branch-centric workflow, that same work tends to collapse into one pull request with forty files in it, because splitting it means juggling branches, base branches, and the fun of every rebase invalidating the review below. I have watched excellent engineers batch up a week of work into a single reviewable lump purely because the tooling made the alternative annoying.&lt;/p&gt;

&lt;p&gt;We then blame the reviewer for skimming. The reviewer is not the problem. Nobody reads forty files carefully. They read the first three and approve the rest on trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  What large reviews actually cost
&lt;/h3&gt;

&lt;p&gt;The cost is not just missed bugs, though there are missed bugs.&lt;/p&gt;

&lt;p&gt;It is that a large review cannot be honest about intent. When a diff contains a rename, a refactor, a behavior change, and a new feature all at once, no reviewer can tell which lines are load-bearing. The refactor camouflages the risky change. I have shipped bugs this way and I have approved bugs this way, and in both cases the review technically happened.&lt;/p&gt;

&lt;p&gt;It is also that a large review makes disagreement expensive. If I object to one design decision inside a big pull request, I am blocking a week of someone's work. So I soften the comment, or I leave it as a "nit," or I say nothing. Small changes make it cheap to disagree, which means disagreement actually surfaces.&lt;/p&gt;

&lt;p&gt;And it is that revert becomes a blunt instrument. Reverting a focused change is a five-minute operation. Reverting a mega-branch means untangling four unrelated things at the worst possible moment.&lt;/p&gt;

&lt;h3&gt;
  
  
  You can get most of this without switching tools
&lt;/h3&gt;

&lt;p&gt;Here is the part I want to be practical about. I am not going to convince an organization to migrate its review infrastructure, and I would not necessarily recommend it.&lt;/p&gt;

&lt;p&gt;But most of the benefit comes from habits rather than tooling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write commits that each stand alone, so a reviewer can walk them in order and follow the reasoning.&lt;/li&gt;
&lt;li&gt;Split mechanical changes from behavioral ones. A rename-only pull request is a gift. It gets approved in a minute and it makes the next diff readable.&lt;/li&gt;
&lt;li&gt;Open the interface change before the implementation, so the design conversation happens while it is still cheap.&lt;/li&gt;
&lt;li&gt;Use stacked pull requests when the platform supports them, even if the ergonomics are imperfect.&lt;/li&gt;
&lt;li&gt;Say in the description what you want reviewed. "The retry logic is the risky part; the rest is plumbing" saves everyone twenty minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires new software. It requires treating review as a communication problem rather than a gate to pass through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the tools still matter
&lt;/h3&gt;

&lt;p&gt;That said, tooling shapes behavior more than intentions do. If rebasing a stack is painful, people will stop stacking, regardless of what the style guide says. If review comments do not survive a force-push, people will avoid force-pushing and let their history get messy instead.&lt;/p&gt;

&lt;p&gt;So I am glad these alternative workflows keep getting built, even when they stay niche. They function as a running argument that the dominant model is a choice. Every time I use one, I come back to the mainstream flow noticing friction I had accepted as weather.&lt;/p&gt;

&lt;p&gt;The goal was never to have opinions about Git. It was to make it easy for a colleague to understand one decision at a time, and to disagree with it while disagreeing is still cheap.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What Lowercasing Taught Me About Trusting Strings</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:39:43 +0000</pubDate>
      <link>https://dev.to/maroneta/what-lowercasing-taught-me-about-trusting-strings-3mdi</link>
      <guid>https://dev.to/maroneta/what-lowercasing-taught-me-about-trusting-strings-3mdi</guid>
      <description>&lt;p&gt;Every so often a post reminds me that the most dangerous line of code in a system is the one that looks like it could not possibly be wrong. This week's version: calling &lt;code&gt;.lower()&lt;/code&gt; on a string can be a security vulnerability.&lt;/p&gt;

&lt;p&gt;If your first reaction is skepticism, mine was too. Lowercasing is the plumbing of programming. We do it to normalize usernames, compare header names, canonicalize domains, and check things against blocklists. It feels like arithmetic.&lt;/p&gt;

&lt;p&gt;The problem is that case conversion is not a character-by-character mechanical operation. It is a linguistic one, defined by Unicode, and it has behavior that surprises almost everyone who has not been bitten before.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case is not symmetric, and not always local
&lt;/h3&gt;

&lt;p&gt;Two examples that break the mental model. Turkish has a dotless i, and correct locale-aware conversion maps between letters differently than English does, which means "the same" string can lowercase into two different results depending on locale settings. And there are characters outside ASCII whose lowercase form &lt;em&gt;is&lt;/em&gt; an ASCII character, meaning a string that contains no &lt;code&gt;k&lt;/code&gt; at all can become one that does after normalization.&lt;/p&gt;

&lt;p&gt;Sit with that second one for a moment, because it is the security-relevant shape. If you validate a string, then normalize it, you have validated something that no longer exists. Your check ran against one value and your system acts on another.&lt;/p&gt;

&lt;p&gt;That is the classic time-of-check versus time-of-use bug, except the mutation is not caused by an attacker racing you. It is caused by your own normalization call, quietly doing what the spec says it should do.&lt;/p&gt;

&lt;p&gt;I want to be careful not to overstate the specifics here, since the exact behavior depends on language runtime, Unicode version, and locale configuration. The generalizable lesson is what interests me.&lt;/p&gt;

&lt;h3&gt;
  
  
  The pattern to look for in your own code
&lt;/h3&gt;

&lt;p&gt;Anywhere a string travels through this sequence, there is potential for trouble:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accept input.&lt;/li&gt;
&lt;li&gt;Check it against a rule: an allowlist, a blocklist, a comparison with a known value.&lt;/li&gt;
&lt;li&gt;Transform it: lowercase, strip, unescape, decode, or normalize.&lt;/li&gt;
&lt;li&gt;Use it: as a filename, a header, a domain, a database key, a routing decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If step three sits between steps two and four, the check is guarding a value the system never actually uses. The fix is not usually to remove the transformation. It is to reorder: canonicalize once, immediately at the boundary, and then validate the canonical form. After that point, the value is settled and nothing downstream may touch it.&lt;/p&gt;

&lt;p&gt;This is the same discipline we already accept for HTML escaping and SQL parameterization. Decide on one representation, produce it at the edge, and treat the inside of your system as trusted-by-construction rather than re-cleaned at every stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security comparisons want boring rules
&lt;/h3&gt;

&lt;p&gt;The other thing I have changed my mind about over the years is how much locale-awareness belongs near security decisions.&lt;/p&gt;

&lt;p&gt;Human-facing text should be locale-aware. If you are sorting names for a user, or displaying a title, or building a search feature, you want the real linguistic behavior. That is what it is for.&lt;/p&gt;

&lt;p&gt;Security comparisons want the opposite. They want a narrow, explicit, boring rule that does the same thing in every environment on every machine. If I am comparing a header name, I want an ASCII-only comparison. If I am matching a token against a list, I want exact bytes, chosen deliberately. If I need case-insensitivity for identifiers, I want the language's dedicated case-folding function rather than the display-oriented one, and I want a comment explaining which one and why.&lt;/p&gt;

&lt;p&gt;The general principle: when a function's behavior depends on ambient configuration, do not put it on the path of a decision about access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this keeps happening
&lt;/h3&gt;

&lt;p&gt;Because these functions are marketed to us as trivial. Nobody reviews a &lt;code&gt;.lower()&lt;/code&gt;. Nobody writes a test for a lowercase call. There is no linter rule that fires, and if there were, we would probably silence it.&lt;/p&gt;

&lt;p&gt;Meanwhile the functions themselves are doing something genuinely complex on behalf of a global user base, and doing it well. Unicode is not the villain in this story. The villain is our assumption that "normalize the string" is a single obvious operation with one obvious result.&lt;/p&gt;

&lt;p&gt;What I take away is smaller and more useful than "be afraid of Unicode." It is this: find the places where your code validates a value and then changes it. Those are the seams. In my experience, they are also where the interesting bugs have been hiding all along, patient and well-tested and completely wrong.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Delay Is a Design Material</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:39:40 +0000</pubDate>
      <link>https://dev.to/maroneta/delay-is-a-design-material-1b89</link>
      <guid>https://dev.to/maroneta/delay-is-a-design-material-1b89</guid>
      <description>&lt;p&gt;I read a short argument this week that tooltips need a delay before they appear, and then, once you are obviously working your way along a toolbar, they need to drop that delay entirely. It is a tiny piece of interface behavior. It stayed with me longer than most architecture posts I read this month.&lt;/p&gt;

&lt;p&gt;Partly because it is correct, and partly because it is not really about tooltips. It is about the fact that timing is something you design, the same way you design spacing or color. Most teams treat it as a leftover.&lt;/p&gt;

&lt;p&gt;We pick 200ms because it felt fine on a fast laptop. Or we pick zero because zero seems honest. Or we inherit whatever number shipped inside the component library we installed on day one and never revisit it. Then the product feels twitchy or sluggish, and the bug report says "it feels weird," which is the hardest class of bug there is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two different users living in the same hands
&lt;/h3&gt;

&lt;p&gt;What makes the tooltip case interesting is that a single person switches modes mid-interaction.&lt;/p&gt;

&lt;p&gt;When my cursor is crossing the screen on its way somewhere else, a tooltip that fires instantly is noise. It flashes, it covers content, it makes the interface feel jumpy for no reason. The delay exists to filter accidental passes.&lt;/p&gt;

&lt;p&gt;But the moment I stop and read one tooltip, I have declared intent. I am now surveying. If the next four icons each make me wait 500ms, the interface is punishing me for exactly the behavior it was trying to encourage. The delay was a filter for accidents, and I stopped having accidents.&lt;/p&gt;

&lt;p&gt;So the right behavior is stateful: wait at first, then trust me until I leave the neighborhood. That is the whole insight, and it generalizes further than hover states.&lt;/p&gt;

&lt;h3&gt;
  
  
  The same pattern, wearing other clothes
&lt;/h3&gt;

&lt;p&gt;Once you see it, this shape is everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autocomplete that should debounce while you are typing a word, then feel instant once you have paused and are clearly evaluating results.&lt;/li&gt;
&lt;li&gt;Confirmation dialogs that make sense the first time you delete something and become a wall when you are cleaning up thirty items.&lt;/li&gt;
&lt;li&gt;Retry backoff that protects a struggling service but should collapse quickly once the service is clearly healthy again.&lt;/li&gt;
&lt;li&gt;Loading spinners that should not appear at all under about 300ms, because a flashed spinner reads as a glitch rather than as progress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case the naive fix is a single constant, and the good fix is a small state machine that reflects what the user or the caller is currently doing. Not complicated. Just deliberate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why we skip this
&lt;/h3&gt;

&lt;p&gt;I think there are two reasons, and neither is laziness.&lt;/p&gt;

&lt;p&gt;The first is that timing behavior is nearly invisible in code review. A diff that changes &lt;code&gt;delay: 0&lt;/code&gt; to &lt;code&gt;delay: 400&lt;/code&gt; looks like nothing. There is no diagram, no type signature, no failing test. Reviewers approve it in two seconds because there is nothing to hold onto.&lt;/p&gt;

&lt;p&gt;The second is that we test interfaces in the wrong conditions. We test them on our own machines, with our own muscle memory, in the specific flow we just built. We do not test them while distracted, on a trackpad, at the end of a long day, in the fifth repetition of a boring task. That is where timing either helps or grates.&lt;/p&gt;

&lt;p&gt;Designers often catch this and get overruled, because "it's just a hover delay" sounds unserious next to a migration or a latency budget. But these details are the texture of the product. They are the difference between a tool that feels like an extension of your hand and one you have to consciously operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I try to do now
&lt;/h3&gt;

&lt;p&gt;My rough rule is that any timing constant in the codebase deserves a name and a sentence.&lt;/p&gt;

&lt;p&gt;Not a paragraph of documentation. Just enough that the next person knows what the number is protecting against. &lt;code&gt;HOVER_INTENT_DELAY&lt;/code&gt; with a note that it filters cursor pass-through tells a reviewer what to think about. A bare &lt;code&gt;400&lt;/code&gt; tells them nothing, so they will change it based on vibes and someone will change it back six months later.&lt;/p&gt;

&lt;p&gt;Then I ask whether the constant should stay constant. If the answer is "it depends on what the user just did," that is the signal to add the tiny bit of state. Usually it is a few lines. Usually it is the difference people actually feel.&lt;/p&gt;

&lt;p&gt;The broader belief underneath all of this: latency is not only a performance concern. Sometimes the fastest thing is not the best thing, and the right amount of waiting is a feature you chose on purpose.&lt;/p&gt;

&lt;p&gt;Interfaces happen in time. Design that dimension too.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The Browser Is Filling With Synthetic Fog</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:32:50 +0000</pubDate>
      <link>https://dev.to/maroneta/the-browser-is-filling-with-synthetic-fog-3bbd</link>
      <guid>https://dev.to/maroneta/the-browser-is-filling-with-synthetic-fog-3bbd</guid>
      <description>&lt;p&gt;"Browser de-slop" is a phrase I did not expect to need, which usually means the problem has already become ambient.&lt;/p&gt;

&lt;p&gt;Open a page. Skim. Feel the slight nausea of text that is fluent, generic, and uncommitted. Image carousels that look like memory but point to nothing lived. Layouts that are complete without being considered. The tab title promised a human answer. The body delivered a probabilistic average of answers.&lt;/p&gt;

&lt;p&gt;I am not pure about this. I use models every day. I also want the open web to remain a place where attention is spent on work that someone stood behind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slop is not "AI exists." Slop is unowned fluency.
&lt;/h3&gt;

&lt;p&gt;The distinction matters.&lt;/p&gt;

&lt;p&gt;A carefully edited essay that began as a draft with an assistant can still be human work. A product changelog written with help can still be responsible. The failure mode is publishing without judgment: pages that exist because empty surfaces are bad for ads, SEO, or the appearance of momentum.&lt;/p&gt;

&lt;p&gt;Browsers sit at the worst seat in the house. They are the aggregation layer for everyone else's incentives. When content farms, marketplace listings, and mediocre docs sites all optimize for the same fluency, the browser becomes a fog machine.&lt;/p&gt;

&lt;p&gt;Users respond with coping strategies. Aggressive blockers. Reader modes. "site:" queries. Trust circles. Ignoring the first page of results. That is rational. It is also a tax on curiosity.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I want tools to do about it
&lt;/h3&gt;

&lt;p&gt;I do not want a browser that moralizes. I want one that helps me allocate attention.&lt;/p&gt;

&lt;p&gt;Useful directions look like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stronger reader views that strip decorative mush,&lt;/li&gt;
&lt;li&gt;clearer signals for authored versus generated-looking bulk,&lt;/li&gt;
&lt;li&gt;better controls for autoplay, trackers, and script-heavy scaffolding,&lt;/li&gt;
&lt;li&gt;and user-side preferences that favor sources I already trust without locking me into a garden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of this will be imperfect heuristics. Fine. We already accept imperfect spam filtering. The alternative is pretending every HTTP 200 is equally worth my evening.&lt;/p&gt;

&lt;p&gt;There is a parallel to ad blocking. For years, people said the "right" answer was better ads. Users chose survival tools instead. Synthetic fog may force a similar pragmatic turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creators have a job here too
&lt;/h3&gt;

&lt;p&gt;If you publish, the way out is not a purity contest. It is accountability.&lt;/p&gt;

&lt;p&gt;Put a name on the work. Include the constraint that only you know. Cut the paragraphs that could have been written about any company. Show the scar: the benchmark, the failure, the weird edge case, the decision you regret.&lt;/p&gt;

&lt;p&gt;Models are good at the smooth middle. Humans are still better at the awkward specific.&lt;/p&gt;

&lt;p&gt;The web gets healthier when the awkward specific remains economically and socially rewarded. That reward is partly algorithmic and partly cultural. Culture is the part we can still choose in public.&lt;/p&gt;

&lt;h3&gt;
  
  
  My working stance
&lt;/h3&gt;

&lt;p&gt;I will keep using AI. I will keep reading strangers on the internet. I will also keep raising my bar for what deserves a full-attention read.&lt;/p&gt;

&lt;p&gt;If a page cannot survive a one-sentence summary that includes a concrete claim, I bounce sooner than I used to. That sounds harsh. It is self-defense.&lt;/p&gt;

&lt;p&gt;The browser used to feel like a library with noisy halls. Lately it feels like a hallway where every poster was printed by the same overconfident machine.&lt;/p&gt;

&lt;p&gt;De-slop, to me, is not nostalgia for 2007. It is a demand that tools and norms help humans find the pages that still contain a person.&lt;/p&gt;

&lt;p&gt;I want my browser to be an instrument again, not a fog machine with a search bar.&lt;/p&gt;

&lt;p&gt;Attention is the scarce input. Anything that conserves it is infrastructure.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Radians Are Correct; Turns Are Kind</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:32:15 +0000</pubDate>
      <link>https://dev.to/maroneta/radians-are-correct-turns-are-kind-4hih</link>
      <guid>https://dev.to/maroneta/radians-are-correct-turns-are-kind-4hih</guid>
      <description>&lt;p&gt;Every so often a mathy essay climbs the ladder by saying something that feels almost too obvious once said out loud: humans think in whole rotations more naturally than they think in π.&lt;/p&gt;

&lt;p&gt;Turns versus radians is one of those fights that looks pedantic until you have debugged a graphics bug at midnight and watched two coordinate systems disagree by a factor nobody can feel in their bones.&lt;/p&gt;

&lt;p&gt;Radians are elegant for calculus and physics derivations. They are the correct internal language for a lot of mathematics. That does not automatically make them the kindest default for APIs that humans configure, animate, or reason about under pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correctness and kindness are different layers
&lt;/h3&gt;

&lt;p&gt;Software keeps confusing these layers.&lt;/p&gt;

&lt;p&gt;Floating point is "correct" in IEEE ways and still mean to newcomers. Time zones are "correct" as civil abstractions and still eat production. Regex is "correct" as a tiny language and still creates unreadable policy engines.&lt;/p&gt;

&lt;p&gt;Radians sit in that family for spatial and periodic quantities. They compress beautiful identities. They also hide the simple idea of "halfway around" behind 3.14159-something and a prayer that everyone used the same constant.&lt;/p&gt;

&lt;p&gt;Turns make fractions obvious. Half a turn. A quarter turn. One turn. Your eye can audit the number. Your code review can catch "wait, did we mean half or tau/2?" before it ships.&lt;/p&gt;

&lt;p&gt;I am not arguing that math libraries throw away radians. I am arguing that product interfaces and domain APIs should choose representations that match the mental model of the caller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defaults are pedagogy
&lt;/h3&gt;

&lt;p&gt;An API default teaches.&lt;/p&gt;

&lt;p&gt;If your animation library asks for radians, you teach a tiny tax to every designer-adjacent engineer. If your shader helpers assume degrees in one place and radians in another, you teach despair. If your config file wants turns, you teach a model people can check without a calculator.&lt;/p&gt;

&lt;p&gt;The best systems I have used are bilingual: precise internal forms, humane external forms, and explicit conversions at the boundary. The worst systems pretend one representation is morally superior and then leave conversion bugs as a rite of passage.&lt;/p&gt;

&lt;p&gt;Units are part of UX. Engineers forget that because we live inside the units until they feel like air.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical rule I use
&lt;/h3&gt;

&lt;p&gt;When I design an interface that accepts angles, periods, or normalized cycles, I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will a tired human eyeball this value in a JSON file?&lt;/li&gt;
&lt;li&gt;Can a tester express expected results as simple fractions?&lt;/li&gt;
&lt;li&gt;Are we optimizing for derivation beauty or for operational clarity?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If operational clarity wins, I expose turns or degrees at the edges and keep radians inside the math kernel. If the audience is numerical methods researchers, I do the opposite and document it loudly.&lt;/p&gt;

&lt;p&gt;The mistake is mixing audiences without saying so.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this tiny debate keeps mattering
&lt;/h3&gt;

&lt;p&gt;Because software is filling up with similar mismatches.&lt;/p&gt;

&lt;p&gt;We store money as floats because math class said real numbers. We expose UTC everywhere and then surprise people with local civil time. We make agents speak probability to executives who hear confidence. We choose representations for the implementer and call the caller inexperienced when they stumble.&lt;/p&gt;

&lt;p&gt;Turns versus radians is a friendly microcosm of that arrogance.&lt;/p&gt;

&lt;p&gt;I like mathematics. I also like software that respects the nervous system of the person holding the pager.&lt;/p&gt;

&lt;p&gt;If a representation is correct in theory and hostile in practice, it is incomplete as an interface choice.&lt;/p&gt;

&lt;p&gt;Prefer kindness at the boundary. Keep purity where it earns its keep. Convert deliberately. Name the unit in the type or the field. And when someone proposes a "simpler" default that matches how people count whole things, listen longer than your reflexes want to.&lt;/p&gt;

&lt;p&gt;Sometimes the advanced move is admitting that 0.5 turns is clearer than a shrine to π.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A Locked Cutter Is How Ownership Quietly Dies</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:32:02 +0000</pubDate>
      <link>https://dev.to/maroneta/a-locked-cutter-is-how-ownership-quietly-dies-25bj</link>
      <guid>https://dev.to/maroneta/a-locked-cutter-is-how-ownership-quietly-dies-25bj</guid>
      <description>&lt;p&gt;There is a particular anger that shows up when someone buys a machine, the vendor cloud shrugs, and the physical object becomes e-waste while still mechanically fine.&lt;/p&gt;

&lt;p&gt;Unlocking a deactivated Cricut Maker sits in that genre. Craft hardware. Creative tools. A device that should have been scissors with a motor. Instead it is a subscription to permission.&lt;/p&gt;

&lt;p&gt;I care about this beyond hobby cutters. The same pattern is spreading through routers, printers, tractors, medical accessories, and home batteries. Purchase becomes a revocable license. Repair becomes a gray art. Secondary markets get poisoned because buyers cannot know whether the object will still obey them next year.&lt;/p&gt;

&lt;h3&gt;
  
  
  The product promise and the control plane diverge
&lt;/h3&gt;

&lt;p&gt;Hardware marketing still sells permanence. Buy this. Own this. Make things in your house.&lt;/p&gt;

&lt;p&gt;Then the control plane ships elsewhere. Activation servers. Account binding. Firmware that phones home. Features gated on cloud moods. When the vendor changes strategy, your bench tool inherits the strategy.&lt;/p&gt;

&lt;p&gt;Engineers understand why companies do it. Fraud. Consumables revenue. Support boundaries. IP theater. Ecosystem lock-in dressed as "experience."&lt;/p&gt;

&lt;p&gt;Users understand something simpler: a machine that refuses to run without a remote blessing is not fully theirs.&lt;/p&gt;

&lt;p&gt;Those two understandings are now in open conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-waste is an engineering outcome
&lt;/h3&gt;

&lt;p&gt;We talk about sustainability as materials science and recycling policy. Fine. Also look at software decisions that brick working devices.&lt;/p&gt;

&lt;p&gt;A locked cutter in a closet is not abstract. It is metal, electronics, packaging, shipping carbon, and a person who now needs another unit. Multiply that by product categories and you get a quiet industrial leak. Not a headline oil spill. A thousand small discards justified by terms of service.&lt;/p&gt;

&lt;p&gt;Right-to-repair fights often sound legalistic because they have to. Underneath them is an engineering ethics question: should physical usefulness be separable from vendor continuity?&lt;/p&gt;

&lt;p&gt;I think yes. Not because vendors owe eternal free cloud services. Because basic local function should degrade gracefully when accounts die, startups pivot, or regions lose support.&lt;/p&gt;

&lt;h3&gt;
  
  
  What good ownership looks like in practice
&lt;/h3&gt;

&lt;p&gt;I do not need every device to be fully open. I do need a minimum bar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;core function works offline after legitimate purchase,&lt;/li&gt;
&lt;li&gt;repair documentation exists for wear parts,&lt;/li&gt;
&lt;li&gt;account deletion does not corpse the hardware,&lt;/li&gt;
&lt;li&gt;security updates are separable from engagement metrics,&lt;/li&gt;
&lt;li&gt;and secondary buyers can reset and use the device without a morality play.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a business model cannot survive that bar, it may be a rental business pretending to be retail. Rentals are fine when labeled. The dark pattern is selling "yours" while retaining a kill switch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why hackers keep unlocking things
&lt;/h3&gt;

&lt;p&gt;People reverse these systems for the same reason they always have: the object is right there, the restriction feels illegitimate, and competence is a form of dignity.&lt;/p&gt;

&lt;p&gt;I am glad that competence exists. I wish it were less necessary.&lt;/p&gt;

&lt;p&gt;Every unlock writeup is both a celebration of curiosity and an indictment of design. Celebrate the curiosity. Fix the design.&lt;/p&gt;

&lt;p&gt;If you build devices, ask an ugly question early: what happens to this product when our company is gone, bored, or acquired by someone who hates the legacy SKU?&lt;/p&gt;

&lt;p&gt;If the honest answer is "it becomes sculpture," you did not ship a tool. You shipped a timed souvenir.&lt;/p&gt;

&lt;p&gt;I have started applying that question to my own side projects when they touch hardware or local-only workflows. If a feature requires my personal server to stay alive forever, it is not a feature. It is a future apology. Shipping a local fallback is less glamorous than a cloud dashboard. It is also how you respect the person who trusted you with money and shelf space.&lt;/p&gt;

&lt;p&gt;Ownership should be dull. You paid. It works. You can maintain it. The cloud can add delight without holding the motor hostage.&lt;/p&gt;

&lt;p&gt;Anything less and we are just decorating landfills with DRM.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Postgres as a Default Is a Discipline</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:31:28 +0000</pubDate>
      <link>https://dev.to/maroneta/postgres-as-a-default-is-a-discipline-dbk</link>
      <guid>https://dev.to/maroneta/postgres-as-a-default-is-a-discipline-dbk</guid>
      <description>&lt;p&gt;Every few months someone writes a clean, slightly stubborn essay that amounts to: what if we just used PostgreSQL for more of the architecture?&lt;/p&gt;

&lt;p&gt;Queues. Documents. Full text. Geospatial. Analytics adjacent to the app. Job state. Feature flags. The comment section then splits into two camps: people who have been burned by polyglot sprawl, and people who have been burned by one database asked to do circus tricks.&lt;/p&gt;

&lt;p&gt;I land closer to the first camp, with scars from both.&lt;/p&gt;

&lt;h3&gt;
  
  
  The real cost was never the second database
&lt;/h3&gt;

&lt;p&gt;The second database looks cheap on a whiteboard. It is "just Redis." It is "just Elasticsearch." It is "just another managed service with a cute dashboard."&lt;/p&gt;

&lt;p&gt;The cost arrives later as operational fan-out. Separate backup stories. Separate failure modes. Separate auth models. Separate local-dev myths. Separate "who understands this at 2 a.m." lists. Separate schema migrations that drift out of sync with the system of record.&lt;/p&gt;

&lt;p&gt;If your company is large enough, that sprawl can be rational. Specialization wins at scale. If your company is still finding product shape, every new datastore is a bet that you already know your access patterns and staffing model. That bet is often wrong.&lt;/p&gt;

&lt;p&gt;Postgres as a default is not romance about SQL. It is a forcing function: make the data model honest before you multiply the moving parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  What "for everything" should actually mean
&lt;/h3&gt;

&lt;p&gt;It should not mean stuffing every workload into one process until the vacuum settings become folklore.&lt;/p&gt;

&lt;p&gt;It should mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prefer one transactional core until a measured pain appears,&lt;/li&gt;
&lt;li&gt;use extensions and proven patterns before new infrastructure,&lt;/li&gt;
&lt;li&gt;keep derived systems explicitly derived,&lt;/li&gt;
&lt;li&gt;and treat specialized stores as exits you earn, not toys you collect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have watched teams adopt a queue because a table felt unfashionable. Then they spent months recreating transactional outbox semantics they already had. I have also watched teams insist on Postgres for a search workload that genuinely needed a purpose-built engine. Dogma is bidirectional.&lt;/p&gt;

&lt;p&gt;The discipline is evidence. Latency histograms. Lock contention. Operational toil. Not vibes from a conference hallway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Postgres earns the center of gravity
&lt;/h3&gt;

&lt;p&gt;For product applications with relational truth, rich constraints, and humans who need to debug with SQL, Postgres remains an unusually good gravity well. Foreign keys are documentation that runs. Transactions collapse classes of distributed regret. The ecosystem is mature in the ways that matter when money and identity are involved.&lt;/p&gt;

&lt;p&gt;If I can keep user state, billing-adjacent records, and workflow status in one place with clear invariants, I sleep better. Caching can sit in front. Search can sit beside. Streams can fan out. The core stays boring and queryable.&lt;/p&gt;

&lt;p&gt;That architecture is less impressive in diagrams. It is more impressive in incident reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  A personal rule of thumb
&lt;/h3&gt;

&lt;p&gt;I ask one question before adding a new store: what failure becomes easier, and what failure becomes harder?&lt;/p&gt;

&lt;p&gt;If the new system makes one happy-path metric prettier while making consistency and recovery harder, I wait. If it removes a real, measured ceiling that Postgres cannot reasonably clear, I adopt it without guilt.&lt;/p&gt;

&lt;p&gt;"Postgres for everything" is a slogan. Useful slogans are really about sequencing. Start centered. Specialize on purpose. Keep the system of record boring enough that the product can be interesting.&lt;/p&gt;

&lt;p&gt;There is also a cultural benefit I do not want to underweight. Shared SQL literacy is one of the last cross-role languages left in many companies. Support can inspect rows. Analysts can validate a metric. Engineers can reproduce a bug without learning a fifth vendor dialect. When every concern gets its own store, that shared literacy fragments into guild knowledge.&lt;/p&gt;

&lt;p&gt;I do not need every team to worship one database. I need more teams to stop confusing optionality with progress.&lt;/p&gt;

&lt;p&gt;The best stack is often the one your future teammate can still explain with a whiteboard marker and a straight face.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Go Releases Are Boring on Purpose</title>
      <dc:creator>Mauro Damian Perez Garcia</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:31:24 +0000</pubDate>
      <link>https://dev.to/maroneta/go-releases-are-boring-on-purpose-574i</link>
      <guid>https://dev.to/maroneta/go-releases-are-boring-on-purpose-574i</guid>
      <description>&lt;p&gt;Go 1.27 landing on the front page always feels a little funny to me. There is rarely a single feature that would make a conference keynote explode. The discussion still shows up, because a lot of us have learned to treat boring language evolution as a product decision.&lt;/p&gt;

&lt;p&gt;I used to chase languages that felt exciting week to week. New syntax candy. New paradigms. New ways to rewrite yesterday's working code. Then I spent enough years shipping systems where the expensive part was not writing the first version. It was keeping a team fluent across releases, dependency bumps, and the quiet tax of "we should probably migrate that."&lt;/p&gt;

&lt;p&gt;Go's release cadence, at its best, is an argument against that tax.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stability is a feature you feel in code review
&lt;/h3&gt;

&lt;p&gt;When a language changes slowly, reviews stay about behavior. Naming. Failure modes. Whether the interface leaks. You spend less time arguing about whether the idiomatic style changed again since last quarter.&lt;/p&gt;

&lt;p&gt;That matters more than it sounds. Style churn is not neutral. It creates status contests. People who live in the bleeding edge look "modern." People who keep the old pattern look "behind." Neither signal is strongly correlated with whether the service is reliable on Tuesday morning.&lt;/p&gt;

&lt;p&gt;I am not saying Go is finished or perfect. I am saying the culture around compatibility makes a specific kind of engineering easier: long-lived services maintained by rotating humans.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I actually want from a point release
&lt;/h3&gt;

&lt;p&gt;My checklist is selfish and practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep the standard library unsurprising,&lt;/li&gt;
&lt;li&gt;make tooling better without inventing a second religion,&lt;/li&gt;
&lt;li&gt;improve compile and runtime behavior in ways I can measure,&lt;/li&gt;
&lt;li&gt;and avoid forcing rewrites just to stay current.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a release also adds something elegant, great. Elegance without migration pressure is the luxury I will pay for with loyalty.&lt;/p&gt;

&lt;p&gt;There is a temptation, especially in an industry hypnotized by model releases, to treat every software surface as a stage for novelty. Languages are not models. They are the floorboards. You notice them most when they creak.&lt;/p&gt;

&lt;h3&gt;
  
  
  The other side of boring
&lt;/h3&gt;

&lt;p&gt;Boring can become complacent. Ecosystems stagnate if they refuse to learn. Generics arrived late and imperfectly. Error handling still starts arguments that will outlive us. The module story had years of pain. Pretending otherwise is fan fiction.&lt;/p&gt;

&lt;p&gt;The useful question is not "did Go invent the future this quarter?" It is "did Go reduce accidental complexity for people who already bet on it?"&lt;/p&gt;

&lt;p&gt;For many teams, yes. For others, the answer is to choose something else and mean it. The worst outcome is living in a language you resent while refusing to leave because switching costs became a personality.&lt;/p&gt;

&lt;h3&gt;
  
  
  A builder habit I like
&lt;/h3&gt;

&lt;p&gt;When a mainstream language ships, I skim the notes looking for three classes of change:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;things that delete a class of bugs,&lt;/li&gt;
&lt;li&gt;things that delete a class of ceremony,&lt;/li&gt;
&lt;li&gt;things that create a class of rewrite pressure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I celebrate the first two. I budget for the third.&lt;/p&gt;

&lt;p&gt;That habit has made me calmer about release hype in general. Not every update needs to rearrange my identity as an engineer. Sometimes the win is that Monday still compiles, the race detector still teaches, and the standard library still does the boring network and crypto work without a scavenger hunt.&lt;/p&gt;

&lt;p&gt;Go will keep shipping. Some releases will feel thinner than others. I have started treating that thinness as a signal of confidence rather than decline.&lt;/p&gt;

&lt;p&gt;The industry has enough drama. A language that mostly refuses to participate is doing a kind of infrastructure kindness. I will take that kindness, even when the HN title is just a version number.&lt;/p&gt;

&lt;p&gt;If your stack depends on longevity more than fashion, boring releases are not a letdown. They are the product working.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
