Carlos Batista

V

Coluna — Publicações

Registro do que deu trabalho

Textos sobre problemas que eu resolvi na marra — arquitetura, performance e, cada vez mais, IA aplicada.

30 publicações

Publicação mais recenteMonorepo com npm workspaces e Turbo: o que ninguém te conta sobre React 19, hoisting e shared packagesSemana passada precisei resolver um problema que parecia simples: fazer um frontend Next.js consumir tipos TypeScript de um pacote shared, que também era usado pelo backend pipeline. Os dois viviam no mesmo repositório. Deveria ser trivial. Não foi. O que aprendi nesse processo sobre npm workspaces, Turborepo e os edge cases de monorepos com versões conflitantes de React é o que quero compartilhar aqui. Não como tutorial passo-a-passo, mas como registro do que realmente acontece quando você 8 de jun. de 20264 minmonorepo · typescript · nextjs · devops
7 de jun. de 2026Como Dar Aula Me Ensinou a Construir Dashboards MelhoresVocê já parou pra pensar que um bom professor e um bom engenheiro de dados fazem essencialmente a mesma coisa? Os dois pegam algo absurdamente complexo e transformam numa narrativa que faz sentido pra quem está do outro lado. Passei alguns anos em sala de aula antes de migrar completamente pra tecnologia, e essa conexão entre ensino e dados só ficou mais clara com o tempo. Quando eu preparava uma aula sobre estruturas de dados, meu trabalho não era mostrar a implementação de uma árvore B+ — erdados · educação · engenharia de dados · product thinking · 5 min
31 de mai. de 2026Lambda Warm Instances: Pool de Instâncias e Processamento Assíncrono em GoA primeira invocação de uma Lambda leva 3 segundos. A segunda também. A terceira também. São 3 segundos de cold start toda vez porque cada invocação pode subir um container do zero. Em um fluxo com 20 chamadas encadeadas, são 60 segundos só de overhead de inicialização. A ideia do pool é manter instâncias prontas para reutilização: a primeira chamada paga o cold start, as próximas reutilizam a instância aquecida e respondem em milissegundos. Combinado com processamento assíncrono via workers, o go · concurrency · performance · programming · 5 min
30 de mai. de 2026WebSocket para Monitorar IA em Tempo RealQuando uma IA está "pensando", o que exatamente está acontecendo? Na maioria dos chatbots, você manda uma mensagem e espera. Talvez veja um "digitando..." genérico. Mas e se você pudesse ver em tempo real cada etapa: a classificação de intenção, a extração de triplas, a busca web, a criação de mundos, as inferências simbólicas? Isso transforma debugging de "por que respondeu errado?" em "ah, a extração falhou nesse passo específico". Implementei comunicação via WebSocket onde o backend emite epython · websocket · realtime · 4 min
27 de mai. de 2026Feedback Loop em Orquestradores de Agentes: Aprendizado sem Machine LearningToda vez que o orquestrador seleciona um agente e o resultado é bom, essa informação se perde. Na próxima requisição similar, ele toma a mesma decisão do zero, sem considerar que já acertou antes. E quando erra, erra de novo pelo mesmo motivo. O sistema não aprende. A solução é registrar cada decisão com seu resultado (sucesso ou falha, rating do usuário), acumular padrões ao longo do tempo, e usar esse histórico para melhorar decisões futuras. Não é machine learning pesado. É um sistema de feedai · learning · metrics · programming · 5 min
26 de mai. de 2026Projetando Sistemas que Assumem o Atacante é uma IASeu rate limiting foi projetado para humanos. 100 requests por minuto por IP. Faz sentido quando o atacante é uma pessoa com um terminal aberto, testando manualmente. Não faz sentido quando o atacante é um agente distribuído em 500 IPs rotativos, cada um fazendo 2 requests por minuto, totalizando 1.000 requests por minuto que seu rate limiting nem percebe. Seu CAPTCHA foi projetado para humanos. Modelos multimodais resolvem a maioria deles. Seu WAF detecta assinaturas de ferramentas conhecidas — · 8 min
24 de mai. de 2026O If de Par e Ímpar Disfarçado de ArquiteturaVocê conhece aquele exercício de programação iniciante: dado um número, diga se é par ou ímpar. A solução ingênua que todo mundo ri: if (n == 0) print("par") if (n == 1) print("ímpar") if (n == 2) print("par") if (n == 3) print("ímpar") if (n == 4) print("par") ... Ninguém faria isso. É óbvio que a solução é n % 2 == 0. Uma regra genérica que resolve todos os casos sem enumerar cada um. Qualquer dev olha esse código e diz: "isso é absurdo, você está codificando cada caso individual quando e · 9 min
21 de mai. de 2026Benchmarkando um Motor de Raciocínio: Métricas que ImportamComo saber se um motor de raciocínio está funcionando? Não é como testar um CRUD onde você verifica se o dado foi salvo e retornado corretamente. Aqui você precisa medir coisas como: o sistema extraiu os fatos certos? Consolidou informações de múltiplas fontes? Criou conexões criativas? Reduziu incerteza com novas evidências? São capacidades qualitativas que precisam ser quantificadas de forma objetiva. Criei um benchmark com 5 cenários que testam capacidades diferentes do motor. O score totalpython · ai · testing · 5 min
20 de mai. de 2026Análise Semântica com IA para Roteamento Inteligente de AgentesO usuário digita "validar dados do usuário no cadastro" e o sistema precisa decidir qual agente vai responder. Parece trivial quando você tem 3 agentes. Fica impossível quando tem 15. O nome do domínio é "user/registration" mas o input não contém nem "user" nem "registration". Contém "usuário" e "cadastro". Substring matching não resolve. Você precisa de algo que entenda que "cadastro" e "registration" são a mesma coisa, que "validar dados" implica uma operação de "modify", e que o domínio mais go · ai · nlp · programming · 6 min
19 de mai. de 2026Knowledge Graphs Probabilísticos: Modelando Incerteza como DistribuiçõesA maioria dos grafos de conhecimento que você encontra por aí funciona com fatos absolutos: "Paris é capital da França" é verdadeiro ou falso, ponto final. Mas o mundo real não funciona assim. Informações são incertas, fontes discordam, e o que era verdade ontem pode não ser hoje. Se você está construindo um sistema que aprende de múltiplas fontes ao longo do tempo, precisa de um grafo que aceita incerteza como cidadã de primeira classe. A abordagem que adotei é tratar cada crença como uma dispython · ai · database · 5 min
18 de mai. de 2026Circuit Breaker Pattern em Go: Protegendo Chamadas a LLMsVocê tem um orquestrador que chama um serviço externo de LLM dezenas de vezes por sessão. Esse serviço depende de uma API remota. APIs remotas caem. Quando caem, seu orquestrador fica travado esperando timeout de 120 segundos por chamada, acumula 5 chamadas na fila, e o usuário espera 10 minutos para receber um erro genérico. Pior: enquanto o serviço está fora, você continua bombardeando ele com requests, o que pode atrasar ainda mais a recuperação. O Circuit Breaker resolve isso cortando as chago · designpatterns · resilience · programming · 5 min
17 de mai. de 2026Agent Spread: Distribuindo Agentes IA por Bounded Contexts AutomaticamenteVocê tem uma aplicação com 15 pastas, 200 arquivos, 3 linguagens diferentes. Quer usar agentes IA para ajudar no desenvolvimento mas não quer configurar manualmente qual agente cuida de qual parte. A ideia do Agent Spread é: o sistema escaneia sua aplicação, detecta os domínios automaticamente pela estrutura de pastas e convenções de nomenclatura, e distribui agentes especializados em cada área. Cada agente conhece profundamente seu domínio (quais arquivos existem, qual tech stack, qual a complego · ai · architecture · ddd · programming · 6 min