MÓDULO 13 · 2 SEMANAS · AI-ASSISTED ENGINEERING

AI-assisted Engineering — amplificar julgamento, não substituí-lo

Spec-driven development, LLMs no ciclo de engenharia, geração e revisão de código com IA, avaliação crítica de output, agentic coding, integração com CI/CD, riscos e limites. Como engenheiros sênior usam IA como multiplicador de capacidade sem perder o controle do que está sendo construído.

Duração ~2 semanas
Conceitos 15 fundamentais
Projeto Spec-Driven Feature
Pré-requisito Módulos 00–12 · todos os conceitos anteriores
Qualidade Operação Legibilidade

Quinze conceitos que tratam IA como ferramenta de engenharia — com as mesmas perguntas que fazemos para qualquer ferramenta: o que ela faz bem, o que ela faz mal, quando usá-la e como avaliar o output. Este módulo está em posição intencionalmente tardia na trilha: as técnicas de AI-assisted engineering fazem sentido completo só quando o engenheiro já tem julgamento independente para avaliar o que a IA produz. Os três últimos conceitos cobrem a infraestrutura de agentes: MCP como protocolo de extensão, taxonomia de tipos de agentes, e como configurar um agente de forma eficaz em contexto real.

01

LLMs para engenharia — capacidades, limites e modelo mental correto

O que LLMs fazem bem (geração de código plausível, transformação de texto, síntese de padrões) e o que fazem mal (raciocínio formal, invariantes de sistema, contagem exata, novidade real). Hallucination como característica, não bug. Por que "o LLM gerou" não é argumento de correção. O modelo mental correto: LLM como pair programmer júnior muito veloz.

estudar →
02

Spec-driven development — escrever specs que LLMs entendem

Especificação antes do código como disciplina independente de IA — e por que IA torna essa prática ainda mais valiosa. Estrutura de uma spec eficaz: contexto, comportamento esperado, exemplos, restrições, não-objetivos. Specs como ferramenta de alinhamento entre humano e IA. A spec como contrato que o código deve satisfazer.

estudar →
03

Agentic coding — Claude Code, Cursor e o novo ciclo de desenvolvimento

A diferença entre LLM como autocomplete e LLM como agente que lê, edita e executa código. Claude Code: arquitetura de agente, ferramentas disponíveis, como o agente usa o contexto do repositório. Cursor: tab completion vs agent mode. O ciclo de trabalho com agente: spec → agente implementa → humano revisa → agente corrige. Quando delegar e quando retomar controle.

estudar →
04

Prompting para engenharia — técnicas que funcionam em código

Chain-of-thought para raciocínio sobre design. Few-shot com exemplos de código idiomático da base existente. Prompts de revisão vs prompts de geração — estruturas diferentes. Como fornecer contexto de repositório de forma eficaz. O problema do "assistente que concorda": como pedir crítica genuína. Iteração de prompt como habilidade técnica.

estudar →
05

Geração de testes com IA — o que funciona e o que não funciona

LLMs são bons em gerar casos de teste para código que já existe (testes de regressão, testes de borda óbvios). São ruins em descobrir casos de borda não-óbvios que requerem conhecimento de domínio. Combinação eficaz: TDD primeiro (humano escreve o teste que falha), IA implementa o código. Property-based testing como complemento — LLM sugere propriedades, humano valida.

estudar →
06

Code review com IA — o que confiar e o que verificar

LLMs em code review encontram bugs óbvios, violações de estilo, problemas de segurança conhecidos. Não encontram: violações de invariante de negócio, problemas de performance não-locais, impacto sistêmico de mudanças. Usar LLM como primeiro passo, não como substituto de revisão por pares. Como estruturar prompts de review para obter feedback útil.

estudar →
07

Refactoring assistido por IA — onde o ganho é real

Refactoring mecânico (renomear, extrair método, mover classe) é onde IA entrega ganho claro — é transformação de código sem mudança de comportamento, exatamente o que LLMs fazem bem. Refactoring arquitetural (reestruturar módulos, mudar contratos entre componentes) requer julgamento humano. Estratégia: LLM executa, humano verifica que o comportamento não mudou via testes.

estudar →
08

Documentação gerada com IA — quando agrega e quando polui

LLMs geram documentação fluente a partir de código — e frequentemente geram documentação que descreve o que o código faz, não o que é não-óbvio. Documentação boa explica o porquê, não o quê. Como usar IA para documentar decisões de design, não apenas comportamento. Risco: documentação gerada automaticamente que fica desatualizada e ninguém mantém.

