RSSAmplifier

Blog

alexrios

Alex Rios — Principal Engineer, author, and conference speaker writing about Go internals, systems programming, and tech leadership.

alexrios.meRSS feed ↗73 posts

Latest posts

Writergate

The informal name for Zig's massive I/O interface refactoring that removed GenericWriter/Reader in favor of vtable-based concrete types.

Writergate part 2: the new architecture

Inside Zig's three-level vtable design, and how buffer placement enables both performance and async.

Writergate parte 2: a nova arquitetura

Por dentro do design de vtable em três níveis do Zig, e como a posição do buffer viabiliza performance e async ao mesmo tempo.

Writergate

O nome informal da refatoração massiva da interface de I/O do Zig que removeu GenericWriter/Reader em favor de tipos concretos com vtable.

Writergate part 3: migration patterns

Practical patterns for updating Zig code from std.io to std.Io, with before/after examples.

Writergate parte 3: padrões de migração

Padrões práticos pra atualizar código Zig de std.io pra std.Io, com exemplos de antes e depois.

Writergate part 1: the problem with generic I/O

Why Zig deleted GenericWriter and AnyWriter, and what generic poisoning really costs.

Writergate parte 1: o problema com I/O genérico

Por que o Zig deletou GenericWriter e AnyWriter, e o que o envenenamento genérico custa de verdade.

What does it take to change this?

Five binding times, named by what it costs to change them

O que precisa pra mudar isso?

Cinco momentos de binding, nomeados pelo que custa pra mudar cada um

Underbudgeting design increases total cost

Why your MVP keeps taking eighteen months

Cortar design aumenta o custo total

Por que seu MVP continua levando dezoito meses

Clean code loses to the shape of the problem

The argument that quietly invalidates half of clean code advice

Clean code perde pra forma do problema

O argumento que invalida silenciosamente metade do conselho de clean code

The shared database is not a microservice architecture

When splitting deploy units while sharing storage works, and when it doesn't

O banco compartilhado não é uma arquitetura de microsserviços

Quando dividir as unidades de deploy mantendo o storage compartilhado funciona, e quando não

The bool flag parameter is two functions wearing one name

An anti pattern that still ships every week

O parâmetro bool é duas funções vestindo o mesmo nome

Um anti pattern que ainda entra em produção toda semana

Transparent boundaries

The encapsulation that isn't

Fronteiras transparentes

A encapsulação que não é

Precision is the missing virtue in Go interfaces

Every parameter is a contract. Make it small enough to honor

Precisão é a virtude que falta nas interfaces Go

Cada parâmetro é um contrato. Faz ele pequeno o suficiente pra honrar

How I think about coupling

Two axes, not one list

Como eu penso sobre acoplamento, de verdade

Dois eixos, não uma lista

Cohesion in the era of shipping faster than ever

What AI-shipped code keeps getting wrong about cohesion

Coesão na era das entregas mais rápidas que nunca

O que o código gerado por IA continua errando sobre coesão

The helper that ate the codebase

How well intentioned DRY refactors produce the worst modules I've seen

O helper que comeu a base de código

Como refactor DRY bem intencionado produz os piores módulos que eu já vi

I was reading the Go source code and found a bug

How a one-line nesting mistake in internal/cpu silently disabled GFNI detection on every consumer-grade Intel CPU shipped since 2021 (Alder Lake, Raptor Lake, the Atom-derived N-series, and more).

Green Tea GC: SIMD acceleration

How Go 1.26 repurposes an AES cryptography instruction to make garbage collection up to 20% faster

Migrating a Zig UUID library to 0.16

What it takes to move a zero-allocation UUID library from Zig 0.15 to 0.16, where every side effect now flows through std.Io.

Compile-time clock injection in Zig

How comptime generics replaced function pointers for deterministic UUID testing: zero runtime cost, full test coverage

Silent data corruption and other UUID bugs I shipped

Three bugs found in a UUID library within hours of writing it: negative timestamp corruption, broken monotonicity, and unreachable code that was reachable

Let's talk about choosing a database in 2026

Thirteen years after Making Sense of NoSQL, most of its claims are debunked. PostgreSQL should be your default, with specialized databases added only when you have measured evidence.

Building a UUID library in Zig over a weekend

A design journal for a zero-allocation RFC 9562 UUID library in Zig: constraints, decisions, and what I learned shipping it

Why does Go hide spinlocks?

Go uses spinning internally but refuses to expose spinlock APIs. The reasons reveal deep truths about concurrent programming.

Building slogbox

A design journal for slogbox, a zero-dependency slog.Handler that keeps recent logs in a ring buffer

Green Tea GC: Benchmarking reality check

How to test Go's new garbage collector on your workload, and why the results might surprise you

Green Tea GC: inside the implementation

Data structures, algorithms, and the clever design decisions behind Go's span-based garbage collector

Green Tea GC: the insight

Why Go's new garbage collector works with pages instead of objects—and what that means for your applications

From paper to runtime

How academic research became a Go runtime feature, and how to start using the leak detector today

Bubbles and fake time

How testing/synctest creates isolated execution environments with synthetic clocks—and why this makes concurrent tests deterministic.

Durably blocked

The key insight behind testing/synctest: which operations count as "blocked" and which prevent time from advancing.

When tests become slot machines

Concurrent tests in Go are either slow or flaky. Usually both. The testing/synctest package changes this.

Migration patterns

How to migrate existing tests from time.Sleep and mock clocks to testing/synctest—and when not to.

The unique Package

Go 1.23 standard library package for value canonicalization with GC-integrated weak pointers

Why net/netip Needed unique.Make

The decade-long journey from Issue #5160 to Go 1.23 value interning—and how net/netip forced the runtime team to finally solve it

GC integration

How Go's garbage collector handles weak pointers during mark, sweep, and the blocking mechanism during conversion

The indirection object model

How Go implements weak pointers with an 8-byte handle that enables O(1) invalidation

The 15-year wait for weak pointers

Why Go resisted weak pointers for over a decade, what changed, and what the minimal API actually does