<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog on Post a Post</title><link>https://hernan941.com/en/posts/</link><description>Recent content in Blog on Post a Post</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><managingEditor>hrwgallardo@gmail.com (Hernán)</managingEditor><webMaster>hrwgallardo@gmail.com (Hernán)</webMaster><copyright>Hernán Gallardo Palma (CC BY-NC 4.0)</copyright><lastBuildDate>Fri, 16 Oct 2026 12:51:00 -0300</lastBuildDate><atom:link href="https://hernan941.com/en/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>On Learning</title><link>https://hernan941.com/en/posts/sobre-aprender/</link><pubDate>Fri, 16 Oct 2026 12:51:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/sobre-aprender/</guid><description>&lt;p&gt;Learning has always been hard, especially as we grow older. This difficulty comes from effort, which we often confuse with pain. It&amp;rsquo;s hard to internalize new concepts and deal with the mental load and the frustration, but that effort is usually part of learning.&lt;/p&gt;&#10;&lt;p&gt;Lately we&amp;rsquo;ve found an easy way around that resistance. We no longer need to try over and over to reach the solution, or review the solution in detail to see what we&amp;rsquo;re missing; language models take care of lightening that challenge. What the calculator once was, an agent is now, with the difference that the calculator did the math, but the reasoning was still ours. The agent promises to do both.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Learning has always been hard, especially as we grow older. This difficulty comes from effort, which we often confuse with pain. It&rsquo;s hard to internalize new concepts and deal with the mental load and the frustration, but that effort is usually part of learning.</p>
<p>Lately we&rsquo;ve found an easy way around that resistance. We no longer need to try over and over to reach the solution, or review the solution in detail to see what we&rsquo;re missing; language models take care of lightening that challenge. What the calculator once was, an agent is now, with the difference that the calculator did the math, but the reasoning was still ours. The agent promises to do both.</p>
<p>We have feared that technology would affect our intelligence ever since tools have existed. And I don&rsquo;t want us to fear agents. On the contrary, used the right way they can speed up learning. AI took away the friction that used to come free with learning. Now we have to seek it out on purpose. The good news is that AI itself can help us, if we ask it for questions instead of answers.</p>
<h2 id="the-value-of-mistakes">The value of mistakes</h2>
<p>Learning happens in the struggle to solve a problem, getting it wrong and trying again. Our brain predicts and looks for patterns by instinct. It does so with fast thinking, the intuitive kind, the kind that doesn&rsquo;t ask permission. To activate slow thinking, the deliberate kind, we need to stop assuming our model is the right one. Get it wrong. This forces us to stop and think seriously.</p>
<p>This has a name: desirable difficulties. They make studying slower and more uncomfortable, but what we learn lasts longer. Something similar happens with what we generate ourselves. We remember it better than what we only read, even if our first attempt is wrong. Mind you, afterwards you have to check the correct answer. Otherwise, the mistake stays with us.</p>
<p>Beware of the illusion of competence. We read something, understand it effortlessly and think we already know it. Until the test comes and we can&rsquo;t explain it. Rereading your notes feels productive, but almost never is.</p>
<p>In practice, this translates into three habits:</p>
<ol>
<li><strong>Get it wrong first.</strong> Before starting a topic, a class or a tutorial, try to answer without knowing. You&rsquo;ll fail, and that&rsquo;s what gives the theory the weight of an alarm bell.</li>
<li><strong>Don&rsquo;t reread, explain.</strong> After reading, close the material and explain what you understood in your own words, out loud, like you&rsquo;d explain it to a five-year-old. Wherever you get stuck is the path to follow.</li>
<li><strong>Answer before looking.</strong> When you test yourself, always write down what you think the answer is before seeing the correct one.</li>
</ol>
<p>Learning should feel clumsy. Clumsier than doing it with your feet.</p>
<h2 id="using-ai-to-learn">Using AI to learn</h2>
<p>These practices take discipline, and discipline is hard when the answer is one message away. While AI can be what blocks us, it can also be the answer. An AI that answers takes the effort away from us, whereas an AI that asks gives it back.</p>
<p>We can learn from many sources or from a single tutor. Many sources give more perspectives, but they scatter our attention and force us to find material, organize it and verify it. An AI tutor can gather those perspectives and hand them to us in one place. That way the friction leaves the logistics of studying and stays where it belongs: in the moment of learning.</p>
<p>A cycle that works:</p>
<ol>
<li><strong>Diagnosis.</strong> Ask the agent to quiz you until it finds where what you know ends.</li>
<li><strong>Material.</strong> With that, have it generate study material adjusted to your level: not so easy that you get bored, not so hard that you give up.</li>
<li><strong>Test.</strong> Have it test you, and you answer before seeing the solution.</li>
<li><strong>Repeat.</strong> If you fail, go back to the material. If you get it right, move on to the next topic.</li>
</ol>
<p>This way we can use an agent as a private tutor and aim the difficulty at the right spot.</p>
<h2 id="closing">Closing</h2>
<p>For centuries, learning hurt without anyone asking for it. Now the effort is optional and, like almost everything optional, it&rsquo;s very easy to skip.</p>
<p>AI can give us all the answers. The hard part is asking it for the questions. So the next time you open a chat to understand something, do the counterintuitive thing: ask it to test you, get it wrong with confidence and explain the topic to it as if it were a five-year-old.</p>
<p>Let&rsquo;s not outsource our critical thinking. And if learning feels clumsy, you&rsquo;re doing fine.</p>
<p><img src="https://images.unsplash.com/photo-1485827404703-89b55fcc595e?q=80&amp;w=1470&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=NHwxMjA3fDA%3D" alt="Robot"></p>
]]></content:encoded></item><item><title>The market is F++</title><link>https://hernan941.com/en/posts/the-market-is-f/</link><pubDate>Mon, 12 Oct 2026 12:51:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/the-market-is-f/</guid><description>&lt;p&gt;And not just because of artificial intelligence. Companies are cutting costs, people with years of experience have lost their jobs and are now applying to lower positions, and fewer and fewer spots are opening up for juniors. On top of that, add wars and a cost of living that keeps going up. It&amp;rsquo;s a bad time to start in this industry.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://i.kym-cdn.com/photos/images/newsfeed/001/401/347/312.jpg" alt="This is fine"&gt;&lt;/p&gt;&#10;&lt;p&gt;Even so, the path to landing your first job still has the same steps as when I started. What changed is how you get evaluated.&lt;/p&gt;</description><content:encoded><![CDATA[<p>And not just because of artificial intelligence. Companies are cutting costs, people with years of experience have lost their jobs and are now applying to lower positions, and fewer and fewer spots are opening up for juniors. On top of that, add wars and a cost of living that keeps going up. It&rsquo;s a bad time to start in this industry.</p>
<p><img src="https://i.kym-cdn.com/photos/images/newsfeed/001/401/347/312.jpg" alt="This is fine"></p>
<p>Even so, the path to landing your first job still has the same steps as when I started. What changed is how you get evaluated.</p>
<h2 id="how-i-got-started">How I got started</h2>
<p>When I started, web development seemed like the safest option. I learned React and Node.js, because using the same language on the frontend and the backend made sense to me. I built the classic to-do lists and, since freeCodeCamp was all the rage, I jumped into the &ldquo;365 days of code&rdquo; challenge. There I put together a simple online store with HTML, CSS and JavaScript. It was pretty basic, but it helped me understand how the web works.</p>
<p>Back then I read a lot about how to get a job, and the advice was always the same:</p>
<ol>
<li>Apply to everything you can.</li>
<li>Go to meetups and events to meet people.</li>
<li>Build projects that show what you know.</li>
</ol>
<p>I was doing two out of three. I applied like crazy and practiced with React nonstop on side projects.</p>
<p>In the end the job showed up on my university&rsquo;s Slack. Someone posted that they needed a Meteor developer, a framework that joined the backend and the frontend through methods. First came a technical test, and that&rsquo;s where the projects paid off: it went well, I moved on to the interview and they saw that I was excited about the technology. I had never heard of Meteor, but knowing the fundamentals it wasn&rsquo;t hard to adapt. It was just a matter of knowing how to write JavaScript. But this was more than 5 years ago.</p>
<h2 id="what-didnt-change">What didn&rsquo;t change</h2>
<p>Today it&rsquo;s still the same: you apply a lot and get rejected a lot. And having someone who recommends you is still what helps the most for the first job.</p>
<p>But something did change. I have classmates with six years of university who still can&rsquo;t find a decent job in Chile, and it&rsquo;s not because they don&rsquo;t know their stuff.</p>
<h2 id="what-did-change">What did change</h2>
<p>When you apply, the first thing that checks your CV is how many years of experience you have with each technology. An ATS or a person. If the posting asks for three years of React and you don&rsquo;t have them, you&rsquo;re out. The problem is obvious: a junior has no years of experience, because nobody has given them their first job.</p>
<p>I don&rsquo;t think it&rsquo;s the recruiters&rsquo; fault. Finding out whether someone codes well takes time, so people filter by what&rsquo;s easy to check: keywords and years. That leaves out precisely the people who are just starting. And with so many companies betting on AI instead of hiring, there&rsquo;s even less room.</p>
<p>I think this will get better at some point. In the meantime, it makes sense to adjust how we present ourselves.</p>
<h2 id="what-i-would-do-differently-today">What I would do differently today</h2>
<p><strong>Tailor your CV to each posting.</strong> Your CV doesn&rsquo;t have to tell everything you are. It has to get past the filter. Use the same words the posting uses and leave the rest for the interview. Sometimes I&rsquo;ve even seen the recruiters themselves edit your CV so that it includes the technologies.</p>
<p><strong>Prioritize referrals.</strong> If someone at the company recommends you, your CV goes straight to a person who understands what you do, without going through the years-of-experience filter. That&rsquo;s why it&rsquo;s worth investing time in getting to know people in the industry.</p>
<p><strong>Build projects to learn, not to show off.</strong> Most likely nobody will look at your projects before calling you, so don&rsquo;t stress about having a perfect profile. Projects are for learning and for walking into the technical interview relaxed, which is where someone who actually knows programming finally evaluates you. If you understand the fundamentals well, you can hold your own even if the posting asks for a technology you haven&rsquo;t used.</p>
<h2 id="to-wrap-up">To wrap up</h2>
<p>The process is broken and we&rsquo;re not going to fix it ourselves. What we can do is understand how it works and not take every rejection personally. Almost always it says more about the filter than about you.</p>
<p>Tailor your CV, find someone to recommend you and keep learning with your projects. There will be rejections and uncertainty, but that&rsquo;s part of the process, not a sign that you&rsquo;re not cut out for this.</p>
<p><img src="https://img.artpal.com/398651/655-24-3-12-0-38-42m.jpg" alt="Hang in there, baby!"></p>
]]></content:encoded></item><item><title>What AI Isn't Going to Replace</title><link>https://hernan941.com/en/posts/lo-que-no-va-a-reemplazar-la-ia/</link><pubDate>Sun, 26 Jul 2026 22:35:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/lo-que-no-va-a-reemplazar-la-ia/</guid><description>&lt;p&gt;How do we imagine artificial intelligence a couple of months from now, or a couple of years? Is it going to leave everyone jobless? Will digital products still be created by humans? What should we focus on to stay relevant?&lt;/p&gt;&#10;&lt;p&gt;Every day that passes, AI is more capable. I see how code agents are pushing junior developers out of the equation. In graphic design, generative tools package logos and illustrations in seconds, making the work evaporate slowly but surely. It&amp;rsquo;s a shadow relentlessly spreading over marketing, audiovisual production and, needless to say, translation.&lt;/p&gt;</description><content:encoded><![CDATA[<p>How do we imagine artificial intelligence a couple of months from now, or a couple of years? Is it going to leave everyone jobless? Will digital products still be created by humans? What should we focus on to stay relevant?</p>
<p>Every day that passes, AI is more capable. I see how code agents are pushing junior developers out of the equation. In graphic design, generative tools package logos and illustrations in seconds, making the work evaporate slowly but surely. It&rsquo;s a shadow relentlessly spreading over marketing, audiovisual production and, needless to say, translation.</p>
<p>But there&rsquo;s a gap that still hasn&rsquo;t been filled. We&rsquo;re building systems that can understand language but not the purpose or value of what they say, at least not in a human way. Artificial Intelligence doesn&rsquo;t achieve the perspective of will, and it can&rsquo;t deal with the unknown except by hallucinating.</p>
<p><img src="https://www.weareteachers.com/wp-content/uploads/among-us-6072073_1920.jpg" alt="Among Us"></p>
<h2 id="the-illusion-of-will">The illusion of will</h2>
<p>In case you didn&rsquo;t know yet, what we call AI these days is LLMs (<em>large language models</em>), systems that learned language patterns by reading an enormous amount of text. At an atomic level it started with the idea of predicting the next word.</p>
<blockquote>
<p><em>Roses are …</em></p>
</blockquote>
<p>Now, predicting the next word requires building a complex representation of the context. Building multiple contexts and relating them to each other in sophisticated ways. How this new word influences the whole conversation. Over time these models have grown in size, and so have their training sets, reaching capabilities that resemble reasoning, communication and problem solving.</p>
<p>And with that came people&rsquo;s fear and anxiety. But these models don&rsquo;t cover important aspects of our infrastructure as a society. Not all of our activities can be extrapolated into a training set.</p>
<p>Visualizing patterns, applying probabilities, finding sequences of tokens or words and statistical association is how models see the world. Experience, intent, responsibility, context and values are left to our side of the court.</p>
<p>Because every model categorically confuses frequency with truth, we forget that every dataset it is trained on has errors. That these models touched the internet. And the internet lies, right? Condemned to replicate and optimize the world as we describe it to them. With all the garbage and fiction, all the fanfiction, wattpad and absurd conspiracies. We have to tell the truth apart from the garbage it hands us and connect the wires to get on the right track, our track.</p>
<h2 id="we-went-to-a-and-then-c-no-problem-getting-to-b-now-how-do-we-get-to-z">We went to A and then C, no problem getting to B. Now how do we get to Z</h2>
<p>What is finite and easy to capture, the common events that feed these immense machines, shapes a perfect and efficient model of thought, 100 times more efficient at transactional tasks, where the details are so well defined that we could find a needle in a haystack.</p>
<p>But the world contains much more entropy than even we are willing to accept. It&rsquo;s much messier and more chaotic. Strange events, atypical combinations or creative scenarios could leave a long tail that goes on to infinity. Or rather, they would have found the end, because they always do, but phenomenally wrong:</p>
<blockquote>
<p><em>&ldquo;Eat at least one small rock per day&rdquo;&hellip;</em> (<a href="https://www.bbc.com/news/articles/cd11gzejgz4o">BBC news story</a>)</p>
</blockquote>
<p>Also, in an imperfect environment like our reality, there&rsquo;s another dimension that has to do with combinatorics: adding variables quickly leads to exponential combinations. For the way these models work to capture that dimensionality, we would need an enormous amount of data.</p>
<p>That&rsquo;s why we should be careful with the illusion of having in front of us an image of ourselves, and its estimates. We still don&rsquo;t have a model capable of &ldquo;instant learning&rdquo;. We won&rsquo;t find any model that knows the art of improvising to get out of a jam.</p>
<h2 id="rant">RANT</h2>
<p>What I wanted to say is that our work, and that of many others, will still be there: dealing with human ambiguity, battling legacy systems, struggling from one version to the next because someone decided to build on an unstable base. Designing discrete systems with an immense reality in mind.</p>
<p>There&rsquo;s no machine that solves for us the problem of uncertainty, of long-term complexity. What does a code agent care whether the application is still working in a couple of years? The only thing that changes is that now we&rsquo;re going to be buried under a mountain of code. And who is going to save us from that 80% of garbage code?</p>
<p>I hope you and I aren&rsquo;t too lazy by the time there&rsquo;s nobody left to hold accountable; when the concept of &ldquo;AI first&rdquo; has us digging through a cesspool that looks like it was written by an alien with attention deficit. And investors are going to love it, because it &ldquo;was built in two days&rdquo;. But who knows what the hell it summoned, and why it decided to import three libraries, cross dependencies and import half the internet.</p>
<p><img src="https://www.fayerwayer.com/resizer/v2/HBUG6WARJZGF7AGGOPSPELNWLU.jpeg?auth=86d4bfc8c4f578e7364cd7cfc8d25f7163a94d00202bd170065edcac9b9e60c6&amp;width=1200&amp;height=675&amp;smart=true" alt="AI vs Reality"></p>
]]></content:encoded></item><item><title>I'm Using Claude Code</title><link>https://hernan941.com/en/posts/estoy-usando-claude/</link><pubDate>Tue, 30 Jun 2026 11:00:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/estoy-usando-claude/</guid><description>&lt;p&gt;For the last two months I&amp;rsquo;ve used Claude Code every day, shipping features from the terminal with zero shame, writing code powered by tokens and learning quite a bit along the way. I had already used agents for development before, Copilot in particular, but this time I took it to a completely different level of intensity.&lt;/p&gt;&#10;&lt;p&gt;The task and the goal was to be more productive, to be able to reach targets in impossible timeframes. To use modern technologies at a competitive pace without losing quality along the way, and without ceasing to build solid, scalable solutions. Do more with less. High cohesion and low coupling.&lt;/p&gt;</description><content:encoded><![CDATA[<p>For the last two months I&rsquo;ve used Claude Code every day, shipping features from the terminal with zero shame, writing code powered by tokens and learning quite a bit along the way. I had already used agents for development before, Copilot in particular, but this time I took it to a completely different level of intensity.</p>
<p>The task and the goal was to be more productive, to be able to reach targets in impossible timeframes. To use modern technologies at a competitive pace without losing quality along the way, and without ceasing to build solid, scalable solutions. Do more with less. High cohesion and low coupling.</p>
<p>On top of that, for my part, there was the challenge of keeping the attitude of the craftsman, the blacksmith, even when industrial machinery is at hand. A task that turns into a paradox: how to see beyond what merely &ldquo;works&rdquo; thanks to sheer mass production and keep the passion for the craft. How to transfer this intrinsic concern for the work to a stochastic model.</p>
<p><img src="https://dojiw2m9tvv09.cloudfront.net/29535/product/img_90495118.jpg" alt="Illustration of the blacksmith"></p>
<h1 id="first-month">First month</h1>
<p>To resolve this paradox, in the first few weeks I had to learn in detail what I was dealing with. And maybe this is the best moment to get into the subject and tell you about Claude Code. A programming agent used through the terminal, which has access to different actions inside your computer.</p>
<p>At its core, &ldquo;Claudito&rdquo; works with the concept of context. Imagine a room with defined walls and square meters, where light comes in, along with the furniture, table and chairs, people and pets: like a finite space of information that gives meaning and limits to our reality. And this is important: you have to keep in mind the limitations and how many things fit in the room. The context must contain everything needed for the solutions Claude delivers to be valid and accurate. MCPs, for example (the tools or extended functions, for instance to simulate a browser or access Google Drive), take up a significant amount of space in your context, and can leave you without enough room to give the agent the key background of the problem, inevitably making it lose track of the solution.</p>
<p>I started using it with these concepts in mind, the way its own creators suggest. A sequence of explore - plan - code - commit, but as the weeks went by I felt I was repeating my own flows. So I looked for the other ways people were using this tool. And I
discovered the concept of the harness and how to customize it.</p>
<h1 id="second-month">Second month</h1>
<p>The harness comes by default, and although it isn&rsquo;t the most optimal for every problem or technology, it works. The agentic harness is defined as the set of tools, context management and execution environment that turns a language model into an agent.</p>
<p>In other words, it could be translated as the harness that holds a climber on the mountain. In climbing (unless it&rsquo;s free solo), you need gear. Otherwise, you have nothing to hold on to; you have no protection. The harness is the safety equipment that connects you to the mountain. It gives you the ability to act, to be there and to move forward. And what better than having your own tools and adjusting them day by day.</p>
<p><img src="https://images.unsplash.com/photo-1684055301990-08b447719a89?q=80&amp;w=900&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Climber on the mountain"></p>
<p>Without this, the solution takes a bit longer, or you find yourself telling it the same things over and over. So, from the second month on, I added dedicated skills and commands for the patterns and technologies I use, taking inspiration from a repository (ECC, winner of Anthropic&rsquo;s hackathon). All of this always implemented from a TDD (Test-Driven Development) perspective from day one. Tests here are vital, both to validate your code and to serve as a path for the models to understand it as the solution keeps growing. They are path and validation. Having the right patterns in every new plan secures my solution, but it isn&rsquo;t free: there is a context and token cost attached to every plan. Although, in my opinion, it&rsquo;s completely worth it.</p>
<p>And to make this harness work without running out of space, I leaned on persistent context, or memory. Since the session space is limited, per project you can have a CLAUDE.md file and various other .md files. These work as a usage guide; base instructions that Claude reads when starting inside a folder so it knows, beforehand, what the rules of your project are. The interplay between context and these files when working with Claudito also makes the difference.</p>
<h1 id="in-my-opinion">In my opinion</h1>
<p>With these techniques, Claude has become a snowball of productivity. It&rsquo;s what it promises: things that once took me weeks now take me a couple of minutes. Analyses that might take me months, Claude solves in one well-run session with the right questions. It&rsquo;s hard to look competitive in this industry without Claude as a copilot. Now, Claude doesn&rsquo;t get distracted and doesn&rsquo;t doubt. And it&rsquo;s at your command like an army of one. Army of one.</p>
<p>I know I can still apply techniques to reduce token spend, and even use that crazy learning skill where Claude recognizes my workflows. I dream of the day when you just talk to the computer and interact with a machine of peculiar personality; as of today, this is the closest thing to what I once imagined. And I also know how different Claude is working on existing code and its tendency to create rather than maintain. That its way of maintaining is adding and adding code. That it has strong preferences and that if you get careless you end up creating a swarm. Its swarm, one you don&rsquo;t understand. So my advice is to be careful and always keep understanding the moves toward the summit.</p>
<p>On the other hand, and with all that said, it&rsquo;s hard to keep seeing myself as the craftsman forging the rings of power, devoted to one single, specific and spectacular task. The day-to-day shifted more toward that of a strategist, drawing routes and plans, swapping weapon types and pulling the king&rsquo;s tokens as if it were war. Using the terminal and writing natural language to get what I want instead of flowing through logic gates.</p>
<table>
	<thead>
			<tr>
					<th style="text-align: center"><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSM2p9ATlvf-1LcnPTn4c3W2iOPLE0OXI204NL5I_06wQ&amp;s=10" alt="Visual closing of the article"></th>
			</tr>
	</thead>
	<tbody>
	</tbody>
</table>
]]></content:encoded></item><item><title>Rambling Between Django and FastAPI</title><link>https://hernan941.com/en/posts/divagando-sobre-frameworks/</link><pubDate>Thu, 04 Jun 2026 11:00:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/divagando-sobre-frameworks/</guid><description>&lt;p&gt;Django is one of the frameworks with the longest presence over time, while FastAPI is the framework with the fastest adoption. Choosing one over the other just because of that is absurd, so let&amp;rsquo;s understand the perspectives and features of both.&lt;/p&gt;&#10;&lt;h1 id="architecture-today"&gt;Architecture today&lt;/h1&gt;&#10;&lt;p&gt;For a while now, microservices seem to dominate everything, and with them, FastAPI in Python. The adoption of the cloud as infrastructure in almost every company points in that direction. However, the most obvious downside of this approach is managing and orchestrating those microservices; you have to be very careful with the dependencies between them so you don&amp;rsquo;t &amp;ldquo;cross the wires&amp;rdquo;. You need highly skilled people to keep these operations running.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Django is one of the frameworks with the longest presence over time, while FastAPI is the framework with the fastest adoption. Choosing one over the other just because of that is absurd, so let&rsquo;s understand the perspectives and features of both.</p>
<h1 id="architecture-today">Architecture today</h1>
<p>For a while now, microservices seem to dominate everything, and with them, FastAPI in Python. The adoption of the cloud as infrastructure in almost every company points in that direction. However, the most obvious downside of this approach is managing and orchestrating those microservices; you have to be very careful with the dependencies between them so you don&rsquo;t &ldquo;cross the wires&rdquo;. You need highly skilled people to keep these operations running.</p>
<p>That said, microservices have become the standard. Tools have emerged to make them easier to use, like containers, Kubernetes or Prometheus, and they offer a ton of advantages that can leave a technology like Django behind. It&rsquo;s slow, or at least on the surface, whereas FastAPI is fast, both when processing requests and when developing with it. It also includes typing almost &ldquo;for free&rdquo; (something Python really benefits from, like JavaScript needed it) and has an extremely robust dependency system.</p>
<p>On the other hand, Django has been around since 2005; it&rsquo;s almost as old as Facebook. It stays relevant thanks to a well-organized community that is passionate about web development. As a result, a large share of the usual problems of programming for the web are already thought through and solved. It comes with &ldquo;batteries included&rdquo;, a term that means a big part of your solution is ready from the start (authentication, admin panel, ORM, security, templates and routing). The problem is that its philosophy doesn&rsquo;t align as well with this microservices trend, since it comes from an era when the monolith shined: the application as a centralized whole, with a server-side orientation.</p>
<p>Still, Django has important downsides. It looks slow and, back in the day, there was no way to make asynchronous calls (something that would seem crazy today). In terms of scalability it can fall behind, even with its modular monolith structure and per-app deployment. Also, Django has a strict, opinionated way of working. It can be overkill for small projects. All of this leads us to its learning curve, which is steeper than that of its alternative.</p>
<p>With that said, I&rsquo;d like to dig deeper and analyze the different dimensions from the business perspective, which are what will ultimately lead us to decide between one tool or the other.</p>
<h1 id="time-to-market">Time To Market</h1>
<p>We need to be clear about the business priority when launching the MVP: What is the product about? Does it need to manage users, roles or some kind of common administration? Or, on the contrary, is the execution speed of each call in a specific service more important? These questions guide us. If the solution requires managing users, passwords, moderating content or having some kind of administrative support, with FastAPI you&rsquo;ll have to build all of this from scratch and timelines will increase significantly.</p>
<p>On the other hand, if you need to stay in sync with frontend or mobile teams, FastAPI will give you the smoothness. Its interactive documentation and how quickly you can prototype routes ready for the frontend team to consume speed things up incredibly.</p>
<p>It&rsquo;s also ideal for validating ideas and exploring markets with a very specific tech service. We&rsquo;re talking about something so concise that Django&rsquo;s robust infrastructure would only get in the way.</p>
<h1 id="budget-and-team">Budget and Team</h1>
<p>With no team and no budget, Django shines. With very little, we can do a lot. And if you add AI agents on top of that&hellip; in the same codebase and practically natively. A single developer can handle a big solution, moving from the database all the way to the visualization and the interface.</p>
<p>However, we have to remember: jack of all trades, master of none.</p>
<p>The story changes if you have a structured development department, with at least one team dedicated purely to the frontend, several developers and the resources to invest the time it takes to &ldquo;reinvent the wheel&rdquo; again. Although, let&rsquo;s be honest, it will be a much more specific and faster wheel. At the end of the day, if we&rsquo;re competing in Formula 1, I wouldn&rsquo;t recommend driving a pickup truck.</p>
<h1 id="product-vision">Product vision</h1>
<p>Are we building a heavy, centralized platform, or a product that will be part of an ecosystem of services? If the business value lies in convoluted rules and in managing structured data, Django is most likely the right direction. On the other hand, if the value lies in processing speed, concurrency and independence, maybe it isn&rsquo;t. You have to stop and think: how do I see this solution in 2 or 3 years? Things to keep in mind:</p>
<ul>
<li>Relational complexity</li>
<li>Centralization</li>
<li>Technical specialization</li>
<li>Interface independence</li>
</ul>
<h1 id="scalability">Scalability</h1>
<p>At first glance, this fight comes down to synchronous vs. asynchronous. FastAPI is async by default, and microservices grow much better than monoliths. However, in reality, giants like Instagram, Pinterest and Patreon started (and to a large extent still operate) with Django. Saying that Django can&rsquo;t handle large numbers of users is simply not true.</p>
<p>The real question is: does that massive traffic happen at exactly the same moment? If the challenge goes beyond just &ldquo;holding up&rdquo; under more users and centers on real-time interaction between them (like a live chat or a multiplayer game), FastAPI is the right call so the architecture doesn&rsquo;t wobble.</p>
<h1 id="agility">Agility</h1>
<p>In these terms, a few years ago Django was an undisputed star; it saved us a lot of time by letting us do more with less code. Today, with AI agents spitting out code like machines, this &ldquo;batteries included&rdquo; feature loses a bit of weight. Now we can achieve the same thing using smaller tools.</p>
<p>However, Django has evolved and found a new niche of value: standardization and keeping chaos under control.</p>
<p>A less experienced engineer is much more likely to end up with a chaotic, incomprehensible codebase using a tool like FastAPI than using Django, since the latter tells you step by step how to structure things. Many frameworks do this (like Ruby on Rails or NestJS): they put up &ldquo;guardrails&rdquo; so you don&rsquo;t go off the road. Writing code with AI means that today, more than ever, we have to care about maintainability and technical debt.</p>
<h1 id="kiss">KISS</h1>
<p>At the end of the day, to choose correctly we can narrow it down to knowing where we are, who we are and where we&rsquo;re headed.</p>
<p><img src="https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&amp;fit=crop&amp;w=1600&amp;q=80" alt="Reflective image"></p>
]]></content:encoded></item><item><title>Santiago, work and development</title><link>https://hernan941.com/en/posts/santiagotrabajo-y-desarrollo/</link><pubDate>Sun, 31 May 2026 11:00:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/santiagotrabajo-y-desarrollo/</guid><description>&lt;p&gt;I&amp;rsquo;ve been living in Santiago, the capital, for several weeks now, and it&amp;rsquo;s incredible how this whole country is concentrated in a single place. These days have been hectic: I found a job here doing what I was looking for, Python, AWS and, of course, data flying left and right. But a good part of the change has had nothing to do with work. I had to find a rental (&lt;em&gt;arriendo&lt;/em&gt;), going from a cozy cabin with its pellet stove to an apartment with air conditioning. I&amp;rsquo;m not complaining, but it&amp;rsquo;s not the same. It&amp;rsquo;s not for me, and it&amp;rsquo;s not for my cat either. We both look outside through the screen so we don&amp;rsquo;t fall.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I&rsquo;ve been living in Santiago, the capital, for several weeks now, and it&rsquo;s incredible how this whole country is concentrated in a single place. These days have been hectic: I found a job here doing what I was looking for, Python, AWS and, of course, data flying left and right. But a good part of the change has had nothing to do with work. I had to find a rental (<em>arriendo</em>), going from a cozy cabin with its pellet stove to an apartment with air conditioning. I&rsquo;m not complaining, but it&rsquo;s not the same. It&rsquo;s not for me, and it&rsquo;s not for my cat either. We both look outside through the screen so we don&rsquo;t fall.</p>
<p>So, here, with a fridge, a couple of pieces of furniture and some kitchen stuff, this adventure begins.</p>
<p>I have to take the metro every day. The number of people is incredible. Rush hour gets packed with long faces, shoving and bad moods. But I get it, distances are much greater, and so are prices. Centralization. At least I have everything next door. If I want to shop, I have two Lider supermarkets a couple of minutes away. Are two Lider necessary? The truth is both are packed after 6 in the evening. There are also several pharmacies, bookstores, cafés, café chains, specialty coffee shops, small ones, big ones, themed ones, bad ones, good ones&hellip; The point is there are a lot of coffee shops. On top of that, there are restaurants and bars, a Domino&rsquo;s that serves <em>completos</em> with the tomato on top, among many other stores of every kind with their own quirks, and there&rsquo;s still a lot left to explore.</p>
<p><img src="https://static.wikia.nocookie.net/simpsons/images/f/f1/Coffee_%26_Tea.jpg/revision/latest?cb=20100429202728" alt="Coffee and Tea"></p>
<h2 id="job-hunting-in-2026">Job hunting in 2026</h2>
<p>My job search was long. At one point I was torn between taking the full cloud path and going with AWS and its different specializations, since Python in the industry seemed like something forgotten or left to certain creatures hundreds of years old. But a hybrid worked: at its core it&rsquo;s the ability to work with constant streams of data. Ensuring systems stay up and having the speech ready when it comes to interviews. Another decision was between on-site and remote. There, reality showed me how remote jobs have been disappearing. That pandemic-era industry no longer exists, it has been slowly dying out.</p>
<p>Worse still, a lot of the people who built their lives around remote work have had to go back to the offices. Imagine: a life built around that, the house, the kids&rsquo; school, transportation. Your whole spending flow changes completely between one way of working and the other. Because it&rsquo;s obvious, a 20-minute trip is not the same as a 2-hour one. Having to take the metro or not. Having to share spaces or not. I think working on-site has its advantages, but I think a company that works remotely should keep betting on it.</p>
<h2 id="developing-as-i-go">Developing as I go</h2>
<p>This post has been more on the reflective side. I hope to give my more technical opinion on things soon. I&rsquo;d like to wrap up with an idea of what I think being a developer in 2026 is like. A lot to say, little to code. I think I spend more time talking to an agent and refining my instructions than defining patterns, classes or functions. More time paying down technical debt than leaving it behind. Understanding the domain and the business rules. Deciphering the intentions of other developers or PMs.</p>
<p>An industry that seems made for generalists, where anyone can program (wink, wink).</p>
<p><img src="https://pbs.twimg.com/media/G48cKzbXoAACdx7.jpg" alt="Image"></p>
<p>I spend most of my time translating logic between frontend, backend and infrastructure languages, and not deciding whether to use a frozenset or a tuple as a dictionary key. Specialized jobs probably still exist, I don&rsquo;t know about in Chile. Even less so with the arrival of AI agents, something I plan to write about in another post, since this mess is already starting to look like Frankenstein.</p>
]]></content:encoded></item><item><title>Docker 101: containers, kernel and layers</title><link>https://hernan941.com/en/posts/docker101/</link><pubDate>Tue, 31 Mar 2026 11:00:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/docker101/</guid><description>&lt;p&gt;If you&amp;rsquo;re in the software world, chances are you&amp;rsquo;ve used Docker. And if not, here&amp;rsquo;s a definition:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Docker is a platform for developing, packaging and running containers. Important word: containers, which are isolated environments that include everything your software needs to work. These containers are created from images, immutable and reusable templates defined through a Dockerfile. Thanks to this, the same image can be used in development, testing and production, becoming a consistent unit of work in a distributed world.&lt;/p&gt;&#10;&lt;p&gt;There are also other concepts that tend to be overlooked: volumes, which let you persist data, and networks, which connect containers to each other. All of this within an ecosystem like Docker Hub, which offers thousands of ready-to-use images.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description><content:encoded><![CDATA[<p>If you&rsquo;re in the software world, chances are you&rsquo;ve used Docker. And if not, here&rsquo;s a definition:</p>
<blockquote>
<p>Docker is a platform for developing, packaging and running containers. Important word: containers, which are isolated environments that include everything your software needs to work. These containers are created from images, immutable and reusable templates defined through a Dockerfile. Thanks to this, the same image can be used in development, testing and production, becoming a consistent unit of work in a distributed world.</p>
<p>There are also other concepts that tend to be overlooked: volumes, which let you persist data, and networks, which connect containers to each other. All of this within an ecosystem like Docker Hub, which offers thousands of ready-to-use images.</p>
</blockquote>
<p>I think knowing that, you could already start working and integrating containers into your workflow. But we don&rsquo;t stop here, let&rsquo;s go a little further.</p>
<p><img src="https://unsplash.com/photos/P6WRariZ-8M/download?force=true&amp;w=1600" alt="Whale tail emerging from the ocean"></p>
<h2 id="before-the-whales">Before the whales</h2>
<p>Before Docker there were virtual machines (VMs), which are, in essence, a complete emulation of a physical computer inside another one. Each VM acts as an independent machine, with its own virtual CPU, RAM and storage, which lets you run operating systems and applications in an isolated and secure way.</p>
<p>We could ask ourselves: why not keep using virtual machines? But there&rsquo;s an architectural drawback: the weight and volume of the box exceed those of its contents; that is, the system is wasting resources.</p>
<p>Each instance has to load and run a full operating system (Ubuntu, Debian, Windows or another), which takes a lot of resources. VM disk images usually take up gigabytes, and the boot process can take several minutes, even for simple applications. This creates overhead that affects both performance and system efficiency.</p>
<h2 id="using-the-kernel">Using the kernel</h2>
<p>Containers, unlike VMs, don&rsquo;t emulate a complete computer or require a separate operating system. Instead, they share the host operating system&rsquo;s kernel and isolate only the processes and resources needed to run an application. It&rsquo;s operating-system-level virtualization. This removes much of the overhead, allowing more efficient use of resources and near-instant deployment.</p>
<p>A good way to picture it is to imagine a VM as a detached house: it has its own foundations, pillars, electrical system and plumbing. Containers, on the other hand, are like apartments in a modern building. Each apartment shares the main structure, the electrical system and the plumbing. And yet each apartment has everything it needs to live comfortably and independently.</p>
<p><img src="https://unsplash.com/photos/XpyRouTu6NY/download?force=true&amp;w=1600" alt="Blue Building"></p>
<p>Thanks to this we get Docker&rsquo;s key values, particularly efficiency and resource optimization versus virtual machines:</p>
<ul>
<li>Portability: it works everywhere.</li>
<li>Efficiency and resource optimization: lots of containers.</li>
<li>Isolation and standardization: unit of work.</li>
</ul>
<h2 id="namespaces-and-cgroups">Namespaces and cgroups</h2>
<p>Containers work on top of the kernel in an isolated way through two mechanisms: namespaces and cgroups.</p>
<p>A namespace abstracts global system resources so that processes believe they have their own isolated instance. Changes made to a resource are visible only to the processes that belong to the same namespace, remaining invisible to the rest.</p>
<p>Currently, the Linux kernel has 8 types:</p>
<table>
	<thead>
			<tr>
					<th>Namespace</th>
					<th>Resource it isolates</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>cgroup</td>
					<td>Root directory of control groups (cgroup).</td>
			</tr>
			<tr>
					<td>IPC</td>
					<td>Inter-process communication (System V IPC, POSIX message queues).</td>
			</tr>
			<tr>
					<td>Network</td>
					<td>Network devices, protocol stacks, ports, etc.</td>
			</tr>
			<tr>
					<td>Mount</td>
					<td>Filesystem mount points.</td>
			</tr>
			<tr>
					<td>PID</td>
					<td>Process IDs (lets a process be PID 1).</td>
			</tr>
			<tr>
					<td>Time</td>
					<td>Boot and monotonic clocks.</td>
			</tr>
			<tr>
					<td>User</td>
					<td>User and group IDs (lets you be root inside the namespace).</td>
			</tr>
			<tr>
					<td>UTS</td>
					<td>Hostname and NIS domain name.</td>
			</tr>
	</tbody>
