W
WisyLink
ProdutoPreçosAPIBlogContato
Todas as publicações

WisyLink Blog

spec-driven-developmentexecutable-specificationssource-of-truthcode-generationintent-versioning

Desenvolvimento orientado por especificações: quando a especificação se torna o produto

O desenvolvimento orientado por especificações torna a especificação executável a fonte de verdade e o código numa projeção regenerável. O que muda quando as equipas possuem a intenção, não as linhas.

16 de jun. de 20268 min de leitura
Desenvolvimento orientado por especificações: quando a especificação se torna o produto

O desenvolvimento orientado por especificações é a disciplina de tratar uma especificação executável como o artefacto primário que uma equipa possui, com o código gerado como uma projeção descendente dessa intenção. Quando a especificação contém precisão suficiente para regenerar a implementação, a spec torna-se a fonte de verdade — aquilo que os humanos versionam, revisam e discutem — enquanto o código se instala numa camada derivada e substituível por baixo.

  • A especificação torna-se o artefacto duradouro; o código torna-se uma projeção regenerável da mesma.
  • A revisão desloca-se para cima, de diffs de implementação para diffs de intenção.
  • A determinismo da regeneração importa mais do que a elegância de qualquer saída isolada.
  • As especificações acumulam a sua própria dívida quando a intenção diverge do que corre em produção.
  • Versionar a spec altera o que significa "uma alteração" dentro de um sistema.
  • À medida que os sistemas crescem, as costuras entre especificações tensionam-se antes do código o fazer.

Why the specification, not the code, becomes the source of truth

Uma especificação executável refere-se a uma descrição do comportamento pretendido suficientemente precisa para que um gerador possa produzir uma implementação funcional a partir dela sem escrita humana adicional. A mudança que isto introduz é discreta, mas estrutural. Durante décadas, o código foi o artefacto que sobreviveu; comentários, documentos de desenho e tickets degradavam à sua volta, e o programa em execução permanecia o único registo honesto do que um sistema fazia. O enfoque na spec primeiro inverte essa relação.

Quando a intenção é capturada como algo que uma máquina pode executar, a especificação deixa de ser apenas documentação e passa a ser o activo. O código é regenerado a partir dela, e a implementação que existe num dado momento é uma entre muitas projeções válidas. O que sobrevive através das regenerações é a spec. Esse é o cerne da mudança: a coisa mais duradoura no repositório deixa de ser a mais detalhada.

Isto tende a reorganizar a propriedade. O artefacto que uma pessoa defende numa revisão é a declaração de comportamento, não as linhas que a satisfazem. Uma equipa que interioriza isto deixa de tratar o código gerado como precioso e começa a vê-lo como meteorologia — presente, consequente e esperado que mude. O instinto de polir uma função manualmente desvanece, porque o polimento vive a uma regeneração de distância de ser apagado.

What changes when review moves from code to intent

Uma vez que a spec é a fonte de verdade, o centro de gravidade da revisão acompanha-a. Os revisores deixam de ler diffs de implementação linha a linha e passam a ler as alterações à especificação — adições ao comportamento, restrições mais apertadas, pressupostos removidos. O diff de implementação torna-se uma saída para verificar superficialmente em vez de ser o objecto de escrutínio.

Isto é mais difícil do que parece. Um diff de especificação frequentemente parece pequeno enquanto o código regenerado por baixo muda substancialmente. Uma única frase adicionada a uma cláusula de comportamento pode provocar um efeito em centenas de linhas geradas. Os revisores aprendem a raciocinar sobre o raio de impacto de uma alteração de intenção sem ler cada linha projetada, o que é uma habilidade diferente de ler código, e que demora a construir.

Uma troca que surge é a da rastreabilidade. Quando aparece um defeito no código gerado, a questão deixa de ser "quem escreveu esta linha" e passa a ser "que cláusula da especificação a produziu". As equipas que praticam spec-first cultivam o hábito de traçar defeitos até à intenção e depois decidir se a spec estava errada ou se o gerador interpretou mal uma spec correcta. Esse segundo caso é uma categoria própria de bug — uma falha de fidelidade — e não tem equivalente no código escrito à mão.

How regeneration determinism shapes whether the spec can be trusted

Para que uma especificação sirva de fonte de verdade, a regeneração tem de ser previsível o suficiente para se confiar nela. Se a mesma spec produz implementações materialmente diferentes cada vez, a spec não é realmente a fonte de verdade — o humor do gerador é. Assim, a disciplina põe um peso grande no determinismo: saídas estáveis, comportamento de geração fixado e testes que prendam a projeção à intenção.

Há um espectro aqui. A regeneração eager reconstrói a implementação em cada alteração significativa da spec e trata o código como totalmente descartável. A regeneração lazy mantém uma base gerada e reprojeta apenas as partes que uma alteração afecta. Cada abordagem tem custos, e a escolha tende a acompanhar o tamanho do sistema mais do que a preferência da equipa.

