<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gaston Herrlein</title>
    <description>The latest articles on DEV Community by Gaston Herrlein (@gaston_herrlein_3baa4d62e).</description>
    <link>https://dev.to/gaston_herrlein_3baa4d62e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3518317%2F7906960c-0f2f-4505-b6c9-824bb62e9a26.jpg</url>
      <title>DEV Community: Gaston Herrlein</title>
      <link>https://dev.to/gaston_herrlein_3baa4d62e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaston_herrlein_3baa4d62e"/>
    <language>en</language>
    <item>
      <title>I chose the wrong architecture… on purpose</title>
      <dc:creator>Gaston Herrlein</dc:creator>
      <pubDate>Fri, 27 Mar 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/gaston_herrlein_3baa4d62e/i-chose-the-wrong-architecture-on-purpose-3pk5</link>
      <guid>https://dev.to/gaston_herrlein_3baa4d62e/i-chose-the-wrong-architecture-on-purpose-3pk5</guid>
      <description>&lt;p&gt;It was 2014. Paraná, Argentina. A free period at school, the World Cup just around the corner, and a group of friends who — with not much else to do — started talking about football.&lt;/p&gt;

&lt;p&gt;At some point someone threw out the idea: what if we compete to see who actually knows more? The rules were simple. Everyone made their predictions before each match — exact score, winner, points. Three points if you nailed the exact result. One if you only got the winner right. Zero if you missed entirely.&lt;/p&gt;

&lt;p&gt;What wasn't simple was what it created. Suddenly you found yourself watching matches you normally wouldn't care about — but now they mattered, because your prediction depended on them. There were laughs, arguments, jokes, small symbolic bets. And that hard-to-describe feeling of desperately wanting the game to end exactly the way you'd predicted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We repeated it across Copa Américas, Euros, and other tournaments. Each time, the game was the same. And each time, it was worth it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But years pass. Life changes. I ended up living on a different continent, far from many of those friends. And even though technology keeps us connected, it's not that easy to recreate that spontaneous dynamic we had when we were all together at school.&lt;/p&gt;

&lt;p&gt;That was the starting point for this project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldtivcl8uys937ahfojp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldtivcl8uys937ahfojp.png" alt="Broken memories and future decisions" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  A simple project… with a complicated decision
&lt;/h4&gt;

&lt;p&gt;The idea was clear: build a small app that would let us play again. A place where everyone could submit their predictions, check the results, and follow an updated leaderboard.&lt;/p&gt;

&lt;p&gt;Functionally, it's not complex. Any developer with some experience could build this in a weekend — a monolith, a database, done. That's the sensible choice. No question.&lt;/p&gt;

&lt;p&gt;I didn't do that.&lt;/p&gt;

&lt;p&gt;I decided to build it using a microservices architecture. Not because the project needed it. But because I did.&lt;/p&gt;




&lt;h4&gt;
  
  
  The gap between knowing and understanding
&lt;/h4&gt;

&lt;p&gt;There's a reality many developers will recognize: there are technologies and architectures we hear about constantly — in articles, talks, conferences — but that we rarely get the chance to practice in any real depth.&lt;/p&gt;

&lt;p&gt;Microservices are one of those cases. There's no shortage of content about them. Their advantages, their drawbacks, when to use them, when to avoid them. But there's an enormous gap between understanding a concept in theory and actually facing the real problems that surface when you implement it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Reading about distributed systems is not the same as building one. Even a small one.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I made a conscious decision to use this project as a learning lab. I knew exactly what I was doing: adding unnecessary complexity for an MVP, taking longer than I should, and exposing myself to problems that simply wouldn't exist in a monolith.&lt;/p&gt;

&lt;p&gt;That's precisely why I did it.&lt;/p&gt;




&lt;h4&gt;
  
  
  What this kind of architecture forces you to think about
&lt;/h4&gt;

&lt;p&gt;Designing the system this way wasn't just a theoretical exercise. Every architectural decision came with concrete questions I had to work through:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h5&gt;
  
  
  Real problems that came up
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;How do you separate responsibilities without services becoming tightly coupled?&lt;/li&gt;
&lt;li&gt;How do you handle communication between services without creating a tangle of synchronous calls?&lt;/li&gt;
&lt;li&gt;What happens when one service fails and others depend on it?&lt;/li&gt;
&lt;li&gt;How do you deploy parts of the system independently without breaking everything else?&lt;/li&gt;
&lt;li&gt;How do you reliably integrate an external sports results API across service boundaries?&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each of those problems is a piece of the puzzle that distributed systems really are. And even though my project is small, confronting those challenges gave me a much deeper understanding of how these architectures actually work in practice.&lt;/p&gt;

