Notas longas sobre software, sistemas distribuídos e a arte de construir.
Um post, toda segunda-feira. Busque ou navegue pelo arquivo abaixo.
Database per service agora é de graça. Isso não é motivo para usar
Um free tier que dobra muda as entradas de uma decisão, não a decisão. Na primeira semana, previ que o Bullpen dividiria preços e histórico em dois serviços com dois bancos de dados. Depois o Neon fez database per service parecer de graça, e eu precisei decidir se isso mudava alguma coisa. Este é o histórico de decisões: cinco decisões de dados e deploy, cada uma com suas condições, as opções que pesei, por que uma venceu e o que me faria voltar atrás.
Arquitetura como código tem três funções: descrever, governar, lembrar
Na primeira semana do Bullpen, o modelo de arquitetura planejado ainda citava um provedor de ações que eu tinha recusado, e uma mudança no rodapé e um teste o seguiram. Nada falhou. Uso esse incidente e outros dois para defender que arquitetura como código tem três funções: descrever o sistema, governá-lo e lembrar por que ele tem a forma que tem. Depois sigo a primeira mudança real após as correções, o analytics de produto, pelas três: um registro de decisão antes que o modelo pudesse citá-lo, arquitetura construída e planejada que discordavam, e uma regra que compõe as duas em vez de editar qualquer uma delas.
Quando usar microsserviços em 2026: escalar, por si só, já não é o motivo
No dia em que o Dow registrou uma alta recorde para a época, os clientes da Robinhood não conseguiram operar da abertura ao fechamento. Separar a parte quente para que ela escale sozinha era a resposta antiga; hoje uma plataforma serverless faz isso por função. Abro esta série com o Bullpen, uma liga de paper trading sobre dados de mercado ao vivo, e defendo quando usar microsserviços em 2026: só por um motivo que eu consiga nomear, com um teste, uma medição ou uma fatura por trás.
Stamp vs Control Coupling: Onde Mora a Decisão de Escrita?
Control coupling e stamp coupling ficam lado a lado na taxonomia de Constantine, classificados piores que data coupling e pouco mais. Quando reli isso com um refactor real de applyDiscount em Kotlin à minha frente, o ranking não era a parte interessante. A pergunta que ele não responde é onde a decisão de escrita de fato mora.
Sua Fila Não Vai Esvaziar: A Aritmética da Recuperação de Backlog
Uma frota de consumidores aparentemente saudável pode ficar sentada sobre um backlog de 3 milhões de mensagens que nunca diminui. Estas são minhas anotações sobre a aritmética por trás disso: excedente = capacidade − chegada, drenagem = backlog ÷ excedente, e por que uma frota dimensionada para o regime estacionário tem capacidade de recuperação zero. Construí um pequeno simulador em TypeScript para observar a amplificação de retries estacionar uma frota corretamente dimensionada em uma falha metaestável, e deduzi quando descartar (shedding) supera drenar.
Backpressure é um contrato que todo chamador precisa honrar, não uma configuração
Uma fila limitada em um serviço não faz nada se o chamador acima dele continuar empurrando. Estas são minhas notas sobre backpressure como um contrato ponta a ponta: o que o chamado deve, o que todo chamador deve de volta, e por que o incidente de amplificação de retries do Azure OpenAI é a cara de uma cláusula quebrada em hiperescala.
O Bug Que Não Compilou: Portando um Erro de Reordenação para o Hydro
Plantei um bug de ordem de chegada em uma agregação fan-in escrita à mão em Rust, reproduzi uma subcontagem de 51% com um shuffle com semente e então portei a mesma lógica para o Hydro 0.17-alpha. O merge não ordenado se recusou a compilar meu fold não comutativo — estas são minhas anotações sobre o que essa garantia é, o que o manual_proof! apenas atesta e quando vale a pena pagar os custos de emenda.
Arquitetura como Código com Structurizr DSL: Um Workspace C4 que Tanto o Revisor Quanto o Agente Conseguem Ler
Comitei um workspace Structurizr DSL ao lado de um serviço de billing em Kotlin/Spring e plugei o ArchUnit no Gradle, de modo que o CI quebra no instante em que o código diverge do desenho C4. Aqui está o workspace.dsl, o teste que o sustenta e o que mudou quando um agente de código passou a ler os dois arquivos em vez de adivinhar a partir dos pacotes.
Engenharia Antes da Inferência: A Pergunta Que a Zero Token Architecture Está Realmente Fazendo
Ultimamente eu venho ouvindo uma frase que teria sido absurda três anos atrás: "não consigo fazer agora — fiquei sem tokens". Estas são minhas anotações depois de investigar a Zero Token Architecture — a ideia que Kelsey Hightower levou de um post descartável a uma keynote na PlatformCon — e o princípio que quero construir em cima dela: toda chamada de IA é uma decisão de arquitetura, e os custos que mais importam nunca foram os tokens.
Quando o SQL Basta para Streaming: O Que a Manutenção Incremental de Visões Garante — e O Que Ela Recusa
A promessa de 2026 é que um job de stream escrito à mão se resume a um único CREATE MATERIALIZED VIEW, então construí um no RisingWave e passei meu tempo de estudo tentando quebrá-lo. Estas são minhas anotações sobre a consistência que a visão realmente entrega conforme os eventos chegam, por que cada join nela é uma conta de memória permanente, e as queries que se recusam a ser incrementais — com um consumidor Node acompanhando o changefeed da visão sobre o protocolo puro do Postgres.