🎯 ATIVIDADE 03: ENGENHARIA DE REQUISITOS (FR E NFR)

📖 Fundamentação Teórica

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

Dica

Use sempre o padrão "O sistema deve [AÇÃO] quando [CONDIÇÃO]". Nunca use adjetivos (bonito, rápido, seguro), use métricas exatas!

```mermaid flowchart LR A["Fica abstrata do cliente:
'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.

PassoFala do ClienteTraduçã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:

  1. Salve o arquivo de documentação com o nome Atividade_03.md na pasta es-atv-03-requisitos/ do seu repositório GitHub.
  2. Certifique-se de fazer o commit e push para o repositório público.
  3. Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.

💡 Checkpoint de Lógica

Importante

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.