POTHIEDU Não Decore a Resposta. Entenda o Caminho

O Que São Requisitos Funcionais

O Que São Requisitos Funcionais

O problema que todo mundo ignora no início do projeto

No meu primeiro projeto de software como consultor, o cliente pediu uma tela de login com autenticação por email e senha. A gente anotou isso como requisito e seguiu em frente. Três meses depois, o mesmo cliente chegou com outra planilha pedindo autenticação por Google, Apple, e OAuth 2.0 com SSO corporativo. O sistema já estava construído. Tivemos que refazer praticamente tudo na camada de identidade porque ninguém tinha perguntado o óbvio: quantos provedores de identidade, qual política de tokens, qual tempo de expiração, se precisava de refresh token, se o OAuth era para mobile ou web, se tinha requirement de MFA. Isso acontece porque requisito funcional não é só anotar o que o sistema deve fazer. É antecipar o que vai dar errado quando a coisa for parar na produção. Eu parei de acreditar em templates de requisitos genéricos depois dessa situação, e a solução prática que eu uso hoje é bem específica: para cada funcionalidade que a equipe vai construir, eu escrevo três camadas antes de abrir uma linha de código. A primeira camada diz o que o sistema faz. A segunda camada diz como ele se comporta nos casos extremos. A terceira camada lista o que o sistema não faz, mesmo que o cliente ache que deveria.

Entendendo o conceito de o que são requisitos funcionais

Requisito funcional é uma declaração precisa sobre um comportamento esperado do sistema. Ele define o que o software deve realizar, como entrada, processamento, saída e interação com outros sistemas ou usuários. Diferente de requisito não funcional, que trata de qualidade, desempenho, segurança ou manutenibilidade, o requisito funcional responde à pergunta operacional direta: o que o usuário espera que o sistema faça quando executar aquela ação. No mercado, a maioria das empresas escreve requisito funcional num formato bem padronizado, usando a frase "o sistema deve" junto com um critério de aceite verificável. Isso não é moda. É técnica. A diferença entre um requisito funcional bem escrito e um mal escrito é que o primeiro não precisa de reunião de esclarecimento na sprint 8. O segundo gera retrabalho, divergência entre desenvolvimento e testes, e aquela conversa chata com o cliente onde todo mundo fica se olhando sem saber quem tem razão. A estrutura que eu recomendo segue quatro componentes. O identificador, um código único como FUNC-0042, serve para rastrear o requisito durante todo o ciclo de vida. A descrição, escrita numa única frase clara sem ambiguidade. O critério de aceite, três a cinco condições mensuráveis que passam ou falham de forma binária. E a prioridade, usando MoSCoW ou uma escala numérica, porque requisito sem prioridade é só uma lista de desejos que nunca será entregue.

A parte que poucos contam é que requisito funcional de verdade carrega metadados invisíveis. A fonte, que setor ou stakeholder pediu. O estado, se está proposto, aprovado, rejeitado ou em mudança. O risco associado, se a funcionalidade envolve dados sensíveis, integração externa crítica, ou dependência de fornecedor terceirizado. E o link trace, que mostra quais requisitos não funcionais aquele requisito funcional depende. Sem esses metadados, o requisito vira um documento morto que ninguém mais consulta depois da reunião de levantamento inicial.

Requisitos Funcionais e Não Funcionais para o EBSERH (TI)
Requisitos Funcionais e Não Funcionais para o EBSERH (TI)

A mecânica prática de escrever e manter requisito funcional

Eu comecei a usar um fluxo bem específico que reduziu drasticamente os retrabalhos no meu time. O processo tem cinco etapas e leva em média quarenta minutos por requisito bem escrito, contra duas horas de conversas intermináveis que a gente gastava antes tentando alinhar o que foi entregue com o que foi pedido. A primeira etapa é a entrevista estruturada. Eu não faço pergunta aberta. Eu pergunto: qual é a entrada exata, qual é o formato esperado, qual é a saída esperada, qual é o erro que o sistema deve mostrar se a entrada estiver errada, e qual é a regra de negócio que determina se a operação é permitida ou bloqueada. Eu gravo a resposta no padrão entrada-processamento-saída-erro-regra, e qualquer resposta que não caiba nesses cinco campos volta para o entrevistado com um pedido de completude. A segunda etapa é a decomposição em casos de uso. Cada requisito funcional é decomposto no menos em dois cenários: o caminho feliz, onde tudo funciona como esperado, e pelo menos um caminho alternativo, onde algo dá errado ou o usuário faz algo inesperado. Raramente preciso de mais do que três variações. Se o requisito pede dez casos de uso, ele está escrito de forma confusa e precisa ser reescrito.

