
Passo 1 de 8
Delimitar o problema e o escopo
Defina a fronteira da primeira entrega de uma aplicação de terminal para consultar e corrigir um catálogo JSON local.
Trilha de aprendizado · Nível 15 · Tutorial 1
Delimitar uma aplicação de linha de comando para consultar e atualizar um catálogo local em JSON, definindo comportamentos e critérios de aceitação que orientarão sua implementação e entrega.
Delimitar o problema e o escopo
Defina a fronteira da primeira entrega de uma aplicação de terminal para consultar e corrigir um catálogo JSON local. 1 min
Descrever operações pela intenção do usuário
Mapeie as duas operações da primeira entrega a partir do que a pessoa precisa fazer, identificando entradas, precondições e regras de validade sem decidir a implementação. 2 min
Especificar resultados e efeitos nos dados
Transforme as intenções de consulta e atualização em compromissos funcionais observáveis, incluindo o que deve mudar — e o que deve permanecer preservado. 2 min
Transformar requisitos em critérios de aceitação
Converta compromissos funcionais em cenários concretos, observáveis e decidíveis. 2 min
Tornar compatibilidade, volume e tempo mensuráveis
Transforme expectativas gerais de qualidade em compromissos que possam ser verificados na entrega. 2 min
Ligar requisitos a comandos e evidências
Monte uma matriz que conecte cada compromisso do catálogo ao comando planejado, ao critério de aceitação e à evidência que realmente o comprova. 2 min
Priorizar uma entrega mínima completa
Selecione uma primeira entrega pequena, mas capaz de resolver o fluxo principal do usuário e de ser aceita por evidências concretas. 2 min
Consolidar e revisar a especificação
Reúna os compromissos definidos para o catálogo local e revise se eles podem orientar tanto a implementação quanto a aceitação futura. 3 min

Passo 1 de 8
Defina a fronteira da primeira entrega de uma aplicação de terminal para consultar e corrigir um catálogo JSON local.
A aplicação será útil para uma pessoa que trabalha no terminal e mantém um catálogo local em JSON. Ela precisa localizar um registro pelo identificador e corrigir seu nome quando encontrar uma informação desatualizada ou digitada incorretamente.
Essa é a necessidade do usuário: consultar e corrigir dados existentes. Ela não diz ainda como o programa será organizado internamente.
Exemplo
Uma pessoa que usa o terminal precisa consultar um registro de um catálogo JSON local pelo seu identificador e corrigir o nome desse registro, mantendo os demais dados do catálogo.
Para a primeira entrega, o catálogo já existe. O produto terá duas capacidades: consultar um registro por identificador e atualizar o nome de um registro identificado.
Delimitar o escopo não reduz a utilidade: garante que o fluxo principal possa ser entregue e verificado por completo.
A imagem mostra a fronteira proposta para o produto.

Dentro da fronteira ficam as duas operações que resolvem o problema inicial; fora ficam capacidades adiadas ou não atendidas.
Registre explicitamente as exclusões da primeira entrega:
Uma exclusão não é uma falha escondida: é uma capacidade que não faz parte deste compromisso.
Dica
“Corrigir o nome de um registro pelo terminal” descreve uma necessidade. “Usar uma classe X” ou “organizar em três módulos” descreve uma preferência de implementação. Nesta etapa, defina o que o usuário consegue fazer e o que o produto não cobre.
Escolha a formulação adequada para a primeira entrega.

Passo 2 de 8
Mapeie as duas operações da primeira entrega a partir do que a pessoa precisa fazer, identificando entradas, precondições e regras de validade sem decidir a implementação.
Um caso de uso descreve uma intenção observável da pessoa usuária — não uma função, classe ou sequência interna do programa.
Para o catálogo local, a primeira entrega tem duas intenções:
Evite especificar agora frases como “chamar buscar_por_id” ou “percorrer a lista”. Elas escolhem uma implementação antes de definir o contrato do produto.
Exemplo
✅ “A pessoa consulta o registro de identificador A17 em um catálogo local escolhido.”
❌ “O programa chama uma função que lê o JSON e procura A17 em um dicionário.”
A primeira frase pode ser aceita ou rejeitada ao usar a aplicação. A segunda limita decisões de código que serão tomadas depois.
Use um vocabulário pequeno e consistente:
Assim, a consulta precisa do catálogo local e do identificador. A atualização precisa desses dois dados mais o novo nome.
Compare as informações fornecidas em cada caso de uso.