&lt;p&gt;It wasn't the easiest path. But it was the most interesting one.&lt;/p&gt;




&lt;h4&gt;
  
  
  Where this is going
&lt;/h4&gt;

&lt;p&gt;The project is close to its first working version. The goal is to have it ready before the next World Cup — using some league matches as a test run — so we can do what we used to do years ago: compete against each other, laugh at the predictions that aged poorly, and celebrate when someone calls an unlikely result.&lt;/p&gt;

&lt;p&gt;In the next articles I'll dig into the concrete technical decisions: which services I defined, how they communicate, which tools I chose and why. But this first piece was necessary to set up something that technical blogs often skip: the personal why behind a technical decision.&lt;/p&gt;




&lt;h4&gt;
  
  
  A thought for anyone considering something similar
&lt;/h4&gt;

&lt;p&gt;In software development, there's a lot of talk about avoiding overengineering. And in most cases, that advice is right — especially in professional contexts where time and resources matter.&lt;/p&gt;

&lt;p&gt;But side projects have a huge advantage: they don't always have to optimize for speed of delivery or efficiency. Sometimes they can optimize for something more important: learning.&lt;/p&gt;

&lt;p&gt;Building something that forces you out of your comfort zone, exploring technologies you don't get to touch in your day job, and wrestling with problems you don't yet know how to solve — that has a kind of value that no tutorial can give you.&lt;/p&gt;