A terceira etapa é a reversibilidade. Eu leio o requisito em voz alta e pergunto: esse requisito pode ser negado sem quebrar outro requisito existente. Se a resposta for não, eu identifiquei uma dependência oculta que precisa ser documentada antes de prosseguir. Essa verificação leva dois minutos e evita que mudanças tardias gerem efeito dominó em módulos já desenvolvidos. A quarta etapa é a escrita formal com linguagem normativa. Eu uso deve para obrigações, não deve para proibições, e pode para permissões. Evito palavras como rápido, eficiente, intuitivo, porque essas palavras são subjetivas e imensuráveis. Se o cliente insiste numa palavra assim, eu transformo o adjetivo num número: rápido significa menos de duzentos milissegundos para carregamento de lista com até mil registros, eficiente significa menos de cinco cliques para completar o fluxo principal, e intuitivo significa que menos de quinze por cento dos usuários precisam de treinamento para concluir a tarefa na primeira vez. A quinta etapa é a revisão cruzada com o responsável por testes. Eu apresento o requisito funcional para o engenheiro de QA antes de Considerando isso, ele é considerado aprovado. Ele vai escrever os casos de teste correspondentes e apontar se há alguma condição que não dá para testar automaticamente, o que geralmente revela ambiguidade que eu não tinha percebido na redação original.

O que eu aprendi na prática é que requisito funcional bem escrito não evita todo problema. O que ele evita é o problema mais caro: o desacordo sobre o que foi entregue versus o que foi contratado. Quando um requisito tem critérios de aceite binários, não cabe argumentação. O teste passa ou falha, ponto final.

Requisitos Funcionais e Não Funcionais: exemplos e diferenças
Requisitos Funcionais e Não Funcionais: exemplos e diferenças

Erros comuns e como evitar

O erro mais frequente que eu vejo em documentos de requisito funcional é a mistura de comportamento com implementação. Quando o documento diz que o sistema deve chamar a API do pagamentos a cada cinquenta milissegundos para verificar o status da transação, ele está descrevendo uma solução técnica, não um comportamento esperado. O requisito funcional correto seria: o sistema deve informar ao usuário o status da transação dentro de dois segundos após o pagamento ser realizado. A implementação é decisão da equipe de engenharia, não do documento de requisito. Outro erro comum é o requisito funcional ambíguo por excesso de generalização. Frases como o sistema deve ser fácil de usar, o sistema deve lidar com grandes volumes de dados, ou o sistema deve ter interface amigável são inutilizáveis para teste. Eu substituo sempre por quantificação mensurável. Fácil de usar significa que um usuário sem treinamento prévio consegue completar o fluxo principal em até três tentativas. Grandes volumes significa até dez mil registros na tabela principal sem degradação perceptível de performance. Interface amigável significa que todos os elementos interativos têm rótulo textual, contraste mínimo de quarenta e cinco por cento sobre o fundo, e tamanhos de toque de pelo menos quarenta e quatro por quarenta e quatro pixels em dispositivos móveis. Existe também o erro da sobre-especificação, que é o oposto da generalização. Nesse caso, o documento de requisito funcional descreve pixels, cores exatas, posições de botões e animações de transição. Isso é especificação de interface, não requisito funcional. A equipe de design pode alterar tudo isso sem impactar o requisito funcional, desde que os critérios de aceite continuem sendo satisfeitos. Misturar essas camadas gera custo desnecessário de mudança quando o design evolui durante o desenvolvimento.

A falha mais silenciosa, e a que mais custa dinheiro, é o requisito funcional sem critério de aceite. Sem critério de aceite, a equipe de teste não sabe quando considera a funcionalidade pronta, o desenvolvedor não sabe quando considera a funcionalidade entregue, e o cliente não sabe quando considera a funcionalidade aceita. O resultado é aquele ciclo interminável de revisões where everyone thinks they are right but nobody can prove it. Um critério de aceite bom é aquele que um terceiro leitor, sem contexto do projeto, consegue aplicar e obter o mesmo resultado binário que o autor pretendia.

Cenários avançados e armadilhas reais

