Conexão · Interrompida

Algo não carregou

Parte desta página não chegou até você. Recarregue para tentar novamente — se persistir, verifique sua conexão.

Pular para o conteúdo principal
Escritos · № 03

Todos posts

Notas longas sobre software, sistemas distribuídos e a arte de construir. Publicando uma por semana.

Todos os Posts
30 posts
Engineering01

Transformando Manutenção de Repositório em Markdown: Mantendo uma Codebase Rust Viva com Workflows Agênticos

Repositórios de vida longa sofrem drift: componentes depreciados persistem, camadas sangram e testes não cobrem as funções que de fato quebram. No meu próprio estudo, transformei três tarefas recorrentes em workflows markdown agendados que o próprio repositório roda sobre si mesmo, e depois escrevi o que aprendi sobre limitar o raio de impacto, parear checagens LLM com scans determinísticos, e deixar os agentes rascunharem formatos enquanto eu escrevo a substância.

5 de jul.
Engineering02

O que o APISIX no Anel Trial Realmente Oferece: Notas sobre seu Plano de Controle Baseado em etcd

O Volume 34 do Thoughtworks Technology Radar moveu o Apache APISIX para o anel Trial. Passei uma semana investigando a documentação, o código-fonte e alguns bug reports para me convencer de que a alegação de roteamento dinâmico baseado em etcd era real — e para pesar o custo operacional que ela esconde. Estas são minhas notas sobre o mecanismo de watch, o precipício de escala de conexões nos 263 long polls, e quando eu recorreria ou não ao APISIX em 2026.

1 de jul.
Engineering03

Concorrência Estruturada Parece Igual em Quatro Runtimes — Até um Filho Falhar

Escrevi o mesmo fan-out quatro vezes — Java 25 StructuredTaskScope, Kotlin coroutineScope, Swift withThrowingTaskGroup, Python asyncio.TaskGroup — e a API de superfície é quase intercambiável. As semânticas de cancelamento e agregação de exceções não são. Estas são minhas notas sobre o que diverge no caminho de falha e por que apenas Python te entrega todas as falhas por padrão.

28 de jun.
Engineering04

Uma Fitness Function É Só um Teste Que Quebra o Build Quando a Arquitetura Desvia

Uma fitness function não é um artefato de framework — é um teste que quebra o build e codifica um invariante arquitetural. Codifico uma regra de camadas em cerca de 60 linhas de TypeScript usando a própria API do compilador, testo o teste contra árvores boas, ruins e de código gerado, e então traço a linha entre um invariante que vale a pena travar e um gate de métrica que sai pela culatra sob a lei de Goodhart.

24 de jun.
Engineering05

Evolução de Schema no Iceberg: Drop-Então-Add Não é um Rename

O Apache Iceberg rastreia cada coluna por um id numérico único, não pelo nome. Da minha própria investigação na especificação e de um pequeno programa em Kotlin contra um catálogo local, a armadilha que mais me pegou foi esta: um drop seguido de um add com o mesmo nome de coluna não é um rename, e tratá-lo como se fosse silenciosamente deixa seus dados históricos órfãos.

21 de jun.
Distributed Systems06

Convergência É uma Propriedade da Sua Função de Merge, Não da Rede

Uma vez vi uma tarde inteira de edições offline desaparecer sob um sync last-writer-wins, e a correção não foi uma rede melhor — foi uma função de merge melhor. Estas são minhas notas sobre por que réplicas CRDT convergem: um merge que é comutativo, associativo e idempotente. Reconstruo um OR-Set add-wins mínimo em TypeScript, executo o código e avalio o que a garantia custa em tombstones e memória.

14 de jun.
Engineering07

Kotlin 2.4: As Três Mudanças que Moveram Minha Mão no Teclado

O Kotlin 2.4.0 chegou com um changelog extenso, mas apenas três recursos mudaram a forma como eu realmente digito: context parameters estáveis, explicit backing fields e (ainda atrás de uma flag) name-based destructuring. Este é o meu recorte de engenheiro backend, verificado contra o compilador 2.4.0, mais a remoção do K1 que tive que colocar no calendário.

8 de jun.
Backend08

Capturando uma Race Condition de Retry com Uma Seed: Simulação Determinística em Rust usando turmoil

Eu tinha três testes de retry flaky que ninguém conseguia reproduzir em um laptop. Reescrevi um deles em Rust em cima do turmoil, o simulador determinístico do Tokio, e uma única seed de 8 bytes fixou a race condition de partição byte por byte. Estas são minhas anotações sobre o que a seed realmente controla, o que escapa dela e quando o teste de simulação determinística vale a pena.

4 de jun.
AI09

Lendo AG-UI como um protocolo de fio, não um framework

Eu ficava reconstruindo o mesmo envelope SSE toda vez que escrevia uma UI de agente. AG-UI é a primeira tentativa séria que vi de padronizar esse envelope. Neste post eu desnudo o protocolo até seu formato de fio e reconstruo um endpoint mínimo em Spring WebFlux que fala o protocolo sem um SDK.

2 de jun.
Distributed Systems10

Two-Phase Commit na JVM: O Problema de Bloqueio Que Ninguém Coloca no Diagrama

Eu derrubei de propósito um coordenador de Two-Phase Commit em uma pequena simulação Kotlin para medir por quanto tempo os participantes ficam travados quando o coordenador desaparece entre as fases. O resultado é a parte do 2PC que os diagramas nunca mostram — e a razão pela qual eu modelaria a maior parte das escritas cross-service como uma saga em vez disso.

30 de mai.