A atualização inclui todas as entradas da consulta e acrescenta o novo nome.
Exemplo
| Intenção | Informações fornecidas pela pessoa |
|---|---|
| Consultar um registro | catálogo local escolhido; identificador |
| Atualizar um nome | catálogo local escolhido; identificador; novo nome |
Este mapa não determina se essas informações serão digitadas, lidas de argumentos ou obtidas de outra interface. A forma da linha de comando será definida mais adiante.
Uma especificação fica mais clara quando não mistura estas categorias:
A precondição descreve o contexto; a entrada vem da interação; a regra limita valores aceitáveis. Ainda não estamos definindo resultados, mensagens ou alterações no arquivo.
Relacione cada afirmação à categoria adequada.
Toque em um item e depois no par correspondente.
Qual conjunto descreve somente as entradas necessárias para a intenção “atualizar o nome de um registro”?

Passo 3 de 8
Transforme as intenções de consulta e atualização em compromissos funcionais observáveis, incluindo o que deve mudar — e o que deve permanecer preservado.
Um requisito funcional descreve um comportamento observável sob condições definidas. Ele não diz como o código deve ser organizado nem como o JSON deve ser formatado.
Para este catálogo, o requisito precisa deixar claro: em que condição a operação ocorre, o que a pessoa vê e qual efeito acontece nos dados — ou que os dados não mudam.
Use esta sequência para revisar cada requisito: condição → resultado apresentado → efeito no catálogo.

O requisito conecta uma ação observável ao estado dos dados, sem depender da implementação interna.
Exemplo
RF-01 — Consulta: Quando o catálogo local puder ser lido e contiver o identificador informado, a aplicação deve apresentar as informações desse registro e não deve alterar o catálogo.
RF-02 — Atualização: Quando o catálogo local puder ser lido, contiver o identificador informado e receber um nome não vazio, a aplicação deve confirmar a atualização e persistir o novo nome. O identificador do registro e todos os demais registros devem permanecer inalterados.
A confirmação de atualização não basta por si só. O novo nome precisa aparecer em uma consulta feita em outra execução da aplicação.

A evidência de persistência é o catálogo alterado e a nova consulta, não apenas uma mensagem de sucesso.
O contrato deve cobrir situações previsíveis sem supor detalhes de mensagens ou códigos de saída:
Assim, uma tentativa sem condições válidas nunca destrói nem modifica dados existentes.
Atenção
“Exibir erro se algo der errado” é vago: não identifica a condição, nem informa se o catálogo foi preservado. Declare cada situação relevante e o efeito esperado nos dados.
Reescreva este requisito vago: “O programa deve atualizar o nome do produto.” Inclua condição de entrada, resultado observável, mudança persistente e o que deve permanecer inalterado.
Escreva pelo menos 180 caracteres (0/180).

Passo 4 de 8
Converta compromissos funcionais em cenários concretos, observáveis e decidíveis.
Um requisito expressa um compromisso: “A aplicação deve atualizar o nome de um registro existente.”
Um critério de aceitação torna esse compromisso verificável: define um catálogo inicial completo, a ação do usuário e o que deve ser observado depois. Assim, duas pessoas conseguem chegar à mesma decisão sobre a entrega, sem depender de como o código foi organizado.
Use Dado / Quando / Então para separar estado inicial, ação e resultados observáveis.

O cenário começa nos dados conhecidos e termina no que o usuário vê e no estado que permanece salvo.
Exemplo
Requisito: a aplicação deve persistir o novo nome de um registro existente.
Dado um catálogo local com exatamente estes registros:
[
{"id": "p1", "nome": "Caderno"},
{"id": "p2", "nome": "Caneta"}
]Quando a pessoa solicita a atualização do registro p2 para o nome Caneta azul.
Então a aplicação informa que o registro p2 foi atualizado.
E uma nova consulta, em outra execução, ao identificador p2 apresenta o nome Caneta azul.
E o catálogo persistido passa a conter:
[
{"id": "p1", "nome": "Caderno"},
{"id": "p2", "nome": "Caneta azul"}
]O identificador de p2 e o registro p1 permanecem inalterados. O critério não exige uma formatação específica do JSON; exige os dados corretos.
Dica
Não escreva “o sistema atualiza corretamente”. Declare qual valor deve aparecer e qual estado deve permanecer. O resultado esperado deve poder ser determinado apenas pelo catálogo inicial e pela ação descrita — não pela implementação.
Além do sucesso, cubra situações que impedem a atualização:
Esses cenários verificam duas coisas: a resposta ao usuário e a ausência de efeito nos dados. Não repita cenários que provam exatamente a mesma regra com valores diferentes sem acrescentar uma condição relevante.
Exemplo
Dado o catálogo:
[
{"id": "p1", "nome": "Caderno"},
{"id": "p2", "nome": "Caneta"}
]Quando a pessoa solicita alterar o nome do registro p9 para Lápis.
Então a aplicação informa que não existe registro com o identificador p9.
E o catálogo persistido continua contendo exatamente p1 com nome Caderno e p2 com nome Caneta.
Complete o trecho:
E uma nova consulta ao identificador p2, em outra execução, apresenta o nome ____.
Complete o resultado para uma tentativa de atualizar p2 com nome vazio:
E o catálogo persistido permanece ____.