estudar →
09

IA em pipelines de CI/CD — revisão automática, análise de impacto

LLMs no pipeline como linting semântico: detectar padrões problemáticos que regex não pega. Análise de impacto de PR: quais testes rodar com base em quais arquivos mudaram. Geração automática de changelog a partir de commits. Limites: o pipeline não pode substituir revisão humana para mudanças de contrato ou de comportamento externo.

estudar →
10

Avaliando código gerado por IA — o checklist do revisor

Código gerado por LLM pode ser plausível sem ser correto. O checklist: está testado? trata os casos de borda do domínio (não só os genéricos)? usa as abstrações e padrões do resto da base? tem algum vazamento de segurança sutil? as dependências introduzidas são necessárias? O engenheiro sênior como árbitro final — a responsabilidade não migra para o LLM.

estudar →
11

Riscos e limites — o que a adoção ingênua de IA produz

Dívida técnica acelerada: IA gera código que funciona mas não o engenheiro não entende e não sabe manter. Over-confidence em output plausível. Erosão de habilidade em tarefas delegadas completamente. Exposição de código proprietário em prompts. Copyright de código gerado. Viés de confirmação amplificado. Como usar IA sem criar dependência que fragiliza o time.

estudar →
12

O engenheiro sênior na era da IA — o que muda e o que não muda

O que fica mais valioso: julgamento de design, entendimento profundo de sistemas, capacidade de avaliar output, domínio de contexto de negócio, liderança técnica. O que fica menos diferenciador: digitação veloz, memorização de APIs, geração de código boilerplate. Como construir a carreira para os próximos 10 anos em vez dos últimos 10. Senior is a verb — mais verdadeiro do que nunca.

estudar →
13

MCP — Model Context Protocol e a extensão de capacidades do agente

MCP (Anthropic, 2024) é um protocolo aberto que define como LLMs se conectam a ferramentas externas de forma padronizada: servidores MCP expõem resources (dados), tools (ações) e prompts (templates); clientes MCP (Claude Code, Claude Desktop, Cursor) os consomem. Antes do MCP, cada integração exigia código ad-hoc; com MCP, um servidor escrito uma vez funciona em qualquer cliente compatível. Arquitetura host/client/server, transporte stdio vs SSE, descoberta de capacidades via capability negotiation. Como implementar um MCP server em C#, Python e Go — e quando criar um servidor próprio versus usar um existente (filesystem, GitHub, Postgres, Brave Search, entre dezenas disponíveis).

estudar →
14

Tipos de agentes de IA — taxonomia, arquiteturas e quando usar cada um

Agente de IA é qualquer sistema onde um LLM toma decisões iterativas usando ferramentas e feedback do ambiente. A taxonomia prática: agente reativo (LLM recebe input, usa tools, retorna resultado — sem memória persistente); agente com memória (mantém contexto entre turnos via scratchpad, banco vetorial ou armazenamento estruturado); agente planejador (decompõe objetivos em subtarefas antes de executar — ReAct, chain-of-thought com tools); agente orquestrador (coordena outros agentes especializados); multi-agent systems (vários agentes com papéis distintos colaborando via mensagens). Skills no Claude Code: como encapsular comportamentos reutilizáveis em slash commands customizados, quando criar uma skill vs usar MCP vs escrever código direto. Trade-offs de cada arquitetura: latência, custo, debuggability, risco de erro em cascata.

estudar →
15

Configurando agentes de IA — CLAUDE.md, system prompt, permissões e contexto

A qualidade do output de um agente é diretamente proporcional à qualidade da sua configuração. Os quatro vetores de configuração: (1) instrução persistente — CLAUDE.md no Claude Code define regras de projeto, convenções de código, restrições, tom; system prompt em agentes customizados define persona, escopo e limites; (2) gerenciamento de contexto — o que entra no contexto do agente, como evitar context pollution, compact e compressão de histórico; (3) permissões e ferramentas disponíveis — princípio do menor privilégio aplicado a agentes: o agente não deve ter acesso a ferramentas que não precisa; modo allow-list vs deny-list; (4) configuração de hooks — ações automáticas em eventos do ciclo de vida do agente (pre-tool-call, post-tool-call, pre-commit). Padrões de CLAUDE.md eficaz: estrutura, o que colocar, o que não colocar, e como o agente usa esse arquivo na prática.

estudar →
princípio orientador