Um dos cenários que mais causa problemas é quando o requisito funcional depende de um sistema externo. Se o sistema precisa consumir uma API de terceiros, o requisito funcional deve incluir claramente o comportamento esperado quando a API externa está indisponível, qual é o tempo máximo de espera, e qual mensagem o usuário deve ver. Eu já vi projeto inteiro travado por semanas porque o requisito funcionai citava a API mas não definia fallback, e quando a API caiu num friday night, ninguém sabia o que fazer. Outro cenário difícil é a questão da conciliação de dados. Quando o sistema precisa sincronizar dados entre múltiplas fontes, o requisito funcional deve especificar qual fonte é a authoritative, qual é a política de resolução de conflito, e qual é a frequência de sincronização. Sem essas informações, cada desenvolvedor implementa uma política diferente, e o resultado é dados inconsistentes que só aparecem em produção. Existe ainda o problema da mudança de escopo disfarçada de requisito funcional. Às vezes, o cliente pede uma funcionalidade nova no meio do projeto justificando que era óbvio que o sistema deveria fazer aquilo. A resposta profissional não é aceitar nem recusar cegamente. A resposta é registrar a solicitação como proposta de mudança, estimar o impacto em prazo e custo, e submeter para aprovação formal do comitê de mudanças. Requisito funcional nunca é só anotar o que o cliente pediu. É documentar o que foi acordado, sob quais condições, e com quais trade-offs conhecidos.

Sabe a diferença entre requisitos funcionais e não funcionais ...
Sabe a diferença entre requisitos funcionais e não funcionais ...

Uma nuance importante que poucos mencionam é que requisito funcional pode ter validade temporal. Alguns requisitos são verdadeiros apenas para uma versão do produto, para um mercado específico, ou sob regulamentação vigente num determinado período. Eu adiciono cláusula de vigência ao metadado do requisito sempre que a funcionalidade depende de fator externo mutável, como legislação, norma técnica, ou política de negócio sujeita a revisão periódica. Isso evita que requisito obsoleto continue sendo considerado válido por engano em auditorias futuras.

A relação com outros artefatos do projeto

Requisito funcional não existe isolado. Ele se conecta diretamente com o modelo de domínio, com a arquitetura do sistema, com os casos de uso, com os testes automatizados e com a documentação de API. Quando o requisito funcional muda, pelo menos quatro artefatos precisam ser atualizados. Se a equipe não mantém essa rastreabilidade, o custo de manutenção cresce exponencialmente a cada Sprint. O modelo de domínio herda entidades e relacionamentos diretamente dos requisitos funcionais. Se o requisito funcional menciona ordem de compra, cliente, produto e status de pagamento, o domínio contém essas entidades. Se o requisito funcional muda o status de pagamento de três valores para sete valores, o domínio muda junto. Manter esse alinhamento exige revisão conjunta entre analista de negócio e arquiteto de software a cada ciclo de planejamento. Os casos de teste são o espelho direto dos critérios de aceite do requisito funcional. Cada critério de aceite deve gerar pelo menos um caso de teste automatizado. Critério de aceite sem caso de teste correspondente é requisito funcional sem garantia de implementação. Esse é um dos indicadores mais confiáveis de qualidade do documento: a razão entre critérios de aceite cobertos por teste automatizado e o total de critérios de aceite escritos. Projetos maduros buscam setenta por cento ou mais de cobertura.

A documentação de API é o contrato visível dos requisitos funcionais que envolvem integração. Se o requisito funcional define um endpoint, método HTTP, payload esperado e resposta esperada, a documentação de API deve refletir exatamente isso, sem adicionar nem omitir informação. Qualquer divergência entre requisito funcional e documentação de API é sinal de que pelo menos um dos artefatos está desatualizado.

Requisitos Funcionais De Um Sistema – HAVJ
Requisitos Funcionais De Um Sistema – HAVJ

Conclusão sobre o que são requisitos funcionais

O tema o que são requisitos funcionais costuma ser explicado de forma acadêmica, com definições teóricas que não refletem a realidade do dia a dia de desenvolvimento. Na prática, requisito funcional é um instrumento de comunicação e gestão de risco. Ele traduz expectativas em compromissos verificáveis, protege a equipe de escopo mutável, e fornece base objetiva para decisão sobre o que está pronto e o que está pendente. A habilidade central não é escrever bonitinho. É pensar até o fundo do problema antes de formalizá-lo no documento. O melhor requisito funcional que eu já vi não era o mais longo nem o mais técnico. Era o mais preciso, com critérios que qualquer pessoa, lendo isoladamente, chegava ao mesmo julgamento de aceitação. E o pior requisito funcional que eu já vi era o que parecia completo mas escondia uma ambiguidade que só apareceu quando o código já estava rodando em produção e o bug chegou no telefone do cliente às onze da noite. O conselho pragmático que eu dou para quem está começando é simples e difícil de seguir: escreva pouco, seja preciso, teste antes de entregar, e jamais considere um requisito funcional como documento finalizado enquanto o responsável por testes não tiver assinado a revisão. O tempo que você economiza na redação cuidadosa inicial se multiplica por dez quando o código precisa ser revisado, corrigido ou reconstruído por ambiguidade não resolvida.