Boas-vindas a outro curso da Alura. Neste curso, veremos Spec Driven Development (Desenvolvimento Orientado por Especificação).
Vamos analisar, sob a perspectiva da pessoa desenvolvedora, como utilizamos ferramentas de LLM (Large Language Model, Modelo de Linguagem Grande) para auxiliar no desenvolvimento de software (programa de computador), algo que muitas empresas já demandam no dia a dia para geração de código. No entanto, vamos introduzir estrutura nesse processo de desenvolvimento.
Estamos com o Claude aberto, mas é possível acompanhar este curso com Claude, Gemini, Codex, LLaMA, ou a ferramenta que preferir; qualquer LLM funciona hoje. Contudo, utilizaremos o Claude neste curso.
Vamos estruturar nosso trabalho dentro do Spec Driven Development. Nosso processo de desenvolvimento não será apenas solicitar a geração de código ou de funcionalidades de maneira desorganizada e aleatória. Em vez disso, vamos entender o que precisamos fazer para que o LLM não perca contexto, não se desvie da tarefa, compreenda com clareza o que deve ser feito e quais são os problemas em jogo, além de discutir as diferenças entre escrevermos código diretamente e solicitar que um LLM o faça, sendo nós quem escreve em linguagem natural.
Qual é a diferença entre escrever nesses dois casos? Vamos analisar tudo isso e montar um projeto.
Partiremos de um projeto já preexistente, um projeto de e-commerce (comércio eletrônico), escolhido por ser um domínio muito comum: muitas pessoas o conhecem e, mesmo sem ter trabalhado diretamente nessa área, entendem intuitivamente como funciona. Implementaremos nossa abordagem Spec Driven (orientado a especificação).
Teremos a parte de documentação da arquitetura do nosso sistema, como definimos as regras de negócio, como descrevemos um módulo do nosso sistema, o que é uma especificação de fato, como produzimos uma especificação, de onde a extraímos e por que fazemos dessa maneira. Reuniremos um conjunto de documentos para, ao final, termos nosso sistema implementado.
Como caso de uso, implementaremos o cancelamento de pedidos. Também validaremos essa funcionalidade: haverá uma rotina de testes no Postman (ferramenta de testes de API) para utilizarmos e, como podemos notar, no nosso código também foram implementados testes para garantir que o que solicitamos seja realizado corretamente.
No entanto, quem escreveu esse código — tanto os testes quanto a implementação — foi o LLM (modelo de linguagem grande). Qual problema podemos ter com isso? É uma discussão aberta que teremos: trata-se de uma área que ainda está mudando bastante, mas é um debate muito interessante para o dia a dia de uma pessoa desenvolvedora.
Vamos em frente e estudar.
Vamos iniciar nosso curso de Spec Driven Development (Desenvolvimento guiado por especificação). Estamos com o projeto do curso, isto é, o código que vamos implementar — parte do qual já está pronto. Vamos começar em um projeto já iniciado para adicionar o Spec Driven Development, em um caso mais real e alinhado ao que a maioria de vocês vivencia no dia a dia. Geralmente, já existe uma base de código; dificilmente começamos em um cenário de Greenfield (projeto iniciado do zero), no qual podemos fazer tudo como quisermos.
Vamos trabalhar com um código já preparado, que já possui algumas rotas. Temos uma API REST, um back-end (servidor), e ela está em execução no Docker (plataforma de contêineres). Mantemos o Docker aberto com três contêineres em execução:
Realizamos algumas verificações e temos o Postman com toda a documentação organizada, incluindo:
Tudo isso está preparado para executarmos os testes e evoluirmos a aplicação.
Vamos implementar o Spec Driven Development utilizando esta ferramenta neste projeto, com o suporte da ferramenta de Cloud (nuvem). Mantemos a ferramenta de Cloud aberta para organizar o projeto. Trabalhamos com uma API de e-commerce, na branch principal (main), e vamos usar a Cloud como nossa ferramenta, atuando como agente de IA para conduzir o Spec Driven Development.
Antes de começarmos, precisamos registrar alguns avisos. Tudo o que vamos discutir neste curso ainda está em debate ativo. Não há uma conclusão definitiva nem um consenso geral sobre qual é a melhor forma de aplicar essas práticas ou sobre a relevância exata de cada abordagem.
A relevância do tema está em alta com as IAs. Analisaremos como isso pode evoluir nos próximos anos, o que tende a mudar e o que provavelmente permanecerá. Dada a velocidade atual, mudanças significativas podem ocorrer em poucos meses.
Neste curso, apresentaremos uma discussão ampla e geral, com ideias sobre como implementar o Spec Driven (orientado por especificação), como aplicá-lo e quais pontos críticos levar para o dia a dia ao trabalhar em uma base de código utilizando o Spec Driven. Trata-se de uma discussão abrangente sobre aspectos que podem mudar nos próximos meses, no próximo semestre, ao longo deste ano ou mesmo no ano que vem, considerando o ritmo acelerado da evolução tecnológica.
A evolução ocorre tanto no campo das IAs quanto no dos modelos. Cada novo modelo lançado traz capacidades adicionais. A cada nova versão do Harness (arcabouço), surgem novidades; o próprio Cloud Code (código em nuvem) é um Harness, isto é, uma ferramenta que envolve o LLM. O LLM é uma parte; o Harness é outra. O Harness adiciona habilidades e funcionalidades que podemos utilizar, como as próprias Skills (habilidades), os Workflows (fluxos de trabalho), além da forma de navegar e realizar o scaffolding (geração de estrutura) em nossas pastas. Esses recursos não são necessariamente responsabilidade do LLM, e sim do Harness. À medida que o Harness é atualizado, passamos a contar com novas funcionalidades e vantagens no uso.
Neste curso, nós vamos utilizar um projeto de uma API (Interface de Programação de Aplicações) de e-commerce (comércio eletrônico). Teremos módulos de autorização, carrinho, categorias, pedidos, pagamentos, produtos e usuários. Trabalharemos com esses módulos utilizando o Spec Driven (orientado por especificação). Partiremos de uma base de código já iniciada e mostraremos como incorporar o Spec Driven (orientado por especificação) a esse projeto.
Como dissemos, temos o projeto da nossa API de e-commerce. Vamos trabalhar nele, tomar esse projeto que já possui código e transformá-lo, ou tratá-lo, como um projeto no qual vamos passar a utilizar Spec-Driven Development (desenvolvimento orientado por especificação). Para isso, vamos entender melhor o que isso significa e quais são algumas possibilidades e metodologias.
Novamente, tudo o que vamos dizer aqui pode mudar. Ainda há muita discussão e não existe um consenso geral sobre como abordar essa forma de desenvolver software, que é muito nova.
Entre as metodologias possíveis, podemos começar falando do código como fonte da verdade. Ou seja, o código é a fonte. Essa era a forma como costumávamos operar antes de termos agentes de LLMs (Large Language Models, Modelos de Linguagem de Grande Porte) e antes de conseguirmos gerar código por meio de assistentes. Nesse modelo, sempre escrevemos o código, o código dita as regras, é o que está em produção e é a fonte da verdade.
Entretanto, estamos passando por uma mudança. Com os LLMs e com as IAs, agora temos a especificação. Passamos a criar documentação que descreve e especifica — por isso falamos em “spec” — o que queremos: quais funcionalidades, quais módulos, quais são as regras de negócio e como determinada funcionalidade deve comportar-se. A especificação torna-se a fonte da verdade, uma vez que o LLM pode ler essa especificação, interpretá-la e transformá-la em código.
No cenário ideal, geramos uma especificação bem detalhada, com todos os pormenores; o assistente lê e gera o código exatamente como queremos, atendendo a todas as regras definidas. Assim, a especificação passa a ser a fonte da verdade. Nesse ponto, ocorre uma mudança: saímos do modelo em que o código é a fonte da verdade, com a intervenção direta da pessoa profissional no código, para o modelo em que a especificação é a fonte da verdade, e a intervenção humana ocorre principalmente na especificação. A partir do momento em que isso estiver bem estruturado, uma das possibilidades é deixarmos de tocar no código: quem cuida de 100% dele é o nosso assistente, o LLM.
No mundo real, porém, o que mais deve ocorrer hoje, especialmente se você é uma pessoa desenvolvedora, é algo intermediário. O código continua sendo a fonte da verdade, mas a especificação ainda dita muitos aspectos. É aqui que podemos falar de spec anchor (ancoragem na especificação). Isso não é necessariamente novo: quando começávamos uma feature (funcionalidade), normalmente havia uma pessoa PM, uma pessoa PO que definia a sprint (ciclo de desenvolvimento) conosco, esclarecia dúvidas, e uma pessoa BA fazendo análise de negócio e estabelecendo regras. Já existia uma série de estruturas ao redor do time de TI que forneciam as regras. Em alguns casos, precisávamos definir pontos durante o desenvolvimento, mas havia uma boa infraestrutura para criar documentação que descrevia as regras de negócio, e então seguíamos para a codificação como time de TI.
Esse spec anchor (ancoragem na especificação) é, em linhas gerais, isso: a especificação permanece junto ao código e é utilizada para evoluir o sistema, mantendo-se acoplada a ele, mas isso não impede intervenções diretas no código para modificar o que for necessário. Temos, portanto, os extremos:
Antes de discutir esses motivos, vamos definir o que é a especificação neste contexto. Vamos adotar a definição de Martin Fowler. Em seu blog, há um artigo sobre Spec-Driven Development (desenvolvimento orientado por especificação) com diversas observações. Ele propõe que uma especificação é uma estrutura ou artefato orientado a comportamento — podendo ser um conjunto de artefatos, não necessariamente um único documento — escrito em linguagem natural, que expressa e descreve a funcionalidade e serve de guia para agentes de código baseados em IA.
Portanto, quando falamos de especificação aqui, utilizamos essa definição de Martin Fowler para “spec”. Vale lembrar que, mesmo antes da IA, já existiam várias metodologias para gerar documentação: especificações técnicas, funcionais e não funcionais, análise de requisitos etc. Assim, quando falamos de “spec”, referimo-nos ao documento que servirá principalmente como guia para o nosso agente de IA.
Ele também aponta que existem variantes: cada variante de desenvolvimento orientado por especificação define seu próprio enfoque para essa estrutura. Não há, portanto, uma estrutura única, um senso comum consolidado, nem uma boa prática amplamente difundida que todas as pessoas sigam da mesma maneira. Há várias metodologias e abordagens para Spec-Driven Development, e cada uma define o nível de detalhe, a organização dos artefatos dentro do projeto e a própria estrutura desses artefatos. É uma definição ampla, mas, em resumo, quando falamos de “spec”, referimo-nos a qualquer documento que vai guiar nosso agente de código, escrito em linguagem natural e que descreva a funcionalidade do software.
No nosso dia a dia, teremos um cenário no qual o nosso assistente de IA está no meio do fluxo e precisa considerar alguns elementos — os artefatos. Assim como nós, ao escrever código, precisamos levar certos pontos em conta, o agente de IA também precisa. Podemos dividir esses pontos, de forma geral, em algumas categorias:
As regras podem ser, por exemplo, usar apenas esta stack (pilha) tecnológica.
Nossa stack (pilha) tecnológica é TypeScript, com React, com Jest para realizar testes, e vamos executar tudo em Docker quando for backend (camada de back-end). Nosso banco de dados será SQL.
Aqui estão as políticas; essas são as regras. A arquitetura define como esses elementos se comportam, como se comunicam entre si e como interagem. Portanto, tratamos da arquitetura do software. As necessidades de negócio serão as regras gerais. Para criar qualquer feature (funcionalidade), nosso agente deve considerar esses pontos.
Acima desse conjunto mais fixo — regras, necessidades e arquitetura, que não mudam com tanta frequência — teremos a especificação, que é o documento mencionado anteriormente. Ele descreve uma feature (funcionalidade) específica, um módulo concreto, uma área detalhada, em um nível menor, ou melhor, com maior nível de detalhe, dentro do projeto. A partir disso, geraremos nosso código, que pode ser tanto o código de testes quanto o código de execução em produção. Nosso assistente de IA, representado aqui no centro, precisa considerar todos esses elementos ao gerar o código, pois queremos que o sistema funcione corretamente. Esse será nosso agente. Esse agente partirá da especificação e gerará código.
As demais partes citadas — necessidades de negócio, arquitetura, políticas e regras — colocaremos no que hoje é chamado de memory bank (repositório de memória), que é basicamente o que fica do lado do harness (orquestrador), da Cloud (nuvem), do Gemini ou do Codex que estivermos usando. Também são documentos, mas, diferentemente da especificação, que descreve a funcionalidade do software, eles descrevem a arquitetura e regras mais gerais, restringindo o que o agente pode fazer. Assim, existe uma série de decisões tomadas antes da própria especificação, que guardamos nesse memory bank, que ficará do lado do harness.
Também teremos skills (habilidades). Se tivermos um processo padrão para fazer um PR (pull request), podemos ter uma skill (habilidade) para isso. Se tivermos um processo padrão, um template (modelo) de como uma feature (funcionalidade) deve ser descrita para que a especificação fique correta, podemos ter uma skill (habilidade) para isso. A arquitetura do sistema e as limitações que queremos impor como arquitetura podem ser registradas nesse documento. Vamos manter, em linhas gerais, essa separação de conceitos dentro do nosso sistema durante o desenvolvimento.
Nesse memory bank (repositório de memória), teremos a descrição e o objetivo do sistema, regras de arquitetura, a definição da stack (pilha) de trabalho, workflows (fluxos de trabalho) e templates (modelos) a serem utilizados. De modo geral, esses elementos permanecem nesse memory bank. Entretanto, cada pessoa ou cada abordagem que quisermos aplicar com Spec Driven (orientado por especificação) pode variar isso, adicionando ou removendo itens desse memory bank, dessa caixa de acessórios e artefatos, que nosso agente consultará ocasionalmente.
Teremos de lidar com problemas. Assim como já enfrentávamos problemas no desenvolvimento de software quando trabalhávamos diretamente com código — como transferência de informação entre equipes, desacoplamento, ou conhecimento de negócio centralizado em uma pessoa ou em um time dentro do sistema inteiro —, a manutenção se torna difícil porque o conhecimento não está distribuído por toda a equipe. Esses problemas que surgem quando escrevemos código diretamente em equipe também aparecem aqui ao lidar com a LLM (Large Language Model, Modelo de Linguagem Amplo), pois ela pode ter uma janela de contexto pequena. Embora a janela de contexto venha aumentando com os novos modelos, ela ainda pode ser insuficiente para o tamanho do código que estamos escrevendo ou para o tamanho da feature (funcionalidade) que estamos desenvolvendo.
Além disso, podemos ter má interpretação das regras de negócio por parte do agente. Ao escrevermos em linguagem natural — em português no nosso caso, mas em qualquer língua natural —, há ambiguidade e a possibilidade de termos descrito algo que foi mal interpretado. Na discussão sobre a sintaxe de linguagens de programação versus a forma como falamos e escrevemos em linguagem natural, existe uma diferença muito grande. É nesse ponto que muitas pessoas encontram dificuldades ao aprender programação, porque a sintaxe do código — em JavaScript, C#, ou qualquer linguagem — é muito estrita e feita para eliminar a ambiguidade, enquanto o idioma natural é cheio de ambiguidade e possibilidades de interpretação, não sendo tão exato. Há, portanto, uma discussão importante sobre como descrever e o que escrever para não sermos mal interpretados pelo agente.
Dave Farley, engenheiro de software, signatário de um manifesto e profissional experiente, tem um canal no YouTube sobre engenharia de software. Ele publicou um vídeo, já um pouco antigo — de cerca de um ano ou um ano e meio —, no qual aborda essa diferença entre linguagem de programação e linguagem natural; é um conteúdo muito interessante.
Podemos ter, ainda, regras conflitantes na forma como escrevemos nossos documentos, artefatos e especificações. Se o sistema for muito grande, podemos ter módulos com regras conflitantes; em um trecho do código podemos afirmar uma coisa, na especificação outra e, em outro lugar, algo diferente, gerando conflito. Como resolvemos conflitos nesse caso? Como fornecemos contexto suficiente para que nosso agente entenda se há, de fato, um conflito, ou se existe alguma separação implícita que nós, como pessoas, conhecemos do negócio e do sistema, e que faz com que não haja conflito? Se realmente houver conflito, precisamos lidar com ele.
Frequentemente deixamos coisas implícitas e não comunicamos tudo que o agente precisa. Ao trabalharmos em equipe, existe um conhecimento comum que facilita a comunicação; o jargão técnico de qualquer área também facilita isso. Uma palavra pode significar algo bem mais amplo e acelerar a comunicação. Esse conhecimento implícito, muitas vezes, esquecemos de comunicar à IA, porque a IA não o possui. Precisamos transmiti-lo e ser muito mais rigorosos ao escrever a especificação.
Vamos lidar com esses problemas. Temos uma série de abordagens diferentes para realizar Spec Driven (orientado por especificação). Agora, vamos analisar nossa base e definir o primeiro passo necessário para transformar uma base de código existente em algo Spec Driven (orientado por especificação) e, assim, desenvolver uma feature (funcionalidade) dentro dela.
O curso Spec Driven Development: desenvolvimento assistido por agentes possui 166 minutos de vídeos, em um total de 37 atividades. Gostou? Conheça nossos outros cursos de IA para Programação em Inteligência Artificial, ou leia nossos artigos de Inteligência Artificial.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
O Plano Plus evoluiu: agora com Luri para impulsionar sua carreira com os melhores cursos e acesso à maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Programação, Data Science, Front-end, DevOps, Mobile, Inovação & Gestão, UX & Design, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
Acesso à inteligência artificial da Alura.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri Vision chegou no Plano Pro: a IA da Alura que enxerga suas dúvidas, acelera seu aprendizado e conta também com o Alura Língua que prepara você para competir no mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Chat, busca, exercícios abertos, revisão de aula, geração de legenda para certificado.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Para quem quer atingir seus objetivos mais rápido: Luri Vision ilimitado, vagas de emprego exclusivas e mentorias para acelerar cada etapa da jornada.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Catálogo de tecnologia para quem é da área de Marketing
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais de forma ilimitada.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.