Passo 5 de 8
Transforme expectativas gerais de qualidade em compromissos que possam ser verificados na entrega.
Além de definir o que os comandos fazem, especifique em quais condições eles precisam funcionar. Compatibilidade, capacidade e tempo de resposta são requisitos não funcionais quando incluem uma condição observável e um limite para aprovação.
Evite promessas como “funciona em qualquer computador”, “aceita catálogo grande” ou “é rápido”. Elas não permitem decidir se a entrega foi aprovada.

Um requisito verificável declara o cenário, a medida observada e a regra para aprovar ou reprovar.
Compatibilidade não é suporte universal. Declare versões e plataformas, por exemplo: “A aplicação deve executar em Python 3.11 e 3.12 no Windows 11 e no Ubuntu 22.04 LTS.”
Para capacidade, descreva a carga: quantidade de registros, tamanho máximo de cada nome e tamanho do arquivo JSON. Também separe duas fronteiras:
Exemplo
Vago: “O catálogo deve suportar muitos itens.”
Verificável: “A consulta e a atualização devem operar com catálogos de até 10.000 registros, nomes de até 120 caracteres e arquivo JSON de até 5 MB. Acima de 10.000 registros ou 5 MB, a aplicação deve informar que o catálogo excede o limite e não deve sobrescrever o arquivo.”
Qual requisito de compatibilidade permite uma decisão objetiva de aprovação?
Um limite de tempo só é verificável se disser qual operação, qual carga, em qual ambiente e o que a medição inclui.
Para este catálogo, a fronteira pode ser a execução completa do comando: começa ao iniciá-lo e termina quando ele finaliza, incluindo leitura do JSON, processamento, escrita quando houver atualização e encerramento. Registre processador, memória e tipo de armazenamento; SSD e disco rígido podem produzir resultados diferentes.
Defina também repetições, estatística e limite. Exemplo: usar a mediana de 10 execuções, não apenas uma tentativa favorável.
Exemplo
“Em um computador de referência com processador de 4 núcleos, 8 GB de RAM e SSD, a consulta de um identificador existente em um catálogo JSON de 10.000 registros e até 5 MB deve concluir em até 1,0 s. O tempo será a mediana de 10 execuções completas do comando.”
Dica
Este requisito é um compromisso para a aceitação futura, não uma alegação de que o resultado já foi alcançado. A evidência será registrada depois, nas condições declaradas, com a carga e as medições obtidas.
Qual formulação é suficiente para verificar o tempo de resposta?
Resumo

Passo 6 de 8
Monte uma matriz que conecte cada compromisso do catálogo ao comando planejado, ao critério de aceitação e à evidência que realmente o comprova.
Um requisito só está pronto para ser aceito quando você sabe como verificá-lo. Registre quatro ligações: requisito → comando planejado → critério → evidência.
Os comandos ainda são apenas uma interface planejada, por exemplo catalogo consultar --arquivo catalogo.json --id 7 e catalogo atualizar --arquivo catalogo.json --id 7 --nome "Caderno". Não é necessário decidir agora como o parser será implementado.
A evidência deve testar o compromisso declarado, não apenas uma parte interna do programa.

