<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rants on cache cascade</title><link>https://blog.taigrr.com/categories/rants/</link><description>Recent content in Rants on cache cascade</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>tai@taigrr.com (Tai Groot)</managingEditor><webMaster>tai@taigrr.com (Tai Groot)</webMaster><lastBuildDate>Wed, 11 Jun 2025 22:31:25 +0600</lastBuildDate><atom:link href="https://blog.taigrr.com/categories/rants/index.xml" rel="self" type="application/rss+xml"/><item><title>Why I Chose Go for grlx Instead of Rust</title><link>https://blog.taigrr.com/blog/why-i-chose-golang-for-grlx/</link><pubDate>Wed, 11 Jun 2025 22:31:25 +0600</pubDate><author>tai@taigrr.com (Tai Groot)</author><guid>https://blog.taigrr.com/blog/why-i-chose-golang-for-grlx/</guid><description>&lt;h2 id="why-not-rust"&gt;Why Not Rust?&lt;/h2&gt;
&lt;p&gt;There’s been a lot of debate lately about language choices, especially after Microsoft announced that the new TypeScript compiler is being
&lt;a
href="https://devblogs.microsoft.com/typescript/typescript-native-port/"
target="_blank"
&gt;rewritten from TypeScript to Go&lt;/a
&gt;.
This sparked a fresh round of questions on social media: why Go, and why not Rust?
It&amp;rsquo;s a fair question, and one that applies to &lt;a class="grlx"&gt;&lt;/a&gt; grlx as well.
The answer, in both cases, is rooted in pragmatism.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve written extensively in the past on
&lt;a
href="https://blog.taigrr.com/blog/introducing-grlx/#low-overhead"
target="_blank"
&gt;why I chose Go over Python&lt;/a
&gt;, but many of those arguments for Go over Python also apply to Rust over Python!
Between Go and Rust, Go continues to be the language of choice for teams that prioritize development speed, ecosystem maturity, and operational simplicity.
Let&amp;rsquo;s take a look at why.&lt;/p&gt;
&lt;h2 id="familiarity-and-developer-productivity"&gt;Familiarity and Developer Productivity&lt;/h2&gt;
&lt;p&gt;Let’s be honest: I’m a Go developer by trade.
That familiarity translates directly into productivity.
When building &lt;a class="grlx"&gt;&lt;/a&gt; grlx, being able to quickly write, test, and maintain code is more important than chasing theoretical speed or memory guarantees.
My experience with Go allows me to implement features quickly and pivot when needed.
I’ve written production Rust, and I respect it, but Go is where I’m fastest.&lt;/p&gt;
&lt;h2 id="performance-in-practice"&gt;Performance in Practice&lt;/h2&gt;
&lt;p&gt;Rust shines when you need tight control over memory and raw performance.
But, &lt;a class="grlx"&gt;&lt;/a&gt; grlx isn’t compute-bound.
It shells out to system commands, modifies configuration files, and reacts to asynchronous events.
The bottlenecks are I/O and process orchestration, not CPU or memory allocation.
While Rust’s performance profile is technically superior, those benefits wouldn’t be realized in a tool like &lt;a class="grlx"&gt;&lt;/a&gt; grlx.
In practice, Go’s performance is more than sufficient.&lt;/p&gt;
&lt;h2 id="type-systems-and-safety-guarantees"&gt;Type Systems and Safety Guarantees&lt;/h2&gt;
&lt;p&gt;Rust’s type system is more advanced.
That’s a fact.
But for &lt;a class="grlx"&gt;&lt;/a&gt; grlx, it’s not a clear win.
Much of &lt;a class="grlx"&gt;&lt;/a&gt; grlx’s core functionality involves invoking and managing external processes, tasks that don’t gain much from advanced type guarantees.
In many cases, to maintain portability across distributions, the safest way to perform a task is to shell out and handle the output explicitly.
Trying to enforce strict safety via Rust’s type system often leads to awkward wrappers and, ironically, more &lt;code&gt;unsafe&lt;/code&gt; code.
If you’re already bypassing the compiler’s guarantees, the rest of the system doesn’t benefit much from theoretical safety.&lt;/p&gt;
&lt;h2 id="iteration-and-flexibility"&gt;Iteration and Flexibility&lt;/h2&gt;
&lt;p&gt;The &lt;a class="grlx"&gt;&lt;/a&gt; grlx project is still actively evolving.
In this phase, fast iteration is key.
Go’s lightweight syntax and forgiving compiler make it easy to prototype, refactor, and shift architectural decisions as the product matures.
Rust’s compiler enforces rigor early on, which can be helpful in large, stable systems—but it often gets in the way during the creative stage.
Go lets me move faster.&lt;/p&gt;
&lt;h2 id="ecosystem-and-tooling"&gt;Ecosystem and Tooling&lt;/h2&gt;
&lt;p&gt;Go’s ecosystem is mature and focused, especially in the realm of system tooling.
From HTTP servers to CLI libraries, the tools I need already exist and are well-maintained.
For missing pieces, writing custom packages is straightforward.
I’ve built wrappers for systemd, SysV Init, and OpenRC support.
In Go, this feels natural.
Rust’s ecosystem for system-level orchestration is improving but still lags behind in simplicity and breadth.&lt;/p&gt;
&lt;h2 id="readability-and-auditing"&gt;Readability and Auditing&lt;/h2&gt;
&lt;p&gt;The &lt;a class="grlx"&gt;&lt;/a&gt; grlx sprout runs with root permissions, so transparency is critical.
Go’s straightforward syntax and lack of metaprogramming make it easy to understand and audit.
Other developers, ops engineers, and security reviewers can all look at the code and follow what’s going on.
Rust, while expressive, often introduces cognitive overhead via macros, lifetimes, and traits.
This makes security reviews more complex.
With Go, what you see is what you get.&lt;/p&gt;
&lt;h2 id="security-via-simplicity"&gt;Security via Simplicity&lt;/h2&gt;
&lt;p&gt;Using Go’s standard library reduces reliance on external dependencies.
That matters. Every third-party package increases the surface area for supply chain attacks.
With Rust, even basic functionality often comes from external crates, which need to be audited, version-locked, and maintained.
Go includes batteries for most common tasks, making it easier to write secure, auditable, and maintainable code from day one.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Rust is an excellent language, and I wouldn’t hesitate to use it in the right context.
But &lt;a class="grlx"&gt;&lt;/a&gt; grlx isn’t a performance-critical game engine or a systems kernel.
It’s a fleet orchestration tool.
For that purpose, Go’s fast iteration cycle, strong ecosystem, simple deployment model, and security-minded standard library make it the better choice.
This isn’t about hype or language tribalism.
It’s about building the right tool with the right technology—and for &lt;a class="grlx"&gt;&lt;/a&gt; grlx, Go is it.&lt;/p&gt;
&lt;p&gt;If you want to learn more about the tradeoffs between Go and Rust (or TypeScript!), you can
&lt;a
href="https://www.linkedin.com/learning-login/share?forceAccount=false&amp;amp;redirect=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fchoosing-the-right-back-end-language-typescript-go-or-rust-for-your-greenfield-project%3Ftrk%3Dshare_ent_url%26shareId%3Dv1G%252FaMi3Tu2HoryF4ksy4w%253D%253D"
target="_blank"
&gt;check out my course on LinkedIn Learning.&lt;/a
&gt;
It&amp;rsquo;s free!&lt;/p&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.25%"&gt;&lt;iframe width="640" height="360" src="https://www.linkedin.com/learning/embed/choosing-the-right-back-end-language-typescript-go-or-rust-for-your-greenfield-project/comparing-golang-vs-rust?autoplay=false&amp;claim=AQFAxHGKdxIkJwAAAZdiEHxZA8FZjmZhZc1zT0VNKAGJTYtHmMPJm5olWIqlMvXhR4AUmBrkQKtvhA_D2g0JKs99qJHrAGOgcBHiyKbcaObE7HuRTL3M2PL5ld-A1nVBxRW-6BjfvO3Gze8yPx-uX_0p0Wrmv6ckzL5SOH0KvJZfV7Wn1qna1lyF5Ad6c9oXFA2Lytp8agYzfq8OHNGNK-4uR0ueJchGTjP2N2cWXXbLmS9RqCuTfRoz6UVwOH1sD3Yv9V5UtXmT1mPQahmN7D0slIcZMeeElesXHRiRRoz6BcQIh2fCMEsCWD62EtYpxt-Ul2ukLrdjdLlHu-KYcP9Aa6EdLFNZ5cmCTvGDR0Ovk1nDO7imrBntvYzBgxZjdxAjxfFyfd0W9jy4O0nwd49eGmGeC1uMAw4qUyqr-cm4o-dF0pTxGEbwopvBL0IpcwqyJwrSBOZGvl162D9StJWVUt9i8E2elxm9-S4tbzxqm8vvXy62wTXzwhTNujGWc3DfTRc1kcQzYDzZ3h3PYGPkJg7BdyiSKW83cHK4V54lqQE_ahF7fN_t3l2hiVA09i_EGy6a-QrOwUrwk8RqtqkQyu1CoCE3ALXJT25VMYH1JqbJowcm16a1x0jUhDQfguQ9zo9t9LcFJzvkbnxcflvseXqWDnEReENQYZ9OF7aUKPYfmdi6pYR9O74aLCnHd0Ac6a2nyFvSGrDTBhAyyhvgpxRqQwjUszOczguGGMD9p1QnrkfnoDktDZuSpA4faWRoS8b8Niv_SmuSbEJFVepNnkb9axDua7q_XMlqjamfYuSg56Ivg6XswXdKesObBzYsRp2ptkKw3MjLbXAqu8B7upI3i2DP73HEpszBBZiIjntzs8cGOIXUGo5eMXRPEsjx9Qcm4OqNXPogvsoql6tADt6mCjA5Of3v6yFJJt35gOPVPqvMu2GrOzMzYt27WqY0WBAYrLArolk-VmMdfMIqnVNWambhChPUdRepKkwQD8yYHk2zHYvOtAcSJy-Y1SkeyfgyBsMuFDvPD_N8JjytIWkAqdtJjv56TNBobZOx2DZT83TEE12v9_NLvLjUewG-YZjldY77Bp_PXETs2FkIZRJ5Lw_OHhL4EN7TmFb1pW6sTD-DliFhZ1QrJjJjRO817axND0i8gSg4ELbs1hNVJlQ4rryAeo2FIHeaLjki5dqzWpXTX29Vo0M4MWyQnjC6vfk" mozallowfullscreen="true" webkitallowfullscreen="true" allowfullscreen="true" frameborder="0" style="position:absolute;width:100%;height:100%;left:0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.linkedin.com/learning/choosing-the-right-back-end-language-typescript-go-or-rust-for-your-greenfield-project/comparing-golang-vs-rust?trk=embed_lil"&gt;Comparing Golang vs Rust&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href="https://www.linkedin.com/learning/choosing-the-right-back-end-language-typescript-go-or-rust-for-your-greenfield-project?trk=embed_lil"&gt;Choosing the Right Back-End Language: TypeScript, Go, or Rust for Your Greenfield Project&lt;/a&gt;&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://www.linkedin.com/learning/instructors/tai-groot?trk=embed_lil"&gt;Tai Groot&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Frontend FOMO: A Hype-Driven Ecosystem</title><link>https://blog.taigrr.com/blog/frontend-fomo/</link><pubDate>Tue, 12 Sep 2023 18:19:25 +0600</pubDate><author>tai@taigrr.com (Tai Groot)</author><guid>https://blog.taigrr.com/blog/frontend-fomo/</guid><description>&lt;p&gt;Ah, JavaScript development, the ever-evolving frontier of web development.
New runtimes, package managers, libraries, frameworks, module systems, and packages pop up like mushrooms after a rainstorm.
Every week, it feels like a tech carnival, with flashy new tools and configurations tempting you to hop aboard the latest hype train.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by acknowledging that innovation is a positive force for good.
The JavaScript ecosystem is a hotbed of creativity, where developers are constantly pushing the boundaries of what&amp;rsquo;s possible.
New libraries and frameworks emerge to solve real-world problems, making developers&amp;rsquo; lives easier and applications more powerful.&lt;/p&gt;
&lt;p&gt;Innovation itself is not the problem.
The problem is the collective behavior of developers, often resembling a herd of lemmings, that can lead to chaos.
Front-end (and consequently Full-Stack) developers seem to be particularly susceptible to FOMO and analysis paralysis.
Once (or even before) a developer starts to feel comfortable with a tech stack, a new kid on the block arrives, and some begin suddenly questioning every decision they’ve ever made.&lt;/p&gt;
&lt;p&gt;Imagine this scenario: you&amp;rsquo;ve been working with React for a while, building beautiful (let’s be honest, janky but functional) user interfaces, and you&amp;rsquo;re finally getting the hang of it.
But wait, Svelte comes along and promises to revolutionize the way you think about front-end development.
You start to wonder if you&amp;rsquo;ve been living in the Stone Age and if Svelte is the key to enlightenment.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cuHDQhDhvPE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;Perhaps you&amp;rsquo;re knee-deep in Node.js, happily coding away server-side, when Deno makes its grand entrance, boasting improved security and a new approach to runtime environments.
Suddenly, your Node.js project feels like last year&amp;rsquo;s news, and you can&amp;rsquo;t help but question if Deno is the future.
&lt;i&gt;Nota bene: Bun was released right before this article was published, and its release only makes my point stronger.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;FOMO leads to a never-ending cycle of tool evaluation, configuration tweaking, and second-guessing.
It&amp;rsquo;s like being stuck in a revolving door that never stops spinning.
You find yourself constantly switching between libraries and frameworks, never truly mastering any of them, and your deliverables suffer from analysis paralysis.&lt;/p&gt;
&lt;p&gt;I’ve been picking on Front-end developers, but let’s be fair: backend developers face choices too; I&amp;rsquo;m all too familiar with the Go / Rust / Zig argument (and I’ll save Ruby on Rails and PHP for a future date).
There are so many general-purpose languages (GPLs, as opposed to domain-specific languages, DSLs) that, of course, there is bound to be arguing, evangelizing, and a general lack of consensus.&lt;/p&gt;
&lt;p&gt;However, I would posit the arguments that arise over which backend language to use are of an entirely different class than the arguments that arise within the JavaScript ecosystem.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Your average Go developer and Python developer get into an argument over whose language is Better.
What are their talking points?
Typically, the Python developer will criticize Go for having a smaller package ecosystem, and no significant support for Machine Learning, praising Python for ease of development &amp;ndash; it’s often faster to get a prototype out the door for Python than for Go.&lt;/p&gt;
&lt;p&gt;The Go developer will then come back complaining about Python’s slower speed, dynamic typing, and runtime package management.
If both parties are reasonable, they may agree that while both languages are &amp;ldquo;General Purpose,&amp;rdquo; there are still &amp;ldquo;domain preferences&amp;rdquo; for each language.
In other words, there are problems and use cases where one language is the better tool for the job, even if both could work.
(I’m aware the comparison between a compiled and interpreted language may be more extreme than between Go and Rust or Python and Julia, but the point still carries.)&lt;/p&gt;
&lt;p&gt;Now look at an argument between a Vue user and a React user.
The Vue user might complain about JSX syntax, the corporate backing (Meta), and the relaxed project scaffolding (the strict 1:1 component to file rule means all Vue projects end up organized somewhat the same, without requiring developers to search across files to find where a component is defined.)
Conversely, React developers insist ‘the future is React’, more developers know React (hiring talent is easier), and complain the strictness of Vue’s scaffolding leads to verbose, sprawling directories and &lt;code&gt;ReallyLongAndSpecificComponentNames.vue&lt;/code&gt; (getting Java flashbacks, anybody?)&lt;/p&gt;
&lt;p&gt;Of course, I won’t pretend all arguments about these libraries are the same.
React does mobile better (thanks to React Native).
Vue does incremental adoption better.
(React and Vue have gone back and forth on which has better performance.)&lt;/p&gt;
&lt;p&gt;So, while there are Domain arguments to be had across JavaScript frameworks, the point I am making here is that &lt;b&gt;the loudest and oft repeated disagreements over JavaScript stacks are about Developer Experience (DX) and preference, rather than which stack can do the job better in production.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I still don’t think these arguments over preference are The Problem With The JavaScript Ecosystem™.
Different developers will make judgment calls for one choice over another.
But if the tools can all (mostly) get you to the same, functional result, and it’s really a DX and preferential choice question, FOMO is the problem.
The most important factor for seamless DX is the stability of the ecosystem: building components and shipping changes to production should become muscle memory over time.
&lt;b&gt;This muscle memory can never develop when the developer is constantly switching between tools and libraries.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Backend developers listen to the arguments over which JS stack does what and how.
Inevitably overwhelmed, they retreat back into their caves to write some of the finest, purest Haskell ever conceived, then sit back with a glass of brandy admiring their monads (or something like that, I don’t know, I don’t write Haskell) leaving the Scary Frontend World alone.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s generally acknowledged that Linux &amp;ldquo;distro hopping&amp;rdquo; is an unhinged practice fit for masochists and the clinically deranged.
It&amp;rsquo;s high time we collectively agree stack churn in the JavaScript Ecosystem is a comparable vice.
What is the solution then?
Where’s a good tradeoff between stifling innovation and maintaining stability?&lt;/p&gt;
&lt;p&gt;Be pragmatic.
If you&amp;rsquo;re a library maintainer, keep building awesome tools, but don&amp;rsquo;t expect everyone to use them right away.
There are already so many moving pieces.
If what you&amp;rsquo;re building is truly revolutionary, it will stand the test of time and eventually become a standard (whether you like it or not!).&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building a product, you need to ship.
Leave the bleeding edge, the framework wars, and library hopping to the maintainers of the tools.
Chances are you don&amp;rsquo;t need to be an expert in every new library that comes out.&lt;/p&gt;
&lt;p&gt;Stop, settle, and &lt;b&gt;pick something to move forward.&lt;/b&gt;
If you can’t decide where to start, then &lt;i&gt;vox populi vox dei&lt;/i&gt;: start with
&lt;a
href="https://nextjs.org/docs"
target="_blank"
&gt;Next.js&lt;/a
&gt;.
Get really good at it.
Only switch up your stack if there’s a feature your platform can’t function without.
It’s time to &lt;b&gt;focus on shipping, not deliberating.&lt;/b&gt;
I regretfully inform you, that even if you can’t take advantage of the latest shiny, you’ll be ok!&lt;/p&gt;</description></item></channel></rss>