<?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: Luis Enriquez Aracena Cabrera</title>
    <description>The latest articles on DEV Community by Luis Enriquez Aracena Cabrera (@icewizard98).</description>
    <link>https://dev.to/icewizard98</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%2F3249400%2Fd21c92c0-af39-495b-bd93-8d88775d3d0e.jpeg</url>
      <title>DEV Community: Luis Enriquez Aracena Cabrera</title>
      <link>https://dev.to/icewizard98</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/icewizard98"/>
    <language>en</language>
    <item>
      <title>What are bloom filters and how i use them</title>
      <dc:creator>Luis Enriquez Aracena Cabrera</dc:creator>
      <pubDate>Fri, 13 Jun 2025 09:46:04 +0000</pubDate>
      <link>https://dev.to/icewizard98/what-are-bloom-filters-and-how-i-use-them-147k</link>
      <guid>https://dev.to/icewizard98/what-are-bloom-filters-and-how-i-use-them-147k</guid>
      <description>&lt;h1&gt;
  
  
  What are bloom filters and how i use them
&lt;/h1&gt;

&lt;p&gt;A few days ago, a friend of mine — &lt;a href="https://github.com/zangarmarsh" rel="noopener noreferrer"&gt;Zangarmash&lt;/a&gt; — told me about &lt;em&gt;Bloom filters&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Up until that moment, I had no idea they even existed, but as he explained how they work, I started to grasp their potential. And to me, that could only mean one thing: sooner or later, I’d have to use them.&lt;/p&gt;

&lt;p&gt;I’m not usually the type to work on &lt;em&gt;side projects&lt;/em&gt;, but lately, I’ve been revisiting my “go-to project” — the one I build every time I study a new programming language and want to go beyond basic tutorials to really challenge myself whit basic stuff.&lt;/p&gt;

&lt;p&gt;This time, the language is Go, and during development, Bloom filters came to mind again. I had finally found the perfect use case: using one to check whether a file is &lt;em&gt;possibly&lt;/em&gt; present in the file system &lt;strong&gt;before&lt;/strong&gt; attempting access, avoiding unnecessary disk reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Bloom Filter?
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;Bloom filter&lt;/em&gt; is a data structure that allows you to determine whether an element is &lt;em&gt;definitely not present&lt;/em&gt; or &lt;em&gt;possibly present&lt;/em&gt; in a set, using a probabilistic lookup mechanism.&lt;/p&gt;

&lt;p&gt;This distinction is crucial: a Bloom filter can produce &lt;em&gt;false positives&lt;/em&gt; (i.e., it may say an element is present when it’s actually not), but it never returns &lt;em&gt;false negatives&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In other words: if the filter says “not present,” then it’s &lt;strong&gt;definitely not there&lt;/strong&gt;; if it says “maybe present,” it could be wrong.&lt;/p&gt;

&lt;p&gt;Understanding this behavior is essential, because there are situations where using a Bloom filter may be pointless — or even counterproductive — compared to other solutions.&lt;/p&gt;

&lt;p&gt;Technically, a Bloom filter consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;n, the &lt;em&gt;size of the bit array&lt;/em&gt; representing the filter;&lt;/li&gt;
&lt;li&gt;k, the number of &lt;em&gt;distinct hash functions&lt;/em&gt; used for each inserted element.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we add a value to the filter, we apply the &lt;code&gt;k&lt;/code&gt; hash functions, which give us &lt;code&gt;k&lt;/code&gt; positions in the bit array of length &lt;code&gt;n&lt;/code&gt;. At each of these positions, we set the bit to 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  An Intuitive Example: Mailboxes
&lt;/h3&gt;

&lt;p&gt;Imagine a row of mailboxes numbered from 0 to &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every time you want to “register” a name (say, “Alice”), you use &lt;code&gt;k&lt;/code&gt; different keys (the hash functions) that tell you which mailboxes to open. For each indicated mailbox, you drop in a slip of paper.&lt;/p&gt;

&lt;p&gt;When you want to check if “Bob” has already been registered, you repeat the process with the same keys. If &lt;strong&gt;all&lt;/strong&gt; the mailboxes you’re supposed to check already contain slips, then Bob is &lt;em&gt;possibly&lt;/em&gt; already registered.&lt;/p&gt;