</table>
<p>If namespaces decide what you can see, cgroups decide how much you can use.</p>
<p>Cgroups let you allocate system resources (CPU, memory, network bandwidth or a combination) among user-defined groups of tasks (processes). And they go further, letting you monitor the consumption of the configured groups, restrict access to certain resources or set limits. They even let us adjust limits and priorities dynamically. With these mechanisms we achieve isolation.</p>
<h2 id="docker-operates-on-immutable-layers">Docker operates on immutable layers</h2>
<p>An immutable layer is a set of read-only files that records a specific state change in the image. Since they can&rsquo;t be altered, Docker reuses them across multiple containers without duplicating disk space, guaranteeing that the environment is always identical and predictable (determinism). Any later modification doesn&rsquo;t edit the base layer, but generates a new one on top of it, protecting the integrity of the original source.</p>
<p>Working across layers is possible thanks to the concept of UnionFS. This engine takes folders in different layers and &ldquo;merges&rdquo; them virtually so they look like a traditional filesystem. This way we get immutable layers working in harmony, making it possible to spin up disposable infrastructure that is completely replicable.</p>
<p><img src="/images/layers.webp" alt="Docker immutable layers"></p>
<h2 id="communication-and-networking">Communication and networking</h2>
<p>The network namespace is what isolates the network. Each container operates as if it had its own network card and its own IP. Based on this, to connect containers we need a &ldquo;switch&rdquo;, a bridge that allows interaction, as if it were a physical network, creating virtual cabling through a subnet.</p>
<p>But there&rsquo;s a problem: IPs are ephemeral and, so we don&rsquo;t have to configure IPs all the time, the internal DNS server steps in, intercepting the request and returning the current IP, or rather the service name. These 3 mechanisms let us keep communication fast, secure and reliable.</p>
<h2 id="docker-and-its-friends">Docker and its friends</h2>
<p>However, Docker is just the unit of work. In modern professional applications (like those using Django or FastAPI), we rarely work with a single container; we usually need a database, a backend, a worker and a frontend working together. This is where Docker Compose comes in as the orchestra conductor. With a single configuration file, you can define a complete infrastructure for a digital product.</p>
<p>Other technologies like Kubernetes or Docker Swarm let us orchestrate at a larger scale.</p>
<p>With that, I think that&rsquo;s enough whales for one day, maybe for a week, maybe for a good while. I hope it taught you something, and remember that all of these technologies draw heavily from others like operating systems, virtualization and networking&hellip; and remember: if you&rsquo;re out there working with Docker, don&rsquo;t forget to create your <code>.dockerignore</code>.</p>
<p><img src="https://unsplash.com/photos/WeUIHNHbs6o/download?force=true&amp;w=1920" alt="More whales"></p>
<hr>
<p><strong>Note:</strong></p>
<p>Docker Compose is great for development and testing, but in production you shouldn&rsquo;t put the database in a container. A database needs real persistence, high availability and good performance tuning. For production, it&rsquo;s safer to use managed services (AWS RDS, Cloud SQL) or dedicated VMs with backups, replicas and serious monitoring.</p>
<hr>
<h2 id="resources">Resources</h2>
<ul>
<li><a href="https://github.com/ivanmorenoj/how-containers-works">How containers works</a></li>
<li><a href="https://docs.docker.com/get-started/docker-concepts/building-images/understanding-image-layers/#additional-resources">Understanding image layers (Docker Docs)</a></li>
<li><a href="https://sehun.me/layers-of-docker-image101-bca5beead44">Layers of Docker image 101</a></li>
</ul>
]]></content:encoded></item><item><title>Transactions and Concurrency: what you should know</title><link>https://hernan941.com/en/posts/concurrencia/</link><pubDate>Mon, 23 Feb 2026 12:51:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/concurrencia/</guid><description>&lt;p&gt;There are concepts that make the difference between a junior and a senior software engineer. Concepts that would fill several books. Here I try to close that gap a little between what we know and how it all connects.&lt;/p&gt;&#10;&lt;p&gt;For the last few weeks I&amp;rsquo;ve been mulling over how operations and concurrency work. What guarantees that a critical operation won&amp;rsquo;t break the system?&lt;/p&gt;&#10;&lt;h2 id="transaction-fundamentals"&gt;Transaction Fundamentals&lt;/h2&gt;&#10;&lt;p&gt;Nothing. There is no configuration that&amp;rsquo;s right for every case. What does exist is understanding how transaction states behave when they work together. A transaction is a consistency contract. When we don&amp;rsquo;t understand what happens at the levels below, we leave the system&amp;rsquo;s integrity to chance.&lt;/p&gt;</description><content:encoded><![CDATA[<p>There are concepts that make the difference between a junior and a senior software engineer. Concepts that would fill several books. Here I try to close that gap a little between what we know and how it all connects.</p>
<p>For the last few weeks I&rsquo;ve been mulling over how operations and concurrency work. What guarantees that a critical operation won&rsquo;t break the system?</p>
<h2 id="transaction-fundamentals">Transaction Fundamentals</h2>
<p>Nothing. There is no configuration that&rsquo;s right for every case. What does exist is understanding how transaction states behave when they work together. A transaction is a consistency contract. When we don&rsquo;t understand what happens at the levels below, we leave the system&rsquo;s integrity to chance.</p>
<p>This becomes obvious when we have to work on financial services, cryptocurrencies, inventory management, reservations or distributed systems.</p>
<h2 id="acid-transactions">ACID Transactions</h2>
<p>When databases started being used in critical systems, failures left data in inconsistent states, causing costly errors. In the 80s, Jim Gray and other researchers defined the ACID properties: Atomicity, Consistency, Isolation and Durability. Four rules that guarantee that, even in the face of failures, data stays correct.</p>
<h4 id="atomicity">Atomicity</h4>
<p>It&rsquo;s the &ldquo;all or nothing&rdquo; idea. A transaction can have 10 steps, but if step 9 fails, the other 8 are undone as if they had never existed. This is achieved through logs (Write-Ahead Logging).  The database writes down what it&rsquo;s going to do before touching the actual data. If there&rsquo;s an error, it uses that log to apply a Rollback and return to the initial state.</p>
<h4 id="consistency">Consistency</h4>
<p>It guarantees that a transaction only takes the database from one valid state to another. The core of this property is enforcing business rules. The tools involved are Triggers, Foreign Keys, Check Constraints and data types. For example. If you try to set a negative volume and there&rsquo;s a rule forbidding it, the transaction bounces.</p>
<h4 id="isolation">Isolation</h4>
<p>This is where things get interesting. When several transactions try to access and modify the same resource at the same time, they can&rsquo;t simply run in parallel without coordination. If they did, we&rsquo;d end up with inconsistent states. That&rsquo;s why a transaction has to wait its turn while another one finishes its operation on that same data.</p>
<p>Concurrency happens when the execution of two or more pieces of code behaves as if they were running at the same time.</p>
<p>To deal with concurrency, coordination is achieved with mutual exclusion primitives. At a low level we&rsquo;re talking about mutexes: mechanisms that guarantee that only one thread or process accesses a critical resource at a time (<a href="https://www.youtube.com/watch?v=1tZhmTnk-vc">if you want to know more</a>). In databases, the concept translates into locks, which apply that exclusion on rows, pages or tables. It&rsquo;s not optional cooperation; the engine enforces these rules to protect integrity.</p>
<table>
	<thead>
			<tr>
					<th>Locking Type</th>
					<th>Description</th>
					<th>Characteristics</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Pessimistic Locking 🙁</td>
					<td>&ldquo;I put a lock on the data until I&rsquo;m done&rdquo;</td>
					<td>Nobody else touches anything. It&rsquo;s safe but slow.</td>
			</tr>
			<tr>
					<td>Optimistic Locking 🙂</td>
					<td>&ldquo;I don&rsquo;t lock, I assume nobody else will touch it&rdquo;</td>
					<td>At the end, I check whether someone changed something. If someone did, I abort and retry. It&rsquo;s much faster for high-traffic systems.</td>
			</tr>
	</tbody>