PropriedadeRegeneração eagerRegeneração lazy
Permanência do códigoTotalmente descartável; reconstruído na íntegraParcialmente retido entre alterações
Risco de divergênciaBaixo; a saída segue sempre a specMais alto; regiões obsoletas podem persistir
Custo por alteraçãoElevado em computação, baixo em raciocínioBaixo em computação, maior em raciocínio
Modo de falhaSurpresas no sistema inteiroInconsistências localizadas

Nenhum dos extremos é correcto em abstracto. Sistemas pequenos toleram a regeneração eager com baixo custo e beneficiam da garantia de que a saída segue sempre a spec. Sistemas grandes frequentemente não podem dar-se ao luxo de reprojetar tudo e tendem para estratégias lazy, o que reintroduz alguma da divergência que o spec-first pretendia eliminar.

Where specifications accumulate their own kind of debt

A dívida de especificação é a lacuna que se abre quando a intenção escrita já não corresponde ao que o sistema em execução realmente necessita. É o análogo spec-first do código legado, e acumula-se de formas familiares. Cláusulas contradizem-se. Casos limite são acrescentados como excepções em vez de serem integrados no modelo. A especificação cresce por acréscimo até que nenhuma pessoa detenha a sua forma inteira.

A falha é mais subtil do que código emaranhado porque uma especificação pode ler-se de forma limpa enquanto codifica uma intenção incoerente. Uma spec bem formatada, cheia de contradições silenciosas, ainda assim gera algo — apenas gera a coisa errada com confiança. Os revisores podem ser iludidos por uma prosa que parece deliberada, e o gerador nunca objectará a uma contradição da mesma forma que um compilador objeta a um erro de tipos.

Specification drift
A divergência lenta entre a intenção declarada e o comportamento que o sistema realmente requer na prática.
Projection fidelity
O grau em que o código gerado realiza fielmente a especificação sem adicionar ou suprimir comportamento.
Intent surface
O conjunto de cláusulas e restrições que uma alteração deve tocar para alterar deliberadamente o comportamento do sistema.

Gerir esta dívida significa refactorizar especificações da mesma forma que as equipas antes refactorizavam código: consolidando cláusulas, removendo restrições mortas e nomeando o modelo para que a sua forma se mantenha legível à medida que cresce. O trabalho é pouco glamoroso e fácil de adiar, e adiar é exactamente como uma spec limpa se torna opaca.

How a deliberate spec-first change tends to proceed

A ordem de operações num fluxo de trabalho maduro spec-first tende a seguir uma forma consistente, independentemente do domínio. A sequência mantém a especificação como autoridade e evita que o código gerado se torne silenciosamente uma segunda fonte de verdade que compete com a spec. O que importa é menos os passos exactos do que a direcção para a qual cada passo aponta: as alterações entram pela intenção e fluem para fora até à implementação, nunca o inverso.

  1. Declara a alteração de comportamento como uma emenda à especificação, não como uma edição de código.
  2. Codifica a nova intenção como restrições e exemplos que tanto um gerador como uma suíte de testes possam ler.
  3. Regenera a projeção afectada e deixa os testes vinculantes confirmarem a fidelidade.
  4. Inspeciona o diff do comportamento, não o diff de linhas, em relação à intenção declarada.
  5. Incorpora quaisquer surpresas de volta na spec para que a próxima regeneração transporte a lição.

A disciplina vive no passo cinco. Quando uma regeneração nos surpreende, a tentação é corrigir a saída manualmente. Cada correcção manual que não volte para a especificação reabre a lacuna que o spec-first pretendia fechar, e a spec deixa de ser a verdade silenciosamente. A linha corrigida funciona hoje e engana amanhã, no momento em que algo desencadeia uma nova regeneração. As equipas que mantêm a disciplina tratam uma projeção surpreendente como um sinal de que a intenção estava subespecificada, e gastam o esforço para dizer com mais precisão o que queriam em vez de sobrepor a saída ramificadamente.

Where the model strains as systems grow larger

Em pequena escala, uma única especificação segura um sistema inteiro confortavelmente e a regeneração é barata. A tensão aparece nas costuras. Sistemas grandes não são uma única especificação mas muitas, compostas entre si, e os contratos entre especificações tornam-se a superfície frágil — exactamente onde as arquitecturas ordinárias também falham, mas agora um nível acima, na linguagem da intenção em vez de interfaces.

A composição limitada, onde cada especificação possui uma interface clara e reprojeta-se independentemente, tende a escalar. A composição ilimitada, onde especificações entram nas pressuposições umas das outras, produz regenerações que são individualmente válidas mas colectivamente inconsistentes. O acoplamento move-se do código para a intenção, e o acoplamento de intenção é mais difícil de ver porque nada numa única spec parece errado.

