Vibe coding e spec-driven development: quando usar cada um

Vibe coding e spec-driven development: quando usar cada um

A escolha entre vibe coding e spec-driven development decide se a velocidade da IA vira produto ou dívida técnica. Neste artigo, comparamos as duas abordagens e mostramos por que a especificação devolve previsibilidade ao trabalho com agentes.

O que diferencia vibe coding e spec-driven development

Em poucas palavras, vibe coding e spec-driven development divergem sobre onde mora a fonte da verdade. No primeiro caso, ela vive no histórico de uma conversa com o agente.

No segundo, ela vive em arquivos versionados que descrevem o comportamento esperado antes de qualquer linha de código. Por isso, a diferença não está na ferramenta, e sim no contrato que guia a geração.

Os dois modelos usam os mesmos agentes, como GitHub Copilot, Claude Code ou Cursor. Contudo, cada um coloca o desenvolvedor em um papel distinto: explorador em um caso, arquiteto e revisor no outro.

Entender essa diferença evita uma armadilha comum. Muita gente acredita que basta trocar de ferramenta para sair do improviso, quando na verdade o que muda é o processo.

Por que o vibe coding conquistou os desenvolvedores

Andrej Karpathy batizou a prática em fevereiro de 2025. Na ocasião, ele descreveu um jeito de programar em que você se entrega ao fluxo e esquece que o código existe.

A ideia pegou tão rápido que o Collins Dictionary elegeu o termo como palavra do ano de 2025. Em poucos meses, ferramentas como Lovable, Bolt, Replit Agent e Cursor transformaram a prática em rotina para milhões de pessoas.

O apelo é fácil de entender. Você descreve o que quer em linguagem natural, o agente gera o código, e então você testa e pede ajustes até o resultado parecer certo.

Além disso, a barreira de entrada praticamente desaparece. Pessoas sem formação técnica conseguem colocar uma ideia de pé em uma tarde, algo impensável há poucos anos.

Onde a geração exploratória brilha

Na prática, o vibe coding brilha quando o custo de errar é baixo. Protótipos, provas de conceito, scripts descartáveis e demos para validar hipóteses se encaixam bem nesse perfil.

Nesses cenários, descobrir o que você realmente quer construir importa mais do que a qualidade interna do código. Assim, tocar em algo funcionando, ainda que tosco, acelera o aprendizado sobre o problema.

Também vale lembrar que explorar é uma etapa legítima, e nenhuma comparação entre vibe coding e spec-driven development deveria ignorar isso. O problema começa quando o protótipo vira produção sem que ninguém perceba a transição.

O custo escondido do vibe coding em repositórios complexos

Em um repositório pequeno e novo, quase tudo funciona. Entretanto, o cenário muda quando o projeto acumula módulos, regras de negócio implícitas e anos de decisões arquiteturais.

O agente não carrega essas decisões consigo entre uma conversa e outra. Ele enxerga apenas o contexto que cabe na janela atual, e o restante simplesmente deixa de existir para ele.

É aqui que a comparação entre vibe coding e spec-driven development deixa de ser teórica. Quanto maior o repositório, maior o preço de depender da memória de uma sessão de chat.

Deriva de intenção e perda de contexto

Cada novo prompt corrige um detalhe e, sem querer, desloca outro. Com isso, a distância entre o que você pretendia e o que o código faz cresce a cada iteração.

Alguns autores chamam esse fenômeno de deriva de intenção. Ele aparece de formas bem concretas, como um segundo serviço de autenticação criado porque o agente não encontrou o primeiro.

Outro exemplo clássico é a validação duplicada em camadas diferentes. Cada cópia evolui de um jeito, e logo a mesma regra passa a ter três comportamentos distintos.

Além disso, no vibe coding o requisito nunca fica em lugar durável, ao contrário do spec-driven development. Quando alguém precisa entender por que uma regra existe, a única pista é um chat que talvez nem esteja mais acessível.

Por fim, surge a dívida de compreensão. O código funciona, mas ninguém do time sabe explicar como, e isso só fica evidente durante um incidente em produção.

O que os dados mostram sobre manutenção

Os números confirmam a intuição. Uma pesquisa da GitClear com a GitKraken analisou 623 milhões de alterações de código entre 2023 e 2026.

