Todos posts
Notas longas sobre software, sistemas distribuídos e a arte de construir. Publicando uma por semana.
Java 26 Chegou: Os Recursos para Acompanhar Antes do LTS do Java 29
A maioria das equipes de backend roda apenas as linhas LTS, então o Java 26 parece dispensável. Não é — é o preview mais claro do que o LTS do Java 29 vai conter. Estas são minhas anotações sobre o que já está finalizado (cache de objetos AOT com ZGC, um G1 mais rápido, HTTP/3), o único preview pelo qual eu reescreveria código (Lazy Constants, com um exemplo executável) e a mudança de integridade que vai quebrar builds.
A Zona de Transição: O Backend Está Se Tornando Software Que Dorme
Vi o estado quebrar o monólito, depois os microsserviços, depois o serverless — e passei meses lendo os changelogs que me convenceram de que a terceira quebra acabou de ser resolvida. Estas são minhas anotações sobre a convergência de 2024–2026 entre compute efêmero e estado durável, por que o modelo de cobrança é o indício revelador, e o experimento A/B com o qual este post me compromete: reconstruir sobre o novo substrato um problema que já resolvi em Spring Boot, com os números publicados de qualquer forma.
O Servidor Agora É um Relay de Sincronização: Arquitetando em Torno do Estado que Pertence ao Cliente
Na QCon London 2026, Kleppmann descreveu o local-first como o melhor do Google Sheets e o melhor do Git, e neste ano os sync engines chegaram ao mercado. A partir da minha leitura do Electric, do Zero e do LiveStore lado a lado, estas são minhas anotações sobre o que muda quando a cópia do cliente se torna primária: onde os conflitos são resolvidos, o que o servidor ainda controla e a linha entre mesclar e recusar que decide quais aplicações nunca devem ser construídas dessa forma.
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.
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.
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.
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.
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.
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.
Idempotência É um Protocolo, Não uma Chave
Na primeira vez em que entreguei idempotência como um header UUID e uma consulta no Redis, uma cobrança duplicada escapou uma semana depois. Estas são minhas notas sobre tratar idempotência como um protocolo de quatro partes — deduplicação, determinismo, segurança concorrente, propagação downstream — com uma implementação mínima em Kotlin mais Postgres que se mantém firme sob retry.