🎯 ATIVIDADE 03: ENGENHARIA DE REQUISITOS (FR E NFR)
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 03: AS ATIVIDADES DO PROCESSO
Bem-vindo a mais uma etapa da sua jornada no curso de Gestão de TI / Desenvolvimento de Sistemas. Hoje vamos mergulhar em conceitos que conectam a teoria técnica diretamente com o padrão de excelência da indústria, aprendendo a redigir o contrato técnico que guiará todos os programadores. 🛡️🧩
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Diferenciar Requisitos Funcionais (RF) (O que o sistema faz) de Requisitos Não-Funcionais (RNF) (Como o sistema se comporta).
- Redigir requisitos com alto rigor técnico utilizando o padrão de escrita: "O sistema deve...".
- Aplicar uma matriz de priorização de requisitos (Essencial, Importante, Desejável).
🏢 O Cenário Prático (Seu Desafio)
Na TecProExpress, após o seu time decidir utilizar a metodologia ágil (Atividade 02), a diretoria começou a bombardear a equipe com ideias para o novo App de Rastreamento. O diretor de Vendas quer que o App tenha "um mapa bem bonito e rápido". O diretor de Logística quer "um botão de pânico para o motorista".
Ouvindo essas demandas soltas, os desenvolvedores não sabem o que programar primeiro, nem como medir se o mapa é "bonito e rápido" o suficiente.
"Seu desafio é atuar como Engenheiro de Requisitos. Você deve traduzir as falas confusas e abstratas da diretoria em Requisitos Funcionais e Não-Funcionais matemáticos, testáveis e priorizados, criando a lista mestra que o time de desenvolvimento vai usar para trabalhar."
🧠 Fundamentos: A Teoria Traduzida
A Engenharia de Requisitos é a arte de extrair a verdade. Se o requisito for mal escrito, o programador criará o código errado.
Funcional vs Não-Funcional
- Funcional (RF): É uma ação. É um botão que você clica, uma tela que abre, um cálculo que é feito. (Ex: "O sistema deve calcular o frete").
- Não-Funcional (RNF): É a infraestrutura, a performance, a segurança. Você não clica num RNF, você o sente. (Ex: "O cálculo do frete deve ser respondido em menos de 2 segundos").
📊 Visualizando a Lógica
Use sempre o padrão "O sistema deve [AÇÃO] quando [CONDIÇÃO]". Nunca use adjetivos (bonito, rápido, seguro), use métricas exatas!
'O app tem que ser seguro'"] --> B{"Filtro do Engenheiro"} B --> C["RNF01: O sistema deve exigir
uma senha de 8 caracteres
alfanuméricos no login."] ```
📖 Exemplo Guiado
Abaixo, veja como categorizar e escrever requisitos de forma profissional.
| Passo | Fala do Cliente | Tradução da Engenharia |
|---|---|---|
| 01 | "Quero cadastrar meus clientes." | RF01: O sistema deve permitir o cadastro de clientes contendo Nome, CPF e Endereço. |
| 02 | "O mapa tem que carregar rápido." | RNF01: O mapa de rastreio deve ser renderizado em no máximo 3 segundos após o clique. |
| 03 | "Tem que rodar no celular de todo mundo." | RNF02: O sistema deve ser responsivo e suportar os sistemas Android 10+ e iOS 14+. |
📊 Priorização MoSCoW dos Requisitos da TecProExpress
flowchart TD
subgraph MUST [Must Have - Essencial]
M1["RF01: Login do Motorista"]
M2["RF02: Listar Entregas do Dia"]
end
subgraph SHOULD [Should Have - Importante]
S1["RF03: Roteirização Automática"]
end
subgraph COULD [Could Have - Desejável]
C1["RF04: Som ao atribuir carga"]
end
MUST --> SHOULD --> COULD
style MUST fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
style SHOULD fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style COULD fill:#fffde7,stroke:#fbc02d,stroke-width:2px
🛠️ Estrutura de Documentação de Requisitos
# Lista de Requisitos (App Rastreio Express)
## Requisitos Funcionais (RF)
| ID | Descrição | Prioridade |
| :--- | :--- | :--- |
| RF01 | O sistema deve permitir que o motorista faça login via CPF e Senha. | Essencial |
| RF02 | O sistema deve listar as entregas do dia em ordem de distância. | Importante |
| RF03 | O sistema deve emitir um som quando um novo pacote for atribuído. | Desejável |
## Requisitos Não-Funcionais (RNF)
| ID | Categoria | Descrição |
| :--- | :--- | :--- |
| RNF01 | Performance | A listagem de entregas deve carregar em < 2 segundos. |
| RNF02 | Segurança | As senhas devem ser criptografadas em BCrypt no banco. |
🔍 Detalhamento da Documentação:
- A Prioridade salva projetos. Se o prazo apertar, o time corta os requisitos "Desejáveis" para garantir que o "Essencial" suba para produção.
- Categorias de RNF: Podem ser de Performance, Segurança, Usabilidade ou Tecnológicas.
💻 Matriz de Rastreabilidade & Validador de Requisitos em Python
Para auditar se seus requisitos possuem métricas verificáveis e priorização definida, execute o validador:
# validador_requisitos.py
requisitos_funcionais = [
{"id": "RF01", "desc": "Autenticação do motorista via CPF e Senha", "prioridade": "Essencial"},
{"id": "RF02", "desc": "Listagem de entregas ordenadas por distância", "prioridade": "Importante"},
{"id": "RF03", "desc": "Notificação sonoro-visual ao atribuir nova entrega", "prioridade": "Desejável"}
]
requisitos_nao_funcionais = [
{"id": "RNF01", "categoria": "Performance", "criterio": "Tempo de resposta < 2.0s sob 500 req/s"},
{"id": "RNF02", "categoria": "Segurança", "criterio": "Criptografia de senhas com algoritmo BCrypt (salt >= 12)"}
]
print("=" * 65)
print("📋 MATRIZ DE RASTREABILIDADE DE REQUISITOS - TECPROEXPRESS")
print("=" * 65)
print(f"🔹 Requisitos Funcionais ({len(requisitos_funcionais)} catalogados):")
for rf in requisitos_funcionais:
print(f" • [{rf['id']}] [{rf['prioridade']:<10}] {rf['desc']}")
print(f"\n🔸 Requisitos Não-Funcionais ({len(requisitos_nao_funcionais)} catalogados):")
for rnf in requisitos_nao_funcionais:
print(f" • [{rnf['id']}] [{rnf['categoria']:<11}] Critério: {rnf['criterio']}")
print("=" * 65)
🖥️ Saída Esperada no Terminal:
=================================================================
📋 MATRIZ DE RASTREABILIDADE DE REQUISITOS - TECPROEXPRESS
=================================================================
🔹 Requisitos Funcionais (3 catalogados):
• [RF01] [Essencial ] Autenticação do motorista via CPF e Senha
• [RF02] [Importante] Listagem de entregas ordenadas por distância
• [RF03] [Desejável ] Notificação sonoro-visual ao atribuir nova entrega
🔸 Requisitos Não-Funcionais (2 catalogados):
• [RNF01] [Performance] Critério: Tempo de resposta < 2.0s sob 500 req/s
• [RNF02] [Segurança ] Critério: Criptografia de senhas com algoritmo BCrypt (salt >= 12)
=================================================================
🌐 Exemplo de Payload JSON para Catálogo de Requisitos (Swagger /docs)
{
"codigo": "RF01",
"modulo": "Autenticação",
"descricao": "O sistema deve permitir que o motorista faça login via CPF e Senha",
"prioridade": "Essencial",
"criterios_aceite": [
"Retornar token JWT válido por 8 horas",
"Bloquear conta temporariamente após 5 tentativas inválidas"
],
"rastreabilidade_testes": [
"tests/test_auth.py::test_login_sucesso",
"tests/test_auth.py::test_login_bloqueio"
]
}
📤 Instruções de Entrega (Microsoft Teams)
Após validar suas documentações técnicas:
- Salve o arquivo de documentação com o nome
Atividade_03.mdna pastaes-atv-03-requisitos/do seu repositório GitHub. - Certifique-se de fazer o commit e push para o repositório público.
- Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.
💡 Checkpoint de Lógica
Reflexão Profissional: Imagine que você escreveu o seguinte requisito: "RF04: O sistema deve ter uma tela de relatórios legais". Durante a entrega, o cliente recusou o sistema dizendo que o relatório não era "legal" o suficiente. Como engenheiro, onde esteve o erro e como você reescreveria esse requisito para se proteger de recusas futuras? 🧠🛡️
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Requisitos Funcionais (RF) | Menos de 10 RFs ou formulados de maneira ambígua. | 10 RFs formulados mas com falhas na padronização 'O sistema deve'. | Pelo menos 10 RFs perfeitamente numerados (RF01..RF10) com priorização (Essencial/Importante/Desejável). |
| Requisitos Não-Funcionais (RNF) | Menos de 5 RNFs ou sem distinção entre qualidade/desempenho. | 5 RNFs definidos com medição subjetiva. | Pelo menos 5 RNFs numerados (RNF01..RNF05) abrangendo Performance, Segurança e Usabilidade. |
| Entrega no GitHub | Entrega fora da pasta ou repositório inacessível. | Arquivo entregue mas sem tabela Markdown adequada. | `Atividade_03.md` em `es-atv-03-requisitos/` com Markdown impecável. |