<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Walter’s Mind Blowers]]></title><description><![CDATA[Rants, revelations, and regret from the front lines of modern software engineering. Switching to Golang didn’t fix my life, but maybe this blog will.]]></description><link>https://waltersoto.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 08:52:05 GMT</lastBuildDate><atom:link href="https://waltersoto.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Handle Advice Without Going Nuts]]></title><description><![CDATA[The internet is full of people telling you how to live, offering you “the secret” to success. From writing coaches promise to unlock your inner Substack savant. Developers on Twitter claim their framework will “change everything.” Fitness influencers...]]></description><link>https://waltersoto.com/how-to-handle-advice-without-going-nuts</link><guid isPermaLink="true">https://waltersoto.com/how-to-handle-advice-without-going-nuts</guid><category><![CDATA[advice]]></category><category><![CDATA[Learning Journey]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Tue, 09 Sep 2025 12:46:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/0LmC0xPxyYE/upload/4bc50c913729682be687e076d87ae334.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The internet is full of people telling you how to live, offering you “the secret” to success. From writing coaches promise to unlock your inner Substack savant. Developers on Twitter claim their framework will “change everything.” Fitness influencers insist you’re doing pushups wrong unless you’re clapping between reps. Everyone has <em>their way</em> of doing things.</p>
<p>Here’s the uncomfortable truth: a lot of them are just making stuff up, and others are probably telling you the truth (sort of). Their advice probably did work, but it is not universally, and perhaps it won’t work for you.</p>
<p>That’s how we should treat advice in general: We assume it worked for the person giving it, then reserve the right to ignore it if it doesn’t fit our life. Writing tips, coding patterns, career advice, even health hacks; unless my doctor said it, it goes into the “maybe pile” until I test it.</p>
<p>Because advice is messy, some of it is bedrock: “use version control,” “get enough sleep,” “don’t put metal in the microwave.” But most of what people pass around is more like seasoning; it makes sense in their recipe, but it won’t automatically improve yours. A writer swears by outlining, another swears by discovery writing, and both are convinced they’ve cracked the code. Meanwhile, a lot of books were written with no code at all; just stubbornness and coffee.</p>
<p>What people rarely admit is how much of the advice is shaped by circumstance. Your uncle’s brilliant business strategy might’ve only worked because he stumbled into the right market at the right time. The fitness influencer’s miracle workout might rely on genetics more than technique. The author’s “must-do” rule might have saved their novel, but might just derail yours.</p>
<p>So what do you do with all this noise? You listen politely, maybe write it down, and then treat it like an experiment. Try it in a small way. See if it actually helps. If it does, congratulations, you’ve learned something new. If it doesn’t, you’ve wasted an afternoon, not your entire career. No guilt required.</p>
<p>The point isn’t to build your life around someone else’s blueprint. It’s to collect enough experiments that you end up with a process that feels like yours. And once you have that, the advice machine doesn’t stop; people will still insist you’re doing it wrong. You’ll just be too busy making progress to care.</p>
<p>So yes, take advice. Respect it. Even try it. But always keep your veto power. And please, for your own sake, skip the $2,000 “wealth secrets” webinar hosted by a guy who just learned what compound interest is.</p>
]]></content:encoded></item><item><title><![CDATA[Design Patterns: You Use Them Even If You're Too Tired to Spell Them]]></title><description><![CDATA[Design patterns, those noble battle-tested solutions to common problems in software architecture. The kind of thing every job interview pretends you'll consciously wield like a master swordsman.
"Tell me about a time you used a design pattern," they ...]]></description><link>https://waltersoto.com/design-patterns-you-use-them-even-if-youre-too-tired-to-spell-them</link><guid isPermaLink="true">https://waltersoto.com/design-patterns-you-use-them-even-if-youre-too-tired-to-spell-them</guid><category><![CDATA[design patterns]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Sun, 03 Aug 2025 03:10:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ukzHlkoz1IE/upload/086c2cda80e9481859969bdfcc3e7f41.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Design patterns, those noble battle-tested solutions to common problems in software architecture. The kind of thing every job interview pretends you'll consciously wield like a master swordsman.</p>
<p>"Tell me about a time you used a design pattern," they ask, as if you didn’t just copy-paste that entire module from the project your last tech lead abandoned.</p>
<p>Let’s get this out of the way: design patterns are useful. They offer structure, maintainability, and a shared language. But let’s also stop pretending we consciously choose them most of the time. The truth? Most patterns sneak into your codebase like raccoons through an open trash lid. And just like raccoons, we usually notice them only when they start making a mess.</p>
<hr />
<h2 id="heading-the-interviewer-illusion">The Interviewer Illusion</h2>
<p>Interviewers treat design patterns like a badge of seniority. If you can rattle off Observer, Decorator, Factory, and Abstract Factory without stuttering, you're considered a serious engineer. Bonus points if you throw in "Command pattern" like it's a secret cheat code.</p>
<p>But in practice? Most devs haven’t voluntarily used a Visitor pattern since they were forced to implement it during a college group project with someone named Chad who never showed up to meetings.</p>
<p>Ask any real-world engineer when they last <em>chose</em> a pattern, and they'll probably reply with something like:</p>
<blockquote>
<p>"Oh yeah, I used MVC. Because... that's what ASP.NET does by default."</p>
</blockquote>
<hr />
<h2 id="heading-patterns-youre-already-using-without-knowing">Patterns You're Already Using (Without Knowing)</h2>
<p>Let’s break the illusion. You <em>are</em> using design patterns. Just not the way whiteboard interviews would like to imagine.</p>
<h3 id="heading-mvc-model-view-controller">🔹 MVC (Model-View-Controller)</h3>
<ul>
<li><p><strong>Where it shows up:</strong> Every web framework since 2003.</p>
</li>
<li><p><strong>Did you choose it?</strong> No. You clicked “New Project” and it came with a folder called <code>Controllers</code>.</p>
</li>
</ul>
<h3 id="heading-singleton">🔹 Singleton</h3>
<ul>
<li><p><strong>Where it shows up:</strong> Your dependency injection container, your logging class, your config service.</p>
</li>
<li><p><strong>Did you choose it?</strong> No. You used <code>AddSingleton()</code> because the tutorial said so.</p>
</li>
</ul>
<h3 id="heading-observer">🔹 Observer</h3>
<ul>
<li><p><strong>Where it shows up:</strong> React state updates, event emitters, RxJS, C# events.</p>
</li>
<li><p><strong>Did you choose it?</strong> Also no. The framework asked for a callback.</p>
</li>
</ul>
<h3 id="heading-strategy">🔹 Strategy</h3>
<ul>
<li><strong>Where it shows up:</strong> You passed different functions to the same method. Congratulations.</li>
</ul>
<h3 id="heading-decorator">🔹 Decorator</h3>
<ul>
<li><p><strong>Where it shows up:</strong> Middleware pipelines, logging wrappers, chained HTTP handlers.</p>
</li>
<li><p><strong>Did you choose it?</strong> Not unless you write raw JavaScript for a living and enjoy pain.</p>
</li>
</ul>
<hr />
<h2 id="heading-the-truth-about-pattern-usage">The Truth About Pattern Usage</h2>
<p>Patterns are like gravity. They're always there, shaping things, even if you don't name-drop them. You build enough backend services, and you'll eventually end up writing something that <em>resembles</em> a Command pattern. Not because you're a Gang of Four purist, but because you needed to encapsulate some logic and didn’t want to write another 400-line method called <code>ExecuteAllBusinessThingsAndThenMaybeLog</code>.</p>
<p>The more experience you have, the more you realize:</p>
<blockquote>
<p>Patterns are what you name your code after it works.</p>
</blockquote>
<p>You don’t refactor to a Builder pattern out of aesthetic joy. You do it because otherwise your object constructor looks like a Chipotle order form.</p>
<p>Also worth noting: patterns are not laws. They’re just labels we slap on solutions that tend to work well. You can (and should) adapt them. A Decorator can log. A Factory can cache. A Strategy can also send emails, if you’re feeling frisky. The books gave us definitions, but your code gets to break the rules if it still makes sense and works.</p>
<hr />
<h2 id="heading-so-are-patterns-useless">So, Are Patterns Useless?</h2>
<p>Not at all. They're extremely useful <em>once you understand them</em>. They help you debug faster. They help you onboard new devs. They give structure to chaos. But we need to stop pretending they are sacred rituals we all follow from day one.</p>
<p>Most of the time, your framework determines your pattern before you even write a line of code. Laravel, Spring, Django, and <a target="_blank" href="http://ASP.NET">ASP.NET</a> all come with opinionated architectures that quietly introduce half a dozen patterns behind the scenes.</p>
<hr />
<h2 id="heading-conclusion">Conclusion</h2>
<p>Use patterns. Learn them. They are good. But let’s stop romanticizing how they show up in the real world. In interviews, everyone acts like they auditioned patterns like Netflix genres before settling on the perfect one. In real life, we just needed something that didn’t crash and could be unit tested.</p>
<p>You didn’t <em>choose</em> the Singleton life. It came pre-installed.</p>
<p>And that’s okay.</p>
]]></content:encoded></item><item><title><![CDATA[Clean Architecture: Because One Day You'll Regret That God Class]]></title><description><![CDATA[Have you ever opened a codebase and felt like you just walked into a hoarder's house? There's a half-eaten quesadilla inside the controller, a database call nestled alongside some business logic, and ]]></description><link>https://waltersoto.com/clean-architecture-because-one-day-youll-regret-that-god-class</link><guid isPermaLink="true">https://waltersoto.com/clean-architecture-because-one-day-youll-regret-that-god-class</guid><category><![CDATA[clean code]]></category><category><![CDATA[Clean Architecture]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Wed, 23 Jul 2025 23:13:55 GMT</pubDate><enclosure url="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/681a4fc818b6a9a8ee085437/cc8917d6-f36f-40ef-a5b3-fb6c3eece936.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever opened a codebase and felt like you just walked into a hoarder's house? There's a half-eaten quesadilla inside the controller, a database call nestled alongside some business logic, and for some reason, a queue consumer is residing in the model folder. You don’t even work here. You’re just trying to fix a bug.</p>
<p>Welcome to the beautiful mess of real-world software development. Now let’s talk about how Clean Architecture tries to stop this kind of madness.</p>
<h2>So… What Is Clean Architecture?</h2>
<p><strong>Clean Architecture</strong> is a software design approach that separates concerns like a <strong>paranoid introvert at a family cookout</strong>; everything needs its own space. <strong>Robert C. Martin (Uncle Bob)</strong>, who essentially wrote the book on it (literally, his book <em>Clean Architecture: A Craftsman's Guide to Software Structure and Design</em> is the one everyone tells you to read, and they're right), popularized this idea. The main promise? Your core business logic should be blissfully unaware of your frameworks, databases, or tools. It's about letting your business be business, not a database whisperer.</p>
<p>Why? Because frameworks age faster than avocados. Your domain logic, ideally, should not.</p>
<p>At its core, Clean Architecture is just an aggressive way of saying, “stop mixing your mashed potatoes with your ice cream.”</p>
<h2>Real-World Analogy: The Restaurant</h2>
<p>Imagine you're running a restaurant.</p>
<ul>
<li><p>The <strong>chef</strong> (Domain Layer) knows how to cook. He doesn't care if the food is served on porcelain or paper plates.</p>
</li>
<li><p>The <strong>waitstaff</strong> (Service Layer) knows which dishes to bring, and when.</p>
</li>
<li><p>The <strong>front desk</strong> (Interface Adapters) deals with customers, takes orders, and smiles through the pain.</p>
</li>
<li><p>The <strong>delivery truck</strong> (Frameworks/Repo Layer) brings you ingredients. If it breaks down, the chef doesn’t stop knowing how to make birria tacos.</p>
</li>
</ul>
<p>You can change the delivery truck. You can repaint the dining room. But the recipe? That stays golden.</p>
<h2>The Layers: Explained Without Yelling</h2>
<p>Let’s go through the concentric circle model, minus the cult vibes:</p>
<ul>
<li><p><strong>Entities (Domain Layer):</strong> These are your core models and rules. They're pure, simple, and shouldn’t know HTTP exists. Think of them like monks in a mountain temple, completely unbothered by the chaos below.</p>
</li>
<li><p><strong>Use Cases (Service Layer):</strong> This is where business happens. It's the logic that says, “If user X does Y, then Z must happen.” It coordinates, but it doesn’t store or render anything.</p>
</li>
<li><p><strong>Interface Adapters:</strong> Here live your controllers, your serializers, your CLI handlers. They take input from the outside world and translate it into something your system understands. They’re the bilingual middle managers of your app.</p>
</li>
<li><p><strong>Frameworks &amp; Drivers (External Concerns):</strong> Databases, HTTP clients, cloud SDKs. This is where the noise lives. The stuff that breaks the moment you update a minor version. Keep it outside where it belongs.</p>
</li>
</ul>
<h2>The Rule of Dependencies (The Only Rule That Matters)</h2>
<p>If you remember nothing else, remember this: <strong>dependencies go inward.</strong></p>
<p>Outer layers can depend on inner ones, but not the other way around. It’s like social media followers, you can follow down the chain, but your core logic doesn’t follow anyone back. Your domain entities are Beyoncé.</p>
<h2>Why Bother?</h2>
<p>Here’s what you get for your discipline:</p>
<ul>
<li><p><strong>Testability:</strong> You can test your domain logic without needing to spin up a database, mock an HTTP request, or sacrifice a goat.</p>
</li>
<li><p><strong>Flexibility:</strong> Swap out Postgres for Mongo. Or Redis. Or write to a CSV file like a maniac. Your business logic doesn’t care. It just works.</p>
</li>
<li><p><strong>Maintainability:</strong> When someone asks you to “just add a quick feature,” you won’t have to spelunk into <code>app/controllers/utils/misc/wtf_this_does.cs</code> to make it happen.</p>
</li>
</ul>
<h2>A Simple Example</h2>
<p>Let’s say you’re building a Todo app.</p>
<ul>
<li><p>Your <strong>Entity</strong> is <code>Task</code>. It has fields like <code>title</code>, <code>dueDate</code>, and maybe a method like <code>isOverdue()</code>.</p>
</li>
<li><p>Your <strong>Use Case</strong> is <code>MarkTaskAsComplete</code>, which takes a task ID and flips a flag.</p>
</li>
<li><p>Your <strong>Interface Adapter</strong> is a REST endpoint: <code>PUT /tasks/{id}/complete</code>.</p>
</li>
<li><p>Your <strong>Framework/Driver</strong> is the database that persists it all.</p>
</li>
</ul>
<p>If tomorrow you switch from REST to GraphQL, or from SQL Server to Notion (please don’t), your domain logic stays intact.</p>
<h2>Final Thoughts</h2>
<p>Clean Architecture sounds like overkill until you’ve worked on something long enough to feel the pain of not using it. It’s like flossing: annoying now, but better than root canals later.</p>
<p>Your core business logic is the part that matters. That’s what should be stable, testable, and free of framework drama. Keep it clean. Keep it boring. And let the rest of your stack implode in peace.</p>
]]></content:encoded></item><item><title><![CDATA[Why You Need an Outbox Pattern (Even If Your Event Bus Is Fancy)]]></title><description><![CDATA[The Fantasy of Distributed Systems
You built your distributed system, hooked it up to Kafka or NATS or RabbitMQ, and now everything talks to everything else like some perfectly choreographed dance. At least that's what the architecture diagram sugges...]]></description><link>https://waltersoto.com/why-you-need-an-outbox-pattern-even-if-your-event-bus-is-fancy</link><guid isPermaLink="true">https://waltersoto.com/why-you-need-an-outbox-pattern-even-if-your-event-bus-is-fancy</guid><category><![CDATA[events]]></category><category><![CDATA[message broker]]></category><category><![CDATA[message queue]]></category><category><![CDATA[outbox pattern]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Fri, 13 Jun 2025 01:01:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1749776419146/d51155ed-c640-4c7d-b3ff-54a63948f27f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-fantasy-of-distributed-systems">The Fantasy of Distributed Systems</h2>
<p>You built your distributed system, hooked it up to Kafka or NATS or RabbitMQ, and now everything talks to everything else like some perfectly choreographed dance. At least that's what the architecture diagram suggests.</p>
<p>In practice, things fall apart in much smaller, more pathetic ways. A server restarts. A pod crashes. Some timeout fires a little too early. And right in the middle of that, your app writes something to the database but never sends the event to the bus. Or worse, sends the event but fails to commit the database. Congratulations, you're now the proud owner of an inconsistent system.</p>
<h2 id="heading-the-problem-nobody-wants-to-talk-about">The Problem Nobody Wants to Talk About</h2>
<p>You may hear people argue that their event bus has built-in guarantees. Sure. They’ll talk about at least once delivery, idempotency, eventual consistency, and a bunch of other words that sound smart enough to end conversations. But none of those solve the core problem if your app crashes between writing the database and sending the event. You need something that guards the gap.</p>
<p>Distributed systems don't care how good your intentions are. They reward paranoia and punish optimism.</p>
<h2 id="heading-enter-the-outbox-pattern">Enter the Outbox Pattern</h2>
<p>The basic idea isn't complicated: instead of writing to your database and your event bus as two separate actions, you write both the data and a corresponding event into the same database transaction. That outbox table is now your source of truth. A separate worker process reads from it and publishes events to your fancy bus. If the database commit succeeds, the event will eventually be processed. If not, it never existed to begin with.</p>
<p>It's not magic. It's paperwork. But paperwork keeps the lights on.</p>
<h2 id="heading-the-trade-off">The Trade-Off</h2>
<p>Of course, this means adding another moving part. Now you have an extra table, a poller, retries, and monitoring for the poller. But you're trading a sharp random failure for a boring, predictable system. If something breaks, you know where to look. You know which events didn't get published. And you have full control to replay or reprocess them.</p>
<p>The alternative is hoping your event publishing code never fails at exactly the wrong moment. It will. Eventually. You might not even notice until a customer calls support and asks why their account was never fully created. Then you'll pull logs, stare at gaps in your Kafka topic, and wish you'd just set up the outbox in the first place.</p>
<h2 id="heading-why-you-should-use-it">Why You Should Use It</h2>
<p>The outbox pattern doesn’t eliminate failure. Nothing does. What it gives you is a system where failure is contained, observable, and recoverable. When the outbox poller stops, you see it. When events get stuck, you can replay them. When something downstream breaks, at least you know the events were captured.</p>
<p>You can build a system that tolerates mistakes, or you can build one that assumes nothing will go wrong. Only one of those is still standing after six months in production.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>So yeah, your event bus is great. Keep it. You can wrap it in an outbox pattern, or go the CDC route, but that’s another discussion. Right now, we’re here for the outbox. It’s the seatbelt your system quietly hopes you’ll never need.</p>
]]></content:encoded></item><item><title><![CDATA[What Is Good Error Handling, Really?]]></title><description><![CDATA[Have you ever shipped a feature, crashed production, and then stared blankly at your PC, wondering what happened? Yeah, welcome to error handling, or as a buddy of mine calls it: the art of pretending chaos is under control.
Let's get this out of the...]]></description><link>https://waltersoto.com/what-is-good-error-handling-really</link><guid isPermaLink="true">https://waltersoto.com/what-is-good-error-handling-really</guid><category><![CDATA[error handling]]></category><category><![CDATA[Resilience]]></category><category><![CDATA[resilient software]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Sat, 07 Jun 2025 02:09:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1749262161809/e1dd96cc-9245-49e1-bad7-b8ed61cd2a26.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever shipped a feature, crashed production, and then stared blankly at your PC, wondering what happened? Yeah, welcome to error handling, or as a buddy of mine calls it: the art of pretending chaos is under control.</p>
<p>Let's get this out of the way: error handling isn’t about avoiding failure. It’s about making failure slightly less catastrophic like choosing to land your plane in a cornfield instead of a mountain.</p>
<p>So let’s break this thing down:</p>
<hr />
<h2 id="heading-graceful-degradation-fail-fast-and-resilient-design">🌩 Graceful Degradation, Fail-Fast, and Resilient Design</h2>
<p>You’ve probably heard these terms thrown around in tech meetings, but what do they mean?</p>
<h3 id="heading-graceful-degradation"><strong>Graceful Degradation</strong></h3>
<p>This is when your app doesn’t throw a tantrum just because one part failed. Think: Netflix is down? Okay, fine. But at least the homepage still loads and I can stare at thumbnails.</p>
<h3 id="heading-fail-fast"><strong>Fail-Fast</strong></h3>
<p>The opposite of sweeping problems under the rug. If something's wrong, make it known <em>fast</em>. Your API should not “kinda” work, it should either do the job or crash like a toddler denied a cookie.</p>
<h3 id="heading-resilient-design"><strong>Resilient Design</strong></h3>
<p>This is the system equivalent of having an emotionally stable friend. Something goes wrong? They have a plan. Maybe it’s retries, maybe it’s fallback logic, maybe it’s screaming silently behind the scenes. Either way, users don’t feel it.</p>
<hr />
<h2 id="heading-expected-vs-unexpected-errors">⚖️ Expected vs Unexpected Errors</h2>
<p>This is the difference between <em>I knew this might happen</em> and <em>what fresh hell is this?</em></p>
<ul>
<li><p><strong>Expected errors</strong>: A user gives you garbage input. A network times out. A file isn’t found. These are normal screwups. You plan for these. You return polite messages. You log warnings. You don’t freak out.</p>
</li>
<li><p><strong>Unexpected errors</strong>: Null pointer exceptions. Race conditions. The database is on fire. These are not things you anticipate. They deserve your panic, but also your attention. You should catch them, log them, and contain them.</p>
</li>
</ul>
<p>Good error handling means acknowledging that both of these will happen and treating them differently. A 400 is a “try again.” A 500 is a “call for help.”</p>
<hr />
<h2 id="heading-trycatch-overuse-vs-strategic-error-boundaries">🫦 try/catch Overuse vs Strategic Error Boundaries</h2>
<p>Let’s talk about the <code>try/catch</code> addiction.</p>
<p>Yes, exceptions should be caught. No, that does <em>not</em> mean you wrap every other line in <code>try {}</code> like you're bubble-wrapping your code for shipping. Catching every error and doing nothing is the same as yelling "Oops!" during a car crash and then driving off.</p>
<p>That’s why modern frameworks give you <strong>error boundaries</strong>—a way to catch <em>groups</em> of issues in a meaningful place. In frontend land (hi React), this could be wrapping a component tree. In backend services, it’s middleware that logs and responds without leaking stack traces into the void.</p>
<p>The goal isn’t to silence every error. It’s to <em>localize</em> the chaos. Keep the bug from spreading like mold in a damp basement.</p>
<hr />
<h2 id="heading-so-what-is-good-error-handling">So What <em>Is</em> Good Error Handling?</h2>
<p>It's not just about avoiding the red screen of death. It’s about:</p>
<ul>
<li><p>Knowing what can go wrong</p>
</li>
<li><p>Designing fallback behavior that keeps things usable</p>
</li>
<li><p>Failing loudly when needed, quietly when appropriate</p>
</li>
<li><p>Not catching exceptions just to whisper "shhh" into the log file</p>
</li>
<li><p>Logging like your future self will need to do forensic debugging at 3 am</p>
</li>
</ul>
<p>Think of error handling like good parenting: you're not preventing mistakes, you're just making sure nobody dies and the house doesn’t burn down.</p>
<hr />
<h2 id="heading-tldr">TL;DR</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Principle</td><td>Bad Example</td><td>Good Example</td></tr>
</thead>
<tbody>
<tr>
<td>Graceful degradation</td><td>Blank screen if API fails</td><td>“We couldn’t load this” message + fallback</td></tr>
<tr>
<td>Fail-fast</td><td>Silent null error three functions deep</td><td>Validate and crash early</td></tr>
<tr>
<td>Expected vs Unexpected</td><td>500 for invalid input</td><td>400 for bad input, 500 for bugs</td></tr>
<tr>
<td>try/catch usage</td><td>Catch everything, log nothing</td><td>Catch once, log meaningfully, recover, or exit</td></tr>
</tbody>
</table>
</div><hr />
<p><strong>Final thought:</strong><br />Code like nothing works and design like someone <em>will</em> click the one button you forgot to test. Because they will.</p>
]]></content:encoded></item><item><title><![CDATA[Why Your Logs Are Useless Until Disaster Strikes]]></title><description><![CDATA[Ah yes, logs. They’re the digital equivalent of shouting into the void and expecting the void to file a Jira ticket.
Every system has them. We all configure them. Every architect insists they’re "critical for observability." And yet, when something b...]]></description><link>https://waltersoto.com/why-your-logs-are-useless-until-disaster-strikes</link><guid isPermaLink="true">https://waltersoto.com/why-your-logs-are-useless-until-disaster-strikes</guid><category><![CDATA[observability]]></category><category><![CDATA[telemetry]]></category><category><![CDATA[logging]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Sat, 31 May 2025 03:21:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748662171149/59b01e75-06e9-49a7-8f0f-ffe43f749c43.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ah yes, logs. They’re the digital equivalent of shouting into the void and expecting the void to file a Jira ticket.</p>
<p>Every system has them. We all configure them. Every architect insists they’re "critical for observability." And yet, when something breaks, the first thing we all do is stare blankly at a wall, try turning it off and on again, and <em>then</em> maybe check the logs. Spoiler alert: the logs were useless.</p>
<p>Let’s talk about it.</p>
<hr />
<h2 id="heading-massive-logs-minimal-usefulness">Massive Logs, Minimal Usefulness</h2>
<p>Logging is the comfort food of backend engineering. Something goes wrong? Log it. Something goes right? Log it. Something might go wrong. You bet your sweet stack trace we’re logging it.</p>
<p>The result? Petabytes of logs are pumped out daily like an overeager data geyser. Most of it looks like:</p>
<pre><code class="lang-plaintext">INFO: Starting background sync job... (job_id: 32498a)
DEBUG: Finished background sync job... (job_id: 32498a, duration: 0.02s)
</code></pre>
<p>Oh geez, groundbreaking stuff. Really glad we archived that in six different AWS regions.</p>
<p>Meanwhile, the one thing you <em>actually</em> needed?</p>
<pre><code class="lang-plaintext">Unhandled exception in thread main_loop_37
Cause: Unknown. Location: Also unknown. Good luck.
</code></pre>
<p>You know, helpful.</p>
<hr />
<h2 id="heading-nobody-reads-logs-until-its-too-late">Nobody Reads Logs Until It’s Too Late</h2>
<p>Here’s the real kicker. Nobody reads logs during normal operation. Why would they? Everything is green, all metrics are up and to the right, and the DevOps Slack channel is silent (which, ironically, is a red flag). Logs are treated like black box recorders on a plane. Nobody checks them until we’re plummeting into the Atlantic.</p>
<p>Only then do we scramble, open up Kibana or Loki or whatever flavor-of-the-month log viewer, and desperately search for <em>the one</em> log line that explains what happened.</p>
<hr />
<h2 id="heading-the-illusion-of-control">The Illusion of Control</h2>
<p>Logging gives us a false sense of control. Like a toddler with a toy steering wheel in the backseat. We think we’re preparing for the worst, but we’re just hoarding timestamped noise.</p>
<pre><code class="lang-plaintext">Log.Info(‘Step 1 complete’) – thanks, Sherlock.
</code></pre>
<p>Sometimes I wonder if logs are less about diagnostics and more about blame distribution. When the site goes down, someone has to say, "Well, <em>my</em> service logged the handoff. It’s the other guy's problem now."</p>
<p>Congratulations. You've built a denial-of-accountability system.</p>
<hr />
<h2 id="heading-observability-theater">Observability Theater</h2>
<p>We throw around buzzwords like observability, telemetry, and real-time analytics. We collect logs, ship them to the cloud, let them rot in storage, and maybe set up a dashboard we check once a quarter when the intern needs something to do.</p>
<p>Yes, some teams do it right. They design structured logs. They use correlation IDs. They have real-time alerting pipelines. They even know what a span is. But let's not pretend this is the norm. Most organizations treat logs like old receipts. Useless until the IRS shows up.</p>
<hr />
<h2 id="heading-so-what-now">So What Now?</h2>
<p>Should we stop logging? No. But maybe log with intent. Less "just in case," more "what will actually help us at 3 AM when prod is on fire and someone is screaming at you."</p>
<p>Add context. Don’t log the same useless info every five milliseconds. And for the love of entropy, test your disaster response workflows. If you can’t find the bug during a simulated outage, you definitely won’t find it while the CEO is breathing down your neck asking why the homepage says "undefined."</p>
<hr />
<h2 id="heading-final-thoughts-before-this-gets-logged-as-a-rant">Final Thoughts (Before This Gets Logged as a Rant)</h2>
<p>Logs aren’t lies, but they aren’t truth either. They’re fragments of what happened, written by optimistic devs who assumed the system would fail gracefully. It won’t. It never does.</p>
<p>So the next time you add a new log line, ask yourself: "Will this help someone at 3 AM with coffee in one hand and fear in the other?" If not, maybe don’t.</p>
<p>Or just log it anyway. I’m sure someone will read it.<br />Eventually.</p>
]]></content:encoded></item><item><title><![CDATA[Why Your Tech Stack is Just Stockholm Syndrome With a README]]></title><description><![CDATA[Let’s not kid ourselves; your tech stack didn’t choose you, and you certainly didn’t pick it with a clear head. You were indoctrinated. Groomed. Conditioned by school, tutorials, job requirements, YouTube clickbait, and that one senior dev who swore ...]]></description><link>https://waltersoto.com/why-your-tech-stack-is-just-stockholm-syndrome-with-a-readme</link><guid isPermaLink="true">https://waltersoto.com/why-your-tech-stack-is-just-stockholm-syndrome-with-a-readme</guid><category><![CDATA[dotnet]]></category><category><![CDATA[Python]]></category><category><![CDATA[golang]]></category><category><![CDATA[DevLife]]></category><category><![CDATA[humor]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Tue, 27 May 2025 14:46:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748358834871/f8b9337b-01f2-4835-ae7a-14f2d0e60b5d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let’s not kid ourselves; your tech stack didn’t choose you, and you certainly didn’t pick it with a clear head. You were indoctrinated. Groomed. Conditioned by school, tutorials, job requirements, YouTube clickbait, and that one senior dev who swore by REACT.js like it was a religious text.</p>
<p>Why <strong>Stockholm Syndrome</strong>? Because it's the emotional bond you form with the tools that hurt you daily, but also pay your bills and make you feel competent just long enough to hit “Merge.”</p>
<hr />
<h2 id="heading-me-and-net-a-love-story-in-a-hostage-situation">Me and .NET: A Love Story in a Hostage Situation</h2>
<p>My go-to stack is .NET and C#.<br />Not because it runs everywhere (even though it kinda does now).<br />Not because it's modern and legacy at the same time, like some kind of enterprise cryptid.<br />Not because the tooling is slick, the docs are thorough, or because Visual Studio makes me feel like a functional adult.</p>
<p>No. I use .NET because I <em>know</em> it. I <em>get</em> it. It’s like that ex you keep texting even though you both know it’s over. Except in this case, you’re married, and your CI/CD pipeline is the kid you're staying together for.</p>
<p>I try to build everything with .NET: web apps, APIs, backend services, side projects, to-do lists, random JSON formatter utilities.</p>
<hr />
<h2 id="heading-meanwhile-python-devs-out-here-acting-like-its-the-second-coming">Meanwhile, Python Devs Out Here Acting Like It’s the Second Coming</h2>
<p>I’ve worked with Python long enough to develop a passive-aggressive relationship with <code>indentationError</code>. It’s not even the language that bothers me. It’s the cult of Python that thinks it’s the solution to literally everything.</p>
<ul>
<li><p>Web app? Flask.</p>
</li>
<li><p>ML model? Jupyter notebook.</p>
</li>
<li><p>API? FastAPI.</p>
</li>
<li><p>Mobile app? Uh… <em>crickets</em>.</p>
</li>
<li><p>That IKEA desk you still haven’t assembled? Someone probably tried to automate it with Python and a Raspberry Pi.</p>
</li>
</ul>
<p>Look, I get it. You learned Python in school, where everything worked in magical Jupyter cells, and you didn’t have to think about the heap or memory or real-world production. You wrote “Hello, World,” imported <code>pandas</code>, and now think you’re ready to re-architect Twitter. Good luck, champ.</p>
<hr />
<h2 id="heading-everyone-has-that-language">Everyone Has <em>That</em> Language</h2>
<p>Let’s be honest: we all try to fix everything with <em>our</em> language. Python kids treat it like duct tape. If you wrap enough of it around any problem, maybe it’ll hold. Me? I’m the guy showing up to a sinkhole with a roll of .NET and yelling “I got this!”</p>
<p>Neither of us is right. Neither of us is sane. We're just prisoners who’ve decorated our cells so nicely we think it's a studio apartment.</p>
<p>I remember a coworker at a previous job who wouldn’t shut up about Go. “It’s fast, it’s clean, it’s amazing for microservices,” he’d say. Like he was pitching me a startup instead of a programming language. Naturally, my first instinct was to dismiss him, because (a) I’m a .NET guy and (b) we all oversell our comfort zones like timeshare salesmen at Ocean City.</p>
<p>But then, at a different job, I actually had to use Go. And <em>gosh darn it</em> he was right. The syntax was tight, the tooling made sense, and it ran like a greased ferret. It didn’t replace .NET for me, but it did humble me. It’s easy to assume your stack is the sharpest knife in the drawer when you’ve never opened another drawer.</p>
<hr />
<h2 id="heading-the-readme-lies">The README Lies</h2>
<p>Here’s the thing: every tech stack looks great in its README. Every GitHub project is like a dating profile with suspiciously good lighting and zero mention of crippling edge cases.</p>
<p>You see:</p>
<blockquote>
<p>“Simple dependency injection!”<br />But in practice: 13 nested containers, a circular reference, and a runtime error that only happens when Mercury is in retrograde.</p>
</blockquote>
<p>You see:</p>
<blockquote>
<p>“Elegant syntax!”<br />But then one misplaced tab in Python sends your soul to the shadow realm (<strong>Land of Shadow for all Elden Ring players)</strong>.</p>
</blockquote>
<p>You see:</p>
<blockquote>
<p>“Cross-platform!”<br />But then try to run it on Linux, and it’s like watching a dolphin try to drive a forklift.</p>
</blockquote>
<hr />
<h2 id="heading-in-conclusion-youre-not-free-youre-just-familiar">In Conclusion: You’re Not Free, You’re Just Familiar</h2>
<p>Your tech stack isn’t your soulmate. It’s your emotional support war crime. It’s not the best option. It’s just the one you’ve suffered with the longest. The devil you know has autocomplete, and the devil you don’t requires reading documentation written by someone who last updated it during the Obama administration.</p>
<p>So go ahead, embrace your broken stack. Just don’t pretend it’s <em>better</em>. It’s just <em>yours</em>. And that, my friend, is what love looks like in the world of software.</p>
]]></content:encoded></item><item><title><![CDATA[Post-Cloud: Is Edge Computing Just Cloud With a Beard?]]></title><description><![CDATA[With everyone talking about edge AI, low-latency IoT, and serverless at the edge, are we innovating or just circling back to on-prem with better fonts?
Back in the day, every tech roadmap had one sacred line: “Move everything to the cloud.”And we did...]]></description><link>https://waltersoto.com/post-cloud-is-edge-computing-just-cloud-with-a-beard</link><guid isPermaLink="true">https://waltersoto.com/post-cloud-is-edge-computing-just-cloud-with-a-beard</guid><category><![CDATA[edgecomputing]]></category><category><![CDATA[serverless]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Fri, 09 May 2025 23:52:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746835066299/2c7b1ec1-3634-42f8-8bc0-df5093ca6842.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>With everyone talking about edge AI, low-latency IoT, and serverless at the edge, are we innovating or just circling back to on-prem with better fonts?</p>
<p>Back in the day, every tech roadmap had one sacred line: <strong>“Move everything to the cloud.”</strong><br />And we did. Or at least we said we did. Now, the trend is shifting again, and the industry has a new favorite phrase: <em>“</em>We’re moving processing closer to the source AKA edge computing<em>.”</em></p>
<p>Depending on who you ask, edge computing is either the future of infrastructure or just cloud computing with a beard. Not the full Gandalf beard. More like a well-moisturized Portland barista beard. Stylish. A little rugged. But still running on the same servers we’ve been quietly naming after superheroes.</p>
<p>But is it <em>new</em>? Or are we just repackaging the past with lower latency?</p>
<hr />
<h2 id="heading-what-edge-means">What Edge Means</h2>
<p>Edge computing moves processing power closer to where data is generated. Think sensors, mobile devices, or that smart doorbell that keeps mistaking squirrels for porch pirates.</p>
<p>This reduces:</p>
<ul>
<li><p>Latency (great for real-time applications)</p>
</li>
<li><p>Bandwidth usage (no need to send everything back to the cloud)</p>
</li>
<li><p>Dependency on connectivity (which matters when your autonomous vehicle is making a left turn, not waiting on a response from Virginia)</p>
</li>
</ul>
<p>Edge computing shines in industries like:</p>
<ul>
<li><p>Manufacturing (machine learning on the assembly line)</p>
</li>
<li><p>Healthcare (real-time diagnostics)</p>
</li>
<li><p>Telecom (5G-powered edge AI)</p>
</li>
<li><p>Retail (smart inventory management and real-time customer analytics)</p>
</li>
<li><p>Transportation (self-driving cars and traffic optimization)</p>
</li>
<li><p>Energy (Predictive maintenance for smart grids and localized power management)</p>
</li>
</ul>
<p>So no, it’s not a gimmick. It just isn’t one-size-fits-all either.</p>
<hr />
<h2 id="heading-why-it-feels-familiar">Why It Feels Familiar</h2>
<p>If this sounds like the on-prem setups we swore off years ago, you're not wrong.</p>
<p>The difference today:</p>
<ul>
<li><p>Edge nodes are lightweight and distributed</p>
</li>
<li><p>They’re managed through APIs or orchestration tools</p>
</li>
<li><p>They integrate with the cloud instead of trying to replace it</p>
</li>
</ul>
<p>In other words, yes, it’s more capable than "a server stuck in a garage," but conceptually it’s still familiar.</p>
<hr />
<h2 id="heading-serverless-at-the-edge-great-idea-until-you-actually-try-it">Serverless at the Edge: Great Idea, Until You Actually Try It</h2>
<p>One of the trendier phrases you’ll hear is <strong>“serverless at the edge.”</strong></p>
<p>This means running event-driven functions on distributed edge nodes without managing infrastructure.</p>
<p>In theory, it’s a great fit. Serverless gives you flexibility. Edge gives you proximity. But in reality, deployment is tricky. Tooling is inconsistent. And you’re now juggling lots of mini-environments that don’t always behave the same.</p>
<p>It works, but it’s not magic.</p>
<hr />
<h2 id="heading-operational-trade-offs">Operational Trade-offs</h2>
<p>Cloud centralizes. Edge distributes. That introduces new trade-offs:</p>
<ul>
<li><p>Monitoring gets harder. Logs may not reach you from a half-connected device sitting in a warehouse.</p>
</li>
<li><p>Updates can be slower or delayed.</p>
</li>
<li><p>Debugging becomes complex. You can’t just SSH into every node. Or at least, you shouldn't.</p>
</li>
</ul>
<p>You didn’t eliminate complexity. You just spread it out.</p>
<hr />
<h2 id="heading-security-gets-complicated">Security Gets Complicated</h2>
<p>Edge devices are often physically exposed, might run in unsecured environments, and are not always possible to patch consistently.</p>
<p>Each node becomes a potential attack vector. That means you’ll need:</p>
<ul>
<li><p>Local encryption and authentication</p>
</li>
<li><p>Secure update pipelines</p>
</li>
<li><p>Tight monitoring to spot issues early</p>
</li>
</ul>
<p>You can't rely on the same perimeter-based security models. Edge forces you to rethink everything.</p>
<hr />
<h2 id="heading-the-takeaway-its-not-just-hype-but-its-not-a-cloud-killer">The Takeaway: It’s Not Just Hype, But It’s Not a Cloud Killer</h2>
<p>Edge computing is useful. It solves real problems, especially when low latency and real-time decision-making are critical.</p>
<p>But it comes with complexity. It requires planning. And it doesn’t replace the cloud, it complements it.</p>
<p>If your system needs local computing, go for it. But make sure you understand the trade-offs.</p>
<p>So yes, edge computing is kind of like a cloud with a beard. A bit more distributed. A bit more hands-on. And depending on your setup, a bit more work.</p>
]]></content:encoded></item><item><title><![CDATA[What the Hell Is Observability and Why Do I Pretend to Understand It?]]></title><description><![CDATA[At some point in the last five years, you’ve nodded along in a meeting while some chump said, “We need to improve observability,” and you had no idea if they meant better logs, a new dashboard, or installing a third Prometheus instance just to feel s...]]></description><link>https://waltersoto.com/what-the-hell-is-observability-and-why-do-i-pretend-to-understand-it</link><guid isPermaLink="true">https://waltersoto.com/what-the-hell-is-observability-and-why-do-i-pretend-to-understand-it</guid><category><![CDATA[observability]]></category><category><![CDATA[Microservices]]></category><category><![CDATA[Devops]]></category><category><![CDATA[monitoring]]></category><dc:creator><![CDATA[Walter Soto]]></dc:creator><pubDate>Wed, 07 May 2025 02:06:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/-WXQm_NTK0U/upload/9b6fb7d49359ae1f768374ef12159667.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At some point in the last five years, you’ve nodded along in a meeting while some chump said, “We need to improve observability,” and you had no idea if they meant better logs, a new dashboard, or installing a third Prometheus instance just to feel something.</p>
<p>Well, me too.</p>
<p>Observability is just another tech buzzwords we all use with the confidence of a toddler wearing a Batman cape fully convinced we are invincible, until reality hits. We’re sure it’s important. We’re pretty sure it involves metrics. And we’re sure nobody will call us out because they don’t get it either.</p>
<p>So let’s rip the bandage off and figure out what the hell observability actually is, before we add “observability engineer” to our LinkedIn profile and get exposed by someone who actually knows.</p>
<h3 id="heading-tldr-observability-monitoring"><strong>TL;DR: Observability ≠ Monitoring</strong></h3>
<p>Monitoring is asking <em>“Is this thing on?”</em></p>
<p>Observability is asking <em>“Why is this thing is beeping at 3AM?”</em></p>
<p>The classic definition (borrowed from control theory, because we’re all pretending to understand math) is:</p>
<blockquote>
<p><strong>Observability is the ability to infer the internal state or condition of a system based on its outputs.</strong></p>
</blockquote>
<p>In English: If your app’s on fire and your logs, metrics, and traces can pinpoint the arsonist, the crime scene, and how long it’s been burning, congratulations. You’re observable.</p>
<h3 id="heading-the-unholy-trinity-logs-metrics-and-traces">The Unholy Trinity: Logs, Metrics, and Traces</h3>
<p>Ah yes, the holy trinity of observability (or three pillars, whatever). Or as I call them:</p>
<ul>
<li><p><strong>Logs</strong>: The app’s internal monologue. Sometimes helpful. Sometimes just “ERROR: Something went wrong. ¯\<em>(ツ)</em>/¯”</p>
</li>
<li><p><strong>Metrics</strong>: Numbers that tell you how fast, slow, bloated, or dead something is. Think CPU usage, request latency, or how many Docker containers are gasping for air.</p>
</li>
<li><p><strong>Traces</strong>: The family tree of a request. It tells you where it went, how long it took, and which microservice mess up.</p>
</li>
</ul>
<h3 id="heading-so-why-do-we-suck-at-it">So Why Do We Suck at It?</h3>
<p>Because most of us duct-taped Grafana to Prometheus (or Victoria Metrics :-p), slapped in a log aggregator, and called it a day. Then we pretend it’s “observability” because we’re tired, and we’ve already burned out two SREs this quarter.</p>
<p>True observability is proactive. It’s the difference between <strong>knowing your system is collapsing</strong> and <strong>knowing exactly why it collapsed—before it sends an SRE into early retirement</strong>.</p>
<h3 id="heading-the-lie-we-all-tell">The Lie We All Tell</h3>
<p>Every dashboard is a lie. Especially the ones that look good.</p>
<p>We build them to look impressive during demos, but half the time they’re just static graphs that say “everything’s fine” while the database isn’t logging errors because it’s too busy bluffing its way through a poker game with your customer data.</p>
<h3 id="heading-if-youve-ever-heard-it-didnt-alert-so-it-must-be-fine-just-know-youve-witnessed-observability-malpractice">If you’ve ever heard, “It didn’t alert, so it must be fine,” just know you’ve witnessed observability malpractice.</h3>
<p>How to Fake It Better</p>
<p>Until you truly invest in observability (and not just more dashboards), here’s how to fake it with style:</p>
<ol>
<li><p><strong>Make logs structured</strong>: JSON, please. We’re not cavemen.</p>
</li>
<li><p><strong>Use labels in your metrics</strong>: Otherwise, it’s just a number doing cosplay as insight.</p>
</li>
<li><p><strong>Adopt tracing before your microservices unionize because when they multiply without proper tracing, chaos is inevitable.</strong></p>
</li>
<li><p><strong>Actually look at your dashboards</strong> before they’re needed in an incident post-mortem.</p>
</li>
</ol>
<hr />
<h3 id="heading-final-thoughts">Final Thoughts</h3>
<p>Observability is like flossing. Everyone says they do it. Almost nobody does it right. And the only time we care is when something hurts.</p>
<p>So yeah, maybe I <em>am</em> still pretending. But at least now I know what I’m pretending <em>about</em>.</p>
]]></content:encoded></item></channel></rss>