</table>
<p>Now then, when and how are these locks applied? That&rsquo;s where <strong>isolation levels</strong> come in: settings that define how strict the database will be when applying locks between concurrent transactions. Each level makes different trade-offs between consistency and performance:</p>
<table>
	<thead>
			<tr>
					<th>Level</th>
					<th>Description</th>
					<th>Characteristics</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Read Uncommitted</td>
					<td>The &ldquo;Wild West&rdquo;</td>
					<td>A transaction can see changes from another one that haven&rsquo;t been committed yet. Risk: Dirty reads.</td>
			</tr>
			<tr>
					<td>Read Committed</td>
					<td>PostgreSQL&rsquo;s default</td>
					<td>You can only read data that has already been committed (Committed).</td>
			</tr>
			<tr>
					<td>Repeatable Read</td>
					<td>Prevents non-repeatable reads</td>
					<td>Guarantees that if you read a record twice in the same transaction, you&rsquo;ll see the same thing, even if someone else modified it in between.</td>
			</tr>
			<tr>
					<td>Serializable</td>
					<td>Maximum safety level</td>
					<td>Transactions run as if they were standing in a single-file line, one after another, even though they happen in parallel. It&rsquo;s the safest but the slowest.</td>
			</tr>
	</tbody>
</table>
<h4 id="durability">Durability</h4>
<p>It&rsquo;s the promise that, once the system tells you &ldquo;OK, saved&rdquo;, that information won&rsquo;t be lost even if the power goes out or the server blows up right afterwards.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/en/thumb/1/11/Disaster_Girl.jpg/250px-Disaster_Girl.jpg" alt="Disaster Girl"></p>
<p>Changes are written to non-volatile storage (hard drive/SSD) and confirmed in the transaction log. Even after a catastrophic failure, on restart the database reads the log and finishes applying whatever was left pending.</p>
<h2 id="beyond-acid">Beyond ACID</h2>
<p>Nowadays, these concepts are the foundation of relational databases. However, understanding this is just the first step. When you make the jump to modern architectures with microservices and NoSQL databases, the engine can no longer guarantee ACID across the whole system, because your data now lives on separate servers and the rules of the game change.</p>
<p>When distributing information, ACID&rsquo;s rigidity is often traded for a more flexible approach that prioritizes the system never going down. We call this new paradigm BASE:</p>
<table>
	<thead>
			<tr>
					<th>BASE Property</th>
					<th>Description</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>B</strong>asically Available</td>
					<td>The system guarantees it will always respond to requests, even if some nodes or servers fail.</td>
			</tr>
			<tr>
					<td><strong>S</strong>oft state</td>
					<td>Since data is being synchronized between servers, the system&rsquo;s state can change over time, even if there are no new write operations.</td>
			</tr>
			<tr>
					<td><strong>E</strong>ventual consistency</td>
					<td>The promise that, if we stop sending changes and wait long enough, all servers will eventually have the same version of the data.</td>
			</tr>
	</tbody>