&lt;p&gt;And if that project is also connected to something personal — memories, friends, something that matters to you beyond the code — then the process becomes even more meaningful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;"Sometimes the best reason to build something isn't that it's the most efficient solution. It's that, in the process of building it, you'll learn something you couldn't have learned any other way."&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>learning</category>
      <category>sideprojects</category>
      <category>microservices</category>
    </item>
    <item>
      <title>TypeScript for CLIs: why so many teams choose it (and why it's not what you think)</title>
      <dc:creator>Gaston Herrlein</dc:creator>
      <pubDate>Mon, 23 Mar 2026 14:15:00 +0000</pubDate>
      <link>https://dev.to/gaston_herrlein_3baa4d62e/typescript-for-clis-why-so-many-teams-choose-it-and-why-its-not-what-you-think-pml</link>
      <guid>https://dev.to/gaston_herrlein_3baa4d62e/typescript-for-clis-why-so-many-teams-choose-it-and-why-its-not-what-you-think-pml</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ue7357f8krjhcw8zfgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ue7357f8krjhcw8zfgk.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When Microsoft shipped the Azure CLI, or when Google chose TypeScript for Gemini CLI, the inevitable question surfaced in every forum: why TypeScript? Isn't it slow? The question itself reveals a misunderstanding worth unpacking fully.&lt;/p&gt;

&lt;p&gt;TypeScript isn't chosen for CLIs because of its performance. It's chosen in spite of its performance not being best-in-class. And paradoxically, that's exactly what makes it the right call for many teams.&lt;/p&gt;




&lt;h4&gt;
  
  
  🏎️ The performance myth
&lt;/h4&gt;

&lt;p&gt;Let's start with the most important point: TypeScript doesn't run. The code you write gets transpiled to plain JavaScript, which then executes on a runtime like Node.js (V8), Deno, or Bun. The end result at runtime is practically identical to writing JavaScript by hand.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the goal were raw performance, the debate would be between Go, Rust, &amp;gt; and C++. TypeScript wouldn't even be in the conversation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And yet, it is in the conversation. Constantly. Because performance is rarely the real bottleneck in a client tool. What actually is: the time it takes a team to build it, maintain it, and evolve it over years.&lt;/p&gt;

&lt;h4&gt;
  
  
  📈 The real argument: sustained productivity
&lt;/h4&gt;

&lt;p&gt;TypeScript introduces static typing without giving up JavaScript's dynamism. For a CLI of any real complexity — with subcommands, flags, plugins, and external API calls — that translates into something very concrete: the compiler catches bugs before the user does.&lt;/p&gt;

&lt;p&gt;Autocomplete actually works. Refactors don't turn into archaeological expeditions. Contracts between modules are written in the code itself, not in a Confluence doc nobody updates. As the project grows, that difference compounds.&lt;/p&gt;




&lt;h4&gt;
  
  
  The ecosystem as a competitive advantage
&lt;/h4&gt;

&lt;p&gt;Perhaps the most underrated argument is the ecosystem. Node.js has been the backbone of the web for decades, and that has a very valuable side effect for people building CLI clients:&lt;/p&gt;

&lt;p&gt;Everything you need already exists, is actively maintained, and works on Windows, Linux, and macOS without touching a single compiler flag. Libraries like commander, inquirer, chalk, or execa aren't experiments — they're battle-tested dependencies used across thousands of real projects.&lt;/p&gt;

&lt;p&gt;Add to that the portability of distribution — a single npm install, or a standalone binary packaged with bun build or pkg — and you have an argument that's hard to dismiss when the goal is getting a client in front of users with as little friction as possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  The team factor
&lt;/h4&gt;

&lt;p&gt;There's one element benchmarks don't capture: the human cost. On a team where frontend and backend coexist, TypeScript allows sharing data models, validations, and HTTP clients between the web app and the CLI. Onboarding a new developer who already knows JS/TS takes hours, not weeks.&lt;/p&gt;

&lt;p&gt;Companies like Microsoft or Google don't choose TypeScript because it's the most performant language available. They choose it because it shrinks the distance between an idea and a working client — and because that client can keep growing without breaking.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h5&gt;
  
  
  The verdict: why TypeScript wins (and why it doesn't)
&lt;/h5&gt;

&lt;p&gt;🔴 Not for runtime performance&lt;br&gt;
🟢 Yes, for productivity and developer experience (DX)&lt;br&gt;
🟢 Yes, for a mature ecosystem and instant portability&lt;br&gt;
🟢 Yes, for long-term maintainability&lt;br&gt;
🟢 Yes, for reducing team cost and iteration speed&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  🛑 So when should you not use TypeScript?
&lt;/h4&gt;

&lt;p&gt;TypeScript isn't universal. It occupies a very specific sweet spot, and knowing when to leave it is just as important as knowing when to lean in.&lt;/p&gt;

&lt;p&gt;Every language choice should start by honestly answering six questions before committing to anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ecosystem:
&lt;strong&gt;Are there mature libraries for what you need?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Portability:
&lt;strong&gt;Does it work smoothly on Windows, Linux, and macOS?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Performance:
&lt;strong&gt;Do you need maximum speed or minimal resource usage?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Distribution:
&lt;strong&gt;Standalone binary, script, or npm/pip package?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Team:
&lt;strong&gt;What languages do your developers actually know well?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Evolution:
&lt;strong&gt;Will this client grow significantly in complexity over time?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A language map: who wins in each scenario
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;When to use it&lt;/th&gt;
&lt;th&gt;Why not always&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interactive CLIs, evolving APIs, JS/TS teams, cross-platform distribution&lt;/td&gt;
&lt;td&gt;Requires a runtime; not optimal for heavy computation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Go&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standalone binaries, infrastructure tooling, fast and simple CLIs&lt;/td&gt;
&lt;td&gt;Rich interactivity takes more effort; more fragmented ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Performance-critical tools, intensive processing, memory safety requirements&lt;/td&gt;
&lt;td&gt;Steep learning curve, slower development, costly builds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prototypes, automation scripts, AI/data integration&lt;/td&gt;
&lt;td&gt;Distribution is painful, complex dependencies, runtime on the user's machine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h4&gt;
  
  
  🚀 A quick decision guide
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — Interactive cross-platform CLI with external APIs and a JS/TS team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt; — Dependency-free binary anyone can run without installing anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust&lt;/strong&gt; — Maximum performance or memory safety; development cost is acceptable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — Quick prototype or internal tool where distribution doesn't matter.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;h5&gt;
  
  
  "TypeScript isn't the best language for running code. It's one of the best for keeping software alive for years."
&lt;/h5&gt;
&lt;/blockquote&gt;

</description>
      <category>typescript</category>
      <category>cli</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