Segundo o levantamento divulgado pela LeadDev, a duplicação cresceu 81% e o reuso caiu 70% em relação ao período anterior à IA. O mesmo estudo indica que commits assistidos por IA já representam cerca de um quarto de todos os commits.

Portanto, o problema deixou de ser marginal. Ele já afeta a base de código de muitas empresas, inclusive daquelas que nunca adotaram o vibe coding de forma oficial.

Outro dado incômodo vem do METR. Em um experimento controlado com 16 desenvolvedores experientes e 246 tarefas reais, quem usou IA levou 19% mais tempo para concluir o trabalho.

Curiosamente, esses mesmos profissionais esperavam ganhar cerca de 24% de velocidade. Ou seja, a sensação de produtividade e a produtividade real podem andar em direções opostas em bases de código maduras.

Um dos fatores apontados é o conhecimento implícito do repositório. Como o agente não acessa essas regras não documentadas, o desenvolvedor gasta tempo revisando, corrigindo e explicando o que o projeto já sabia.

Em resumo, a diferença entre vibe coding e spec-driven development aparece justamente nesse conhecimento implícito. Quando ele vive só na cabeça das pessoas, o agente adivinha, e adivinhação em escala vira dívida técnica.

Spec-driven development como resposta madura ao vibe coding

A resposta da comunidade foi mover a fonte da verdade para fora do chat. Nesse modelo, a especificação vem primeiro, e o código passa a ser a implementação dessa especificação.

Essa ideia não é nova. Test-Driven Development e Behavior-Driven Development já defendiam escrever a intenção antes da implementação, mas os agentes de IA tornaram a prática muito mais barata.

Afinal, o trabalho pesado de transformar intenção em plano e tarefas agora cabe ao agente. Enquanto isso, o humano mantém o controle sobre o que deve ser construído e sobre a revisão do resultado.

Em outras palavras, vibe coding e spec-driven development usam a mesma velocidade de geração. A diferença é que, no segundo modelo, essa velocidade trabalha a favor de um contrato explícito e revisável.

Os três níveis de rigor da especificação

Um artigo publicado no arXiv organiza as abordagens em três níveis de rigor. Essa classificação ajuda a entender que adotar especificações não significa adotar burocracia.

  • Spec-first: a especificação guia a implementação inicial e depois perde relevância.
  • Spec-anchored: a especificação evolui junto com o código e continua sendo verificada.
  • Spec-as-source: a especificação é o único artefato que humanos editam, e o agente gera o código a partir dela.

Na maioria dos times, o ponto de partida realista é o spec-anchored. Dessa forma, a especificação deixa de ser documentação morta e passa a funcionar como referência viva para cada mudança.

Esse detalhe importa porque spec-first sozinho tende a envelhecer rápido. Se ninguém atualiza a spec depois da primeira entrega, o time volta ao improviso em poucas semanas.

Como o Spec Kit organiza o fluxo de trabalho

O Spec Kit é um toolkit open source da GitHub, sob licença MIT, que transforma a especificação em comandos concretos. Ele funciona com diversos agentes, incluindo o GitHub Copilot no VS Code.

Para quem vem do vibe coding, ele é a porta de entrada mais simples para o spec-driven development.

A instalação usa o uv, e a inicialização cria a pasta .specify com templates, scripts e a memória do projeto.

# instala a CLI do Spec Kit
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git

# cria um novo projeto usando o GitHub Copilot como agente
specify init orders-api --ai copilot

Depois disso, o fluxo segue uma sequência de comandos no chat do agente. Cada comando produz um artefato versionado que alimenta o próximo passo.

Comando Artefato gerado Papel no fluxo
/speckit.constitution constitution.md Define os princípios inegociáveis do projeto
/speckit.specify spec.md Descreve a funcionalidade em termos de produto
/speckit.clarify spec.md refinada Resolve ambiguidades antes do plano técnico
/speckit.plan plan.md, data-model.md, contracts/ Desenha a solução técnica
/speckit.tasks tasks.md Quebra o plano em tarefas ordenadas
/speckit.implement Código e testes Executa as tarefas e valida cada etapa

Repare que só o último comando escreve código de produção. Todos os anteriores existem para que, quando o agente começar a implementar, ele já saiba exatamente o que construir e quais limites respeitar.

A constituição como guarda arquitetural

O arquivo .specify/memory/constitution.md é o coração da governança. Nele, o time registra regras que nenhuma funcionalidade pode violar, como padrões de arquitetura, estratégia de testes e contratos de erro.

# Orders API Constitution

## Core Principles

### I. Clean Architecture
The Domain project MUST NOT reference infrastructure packages.

### II. Test-First
Every acceptance scenario MUST have an automated test before implementation.

### III. Error Contract
Every HTTP error MUST return a ProblemDetails payload (RFC 9457).

O plano gerado pelo /speckit.plan começa com uma verificação de conformidade contra essa constituição. Se o desenho técnico quebrar algum princípio, o processo para antes que o agente escreva qualquer código.

É exatamente aqui que vibe coding e spec-driven development se separam de vez. Enquanto o chat esquece decisões, a constituição as reaplica em toda nova funcionalidade, com o mesmo rigor.

Na prática, isso resolve o problema da coerência arquitetural entre sessões. O agente da segunda-feira e o agente da sexta-feira leem as mesmas regras, mesmo que nunca tenham visto a conversa um do outro.

Da especificação às tarefas verificáveis

A especificação descreve o comportamento em cenários testáveis. Um trecho típico do spec.md fica assim:

### User Story 1 - Create an order (Priority: P1)

**Acceptance Scenarios**:

1. **Given** a customer with an empty cart, **When** they submit an order,
   **Then** the API returns 400 with the message "Order must contain at least one item."
2. **Given** a cart with valid items, **When** they submit an order,
   **Then** the API returns 201 with the order id.

Como cada cenário é verificável, ele vira teste automatizado com naturalidade. Em um projeto .NET 10, o primeiro cenário poderia gerar o teste abaixo.

public class CreateOrderTests
{
    [Fact]
    public void Should_reject_order_without_items()
    {
        // cenário 1 da spec.md: pedido sem itens deve ser rejeitado
        var result = Order.Create(customerId: Guid.NewGuid(), items: []);

        Assert.False(result.IsSuccess);
        Assert.Equal("Order must contain at least one item.", result.Error);
    }
}

Assim, a especificação deixa de ser um texto bonito e passa a controlar o que entra no repositório. Se a spec não bloqueia nada, você não pratica spec-driven development: continua no vibe coding, apenas com etapas extras.

Por sua vez, o tasks.md agrupa o trabalho por história de usuário e marca com [P] o que pode rodar em paralelo. Com isso, o agente implementa em fatias pequenas e revisáveis, em vez de uma mudança gigante e opaca.

Vale um alerta honesto, porém. O Thoughtworks Technology Radar observou que algumas ferramentas geram especificações longas e difíceis de revisar, então mantenha cada spec enxuta e focada em uma funcionalidade.

Vibe coding e spec-driven development lado a lado

A tabela abaixo resume as diferenças mais relevantes para quem mantém software em produção.

Critério Vibe coding Spec-driven development
Fonte da verdade Histórico do chat Especificação versionada
Velocidade inicial Muito alta Alta, depois de revisar a spec
Previsibilidade Baixa, resultado probabilístico Alta, resultado verificável
Coerência arquitetural Depende do contexto da sessão Protegida pela constituição
Governança Revisão reativa Gates antes da implementação
Trabalho em equipe Difícil de compartilhar Artefatos revisáveis em pull request
Melhor uso Protótipos e exploração Produto que terá manutenção

Note que vibe coding e spec-driven development não aparecem como rivais na tabela. Na verdade, cada um otimiza uma métrica diferente.

O primeiro reduz o tempo até a primeira versão funcionando. Já o segundo reduz o custo total de manter o sistema ao longo dos anos.

Determinismo, aqui, não significa que o modelo responde sempre igual. Significa que o comportamento esperado está escrito, revisado e verificado, então qualquer desvio aparece como falha, não como surpresa.

Da mesma forma, governança não significa aprovação em cinco níveis hierárquicos. Significa que constituição, spec e plano passam pelo mesmo pull request que o código, e a revisão acontece onde o time já trabalha.

Quando usar vibe coding e quando adotar spec-driven development

A decisão depende menos do gosto pessoal e mais do custo de errar. Usar spec-driven development em um script descartável é tão equivocado quanto aplicar vibe coding em um sistema de pagamentos.

Prefira a geração exploratória nestes casos:

  • o código vai para o lixo depois de validar uma hipótese;
  • você ainda não sabe o que quer construir e precisa explorar;
  • o projeto é pessoal, pequeno e sem usuários reais.

Por outro lado, adote a especificação nestes casos:

  • o sistema vai para produção e terá manutenção por anos;
  • várias pessoas ou vários agentes trabalham no mesmo repositório;
  • existem regras de negócio, compliance ou segurança envolvidas;
  • a arquitetura precisa permanecer coerente entre funcionalidades.

Vale lembrar também que o custo da especificação caiu muito. Afinal, o próprio agente redige o rascunho da spec, do plano e das tarefas, e o seu papel é revisar e decidir.

Por isso, o argumento de que spec-driven development atrasa a entrega em relação ao vibe coding perdeu força. Quinze minutos revisando uma spec costumam economizar horas de retrabalho depois que o código chega à produção.

Um fluxo híbrido entre vibe coding e spec-driven development na prática

Muitos times combinam vibe coding e spec-driven development em vez de escolher um só. O segredo está em tornar explícito o momento da transição entre explorar e construir.

  1. Explore a ideia livremente em um branch ou repositório descartável.
  2. Registre o que aprendeu como especificação com o comando de specify.
  3. Descarte o protótipo, ou use-o apenas como referência visual.
  4. Gere plano e tarefas, revise os gates da constituição e só então implemente.

O passo três costuma doer, mas é o mais importante. Código de protótipo carrega as decisões apressadas da exploração, enquanto a implementação guiada pela spec nasce alinhada ao projeto.

Em projetos existentes, o caminho é parecido. Primeiro, você escreve a constituição a partir das regras que o time já segue e, em seguida, aplica o fluxo a cada nova funcionalidade.

Não é preciso especificar o sistema inteiro de uma vez. Ao contrário, cada nova funcionalidade entra pelo fluxo completo, e o legado ganha especificações aos poucos, conforme alguém precisa mexer nele.

Para entender melhor como os agentes raciocinam e por que o contexto pesa tanto nessa dinâmica, leia o artigo O que são Agents? aqui no blog. Ele explica o ciclo de observação, raciocínio e ação que está por trás de todas essas ferramentas.

Conclusão sobre vibe coding e spec-driven development

O entusiasmo com a geração exploratória é legítimo, porque ela encurtou o caminho entre ideia e software funcionando. Contudo, a mesma velocidade cobra juros altos quando o protótipo vira produto sem que ninguém escreva o que ele deveria fazer.

Nesse sentido, vibe coding e spec-driven development representam fases diferentes de maturidade, e não lados de uma disputa. Explore com liberdade, mas leve para produção apenas o que estiver especificado, planejado e verificado.

Com o Spec Kit, a constituição e os gates de revisão, você mantém determinismo, governança e coerência arquitetural. Ao mesmo tempo, continua aproveitando toda a velocidade que os agentes oferecem.

FAQ

Vibe coding é sempre uma má prática?

Não. Ele funciona muito bem para protótipos, provas de conceito e ferramentas descartáveis, desde que o resultado não vá para produção sem revisão.

Spec-driven development deixa o desenvolvimento mais lento?

O início fica um pouco mais lento, porque você revisa a especificação antes do código. Em compensação, o retrabalho cai, e o agente redige boa parte dos artefatos.

Preciso do Spec Kit para aplicar spec-driven development?

Não. O Spec Kit é uma das opções, ao lado de ferramentas como Kiro e OpenSpec, e o essencial é manter uma especificação versionada que guie e valide o código.

O que é a constituição no Spec Kit?

É o arquivo constitution.md com os princípios inegociáveis do projeto. O plano de cada funcionalidade passa por uma verificação contra esses princípios antes da implementação.

Dá para usar spec-driven development em um projeto existente?

Sim. Você escreve a constituição a partir das regras que o time já segue e aplica o fluxo a cada nova funcionalidade, sem precisar especificar o sistema inteiro de uma vez.