LLMs amplificam o que o engenheiro já tem. Um engenheiro sênior com IA produz mais em menos tempo e mantém controle do que está sendo construído. Um engenheiro júnior com IA produz mais código que não entende — o que não é um avanço, é uma nova forma de dívida técnica. Os três últimos conceitos (MCP, tipos de agentes, configuração) fecham o ciclo: não basta usar IA — é preciso entender a infraestrutura que move os agentes e saber configurá-los para o contexto do projeto. A posição deste módulo no final da trilha é intencional: os 12 módulos anteriores são o julgamento que torna o uso de IA produtivo.

AI-assisted engineering ainda está se consolidando como prática. As decisões abaixo não têm respostas definitivas — têm trade-offs que cada time precisa articular explicitamente.

Agente autônomo ou assistente com aprovação humana em cada passo?

Agentes autônomos (Claude Code com permissão total, Cursor agent mode) são mais rápidos mas menos controláveis: podem tomar decisões de design que o engenheiro discordaria, introduzir dependências não-planejadas, ou deletar código "desnecessário" que tinha propósito não-óbvio. Assistente com aprovação em cada passo (o humano aceita ou rejeita cada mudança) é mais lento mas o engenheiro mantém controle do que entra na base. A regra prática que emerge da experiência: agente autônomo para tarefas mecânicas e bem-definidas (gerar testes para código existente, refactoring de nome, gerar boilerplate de padrão estabelecido); aprovação humana para qualquer coisa que afete contratos entre componentes, segurança, ou arquitetura.

Enviar código da empresa para LLMs externos — como avaliar o risco?

Toda requisição a um LLM externo (OpenAI, Anthropic, Google) é uma transmissão de dado para servidor de terceiro. A questão não é "o LLM vai vazar meu código?" — é "estou transmitindo código proprietário para uma infraestrutura fora do meu controle, e quais são as implicações de confidencialidade, compliance e IP?". Algumas empresas resolvem isso com modelos on-premise ou com APIs enterprise que oferecem contrato de não-retenção de dados. Outras estabelecem política de "não enviar código de sistemas críticos". O ponto de partida é o mesmo de qualquer ferramenta SaaS: verificar os termos de serviço, envolver legal e segurança na decisão, e não assumir que "provavelmente é ok" é política suficiente.

TDD first ou LLM first?

LLM first (descrever o que quer e deixar a IA gerar código + testes) é mais rápido no curto prazo mas inverte a ordem: os testes são escritos para passar no código que já existe, não para definir o comportamento esperado antes da implementação. O risco é a suíte de testes que passa mas não captura os comportamentos que importam. TDD first (humano escreve o teste que falha, LLM implementa o código que faz o teste passar) mantém o valor do TDD — especificação executável do comportamento — e usa IA na parte que LLMs fazem bem (implementar um comportamento já definido). Para código novo em domínio complexo, TDD first com LLM implementando é a combinação mais robusta.

Como medir se IA está melhorando ou degradando a qualidade do código da base?

Sem medição, a percepção de "IA está ajudando" é viés de confirmação — você lembra quando acelerou, não quando introduziu bug sutil. Métricas que dão sinal real: taxa de bugs encontrados em review por PR gerado com IA vs sem (se PRs com IA têm mais issues, algo está errado no processo); cobertura de testes em código gerado vs código manual; DORA metrics (frequency, lead time, MTTR, change failure rate) antes e depois da adoção. O que não é métrica útil: "velocidade de geração de código" — código gerado rápido que não funciona em produção é custo, não ganho.

Spec-driven vs prompt-driven: qual o nível certo de formalização?

Prompt-driven: engenheiro descreve informalmente o que quer no chat e itera até o resultado parecer certo. Rápido, mas sem artefato persistente — o raciocínio fica na conversa e não pode ser revisado, versionado ou reaproveitado. Spec-driven: antes de interagir com o LLM, o engenheiro escreve uma spec estruturada (contexto, comportamento esperado, exemplos, restrições). A spec é um artefato de design, independente do LLM — pode ser revisada por pares antes de implementação. O custo é escrever a spec. O retorno é que a spec força clareza de pensamento, serve como documentação, e melhora dramaticamente a qualidade do output do LLM por dar contexto estruturado. Para funcionalidades de mais de 1 hora de implementação, spec-driven paga o investimento.

O projeto pratica spec-driven development do zero ao deploy: escrever a spec antes do código, usar IA para implementar, avaliar criticamente o output, e documentar onde a IA acertou e onde precisou de correção.

PROJETO PRÁTICO

Spec-Driven Feature

Implementar uma feature nova em um dos projetos anteriores (módulos 09, 10, ou 11) seguindo o ciclo completo de spec-driven development com assistência de IA: escrever spec estruturada, usar Claude Code ou ferramenta equivalente para implementar, revisar criticamente o output, iterar, e documentar o processo — incluindo onde a IA errou e o que foi necessário corrigir. O entregável principal é o documento de processo, não o código em si.

REQUISITOS
  • Escolher uma feature de complexidade média: 1-2 dias de implementação manual estimada
  • Escrever spec completa antes de abrir qualquer ferramenta de IA: contexto, comportamento, exemplos, restrições, não-objetivos
  • Usar Claude Code, Cursor agent, ou Copilot Chat para implementar a partir da spec
  • Escrever testes primeiro (TDD): pelo menos 3 testes que definem o comportamento antes da implementação
  • Revisar 100% do código gerado: não aceitar nenhum bloco sem ler e entender
  • Registro de cada ponto onde a IA errou ou precisou de correção — com o que foi errado e por quê
  • Comparar output inicial com o código final aceito: o que mudou e por quê
  • Documento de retrospectiva: o que a IA acelerou, o que atrasou, o que ficou melhor sem IA
  • A feature deve passar em todos os testes existentes do projeto (sem regressão)
  • Code review simulado: usar LLM para revisar o próprio output e registrar o que ele encontrou vs o que você encontrou
Qualidade Legibilidade Operação
STACK SUGERIDA POR LINGUAGEM
FERRAMENTA DE IA
Claude Code (CLI) + GitHub Copilot (IDE) — usar os dois e comparar output para a mesma spec
SUGESTÃO DE FEATURE
  • Adicionar paginação cursor-based ao endpoint de listagem (vs offset-based que já existe)
  • Implementar cache com invalidação por tag usando IMemoryCache + tags customizadas
  • Adicionar webhook delivery com retry e dead letter para eventos de domínio
  • Usar Roslyn analyzer para criar regra custom que detecta o padrão de toil mais comum na sua base
FERRAMENTA DE IA
Claude Code (CLI) + Cursor — usar os dois e comparar saídas para a mesma spec
SUGESTÃO DE FEATURE
  • Adicionar background task com Celery e resultado consultável via polling endpoint
  • Implementar rate limiting por usuário com sliding window usando Redis
  • Adicionar health check detalhado com status de cada dependência downstream
  • Criar middleware de request coalescing: múltiplas requisições idênticas simultâneas viram uma
FERRAMENTA DE IA
Claude Code (CLI) + GitHub Copilot — usar os dois e comparar saídas para a mesma spec
SUGESTÃO DE FEATURE
  • Adicionar circuit breaker genérico com estado observável via /debug/circuit-breakers
  • Implementar graceful shutdown com draining de conexões ativas
  • Criar servidor de eventos SSE (Server-Sent Events) para streaming de atualizações
  • Adicionar structured concurrency com errgroup e cancelamento propagado corretamente
entregável

Repositório com a feature implementada + README documentando: a spec escrita antes da implementação (texto completo), o log de erros da IA e correções aplicadas (tabela com erro, causa, correção), e a retrospectiva honesta — o que a IA acelerou, o que atrasou, e o que você implementaria diferente no próximo ciclo. O documento de processo é mais valioso que o código. Bonus: comparação de output entre duas ferramentas de IA diferentes para a mesma spec.

Perguntas sobre IA em engenharia aparecem cada vez mais em entrevistas de sênior — especialmente em empresas que adotaram ferramentas de AI-assisted coding. O que diferencia respostas fortes é a articulação de limites e riscos, não o entusiasmo.

Q.01

Como você usa IA no seu fluxo de trabalho de engenharia? Dê um exemplo concreto de tarefa onde IA claramente ajuda e um de tarefa onde você deliberadamente não usa.

Q.02

Um engenheiro júnior do seu time está usando Copilot para gerar 80% do código que submete. Os PRs passam nos testes mas você percebe que ele não consegue explicar o código na review. Como você abordaria isso?

Q.03

O que é spec-driven development e por que ele se torna mais valioso quando se trabalha com LLMs? Qual a estrutura de uma spec eficaz?

Q.04

Seu time quer adotar Claude Code ou Copilot Workspace para geração autônoma de código. Quais são os três maiores riscos que você identificaria e como mitigaria cada um antes da adoção?

Q.05

Como as habilidades mais valiosas de um engenheiro sênior mudaram com a chegada de LLMs capazes de gerar código? O que você está desenvolvendo hoje para continuar sendo diferenciado nos próximos 5 anos?