Cada seta responde: “como saberemos que este compromisso foi cumprido?”
Exemplo
| Requisito | Comando planejado | Critério | Evidência necessária |
|---|---|---|---|
| Consultar um registro existente sem alterar o catálogo | catalogo consultar --arquivo catalogo.json --id 7 | Com o ID 7 existente, apresenta as informações desse registro e o arquivo permanece igual | Saída exibida pelo comando + comparação do conteúdo do arquivo antes e depois |
| Atualizar o nome de um registro | catalogo atualizar --arquivo catalogo.json --id 7 --nome "Caderno" | Com ID existente e nome não vazio, confirma a atualização; o novo nome permanece gravado | Resultado apresentado + arquivo antes/depois + nova consulta em outra execução mostrando “Caderno” |
| Respeitar o limite de tempo declarado | Comando de consulta na carga definida | Nas condições de referência, a estatística escolhida fica dentro do limite | Registro da versão do Python e do sistema, carga usada, ambiente de medição e tempos obtidos |
Dica
Uma mensagem como “nome atualizado” comprova apenas o que foi informado na tela. Para comprovar persistência, compare os dados gravados e faça uma nova consulta em outra execução. Um teste unitário de uma função isolada também não substitui essa evidência do comando disponível ao usuário.
Relacione cada requisito à evidência que o comprova de forma suficiente.
Toque em um item e depois no par correspondente.
Escrever “medir o tempo em cinco execuções” é um plano de verificação. Só será evidência de aceitação quando houver medições registradas nas condições declaradas. Do mesmo modo, uma matriz revela lacunas: se um requisito não tem evidência adequada, ainda não é possível decidir objetivamente se a entrega o cumpre.

Passo 7 de 8
Selecione uma primeira entrega pequena, mas capaz de resolver o fluxo principal do usuário e de ser aceita por evidências concretas.
A primeira entrega deve atender à necessidade central: uma pessoa usa o terminal para localizar um registro do catálogo e, quando necessário, corrigir seu nome de forma durável.
Priorize cada compromisso por երեք perguntas:
Neste catálogo, consulta e atualização persistente formam um conjunto: atualizar sem poder consultar o resultado depois não fecha o fluxo de uso.
A entrega mínima fecha o caminho principal antes de acrescentar extensões.

Pequena e completa: o usuário consulta, corrige, a alteração é salva e pode ser confirmada em outra execução.
Exemplo
Incluir agora
Adiar explicitamente
Adiar esses itens reduz capacidades opcionais; não remove uma parte necessária da consulta ou da atualização prometida.
Dica
Compatibilidade, capacidade e tempo de resposta não são enfeites se fazem parte do contexto declarado. Se a promessa é funcionar em versões e sistemas específicos, com determinado catálogo e limite de tempo, esses requisitos entram na entrega mínima e precisam de evidência futura.
Você precisa definir a primeira entrega do catálogo. Quais compromissos você manteria obrigatoriamente e quais dois ou mais recursos adiaria? Justifique usando a necessidade do usuário, o fluxo completo e a possibilidade de aceitação por evidências.
Escreva pelo menos 120 caracteres (0/120).

Passo 8 de 8
Reúna os compromissos definidos para o catálogo local e revise se eles podem orientar tanto a implementação quanto a aceitação futura.
Uma miniespecificação útil descreve o que será entregue e como será verificado, não como o código será organizado.
Para este produto, o contrato reúne:
A especificação conecta intenção, comportamento observável e evidência.

Cada compromisso precisa chegar a uma verificação observável na aplicação entregue.
Resumo
Use esta síntese como referência de revisão.
Exemplo
Operações planejadas
catalogo consultar <arquivo> <id>catalogo atualizar <arquivo> <id> <novo_nome>Limites da primeira entrega
Evidências previstas
Dica
Os comandos acima são uma interface planejada, não uma exigência de implementar o parser agora. O ponto central é que cada argumento, resultado, alteração e limite possa ser verificado sem inspecionar funções internas.
Revise este rascunho problemático:
“O programa deve gerenciar bem um catálogo grande. O usuário consulta itens e edita nomes rapidamente. A edição deve salvar. O programa funciona nos sistemas comuns.”
Compare-o com o contrato consolidado. Procure termos vagos, comportamentos ausentes, possíveis contradições entre consulta e atualização e promessas sem uma evidência definida.
Quais correções mínimas você registraria para transformar o rascunho em uma especificação verificável? Inclua pelo menos uma correção funcional, uma condição de preservação dos dados, um limite de qualidade e uma evidência.
Escreva pelo menos 180 caracteres (0/180).
Resumo
Use este checklist para avaliar sua miniespecificação.
Parabéns! Você concluiu: Definir requisitos verificáveis para uma aplicação de linha de comando
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks