Autor: magoolation

  • Capacitação Microsoft AI — Aula 7: agentes avançados, ferramentas e aprovação humana

    Playlist completa no YouTube · Código .NET da aula 7 · Código Python da aula 7 · Slides da aula 7 (PDF)

    O que a aula cobriu

    A aula 7 pega o agente simples da aula 6 e dá a ele mais responsabilidade: ferramentas reais, um passo de aprovação humana antes de ações irreversíveis, acesso à documentação oficial via MCP hospedado, e um fluxo com três agentes trabalhando em sequência.

    São quatro demos na mesma base de configuração das aulas anteriores (endpoint, identidade e AIProjectClient não mudam):

    • Function calling: quatro ferramentas (consulta a uma base de conhecimento, previsão do tempo, calculadora e um envio de e-mail simulado) criadas com AIFunctionFactory.Create, cada uma documentada com atributos de descrição que o modelo lê para decidir quando chamar.
    • Human-in-the-loop: a ferramenta de envio de e-mail é envolvida num wrapper de aprovação. O agente pausa, devolve um pedido de aprovação, e só continua a execução depois que uma pessoa confirma.
    • MCP hospedado: o agente ganha acesso a um servidor MCP público de documentação da Microsoft, sem precisar de nenhuma integração customizada — é só mais uma ferramenta na lista.
    • Workflow sequencial: três agentes (pesquisador, validador e redator) encadeados, cada um processando a saída do anterior e transmitindo seu resultado em streaming.

    Três ideias para levar

    1. O modelo nunca executa nada — a sua aplicação executa. Toda ferramenta que você expõe a um agente é só um método comum que a sua aplicação roda quando o modelo pede. Isso significa que validar os parâmetros, nunca devolver segredos e tratar erros com mensagens legíveis (em vez de deixar uma exceção estourar) é responsabilidade sua, não do modelo.

    2. Aprovação é uma decisão de wrapper, não da ferramenta. A mesma função de envio de e-mail funciona com ou sem aprovação humana — o que muda é só a camada que envolve ela. Isso separa bem a lógica de negócio da política de segurança: você decide onde exigir aprovação sem tocar no código da ferramenta em si.

    // A ferramenta de envio de e-mail só é executada depois de aprovação explícita
    var emailTool = new ApprovalRequiredAIFunction(
        AIFunctionFactory.Create(EnviarEmailSimulado)
    );
    
    // O agente pausa e devolve um ToolApprovalRequestContent
    // em vez de executar direto — a aplicação decide o que fazer com isso
    

    3. Nem todo problema precisa de vários agentes conversando. O workflow sequencial da aula mostra o caso em que faz sentido ter mais de um agente — quando cada etapa precisa de um papel e um contexto diferentes. Mas vale sempre perguntar primeiro se um único agente, num loop simples, não resolveria o mesmo problema por um custo menor.

    Antes de rodar

    • Confirme que sua conta tem o papel Foundry User no recurso — sem ele, as chamadas à API retornam 403.
    • Copie o launchSettings.template.json da aula 6 e ajuste só o nome do perfil.
    • Configure as variáveis de ambiente FOUNDRY_ENDPOINT e FOUNDRY_MODEL — o modelo escolhido precisa suportar function calling (use algo da família GPT-5.x caso o agente nunca chame as ferramentas).
    • Rode az login --tenant <id> antes do dotnet run, e defina AZURE_TENANT_ID e AZURE_TOKEN_CREDENTIALS=AzureCliCredential para autenticação mais previsível.
    • Se o restore reclamar de versões conflitantes entre os pacotes de Workflows e de Foundry (erros NU1608/NU1605), pin as duas na mesma versão.
    • A demo 3 precisa de saída de internet do serviço para alcançar o MCP hospedado — confirme que sua rede permite isso.

    Se você está na trilha Python

    O equivalente em Python está em Python/aula07-agentes-avancados, com main.py e um módulo próprio de ferramentas (ferramentas.py) espelhando as mesmas quatro demos. A lógica de validação de entrada e de não devolver segredos nas respostas das ferramentas vale igual nos dois ecossistemas — é decisão de arquitetura, não de linguagem.

    Próximo passo

    Na aula 8 fechamos a série com avaliação de agentes: como medir se o que construímos até aqui está realmente funcionando antes de colocar em produção.

  • Links da semana — 23/10

    Essa semana foram quatro links: a Microsoft apresentou um modelo pensado para decidir rápido, e não para conversar; o time do Claude Code contou como faz code review (com o comentário do Pascoadev sobre o que dá para copiar); e o Augusto Galego abriu o jogo sobre os erros que levaram a startup dele a fechar. No fim, dois canais que valem a inscrição.

    • Microsoft-Decision-1: Our model for fast decision-making
      Um modelo especializado em pontuar decisões de forma rápida e barata, para roteamento, classificação e controle de fluxos de trabalho. Segundo a empresa, supera LLMs e outros modelos de decisão nessas tarefas.
    • How the Claude Code team does code review (claude.dev Blog)
      Com o Claude escrevendo cerca de 90% do código do Claude Code, o time trocou a revisão linha a linha por camadas: verificação antes do PR, revisão por agentes com votação para filtrar falsos positivos, revisão de segurança que bloqueia o merge, aprovação humana conforme o risco da mudança, feature flags e rollback rápido. Entre junho e setembro, os PRs mesclados mais que dobraram e a taxa de reverts caiu mais de 40%. O artigo fecha com um checklist para adotar o processo no seu time, incluindo o uso de um REVIEW.md e um limite de rodadas de revisão.
    • Como a Anthropic faz Code Review (o que dá pra copiar) (Pascoadev)
      O Pascoadev comenta o artigo acima, com foco no que dá para trazer para o seu time. Bom complemento para quem prefere vídeo ou quer uma leitura mais prática do processo.
    • Os Erros Que Fizeram Minha Startup Falir (Augusto Galego)
      Um relato em primeira pessoa sobre o que deu errado na startup do Galego. Raro ver alguém da nossa área falar de fracasso com essa franqueza, e aprender com o erro dos outros sai bem mais barato do que com o próprio. Vale para quem empreende e para quem pensa em empreender.

    Canais para seguir

    • Gambiarra Labs
      O canal do Michel Leonardo, que leva agentes de IA a projetos fora do comum para ver até onde eles vão. Foi dele o vídeo do sistema operacional que só roda Doom, da lista da semana passada.
    • Bytada
      Conteúdo técnico para quem quer se valorizar como dev na era da IA: DevOps, system design, programação e engenharia de IA.

    Se você tem um link que vale a pena, responda este e-mail com a sugestão. Eu leio todas.

  • Capacitação Microsoft AI — Aula 6: seu primeiro agente com o Microsoft Agent Framework

    Este é o sexto de oito artigos que acompanham as aulas da Capacitação Microsoft AI 2026, que Otávio Lourenço da Silva e eu ministramos ao vivo entre agosto e setembro. As gravações continuam no ar; os artigos existem para quem prefere ler, revisar ou copiar o código com calma.

    O que a aula cobriu

    As aulas 1 a 3 já tinham montado a base: mesmo modelo, mesmo recurso Foundry, mesma identidade e o AIProjectClient de sempre. A sexta aula não troca nada disso — ela envolve esse cliente com AsAIAgent(modelo, nome, instruções) e, de repente, você tem um agente. Com nome, com instruções fixas e, a partir daí, com memória de conversa. O agente roda no seu processo; nada é criado do lado do serviço. Não é um recurso novo para provisionar, é uma camada em cima do que já existia.

    Três ideias para levar

    1. Um agente é o cliente de sempre, só que com nome e instruções

    Não existe um serviço de “agentes” separado para criar e gerenciar. AsAIAgent é um método de extensão sobre o client que você já usava desde a aula 3 — ele recebe o nome do deployment, um nome para o agente e as instruções (o equivalente ao system prompt) e devolve um objeto com os mesmos dois jeitos de responder que você já conhecia.

    var agente = client.AsAIAgent(
        model: deploymentName,
        name: "Assistente de Férias",
        instructions: "Responda com base na política de férias da empresa.");
    
    var sessao = agente.GetNewSession();
    var resposta = await agente.RunAsync("Quantos dias de férias eu tenho por ano?", sessao);

    2. RunAsync e RunStreamingAsync continuam sendo a escolha de sempre

    RunAsync devolve a resposta completa de uma vez — cada chamada, isolada, começa do zero se você não passar uma sessão. RunStreamingAsync entrega token a token, do mesmo jeito que o streaming de chat das aulas anteriores. A novidade não está no transporte da resposta, está no que vem entre uma chamada e outra.

    3. AgentSession tira de você a lista de mensagens

    Até a aula 2, manter contexto significava você mesmo acumular uma lista de mensagens e reenviá-la inteira a cada chamada. Com AgentSession, essa lista passa a viver dentro da sessão: você guarda o objeto da sessão, não o histórico, e o framework decide o que mandar de volta ao modelo. Trocar de assunto no meio da conversa, pedir para o agente “lembrar” algo dito três perguntas atrás — isso deixa de ser código seu para ser comportamento do framework.

    Antes de rodar

    • Pré-requisitos de sempre: .NET SDK 10, az login no tenant certo e um recurso Foundry com um modelo já implantado — mas agora com a função Foundry User atribuída à sua identidade. Ser Owner da subscription não é suficiente; sem esse papel específico, as chamadas do agente voltam com 403.
    • A configuração sai de variáveis de ambiente — FOUNDRY_ENDPOINT (o endpoint do projeto) e FOUNDRY_MODEL (o nome do deployment), opcionalmente AZURE_TENANT_ID e AZURE_TOKEN_CREDENTIALS — definidas num launchSettings.json local e fora do controle de versão.
    • O único pacote novo é o Microsoft.Agents.AI.Foundry (ainda em prerelease), mais o Azure.Identity de sempre. Ele já traz consigo os pacotes Azure AI e Microsoft.Extensions.AI de que precisa. Adicionar esses pacotes de novo, manualmente, numa versão diferente da que o framework espera, costuma travar em runtime com MissingMethodException — e os erros do NuGet (NU1608/NU1605) no build já avisam antes disso.
    • 404 geralmente é endpoint no formato errado; o aviso OPENAI001 aparece quando falta o NoWarn para a API ainda experimental.

    Se você está na trilha Python

    A mesma aula existe em Python 3.12+, na pasta aula06-agent-framework, com o mesmo AIProjectClient e o mesmo endpoint de projeto que você já vinha usando desde a aula 3. A ideia de sessão e a separação entre resposta completa e streaming se repete; o que muda é só a sintaxe. Fixar versões no requirements.txt continua valendo, pelo mesmo motivo da aula 5: evitar que uma atualização silenciosa do pacote mude o comportamento do agente entre uma aula e a próxima.

    Próximo passo

    Rode o exemplo sem passar uma sessão entre duas perguntas que dependem uma da outra — deixe ele “esquecer” de propósito — e depois rode de novo passando a mesma AgentSession nas duas chamadas. A diferença entre as duas execuções é a aula inteira resumida em uma demonstração. Na aula 7 esse agente ganha ferramentas, memória de longo prazo e aprende a trabalhar junto com outros agentes.

    Dúvidas ou algo que não funcionou? Deixe nos comentários ou abra uma issue no repositório.

  • Links da semana — 16/10

    Metade da lista desta semana é sobre o Jev, a IA que decide em vez de escrever texto, e sobre os testes que a comunidade já fez com ele. Depois vêm dois vídeos de arquitetura e uma curiosidade para o fim de semana.

    Inteligência artificial

    • Jev: o novo hype da IA para devs (que não é hype) — Código Fonte TV (vídeo)
      O vídeo explica o que muda com o Jev, da TypeSafe AI. Em vez de gerar texto token a token e torcer para o JSON vir certo, você manda o estado, faz perguntas tipadas (escolha, nota ou sim/não) e recebe valores prontos para o código usar, cada um com probabilidade e nível de confiança. A regra que fica é simples: se a saída vai virar um if no seu código, o Jev faz sentido; se vai ser lida por uma pessoa, continua sendo trabalho de LLM. Os dois se complementam dentro de um agente. A ressalva também importa: respeitar o tipo não garante que a decisão esteja certa. Na sua aplicação, quantas chamadas a LLM são, na verdade, uma decisão disfarçada de texto?
    • Testei o Jev com 34 comentários reais: 4,5x mais rápido que o Claude — pasquadev (vídeo)
      O teste é bem prático: 34 comentários reais do canal, classificados pelo Jev e pelo Claude em oito categorias, com urgência de 1 a 5 e um sim/não para pedido de vídeo. O Jev foi cerca de 4,5 vezes mais rápido na mediana e nunca saiu do formato. Os dois discordaram justamente nos comentários ambíguos, e o Claude levou vantagem por conhecer o contexto do canal. O autor é honesto sobre os limites: sem gabarito não dá para medir acerto, a entrada é só texto e prompt injection continua sendo um risco. Vale também o alerta sobre o paradoxo de Jevons: de tão barato, o modelo pode ser usado demais e a conta final subir. Abaixo de que nível de confiança você mandaria uma decisão para revisão humana?
    • Laya é o fim do Jev? Testei a alternativa open source — Attekita Dev (vídeo)
      A Attekita refaz com o Laya, da ConvAI, o jogo da cobrinha que já tinha montado com o Jev. O Laya roda local, com cerca de 800 MB, e responde em dezenas de milissegundos, bem mais rápido que a API do Jev. Só que a cobra passou a fazer movimentos quase aleatórios e, mesmo depois de reformular os estados, o resultado não chegou ao do Jev. A conclusão dela é que o Laya ainda precisa de ajuste fino para cada caso de uso. Ainda assim, ter uma alternativa open source é bom sinal: confirma que a dor é real e pressiona preço e desempenho. Para decisões dentro do seu sistema, você trocaria precisão por latência baixa e custo zero rodando local?

    Arquitetura

    • CQRS: o padrão arquitetural que todo programador precisa conhecer — Renato Augusto (vídeo, 30 min)
      O Renato começa defendendo o CRUD, que resolve bem a maioria dos sistemas, e só depois mostra onde ele aperta: muito mais leituras que escritas, consultas com vários JOINs e agregações, leitura e escrita disputando CPU, memória, I/O e conexões no mesmo banco. Ele explica por que escalar o banco verticalmente e criar read replicas ajudam até certo ponto, mas não são CQRS, e como separar os modelos de leitura e de escrita abre espaço para usar o banco certo em cada lado. O fechamento sobre trade-offs é a parte mais útil: CQRS fora de contexto é só complexidade extra. No sistema em que você trabalha hoje, leitura e escrita têm mesmo necessidades diferentes, ou o CRUD ainda dá conta?
    • System Design começa por esses building blocks — Augusto Galego (vídeo)
      O Galego monta um guia de revisão para entrevistas de system design, em que a ideia é combinar peças conhecidas para fazer um problema pequeno, como um encurtador de URL, aguentar milhões de usuários. Ele passa por bancos SQL e NoSQL e sharding, filas e garantias de entrega, load balancer e API gateway, serverless contra servidores, monolito contra microsserviços, WAF e rate limiting, arquitetura orientada a eventos, DNS, blob store e CDN, e cache com suas estratégias de invalidação. Com a IA escrevendo boa parte do código, saber escolher e combinar esses blocos pesa ainda mais. Qual deles você teria mais dificuldade para explicar numa entrevista?

    Curiosidades

    • Fiz a IA criar um OS que só roda Doom — Gambiarra Labs (vídeo)
      O Michel Leonardo pediu a um agente de IA um sistema operacional mínimo, sem nada além do necessário para rodar Doom. Foi por partes: um bootloader em assembly testado no QEMU, a passagem do processador do modo de 16 bits para 32 e 64 bits, um driver de teclado com os acentos do português e, por fim, o Doom Generic, que reduz o jogo a cinco funções. Segundo ele, a IA planejou o trabalho, escreveu o Makefile, rodou a máquina virtual, leu os logs e corrigiu os próprios erros; a parte mais difícil foi integrar o jogo. O vídeo é patrocinado pela Moonshot AI, dona do Kimi K3 usado no teste, e o código está no GitHub para quem quiser conferir. Que projeto de baixo nível você escolheria para testar até onde vai um agente de programação?

    Viu algo que merece entrar na próxima lista? Responda este e-mail com a sua sugestão.

  • Capacitação Microsoft AI — Aula 5: RAG end-to-end com avaliação

    Este é o quinto de oito artigos que acompanham as aulas da Capacitação Microsoft AI 2026, que Otávio Lourenço da Silva e eu ministramos ao vivo entre agosto e setembro. As gravações continuam no ar; os artigos existem para quem prefere ler, revisar ou copiar o código com calma.

    O que a aula cobriu

    A quinta aula pega o RAG da aula 4, que já funcionava, e faz a pergunta que a aula 4 não conseguia responder: funcionava bem? O corpus e o índice são os mesmos. O que entra é medição: um pipeline que devolve objeto em vez de texto, quatro métricas de qualidade calculadas por um modelo juiz, um conjunto de seis perguntas com gabarito e dois experimentos — a varredura de top-k e a comparação com e sem ranqueamento semântico — que terminam num relatório em Markdown. A ideia que sustenta a aula: RAG não termina quando a resposta aparece na tela; termina quando você consegue dizer, com número, se ela ficou melhor ou pior que ontem, e qual etapa mudou.

    Três ideias para levar

    1. Um pipeline que só imprime texto não pode ser avaliado

    A mudança de arquitetura da aula cabe num tipo de retorno. PipelineRag.ResponderAsync devolve a resposta junto com os trechos recuperados, o contexto exato que foi para o modelo, o modo de busca, o top-k e a latência. Sem esses dados, não há o que comparar — e qualquer “acho que melhorou” vira opinião.

    public sealed record RespostaRag(
        string Pergunta,
        string Texto,
        ChatResponse Bruta,
        IReadOnlyList<TrechoCitado> Trechos,
        string Contexto,
        IndiceRag.Modo Modo,
        int TopK,
        TimeSpan Latencia);

    2. Groundedness e retrieval são separadas de propósito

    As quatro métricas do Microsoft.Extensions.AI.Evaluation.Quality parecem medir a mesma coisa com nomes diferentes, mas cada uma compara um par distinto. Groundedness compara a resposta com o contexto recuperado; relevance, a resposta com a pergunta; retrieval, os trechos com a pergunta; correctness, a resposta com o gabarito. As três primeiras olham para a resposta, e retrieval olha para o que veio antes dela. Se a resposta piorou e o retrieval continua bom, o problema está no prompt ou na geração; se os dois caíram, está no chunking, no embedding ou no índice. O caso perigoso é relevance alta com groundedness baixa: a resposta parece ótima e é inventada.

    Ao lado do juiz rodam duas conferências determinísticas, que não custam chamada de modelo: recuperou os documentos esperados? Recusou exatamente quando devia? Quando discordam do juiz, costumam estar certas. Metade de um diagnóstico de queda é um Contains.

    3. Meça antes de acreditar — inclusive no slide

    Na varredura de top-k (3, 5 e 10), quase todo mundo aposta que 10 é melhor. Com o corpus da aula, a curva sai plana: cinco documentos viram doze chunks, então top-k 10 traz quase tudo e só o custo em tokens sobe. Esse é o resultado certo, e ensina a ler a tabela — retrieval igual com mais tokens quer dizer que você está pagando por nada. Para ver a curva aparecer, basta reindexar com chunks menores. O mesmo vale para o ranqueador semântico: o ganho prometido nos slides vem de corpora grandes e heterogêneos, e num corpus de cinco documentos ele é pequeno, às vezes nulo. O juiz, por sua vez, também é um LLM — erra, é sensível ao próprio prompt e responde em inglês. Não é a verdade; é um instrumento barato o bastante para rodar a cada mudança.

    Antes de rodar

    • Os mesmos pré-requisitos da aula 4: .NET SDK 10, Azure CLI com az login no tenant certo, um recurso Foundry com deployments de chat e de embeddings e um Azure AI Search no SKU basic ou superior. Se a aula 4 já indexou, o índice desta aula já existe.
    • O modelo juiz é, por padrão, o mesmo deployment de chat. A variável FOUNDRY_JUDGE_MODEL existe para usar outro modelo e reduzir o viés de um modelo se avaliar bem.
    • O endpoint continua sendo o /openai/v1, como na aula 4, e as versões dos pacotes não devem ser alteradas. Os dois pacotes de avaliação entram sem mudar o pivô OpenAI 2.12.0, porque falam com o modelo por IChatClient — o argumento mais prático a favor da abstração.
    • As opções que avaliam o conjunto inteiro fazem dezenas de chamadas ao juiz. Se aparecer 429, é cota do deployment: o código já limita a três perguntas simultâneas, e dá para baixar para uma.

    Se você está na trilha Python

    A mesma aula existe em Python 3.12+, na pasta aula05-rag-avancado, com o pacote azure-ai-evaluation fazendo o papel de juiz — groundedness, relevance, retrieval e similarity com o gabarito — e a mesma varredura de top-k e o mesmo relatório. Em Python não existe o problema de pivô: a versão Python usa o mesmo AIProjectClient e o mesmo endpoint de projeto das aulas anteriores. Fixar versões no requirements.txt continua valendo.

    Próximo passo

    Comece avaliando uma única pergunta: a sexta do conjunto, cujo assunto está no corpus mas cuja resposta não está. O sistema recusa, groundedness e correctness tiram nota máxima e retrieval tira nota baixa — porque os trechos, de fato, não respondem à pergunta. Métrica não é nota de prova; é instrumento, e quem interpreta é você. Depois rode a varredura de top-k, anote seu palpite antes e grave o relatório: é ele que você compara na semana seguinte. Na aula 6 saímos do RAG e construímos o primeiro agente com o Microsoft Agent Framework.

    Dúvidas ou algo que não funcionou? Deixe nos comentários ou abra uma issue no repositório.

  • Code review na era dos agentes: a revisão começa na especificação

    Este texto é uma releitura de um artigo que publiquei em 2019 (leia o original).

    Em 2019 eu escrevi um texto curto sobre o que tinha aprendido em 18 meses de code review. Na época eu estava numa empresa onde nenhuma linha entrava na branch principal sem passar por pelo menos outra pessoa, e confesso que no começo achei isso invasivo. Demorou pouco para eu perceber o contrário: eu aprendia mais com os comentários dos colegas do que com qualquer curso que já tinha feito.

    Sete anos depois, boa parte do código que passa por revisão não foi digitada por uma pessoa. Foi sugerida pelo Copilot, gerada por um agente a partir de uma issue ou montada a partir de um prompt. A conclusão a que cheguei é que a revisão mais importante deixou de acontecer no diff. Ela acontece antes, na especificação, e depois, em gates que nenhum humano precisa executar à mão.

    O que não mudou

    Code review continua sendo uma rua de mão dupla. Você revisa para aprender e para ensinar, não para julgar. O tom continua importando: “isso está errado” e “o que acontece aqui se a lista vier vazia?” apontam para o mesmo problema, mas só o segundo abre uma conversa. E o contexto continua sendo tudo. Revisar um diff sem entender o problema que ele resolve é ler a resposta sem saber a pergunta.

    O que mudou: o revisor virou o gargalo

    Antes, escrever código era a parte cara e revisar era a parte barata. Isso inverteu. Com agentes, uma pessoa abre em uma tarde a quantidade de pull requests que antes levaria uma semana. O código sai bem formatado, com nomes decentes e até com testes, e para na fila de revisão, porque a nossa capacidade de ler e entender não acelerou na mesma proporção. O revisor deixou de ser a segunda opinião e passou a ser, muitas vezes, a primeira pessoa que de fato leu aquele código. Se a gente tentar compensar isso só lendo mais rápido, o resultado é fadiga, e revisor cansado aprova qualquer coisa.

    A revisão começa na especificação

    Existe um detalhe que muita gente esquece: o modelo aprendeu com o código que leu. E nem todo código que ele leu está correto, seguro ou acessível. Sem orientação, o que sai é uma média de tudo o que existe por aí, com os mesmos vícios. A forma mais barata de mudar isso não é corrigir no diff, é dizer com clareza, antes, o que se espera.

    Por isso, se o código nasce de um prompt ou de uma spec, o prompt e a spec são código-fonte, e código-fonte passa por revisão. Nos projetos em que participo, versionamos as instruções que os agentes recebem, os arquivos de contexto do repositório e as specs que originam cada tarefa, e revisamos isso com o mesmo cuidado de um diff. Uma spec ambígua gera dez PRs ambíguos. Uma spec que esquece acessibilidade gera dez telas inacessíveis. Revisar a origem é corrigir uma vez em vez de dez, e é uma forma de ensinar o time inteiro de uma vez.

    Uma boa spec responde, no mínimo: qual problema de negócio estamos resolvendo, quais são os critérios de aceite, quais casos de borda importam, quais restrições de segurança, privacidade e acessibilidade valem, e o que não faz parte do escopo. Se a pessoa que pediu não consegue responder isso, o problema não é do modelo.

    Clean Code, Clean Architecture, SOLID e DDD só fazem sentido se você sabe defender

    Virou comum ver prompts do tipo “use Clean Architecture, SOLID e DDD”. O modelo obedece: cria camadas, interfaces, repositórios, agregados. O código fica com cara de bem feito. Mas cada uma dessas abordagens é uma troca. Clean Architecture compra isolamento ao custo de indireção. DDD compra alinhamento com o negócio ao custo de modelagem e de linguagem que precisa ser construída com quem entende a operação. SOLID levado ao pé da letra vira uma interface para cada classe. Nenhuma delas é grátis, e nenhuma serve para tudo.

    A minha regra é simples: só peça ao modelo uma metodologia, um framework ou uma técnica se você entende e está pronto para responder, numa revisão, por cada um dos prós e contras dela naquele contexto. Se a resposta para “por que esse agregado existe?” é “porque o agente criou”, o padrão virou cerimônia. Escrevi sobre isso em 2019, em O problema não é e nunca foi do DDD, e a IA só deixou o problema mais rápido de se reproduzir.

    Testes, mais do que nunca, são assunto de gente

    Quando o mesmo modelo escreve o código e os testes, os testes tendem a confirmar o que o código faz, não o que o negócio precisa. Eles passam, a cobertura sobe, e ninguém verificou se a regra estava certa. Por isso, testes precisam ser revisados com mais rigor do que nunca e, sempre que possível, escritos por pessoas, com apoio dos times de negócio. Os critérios de aceite da spec viram cenários de teste antes de virar código. Aí sim o agente pode implementar até tudo ficar verde, e o verde passa a significar alguma coisa.

    Gates determinísticos diminuem a fadiga da revisão

    A melhor forma de proteger a atenção de quem revisa é não gastar essa atenção com o que uma máquina verifica de forma determinística, sempre do mesmo jeito. O humano não deveria ser o primeiro a descobrir que o build quebrou ou que uma dependência tem vulnerabilidade conhecida. Os gates que eu considero mínimos:

    • Linters e formatadores, com as regras do time versionadas no repositório.
    • Análise estática de código e de segurança (SAST), incluindo dependências e segredos expostos.
    • Análise dinâmica (DAST) e verificações de acessibilidade automatizadas nas interfaces, sabendo que elas pegam só uma parte dos problemas.
    • Execução dos testes de unidade, integração e ponta a ponta, em cada etapa do desenvolvimento, não só no fim.

    E o mais importante: as mesmas regras compartilhadas em três lugares. Nos hooks do Git, para o desenvolvedor saber antes do commit. Nos hooks do harness do agente, para o próprio agente ser barrado e corrigir sozinho antes de abrir o PR. E no pipeline de CI/CD, como garantia final de que nada passou por fora. Quando a regra é a mesma nos três, o PR que chega para a pessoa já passou por tudo o que é mecânico, e a revisão humana pode se concentrar em intenção, domínio e risco.

    Modelos ajudam a revisar, mas nunca dão a palavra final

    Eu uso modelos na revisão, sim. Mas com duas condições. A primeira: o modelo que analisa precisa ser diferente do que gerou o código. Um modelo revisando o próprio trabalho tende a concordar consigo mesmo e a repetir os mesmos pontos cegos. A segunda: a análise do modelo é apoio, nunca a revisão final. Quando um time trata a aprovação automática como suficiente, o que acontece é que um modelo gera, outro aprova e ninguém entende o que foi para produção.

    O que só uma pessoa pega

    • Intenção. O código faz o que a spec pediu. Mas a spec pediu a coisa certa?
    • Domínio. A regra que só faz sentido para quem conhece a operação, o caso de borda que só aparece no fim do mês, o campo que significa outra coisa naquele sistema legado.
    • Acessibilidade. Esse é o ponto que mais me toca, como pessoa com deficiência visual e usuário de leitor de tela. Código gerado produz interfaces que parecem corretas e que, com frequência, são inutilizáveis com NVDA: botões sem nome acessível, modais que não prendem o foco, ordem de tabulação sem sentido. O modelo aprendeu com uma web que, em sua maioria, é inacessível. Ferramenta automatizada ajuda, mas não substitui alguém testando de verdade.
    • Segurança contextual. Não é a injeção de SQL, que o scanner pega. É saber que aquele endpoint não pode expor aquele campo porque existe um contrato com uma área regulada.

    O que eu levo de 2019 para 2026

    Code review nunca foi sobre encontrar erros. Sempre foi sobre construir entendimento compartilhado. Em 2026, esse entendimento começa na especificação, é protegido por gates determinísticos e termina numa pessoa que sabe responder por cada decisão que foi para produção. A ferramenta que gera o código mudou; a responsabilidade de entender continua sendo nossa.

    E no seu time, como está isso? Vocês já revisam specs e testes com o mesmo cuidado do código, ou a revisão ainda começa e termina no diff? Me conta nos comentários.

  • Capacitação Microsoft AI — Aula 4: RAG com Azure AI Search

    Este é o quarto de oito artigos que acompanham as aulas da Capacitação Microsoft AI 2026, que Otávio Lourenço da Silva e eu ministramos ao vivo entre agosto e setembro. As gravações continuam no ar; os artigos existem para quem prefere ler, revisar ou copiar o código com calma.

    O que a aula cobriu

    A quarta aula junta as três anteriores — o modelo do Foundry e a abstração do Microsoft.Extensions.AI — com um índice vetorial no Azure AI Search. O corpus é um conjunto de políticas internas de uma empresa fictícia, escrito de propósito para que algumas perguntas só ele responda, e para que uma pergunta pareça estar nele e não esteja. É essa segunda situação que sustenta toda a discussão sobre groundedness: o modelo tem que saber admitir quando não sabe, mesmo com os documentos na mão.

    Três ideias para levar

    1. Chunking é um parâmetro, não um detalhe escondido

    O projeto quebra o texto por parágrafo e junta vizinhos até ~800 caracteres — deliberadamente simples, e deliberadamente exposto como parâmetro. Mudar esse número e reindexar, ao vivo, é o experimento mais barato da aula: chunks pequenos demais perdem contexto, chunks grandes demais diluem o sinal na média.

    // Chunking por parágrafo, até ~800 caracteres
    var chunks = IndiceRag.Fatiar(\n texto,\n tamanhoAlvo: 800);

    2. Keyword, vetorial e híbrida acertam coisas diferentes

    A busca por palavra-chave (BM25) acerta códigos, siglas e nomes próprios, mas erra sinônimos. A busca vetorial acerta sentido e paráfrase, mas erra identificadores literais. A híbrida soma os dois com reranking semântico — acerta ambos os casos, ao custo de mais latência. Ver os três modos lado a lado, com os scores visíveis, é o que desfaz a ideia de que RAG é uma caixa-preta única.

    3. RAG não é sempre a resposta certa

    O roteiro de sala faz a mesma pergunta com e sem RAG, três vezes. A primeira mostra o modelo inventando um valor plausível sem os documentos, e citando a fonte certa com eles — o caso óbvio. A segunda mostra RAG atrapalhando: uma pergunta que o modelo já respondia bem ganha uma citação desnecessária, gastando tokens e latência à toa. A terceira é a que vale a aula: um assunto que está no corpus mas cuja resposta específica não está — e o comportamento certo é admitir a ausência, não inventar uma política inteira.

    Antes de rodar

    • .NET SDK 10 e Azure CLI instalados, com az login feito no tenant certo.
    • Um recurso Foundry com dois deployments — um de chat e um de embeddings (text-embedding-3-small) — e um serviço Azure AI Search no SKU basic ou superior (o free não tem ranqueamento semântico).
    • Os papéis Search Service Contributor e Search Index Data Contributor no Search, concedidos tanto à sua conta quanto à identidade gerenciada do recurso Foundry — são identidades diferentes, e esquecer a segunda é a causa mais comum de 403 no playground.
    • Não altere as versões dos pacotes. O projeto converge para OpenAI 2.12.0; adicionar Azure.AI.Projects recria o conflito de pivô das aulas anteriores.

    Se você está na trilha Python

    A mesma aula existe em Python 3.12+, na pasta aula04-rag: chunking, embeddings e os três modos de busca — keyword, vetorial e híbrida com reranking — com o mesmo corpus e o mesmo roteiro de sala. A regra de fixar versões no requirements.txt continua valendo.

    Próximo passo

    Rode o console, indexe o corpus e compare os três modos de busca com uma pergunta que usa sinônimos — a diferença entre keyword e vetorial fica evidente em uma tela. Depois rode o roteiro de sala completo e observe a terceira pergunta: é o slide de groundedness. Na aula 5 entramos em RAG end-to-end com avaliação — groundedness, relevância e uma varredura de top-k.

    Dúvidas ou algo que não funcionou? Deixe nos comentários ou abra uma issue no repositório.

  • Capacitação Microsoft AI — Aula 3: Microsoft Foundry, do recurso ao SDK com streaming

    Este é o terceiro de oito artigos que acompanham as aulas da Capacitação Microsoft AI 2026, que Otávio Lourenço da Silva e eu ministramos ao vivo entre agosto e setembro. As gravações continuam no ar; os artigos existem para quem prefere ler, revisar ou copiar o código com calma.

    O que a aula cobriu

    A terceira aula é a aula da plataforma. Passamos pela arquitetura do Microsoft Foundry — a diferença entre recurso e projeto, os papéis de acesso (RBAC), as conexões com AI Search, Storage e Key Vault, o deploy de um modelo pelo portal e a escolha entre Standard e PTU — e depois voltamos ao código para fechar um ciclo que começou na aula 1. O programa desta aula usa o mesmo modelo, a mesma identidade, o mesmo SDK e o mesmo IChatClient da aula de Fundamentos, com uma única diferença: a resposta chega token a token, em vez de inteira, de uma vez só.

    Três ideias para levar

    1. Recurso, projeto e papel: a plataforma antes do código

    No Foundry, o recurso é a unidade de infraestrutura — é nele que os modelos são implantados e que as conexões com outros serviços do Azure são registradas. O projeto é a unidade de trabalho, com endpoint próprio, e é a ele que a aplicação se conecta: o FOUNDRY_ENDPOINT de todas as aulas termina em /api/projects/<projeto>. E o papel que a sua identidade precisa ter é o Foundry User, atribuído no recurso: ser Owner da subscription concede Actions (criar e apagar), mas chamar o modelo exige DataActions. Quem aprende essa separação uma vez para de esbarrar em 403 Forbidden.

    2. Streaming é uma troca de método, não de arquitetura

    O setup é idêntico ao da aula 1 — AIProjectClient autenticado por DefaultAzureCredential, cliente de Responses para o deployment e conversão em IChatClient. A diferença cabe no laço final: GetResponseAsync vira GetStreamingResponseAsync, que devolve um IAsyncEnumerable<ChatResponseUpdate>. Cada atualização já traz o texto em .Text, sem testar tipo nenhum, e o mesmo laço funcionaria contra qualquer outro provedor.

    ChatOptions options = new();
    
    await foreach (ChatResponseUpdate update
        in chatClient.GetStreamingResponseAsync(prompt, options))
    {
        Console.Write(update.Text);              // pedaço de texto
    
        if (update.ConversationId is not null)
        {
            options.ConversationId = update.ConversationId;   // elo da próxima pergunta
        }
    }

    Vale rodar esta demo e a de Fundamentos lado a lado, com a mesma pergunta: a percepção de latência muda sem que nada além do método chamado tenha mudado.

    3. O contexto continua no serviço — e chega junto com o fluxo

    Como na aula 1, o programa não guarda histórico: guarda apenas o ConversationId e o serviço cuida do resto. A sutileza do streaming é que esse id chega junto com as atualizações e só é definitivo no fim, por isso o código guarda o último valor não nulo em vez de assumir que ele veio na primeira. Comparado com a aula 2, onde o histórico vive numa lista no cliente, fica claro que a decisão de quem guarda o contexto é independente da decisão de como a resposta é consumida.

    Antes de rodar

    • .NET SDK 10 e Azure CLI instalados, com az login --tenant <tenant-id> feito no tenant certo.
    • Um recurso Foundry com um modelo implantado e o papel Foundry User atribuído à sua conta — ser Owner da subscription não basta.
    • As variáveis FOUNDRY_ENDPOINT (endpoint do projeto, terminando em /api/projects/<projeto>) e FOUNDRY_MODEL (nome do deployment) no seu launchSettings.json. Um único arquivo serve as três primeiras aulas — basta trocar o nome do perfil.
    • Não altere as versões dos pacotes. O projeto converge para o pivô OpenAI 2.9.1; dotnet add package OpenAI, o Azure.AI.Extensions.OpenAI em prerelease ou o Microsoft.Extensions.AI.OpenAI sem versão compilam sem aviso e quebram em tempo de execução com MissingMethodException. O NoWarn de OPENAI001 no .csproj também não é opcional.

    Se você está na trilha Python

    A mesma aula existe em Python 3.12+: AIProjectClient com DefaultAzureCredential, cliente OpenAI obtido do projeto, stream=True para a resposta token a token e contexto no serviço via previous_response_id. A versão Python vai um pouco além: retry exponencial em erros transientes (429 e 5xx) com tenacity, contagem local de tokens com tiktoken para estimar custo antes de rodar em lote, e saída formatada com rich. As versões ficam fixadas no requirements.txt.

    Próximo passo

    Faça um diff entre o Program.cs desta aula e o da aula 1: as seções de setup são idênticas e a diferença cabe no laço final. Depois, se quiser ver o problema de versões ao vivo, rode dotnet add package OpenAI, compile com sucesso, veja o erro em tempo de execução e desfaça — ensina mais sobre grafo de dependências do que qualquer slide. Na aula 4 entramos em RAG, embeddings e Azure AI Search: como dar ao modelo o contexto da sua empresa sem treinar nada.

    Dúvidas ou algo que não funcionou? Deixe nos comentários ou abra uma issue no repositório.

  • Links da semana — 25/09

    Esta semana a lista puxou para dois lados: o que a IA muda no nosso trabalho e o que continua dependendo da gente. São seis links, cada um com o motivo de eu ter guardado.

    • Todo mundo deveria ter uma assinatura de IA? — Lucas Montano (vídeo, 18 min)
      Acompanho o canal do Lucas Montano há algum tempo. Discordo dele em alguns temas, mas neste vídeo concordo. Para mim, hoje uma assinatura de IA é tão essencial para quem vive de software quanto boas ferramentas para um marceneiro, bons pincéis para um pintor ou um bom instrumento para um músico. Estamos falando de profissionais que ganham dinheiro com código e que vão produzir mais com isso. Se você é estudante, vale procurar os programas acadêmicos da sua faculdade. Mesmo sendo mais limitado, também dá para ir longe com os planos gratuitos. E você, já considera a IA uma ferramenta de trabalho ou ainda um gasto opcional?
      O Lucas discute se pagar por uma ferramenta de IA já deixou de ser luxo e virou item básico.
    • Journaling: o melhor hobby para 2026 — Lisa Guerra (vídeo, 9 min)
      Cheguei ao canal da Lisa Guerra quando comecei a cuidar mais da minha saúde mental, e as reflexões dela são muito boas. Hoje meu dia é uma troca constante de contexto: vários agentes, vários projetos e vários chapéus. Com tanta coisa delegada à IA, comecei a me perguntar qual era, afinal, o meu mérito nas entregas. Este vídeo me ajudou a responder. Escrever o que fiz e o que falta fazer, e registrar os avanços nos meus prompts, no meu harness e na conversa com clientes e colegas, me devolveu a sensação de realização. E você, tem um diário ou algum documento onde registra suas conquistas?
      A Lisa, que é psicóloga, explica por que manter um diário vale como hobby e como hábito, com base na terapia cognitivo-comportamental.
    • Eu fechei a minha startup (e aqui os motivos disso) — Fernanda Kipper (vídeo, 37 min)
      Não acompanho muito o conteúdo da Fernanda Kipper, mas me reconheci em vários dos erros que ela conta, cometidos nas vezes em que tentei empreender. Com a IA e o vibe coding, ficou fácil algum influenciador prometer que VOCÊ vai ganhar dinheiro fácil criando um SaaS. Só que ter uma empresa é muito mais do que escrever código: é cliente, vendas, finanças, pessoas e fôlego. Qual desses erros você também já cometeu?
      A Fernanda faz o balanço do primeiro ano da Pora, a startup dela: não conversar com clientes, pivotar para um mercado desconhecido, terceirizar vendas cedo demais e investir em tráfego pago antes do product-market fit, com os números de faturamento do período.
    • Clean Code estragou a cabeça dos devs? — Augusto Galego (vídeo, 10 min)
      Gosto muito do conteúdo do Augusto Galego. Não concordo com todos os pontos, mas ele acerta em levantar o tema. A IA mudou bastante coisa na engenharia de software, e talvez os autores clássicos escrevessem hoje de outro jeito. Ou talvez não. O vídeo me fez pensar em várias outras referências que mereciam ser revisitadas para esse novo mundo. Você concorda com o Galego? Que nota você daria para o Clean Code em 2026?
      O Galego questiona se a forma como o Clean Code foi ensinado atrapalhou o jeito de muitos devs pensarem código.
    • TestSprite (ferramenta)
      Gerar código ficou fácil e rápido. Difícil é ter certeza de que pedimos certo e de que o modelo escreveu certo. Para isso temos linters, testes de unidade e de integração e até testes end-to-end com Playwright. O problema é manter tudo isso a cada mudança, o que dá muito trabalho. Ainda estou testando o TestSprite, que promete transformar em trabalho de agente todo o ciclo de gerar, executar, monitorar e reportar testes, integrado ao seu fluxo de desenvolvimento. Assim que tiver uma opinião mais formada, conto aqui. E você, como está validando o código que a IA escreve?
      Agente de testes end-to-end que escreve os testes, roda a cada mudança e aponta o que quebrou, pela CLI, pela IDE (via MCP), no CI ou no navegador.
    • Dual write: o problema que mais reprova programadores nas entrevistas — Renato Augusto (vídeo, 25 min)
      Acompanho os vídeos do Renato Augusto há bastante tempo porque ele vai fundo nos temas. Os modelos evoluíram e hoje boa parte do código sai da IA, mas se a gente não conhece bons padrões de desenvolvimento, nem entende como certos problemas surgem e como são resolvidos, cai nas mesmas armadilhas do vibe coding. A IA escreve o código, mas quem precisa reconhecer um dual write esperando para quebrar em produção somos nós. Hoje, mais do que nunca, vale não perder os fundamentos. E você, saberia explicar o problema do dual write numa entrevista?
      O Renato explica o que acontece quando o sistema grava em dois lugares (banco e fila, por exemplo) sem garantia de consistência, e por que isso derruba tanta gente em entrevista.

    Viu algo que merece entrar na próxima lista? Responda este e-mail com a sua sugestão.

  • Quais as atribuições de um desenvolvedor em 2026?

    Este texto é uma releitura de um artigo que publiquei em 2019 (leia o original). Sete anos depois, o que mudou?

    Fala galera!

    Em 2019 eu escrevi que a gente tinha deixado de ser “atendedor de pedidos” fazia tempo. Que o desenvolvedor participava de todo o ciclo: da reunião de definição técnica até a monitoração em produção, passando por testes automatizados, pipelines e ambientes montados por código. Terminei o texto falando de métricas e de “times com atitude”, em que ninguém é dono exclusivo de uma atividade.

    Reli o artigo esses dias e a sensação foi curiosa: tudo aquilo continua valendo. Só que a régua subiu. E subiu por um motivo que em 2019 eu não previa com essa velocidade: a inteligência artificial entrou no dia a dia de quem escreve software.

    O que continua igual

    A ideia central do texto de 2019 era simples: o desenvolvedor é responsável pela entrega inteira, não só pelo trecho de código que digitou. Isso não mudou. Se algo quebra em produção às três da manhã, continua sendo problema do time, e não de um “pessoal da infra” que ninguém sabe quem é.

    Automação de testes, deploy contínuo, infraestrutura como código, observabilidade: em 2019 isso era diferencial. Em 2026 é o mínimo. Quem ainda faz deploy na mão está pagando um preço alto e nem sempre percebe.

    E as métricas de uso, que na época eu descrevia como um hobby com dados analíticos, hoje são parte da conversa de produto. Saber qual funcionalidade é usada e qual chamada de API está lenta continua sendo atribuição de quem constrói.

    O que mudou: o gargalo agora é a revisão

    Aqui está a virada. Com o Copilot e os agentes de código, escrever a linha deixou de ser a parte cara do trabalho. Eu descrevo o que quero, o agente propõe uma implementação, roda os testes, ajusta e me devolve um pull request. Em muitos casos, o que levava uma tarde agora leva o tempo de um café.

    Só que revisar código ficou pesado. A gente não consegue revisar na mesma velocidade em que o código é gerado. A revisão virou o gargalo, e por isso ter bons processos de validação desse código deixou de ser detalhe: testes, linters, análise estática, análise de segurança. Tudo isso rodando antes de um humano abrir o diff.

    Isso não significa abrir mão de entender o código. Ainda precisamos saber o que foi feito e como foi feito. A diferença é que a revisão humana passa a focar nos pontos específicos e principais — regra de negócio, segurança, decisões de arquitetura — e deixa para as ferramentas o que pode ser verificado automaticamente.

    E automação de testes hoje não é opcional. A gente entrega mais de uma vez por dia. Se cada entrega tiver de esperar um time de qualidade rodar um novo ciclo inteiro de testes, o produto não sai do lugar. O teste automatizado valida, no mínimo, o caminho crítico da aplicação: garante que nada impede a conversão de um lead em cliente, de um pedido em faturamento.

    Construir o harness virou ofício

    Se em 2019 eu dizia que a gente participava de todo o ciclo, em 2026 eu diria que a gente orquestra o ciclo. E orquestrar tem nome: harness. A gente se especializou em montar o conjunto de agentes e subagentes, skills, tools, hooks e demais recursos que os agentes de codificação oferecem, e em otimizar tudo isso para o nosso processo e, sim, para o nosso projeto. Não existe configuração genérica que sirva para todo mundo.

    Isso inclui orquestrar as demandas entre os agentes, desenhar os loops de trabalho e, principalmente, medir o consumo de tokens. Cada chamada a um modelo tem preço, e um loop mal feito pode consumir em uma hora o orçamento do mês. Gerir esse custo e demonstrar o retorno sobre o investimento é fundamental. Se você não consegue mostrar quanto a IA custa e quanto ela entrega, alguém vai decidir por você.

    Outras atribuições que ganharam peso

    • Escrever a especificação antes do código. O tal spec-driven development. Se o agente vai implementar a partir de uma descrição, a qualidade dessa descrição é o que define a qualidade da entrega. Especificar bem virou habilidade técnica, não burocracia de gerente.
    • Avaliar a saída dos modelos. Quando a aplicação que você constrói usa um modelo de linguagem, “funciona” deixa de ser binário. Você precisa de conjuntos de avaliação, métricas de qualidade da resposta, testes que detectam quando o modelo começou a alucinar depois de uma atualização. Isso é teste automatizado de 2026.
    • Observar a IA em produção. Rastrear prompts, tokens, tempo de resposta, taxa de fallback, o que o agente decidiu fazer e por quê. A observabilidade que eu defendia em 2019 para APIs agora precisa cobrir o raciocínio da aplicação.

    Na mesa do produto, não no balcão de pedidos

    Em 2019 eu dizia que tínhamos deixado de ser tiradores de pedido. Em 2026 isso ficou ainda mais literal. A gente senta junto com os stakeholders para ajudar a definir o plano de produto. Com base nas métricas de negócio, ajuda a decidir se uma nova funcionalidade é viável e rentável ou não. Quando gerar código fica barato, a pergunta mais cara passa a ser o que vale a pena construir.

    Para isso, a gente acompanha as tendências e conhece os jargões do negócio. Afinal, a spec que vai guiar o agente precisa usar a tão famosa linguagem ubíqua que Eric Evans descreve no livro Domain-Driven Design. Se o time técnico e o time de negócio não falam a mesma língua, o agente vai implementar com perfeição a coisa errada.

    Acessibilidade é atribuição de todo mundo

    Tem um ponto que em 2019 eu deixei de fora e hoje não deixo mais. Eu sou pessoa com deficiência visual e uso leitor de tela o dia inteiro, inclusive para revisar o que os agentes de código me entregam. Sei na prática que acessibilidade tratada como “fase final” vira acessibilidade que não acontece.

    E aqui a IA ajuda e atrapalha ao mesmo tempo. Ajuda porque o agente consegue gerar componentes com semântica correta, rótulos e navegação por teclado se você pedir. Atrapalha porque, se você não pedir, ele reproduz o padrão médio da internet, que é ruim. A diferença está na especificação e na validação, que são justamente as atribuições que citei acima. Quem escreve a spec, quem monta os testes automatizados de acessibilidade e quem aprova o pull request decide se a pessoa que usa leitor de tela vai conseguir usar o produto. Não dá mais para terceirizar isso para um especialista no fim do projeto.

    Times com atitude, versão 2026

    Encerrei o texto de 2019 dizendo que a gente não teria mais “donos” de atividades e precisaria de times com atitude. Sete anos depois, acho que acertei o diagnóstico e errei a escala. Não é só que o dev faz um pouco de infra e um pouco de produto. É que o dev agora coordena ferramentas que fazem parte do trabalho por ele, e a atitude que importa é a de quem assume responsabilidade pelo resultado mesmo quando não digitou cada linha.

    Atitude em 2026 é dizer “esse código foi gerado, mas eu entendo o que ele faz e respondo por ele”. É perguntar quanto custa antes de colocar um agente em loop. É recusar um componente bonito que não funciona no teclado. É medir a saída do modelo em vez de confiar no exemplo que funcionou na demo.

    O que não mudou nada é a pergunta de fundo: o que é uma atribuição justa? Continuo achando que existem vagas pedindo um profissional impossível pelo salário que querem pagar. Mas também continuo achando que quem se dispõe a enxergar o ciclo inteiro, e agora a orquestrar o ciclo inteiro, é quem torna a operação viável, especialmente em times pequenos.

    E você? O que virou sua atribuição nesses últimos anos que em 2019 nem existia?

    Até a próxima!