</table>
<p>Going from ACID to BASE means accepting that your system will live with some temporary inconsistency in exchange for being incredibly fast and resilient to massive outages. At this point data integrity stops coming from the engine&rsquo;s configuration and becomes design patterns you have to implement in code (like the Saga pattern or Two-Phase Commit) to tie up the loose ends.</p>
<p>But that&hellip; is a story for another post.</p>
]]></content:encoded></item><item><title>Motivation and the Lack of It</title><link>https://hernan941.com/en/posts/motivacion/</link><pubDate>Mon, 19 Jan 2026 00:51:00 -0300</pubDate><author>hrwgallardo@gmail.com (Hernán)</author><guid>https://hernan941.com/en/posts/motivacion/</guid><description>&lt;p&gt;Software engineering is a hard discipline that requires investing hundreds, if not thousands, of hours to become competent. Those hours are paid for with incredible mental fatigue and related physical problems, like repetitive strain injuries or the plain wear and tear of working at a desk. They say sitting is the smoking of the 21st century. For that very reason, it&amp;rsquo;s vital to have a clear vision that sustains enthusiasm and gives meaning to the effort.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Software engineering is a hard discipline that requires investing hundreds, if not thousands, of hours to become competent. Those hours are paid for with incredible mental fatigue and related physical problems, like repetitive strain injuries or the plain wear and tear of working at a desk. They say sitting is the smoking of the 21st century. For that very reason, it&rsquo;s vital to have a clear vision that sustains enthusiasm and gives meaning to the effort.</p>
<p>When I started, I was driven by an interest in video games, an affinity for math and the discovery of the magic that programming makes possible; financial security was also an incentive. At university, chasing the same goal alongside my classmates helped me keep going despite how exhausting the road was.</p>
<p>But passion naturally fades. Time doesn&rsquo;t forgive, and our brain gets used to stimuli, reducing the emotional response and the joy we get from tasks that used to produce dopamine spikes. Stagnation also shows up: as our skills grow without the complexity growing, we fall into a technical boredom where work no longer demands the cognitive effort that used to be rewarding.</p>
<p>Facing software development without enjoying it isn&rsquo;t just tedious, it&rsquo;s a trap. Spending hours in front of the screen without a single line of code sparking any enthusiasm is a problem of work philosophy. Programming without those little shots of dopamine is simply unsustainable. We usually talk about requirements and quality attributes for our systems, but we forget that our own process has to be maintainable.</p>
<p>This career is a long haul. If moving forward is hard for you today, tomorrow it will be impossible; so look after your motivation with the same rigor you look after your code, and treat your passion with the same determination you use to try to master your favorite language.</p>
<h2 id="the-blacksmith-mindset">The Blacksmith Mindset</h2>
<p>To find motivation again, I had to resist the idea that it&rsquo;s enough for things to simply &ldquo;work&rdquo;. Although my experience lets me be efficient, there&rsquo;s a gap between the functional and the &ldquo;perfect&rdquo;, understood not as an unreachable goal, but as the willingness to look beyond the obvious solution: separating the patterns that make up the structure and exploring alternatives until I&rsquo;m sure the path I chose is the right one. There&rsquo;s a deep joy in this technical mastery; being an expert is also fun.</p>
<p>However, this craftsman&rsquo;s view clashes with the fast-paced world we operate in. We live in a society (insert Joker image here) hungry for speed and results, full of deadlines, story points and product managers. We ourselves want to see those results fast and without frustration, but learning comes with frustration. To reach excellence, there must be room for introspection, concentration and analysis. We have to look for alternatives and embrace the frustration of learning, accepting that to be good at something I first have to be bad at it. Making mistakes isn&rsquo;t avoidable, it&rsquo;s part of experimenting, and we shouldn&rsquo;t treat that time as wasted time.</p>
<p>That pressure for speed is what breaks the bond with our work. When nothing belongs to us and our work becomes something foreign, a disconnection appears that directly affects our mental health: that&rsquo;s where excessive workloads, difficulty setting boundaries and the importance of learning to say no come in. There are many ways to lose the joy in what we do, which is why we can&rsquo;t leave our motivation to chance.</p>
<p>Adopting a craftsman&rsquo;s mindset is claiming a purpose of your own. When the environment doesn&rsquo;t offer us a clear sense of meaning, our task is to find satisfaction in the doing itself, rediscovering that the value lies not only in the result, but in the quality of our attention. To dig deeper into this concept, I recommend reading authors who explore &ldquo;deep work&rdquo;, like Cal Newport in <em>Deep Work</em>, who argues that regaining our ability to concentrate is the ultimate act of resistance in this era.</p>
<p>In the end, reconciling the efficiency the market demands with the excellence we seek is the only way to make this career sustainable. It&rsquo;s not just about writing code, but about how we inhabit the hours in front of the screen.</p>
]]></content:encoded></item></channel></rss>