A outra tensão é humana. Uma especificação que cresce além do que um leitor pode abarcar torna-se uma forma de legado opaco, e a promessa de que a spec é o artefacto legível e possuído erosiona-se. Manter especificações pequenas o suficiente para raciocinar sobre elas torna-se uma preocupação de primeira ordem, não uma preferência estilística, e as equipas que a ignoram recriam a mesma neblina que deixaram para trás. A disciplina de decomposição que antes governava o código passa agora a governar a intenção, e vem com o mesmo aviso: uma fronteira mal desenhada é mais cara de mover do que não ter fronteira nenhuma.

What the field is becoming as the spec hardens into the product

A trajectória aponta para a especificação a ser tratada como o produto enviado e o código como saída de construção, tal como os binários compilados foram despromovidos décadas atrás. À medida que isso se consolida, os problemas difíceis migram para cima. Versionar intenção, diffar comportamento e rever restrições tornam-se o ofício diário, enquanto ler implementações geradas passa a ser um acto ocasional e diagnóstico reservado para quando a fidelidade falha. As ferramentas seguirão o centro de gravidade, e os artefactos de que uma equipa se orgulha serão as especificações limpas e legíveis em vez do código engenhoso por baixo.

Aquilo que se torna mais difícil é a governação do significado. Quando a spec é o produto, a questão de quem pode mudar que cláusula, e como uma alteração de intenção é validada antes de reprojetar, torna-se a disciplina central. A autoridade sobre uma especificação carrega o peso que a autoridade sobre uma branch de release teve outrora, porque uma única edição pode remodelar o comportamento em todo o local onde a spec projecta.

Os sistemas que resistirão serão aqueles que tratam as suas especificações com o rigor antes reservado ao código de produção — versionadas cuidadosamente, revistas a sério e mantidas pequenas o suficiente para permanecerem honestas. A força na direcção oposta é real, uma vez que uma spec que gera software funcional convida à suposição de que deve ser sólida. Essa suposição é onde a próxima década de lições duras irá aterrar, e as equipas que a resistirem mais cedo gastarão menos a aprender essas lições.

F.A.Q.

Perguntas frequentes

O que é desenvolvimento orientado por especificações?
O desenvolvimento orientado por especificações é uma disciplina em que uma especificação executável é o artefacto primário que uma equipa possui, e a implementação é gerada a partir dela. A especificação torna-se a fonte de verdade, enquanto o código é tratado como uma projeção descendente que pode ser regenerada quando a intenção muda.
Como é que uma especificação executável difere da documentação?
A documentação descreve um sistema depois de ele ser construído e tende a degradar-se à medida que o código evolui. Uma especificação executável é suficientemente precisa para que um gerador produza uma implementação funcional directamente a partir dela, pelo que a especificação permanece autoritativa em vez de divergir para um registo obsoleto.
O que é dívida de especificação?
A dívida de especificação é a lacuna que se abre quando a intenção escrita já não corresponde ao que o sistema em execução realmente necessita. Acumula-se como cláusulas contraditórias e excepções acrescentadas, e ao contrário do código emaranhado pode esconder-se atrás de uma prosa limpa enquanto continua a gerar o comportamento errado com confiança.
O desenvolvimento spec-first escala para sistemas grandes?
Escala quando cada especificação possui uma interface clara e reprojeta-se independentemente, o que mantém o acoplamento visível. Tensiona-se quando as especificações invadem as pressuposições umas das outras, porque as regenerações resultantes podem ser individualmente válidas mas colectivamente inconsistentes, movendo o acoplamento do código para a intenção.
Porque é que o determinismo da regeneração é tão importante?
Se a mesma especificação produz implementações materialmente diferentes cada vez, o gerador passa a ser efetivamente a fonte de verdade em vez da spec. Saídas estáveis e previsíveis, amarradas por testes, são o que permite a uma equipa confiar na especificação como o artefacto durável a partir do qual o sistema é construído.
Partilhar
XLinkedInFacebook
Nesta página
  1. Specification as source of truth
  2. Review moves to intent
  3. Regeneration determinism and trust
  4. When specifications accrue debt
  5. Ordering a spec-first change
  6. Where the model strains at scale
  7. Spec hardening into the product

Documentação

  • Visão geral
  • API
  • CLI
  • GitHub
  • npm

Blog

  • Explorar o blog
  • Mesmo pedido, saída diferente: reprodutibilidade na produção
  • Provar a origem de media gerada por máquina
  • Engenharia do Contexto: Da lapidação de prompts à arquitectura da informação
  • Agentes que Usam Ferramentas: da Resposta à Ação em Inteligência Artificial

Avisos legais

  • Privacidade
  • Termos
  • Empresa

Produto

  • Capacidades
  • Preços
  • Contato
  • Engenharia
WisyLink © 2026·
Feito com ❤️ pela nossa equipa