&lt;p&gt;But if even &lt;strong&gt;one&lt;/strong&gt; of those mailboxes is empty, you can say with certainty that Bob has &lt;strong&gt;never&lt;/strong&gt; been registered.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does It Work?
&lt;/h2&gt;

&lt;p&gt;For each element we want to add to a Bloom filter, we use &lt;code&gt;k&lt;/code&gt; &lt;strong&gt;deterministic&lt;/strong&gt; hash functions. This is important: given the same input, the hash result must always be the same. That’s essential to determine whether a value is “possibly present” or not.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ If we used &lt;em&gt;cryptographic hash functions&lt;/em&gt; (like SHA-256), we could end up with different results for the same input — due to salting or other non-deterministic mechanisms — which would break the entire logic of the filter.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Two Core Operations
&lt;/h3&gt;

&lt;p&gt;A Bloom filter supports only two operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add&lt;/strong&gt;: adds an element by applying the k hash functions and setting the resulting positions to 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check&lt;/strong&gt;: checks if an element is possibly present by reapplying the k hashes and verifying whether &lt;em&gt;all&lt;/em&gt; corresponding positions are set to 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Removing an element from a Bloom filter is not possible, because we can’t know whether the bit positions we want to clear are also used by other elements.&lt;/p&gt;

&lt;p&gt;For this reason, the only safe way to “delete” is to rebuild the filter from scratch — or better yet, avoid deletions altogether.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding an Element
&lt;/h3&gt;

&lt;p&gt;Let’s say we want to add the word "Hi" to the filter. We apply the &lt;code&gt;k&lt;/code&gt; hash functions to this string, getting values like 42, 87, 109, and so on.&lt;/p&gt;

&lt;p&gt;These values are then &lt;strong&gt;normalized&lt;/strong&gt; to fit within the filter size &lt;code&gt;n&lt;/code&gt; (for example using &lt;code&gt;value % n&lt;/code&gt;), and for each resulting position, we set the corresponding bit to 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking an element
&lt;/h3&gt;

&lt;p&gt;If even one of the positions is 0, we can be certain that the element is &lt;strong&gt;not present&lt;/strong&gt; in the filter.&lt;/p&gt;

&lt;p&gt;If all the bits are 1, then the element &lt;em&gt;might&lt;/em&gt; be present — or it might be a false positive caused by other elements previously added.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It’s Called “Probabilistic”
&lt;/h3&gt;

&lt;p&gt;This is where the probabilistic nature of a Bloom filter becomes clear. We can’t be 100% sure an element is present, because different inputs might produce the same hash results (&lt;em&gt;collisions&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;But we can be completely sure that an element is &lt;strong&gt;not present&lt;/strong&gt; if even one of its corresponding bits is 0.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimizing the Number of Hash Functions (k)
&lt;/h3&gt;

&lt;p&gt;An obvious way to reduce false positives is to increase the number of hash functions &lt;code&gt;k&lt;/code&gt;. But be careful: doing this excessively can have the opposite effect, saturating the filter and degrading performance.&lt;/p&gt;

&lt;p&gt;There’s actually a sweet spot that balances:&lt;br&gt;
-&lt;code&gt;m&lt;/code&gt;: the number of elements we expect to insert;&lt;br&gt;
-&lt;code&gt;n&lt;/code&gt;: the size of the filter’s bit array;&lt;br&gt;
-&lt;code&gt;k&lt;/code&gt;: the number of hash functions to use.&lt;/p&gt;

&lt;p&gt;To find the optimal number of hash functions k, we can use the formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k = (n / m) * ln(2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose we want to create a filter with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;n&lt;/code&gt; = 10,000 total bits,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;m&lt;/code&gt; = 1,000 elements to insert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We compute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k = (10,000 / 1,000) * 0.693 = 10 * 0.693 = 6.93
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the optimal number of hash functions to use is around &lt;strong&gt;7&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Using this value of k helps balance the filter’s accuracy and performance, minimizing the probability of false positives.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Implemented a Bloom Filter in My Go Project
&lt;/h2&gt;

&lt;p&gt;In my "go-to project", I decided to use a Bloom filter to optimize checks for the presence of files in the file system.&lt;/p&gt;

&lt;p&gt;The logic is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the file is &lt;strong&gt;not present&lt;/strong&gt; in the filter, I generate and save it.&lt;/li&gt;
&lt;li&gt;If the filter says the file &lt;strong&gt;might be present&lt;/strong&gt;, I check if the file actually exists. If it does, I do nothing; if it doesn’t, I proceed to generate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This use case, though simple, is a perfect fit for a Bloom filter — it helps reduce unnecessary disk accesses and saves precious time.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Current Implementation
&lt;/h3&gt;

&lt;p&gt;So far, I’ve built a basic version of the filter with fixed values for the size n and the number of hash functions k:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;n&lt;/code&gt; = 32 (a very small filter, 32 bits);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k&lt;/code&gt; = 3 hash.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To generate the &lt;code&gt;k&lt;/code&gt; hash functions, I used the 64-bit hash from &lt;a href="https://github.com/cespare/xxhash" rel="noopener noreferrer"&gt;cespare/xxhash&lt;/a&gt;, a fast and reliable Go library.&lt;/p&gt;

&lt;p&gt;From the 64-bit hash, I derived two values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hash&lt;/code&gt;: the result of &lt;code&gt;xxhash64&lt;/code&gt; applied to the input;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h1&lt;/code&gt;: the lower 32 bits of hash (&lt;code&gt;hash &amp;amp; 0xFFFFFFFF&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h2&lt;/code&gt;: the upper 32 bits (&lt;code&gt;(hash &amp;gt;&amp;gt; 32) &amp;amp; 0xFFFFFFFF&lt;/code&gt;).
### Double Hashing to Get Distinct Hashes
To generate the &lt;code&gt;k&lt;/code&gt; distinct hashes (i.e., filter positions), I use the &lt;strong&gt;double hashing&lt;/strong&gt; technique, which is quite common in Bloom filter implementations:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for i := range b.k {
    generated := h1 + h2*i
    hashes[i]  = uint32(generated % 32)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How I Add and Check Elements
&lt;/h3&gt;

&lt;p&gt;In my filter, I use a single uint32 as a bit array (32 bits total).&lt;/p&gt;

&lt;p&gt;To add an element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *bloomFilter) Add(value []byte) {
    hashes := b.getHashes(value)
    for _, hash := range hashes {
        b.Filter |= 1 &amp;lt;&amp;lt; hash
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To check if an element is present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *bloomFilter) Contains(value []byte) bool {
    hashes := b.getHashes(value)
    for _, hash := range hashes {
        if (b.Filter &amp;amp; (1 &amp;lt;&amp;lt; hash)) == 0 {
            return false
        }
    }
    return true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Possible Improvements
&lt;/h3&gt;

&lt;p&gt;This is a simple version that works well for a limited number of elements.&lt;/p&gt;

&lt;p&gt;In the future, I’d like to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamically calculate the filter size n and the number of hash functions k based on the number of files, to reduce false positives;&lt;/li&gt;
&lt;li&gt;Replace the single uint32 with a larger bit array to handle more data;&lt;/li&gt;
&lt;li&gt;Consider using more advanced or optimized hashing functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion, Bloom filters are powerful and fascinating tools, especially when you want to optimize presence checks without consuming too much memory or computational resources. Of course, they’re not the perfect solution for every use case, but in specific contexts — like my project — they can be incredibly effective.&lt;/p&gt;

&lt;p&gt;Had you heard of them before? Have you ever used or implemented one in your own work?&lt;/p&gt;

&lt;p&gt;If you have tips, questions, or just want to chat about the topic, feel free to reach out — you can &lt;a href="//mailto:blog@luise.ac"&gt;email&lt;/a&gt; me or contact me on &lt;a href="https://linktr.ee/luisenriquez" rel="noopener noreferrer"&gt;social media&lt;/a&gt;.&lt;br&gt;
I always enjoy exchanging ideas!&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eli.thegreenplace.net/2025/bloom-filters/" rel="noopener noreferrer"&gt;Bloom filters - Eli Bendersky's website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Why I Can’t Live Without Docker Anymore</title>
      <dc:creator>Luis Enriquez Aracena Cabrera</dc:creator>
      <pubDate>Tue, 10 Jun 2025 08:18:39 +0000</pubDate>
      <link>https://dev.to/icewizard98/why-i-cant-live-without-docker-anymore-5hjk</link>
      <guid>https://dev.to/icewizard98/why-i-cant-live-without-docker-anymore-5hjk</guid>
      <description>&lt;p&gt;My journey with Docker began in 2017 while working on a project for &lt;a href="https://shop.brunellocucinelli.com/it-it/" rel="noopener noreferrer"&gt;Brunello Cucinelli&lt;/a&gt;. At the time, we had to use Docker to replicate the production environment, and for me, it was one of my first encounters with this technology.&lt;/p&gt;

&lt;p&gt;As often happens with new and unfamiliar tools, it was hate at first sight. I couldn’t understand the difference between a &lt;code&gt;Dockerfile&lt;/code&gt; and a &lt;code&gt;docker-compose.yml&lt;/code&gt;, I had no clue what the instructions inside those files meant, and to top it off, I was working on Windows — in the pre-WSL era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker on Windows: A Bumpy Ride
&lt;/h2&gt;

&lt;p&gt;Anyone who has tried Docker on Windows (not WSL or Windows Server) knows that performance isn’t great. This is because Docker isn’t a traditional virtual machine; containers run on top of the host OS, and on Windows, this is much less efficient than on Linux.&lt;/p&gt;

&lt;p&gt;The introduction of &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/" rel="noopener noreferrer"&gt;WSL&lt;/a&gt; (Windows Subsystem for Linux) drastically improved the experience, allowing a Linux environment to run inside Windows and making Docker more usable. However, back in 2017, WSL wasn’t stable or widely adopted, and Docker remained a complex and frustrating tool.&lt;/p&gt;

&lt;p&gt;At that time, only two members of my team had a basic understanding of Docker, which made it hard to figure out what to do when &lt;code&gt;docker-compose up&lt;/code&gt; failed. To make things worse, we used Docker exclusively via Docker Desktop’s GUI, which hid all the real CLI commands being executed under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching to Linux: Game Changer
&lt;/h2&gt;

&lt;p&gt;In 2022, I changed companies — and operating systems. I moved to &lt;a href="https://ubuntu.com/" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;, a well-known Linux distribution that allows Docker to run natively without Docker Desktop.&lt;/p&gt;

&lt;p&gt;This shift changed everything. For the first time, I could clearly see what was happening behind the scenes. I could read and understand the configuration files, debug real errors, and run CLI commands with full control.&lt;/p&gt;

&lt;p&gt;Docker was no longer a black box, but a powerful tool in my hands.&lt;/p&gt;

&lt;p&gt;Sure, I could have started learning it earlier — Windows didn’t prevent me from studying the tech — but the reality is that it made everything harder and more frustrating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can’t Work Without It
&lt;/h2&gt;

&lt;p&gt;Today, I can’t imagine working without Docker. I don’t want to install PHP (in all its versions), MySQL, or any other service directly on my machine. I want clean, isolated, reproducible environments that don’t interfere with my host OS.&lt;/p&gt;

&lt;p&gt;I honestly don’t know how we managed to work on multiple projects with different dependencies in the past. Changing the &lt;code&gt;$PATH&lt;/code&gt;, switching extensions, tweaking ports and configs… I still remember the frustration and anxiety of breaking something important.&lt;/p&gt;

&lt;p&gt;Now, switching between projects and their dependencies is just a matter of two or three commands — often mapped to aliases — and each environment works exactly as needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast Start with a Docker Template
&lt;/h2&gt;

&lt;p&gt;Another huge benefit is being able to start a brand-new project in seconds — even with a completely different stack. Want to test a new version of &lt;a href="https://mariadb.org/" rel="noopener noreferrer"&gt;MariaDB&lt;/a&gt; or PHP? No problem.&lt;/p&gt;

&lt;p&gt;To make this even easier, I created a public GitHub repository with some base Docker configurations I frequently use:&lt;br&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/IceWizard98/basic_docker" rel="noopener noreferrer"&gt;https://github.com/IceWizard98/basic_docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is to grow this repository over time, adding more technologies, with the help of contributors who know certain stacks better than I do. The idea is to have a solid, ready-to-use foundation for any new project — without having to copy and paste configs from previous repos.&lt;/p&gt;

&lt;p&gt;If you’d like to contribute, you’re more than welcome! I’d love to see your PRs. 🙌&lt;/p&gt;

&lt;p&gt;If you’d like to share your own Docker experience, or just chat about dev stuff, you can reach me &lt;a href="https://linktr.ee/luisenriquez" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you’re using a cool Docker template, I’d love to see it!&lt;br&gt;
You can find my original article here &lt;a href="https://luise.ac/blog/?a=why-i-cant-live-without-docker-anymore" rel="noopener noreferrer"&gt;luise.ac&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>docker</category>
    </item>
    <item>
      <title>From TikTok to Text: Starting My Journey into Written Content</title>
      <dc:creator>Luis Enriquez Aracena Cabrera</dc:creator>
      <pubDate>Sun, 08 Jun 2025 11:18:56 +0000</pubDate>
      <link>https://dev.to/icewizard98/from-tiktok-to-text-starting-my-journey-into-written-content-204f</link>
      <guid>https://dev.to/icewizard98/from-tiktok-to-text-starting-my-journey-into-written-content-204f</guid>
      <description>&lt;p&gt;For the past few months, I’ve been creating short video content on &lt;a href="https://tiktok.com/@luisenriquez_98" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt; where I share my (still limited) experience as a developer with those who are just starting out.&lt;br&gt;
The goal has always been simple: to help junior devs — or future devs — feel a little less alone when facing the complexities of this field.&lt;/p&gt;

&lt;p&gt;I’ve never considered myself a “guru” or anything like that. I just try to explain things the way I would’ve liked someone to explain them to me — with clarity, honesty, and maybe a bit of humor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discovering Obsidian and Simon Späti
&lt;/h2&gt;

&lt;p&gt;At some point during this journey, I stumbled across &lt;a href="https://www.ssp.sh/" rel="noopener noreferrer"&gt;@ssp.sh&lt;/a&gt; — Simon's content really struck a chord with me.&lt;br&gt;
One of the biggest takeaways from following his work was discovering &lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt;, a powerful (and local-first!) tool for note-taking and knowledge management.&lt;/p&gt;

&lt;p&gt;I started using Obsidian to keep track of what I was learning from tutorials, blog posts, videos, Twitter threads… basically anything useful. Over time, my note vault became not just a study tool but a kind of personal knowledge base.&lt;/p&gt;

&lt;p&gt;This shift made me rethink &lt;em&gt;how&lt;/em&gt; I learn and &lt;em&gt;how&lt;/em&gt; I share what I learn.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Push Toward Self-Hosting
&lt;/h2&gt;

&lt;p&gt;Then I read this article by Simon:&lt;br&gt;
👉 &lt;a href="https://www.ssp.sh/blog/self-host-self-independence/" rel="noopener noreferrer"&gt;“Why Self-Host? For Self-Independence.”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It really resonated with me. The idea of self-hosting — not just for control or privacy, but for long-term sustainability and independence — made me reconsider the way I approach both content and tools.&lt;/p&gt;

&lt;p&gt;It made me realize that while video is a great medium, text has a different kind of permanence. A post, an article, or even a note can be referenced, linked, updated — and self-hosted, if needed.&lt;/p&gt;

&lt;p&gt;That’s when I decided to give written content a real try.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About My Site and GitHub?
&lt;/h2&gt;

&lt;p&gt;I already have a &lt;a href="https://luise.ac" rel="noopener noreferrer"&gt;personal website&lt;/a&gt; (still pretty minimal), where I’ve just added a short bio about myself and what I do. Nothing fancy — just a placeholder for now, but I hope to expand it as I publish more.&lt;/p&gt;

&lt;p&gt;As for &lt;a href="https://github.com/icewizard98" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, I’ve created and used several small tools and scripts for personal use, but I’ve never really made them public.&lt;br&gt;
Why? Mostly out of fear of judgment — the classic imposter syndrome that I think many of us face in this field.&lt;br&gt;
&lt;em&gt;“Is this code good enough? Will someone point out how bad it is? Should I even share it?”&lt;/em&gt;&lt;br&gt;
These questions often stopped me before I even tried.&lt;/p&gt;

&lt;p&gt;But I’m slowly learning that done is better than perfect — and that sharing, even imperfectly, is still valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  My First Post on dev.to
&lt;/h2&gt;

&lt;p&gt;To get started, I published my first-ever post here on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;.&lt;br&gt;
It’s nothing groundbreaking — a basic, standalone piece — but it represents a small personal milestone.&lt;br&gt;
Not just “writing something,” but stepping into a new mindset: one that values depth over speed, permanence over trends.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;I’m not sure what this new phase will bring. I’ll still make videos on TikTok — but I’m also going to write more often. Short articles, notes, maybe tutorials, maybe just thoughts.&lt;/p&gt;

&lt;p&gt;If you’re a junior developer, a content creator, or someone who’s just trying to build their own path — I hope we’ll learn something together along the way.&lt;/p&gt;

&lt;p&gt;Thanks for reading. And if you have any advice, feedback, or just want to say hi — feel free to drop a comment!&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ssp.sh/" rel="noopener noreferrer"&gt;Simon’s Blog - ssp.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ssp.sh/blog/self-host-self-independence/" rel="noopener noreferrer"&gt;Why Self-Host? For Self-Independence.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tiktok.com/@luisenriquez_98" rel="noopener noreferrer"&gt;My TikTok Profile&lt;/a&gt; &lt;em&gt;(if you want to see the videos I’ve been making)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/icewizard98" rel="noopener noreferrer"&gt;My GitHub&lt;/a&gt; &lt;em&gt;(it’s a bit quiet for now, but stay tuned!)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>From TikTok to Text: Starting My Journey into Written Content</title>
      <dc:creator>Luis Enriquez Aracena Cabrera</dc:creator>
      <pubDate>Sun, 08 Jun 2025 11:18:56 +0000</pubDate>
      <link>https://dev.to/icewizard98/from-tiktok-to-text-starting-my-journey-into-written-content-1li3</link>
      <guid>https://dev.to/icewizard98/from-tiktok-to-text-starting-my-journey-into-written-content-1li3</guid>
      <description>&lt;p&gt;For the past few months, I’ve been creating short video content on &lt;a href="https://tiktok.com/@luisenriquez_98" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt; where I share my (still limited) experience as a developer with those who are just starting out.&lt;br&gt;
The goal has always been simple: to help junior devs — or future devs — feel a little less alone when facing the complexities of this field.&lt;/p&gt;

&lt;p&gt;I’ve never considered myself a “guru” or anything like that. I just try to explain things the way I would’ve liked someone to explain them to me — with clarity, honesty, and maybe a bit of humor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discovering Obsidian and Simon Späti
&lt;/h2&gt;

&lt;p&gt;At some point during this journey, I stumbled across &lt;a href="https://www.ssp.sh/" rel="noopener noreferrer"&gt;@ssp.sh&lt;/a&gt; — Simon's content really struck a chord with me.&lt;br&gt;
One of the biggest takeaways from following his work was discovering &lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt;, a powerful (and local-first!) tool for note-taking and knowledge management.&lt;/p&gt;

&lt;p&gt;I started using Obsidian to keep track of what I was learning from tutorials, blog posts, videos, Twitter threads… basically anything useful. Over time, my note vault became not just a study tool but a kind of personal knowledge base.&lt;/p&gt;

&lt;p&gt;This shift made me rethink &lt;em&gt;how&lt;/em&gt; I learn and &lt;em&gt;how&lt;/em&gt; I share what I learn.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Push Toward Self-Hosting
&lt;/h2&gt;

&lt;p&gt;Then I read this article by Simon:&lt;br&gt;
👉 &lt;a href="https://www.ssp.sh/blog/self-host-self-independence/" rel="noopener noreferrer"&gt;“Why Self-Host? For Self-Independence.”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It really resonated with me. The idea of self-hosting — not just for control or privacy, but for long-term sustainability and independence — made me reconsider the way I approach both content and tools.&lt;/p&gt;

&lt;p&gt;It made me realize that while video is a great medium, text has a different kind of permanence. A post, an article, or even a note can be referenced, linked, updated — and self-hosted, if needed.&lt;/p&gt;

&lt;p&gt;That’s when I decided to give written content a real try.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About My Site and GitHub?
&lt;/h2&gt;

&lt;p&gt;I already have a &lt;a href="https://luise.ac" rel="noopener noreferrer"&gt;personal website&lt;/a&gt; (still pretty minimal), where I’ve just added a short bio about myself and what I do. Nothing fancy — just a placeholder for now, but I hope to expand it as I publish more.&lt;/p&gt;

&lt;p&gt;As for &lt;a href="https://github.com/icewizard98" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, I’ve created and used several small tools and scripts for personal use, but I’ve never really made them public.&lt;br&gt;
Why? Mostly out of fear of judgment — the classic imposter syndrome that I think many of us face in this field.&lt;br&gt;
&lt;em&gt;“Is this code good enough? Will someone point out how bad it is? Should I even share it?”&lt;/em&gt;&lt;br&gt;
These questions often stopped me before I even tried.&lt;/p&gt;

&lt;p&gt;But I’m slowly learning that done is better than perfect — and that sharing, even imperfectly, is still valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  My First Post on dev.to
&lt;/h2&gt;

&lt;p&gt;To get started, I published my first-ever post here on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;.&lt;br&gt;
It’s nothing groundbreaking — a basic, standalone piece — but it represents a small personal milestone.&lt;br&gt;
Not just “writing something,” but stepping into a new mindset: one that values depth over speed, permanence over trends.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;I’m not sure what this new phase will bring. I’ll still make videos on TikTok — but I’m also going to write more often. Short articles, notes, maybe tutorials, maybe just thoughts.&lt;/p&gt;

&lt;p&gt;If you’re a junior developer, a content creator, or someone who’s just trying to build their own path — I hope we’ll learn something together along the way.&lt;/p&gt;

&lt;p&gt;Thanks for reading. And if you have any advice, feedback, or just want to say hi — feel free to drop a comment!&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ssp.sh/" rel="noopener noreferrer"&gt;Simon’s Blog - ssp.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ssp.sh/blog/self-host-self-independence/" rel="noopener noreferrer"&gt;Why Self-Host? For Self-Independence.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tiktok.com/@luisenriquez_98" rel="noopener noreferrer"&gt;My TikTok Profile&lt;/a&gt; &lt;em&gt;(if you want to see the videos I’ve been making)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/icewizard98" rel="noopener noreferrer"&gt;My GitHub&lt;/a&gt; &lt;em&gt;(it’s a bit quiet for now, but stay tuned!)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://luise.ac/blog/?a=from-tiktok-to-text" rel="noopener noreferrer"&gt;My website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Go and Error Handling: A Final (Almost) Word</title>
      <dc:creator>Luis Enriquez Aracena Cabrera</dc:creator>
      <pubDate>Fri, 06 Jun 2025 13:45:32 +0000</pubDate>
      <link>https://dev.to/icewizard98/go-and-error-handling-a-final-almost-word-4f1k</link>
      <guid>https://dev.to/icewizard98/go-and-error-handling-a-final-almost-word-4f1k</guid>
      <description>&lt;p&gt;The Go team recently &lt;a href="https://go.dev/blog/error-syntax" rel="noopener noreferrer"&gt;published&lt;/a&gt; what feels like a final update on a long-debated topic: &lt;em&gt;error handling&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After years of proposals, experiments, and community discussions, the conclusion is simple and clear:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The current approach is considered good enough, and there’s no plan to change it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The post explains that &lt;strong&gt;many alternative designs were explored, some even prototyped&lt;/strong&gt;, but none of them made a compelling enough case to justify a language change — though the team remains open to community input.&lt;/p&gt;


&lt;h2&gt;
  
  
  The most promising proposal (IMO)
&lt;/h2&gt;

&lt;p&gt;Out of all the options discussed over the years, &lt;strong&gt;the one I find most aligned with Go’s philosophy&lt;/strong&gt; is a compact &lt;code&gt;?&lt;/code&gt; syntax for handling errors.&lt;/p&gt;

&lt;p&gt;Example:&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="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s the idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the function returns an error, it gets automatically propagated;&lt;/li&gt;
&lt;li&gt;If the current function doesn’t return an error, a panic(err) is triggered — just like developers often write manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could even manipulate the error inline before returning:&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="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"problem with %q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids repetitive if blocks while still keeping the error flow explicit and customizable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compared to the classic approach
&lt;/h2&gt;

&lt;p&gt;The current Go idiom:&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="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With ?, that becomes:&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="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behavior stays the same. &lt;br&gt;
But it’s cleaner, less noisy, and easier to follow, especially when the same pattern repeats across multiple lines.&lt;/p&gt;

&lt;p&gt;More complex example:&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="n"&gt;printSum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;string&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="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"invalid a: %w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"invalid b: %w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&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;Could become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x, err := strconv.Atoi(a) ? return fmt.Errorf("invalid a: %w", err)
y, err := strconv.Atoi(b) ? return fmt.Errorf("invalid b: %w", err)
fmt.Println("result:", x + y)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  An alternative — not a replacement
&lt;/h2&gt;

&lt;p&gt;Let’s be clear:&lt;br&gt;
This kind of syntax isn’t meant to replace the existing error handling in Go. It’s meant to complement it.&lt;/p&gt;

&lt;p&gt;The familiar &lt;code&gt;if err != nil&lt;/code&gt; remains 100% valid and is still necessary when you need custom error logic.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; operator would be just an alternative for the most common patterns — a shorthand, not a shift in philosophy.&lt;/p&gt;

&lt;p&gt;And since Go’s compiler already understands function signatures, propagating errors where appropriate would be safe and predictable.&lt;br&gt;
Default return values (&lt;code&gt;nil&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;""&lt;/code&gt;, etc.) would be inferred, just as they are today.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I (partially) disagree with the Go team
&lt;/h2&gt;

&lt;p&gt;Go values explicitness, simplicity, and predictability. The verbosity of its error handling reflects those values. That’s totally fair.&lt;/p&gt;

&lt;p&gt;But still — in the vast majority of cases, error handling in Go is formulaic: check error, return or panic.&lt;/p&gt;

&lt;p&gt;Recognizing that, and providing a built-in syntax for it, wouldn’t hurt Go’s clarity. In fact, Go already supports concise syntax when it improves readability, like the &lt;code&gt;:=&lt;/code&gt; short declaration.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; operator would just follow that same principle:&lt;br&gt;
optional, minimal, idiomatic.&lt;/p&gt;

&lt;p&gt;Other languages (Rust, PHP, Kotlin, etc.) use &lt;code&gt;?&lt;/code&gt; to represent a similar idea: short-circuiting on failure. For many developers, that syntax already feels familiar.&lt;/p&gt;




&lt;h2&gt;
  
  
  The “just let the IDE handle it” argument
&lt;/h2&gt;

&lt;p&gt;The blog post also brings up the idea that IDEs and AI tools could abstract away error boilerplate.&lt;/p&gt;

&lt;p&gt;That’s fine in theory — but in practice, you don’t want language clarity to depend on external tools.&lt;/p&gt;

&lt;p&gt;Relying too much on auto-generation or snippets risks hiding the actual behavior, especially in shared or open source codebases.&lt;/p&gt;

&lt;p&gt;Clean syntax should be a language-level feature, not an IDE convenience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Providing a more ergonomic syntax for error propagation wouldn’t dilute Go’s identity. It would just make the most common code patterns cleaner and easier to write.&lt;/p&gt;

&lt;p&gt;A proposal like &lt;code&gt;?&lt;/code&gt;, with clearly defined semantics and full backward compatibility, would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce boilerplate,&lt;/li&gt;
&lt;li&gt;Improve readability,&lt;/li&gt;
&lt;li&gt;Still preserve Go’s explicit nature.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What’s your take on this?&lt;/p&gt;

&lt;p&gt;Let’s talk in the comments&lt;br&gt;
You can find my website here &lt;a href="https://luise.ac/blog/?a=go-error-handling" rel="noopener noreferrer"&gt;luise.ac&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
