Pular para conteúdo

Aula 19 - Estimativa de Esforço em Software e Métricas de Pontos de Função 📐

Objetivo Pedagógico

Objetivo: Aplicar métodos científicos de medição e estimativa de software utilizando Análise de Pontos de Função (APF - IFPUG), Funções de Dados (ALI/AIE), Funções de Transação (EE/SE/CE) e modelos empíricos como COCOMO II.


📑 1. Fundamentos Teóricos & Análise Técnica

Estimar projetos de software utilizando linhas de código (LOC) é falho e distorcido, pois linguagens modernas exigem muito menos linhas que linguagens legadas para expressar a mesma funcionalidade de negócio.

A Análise de Pontos de Função (APF), normatizada pela ISO/IEC 20926 e mantida pelo IFPUG (International Function Point Users Group), mede o software a partir da perspectiva do usuário, mensurando o tamanho funcional de forma independente da tecnologia: 1. Funções de Dados (Armazenamento Lógico): - Arquivo Lógico Interno (ALI): Grupo de dados logicamente relacionados mantido internamente dentro da fronteira da aplicação (ex: tabelas de banco de dados gerenciadas). - Arquivo de Interface Externa (AIE): Dados referenciados pelo sistema, mas cuja manutenção reside em outra aplicação externa (ex: consulta a API de CEP dos Correios ou catálogo do ERP corporativo). 2. Funções de Transação (Processamento Dinâmico): - Entrada Externa (EE): Processo elementar que processa dados provenientes de fora da fronteira e atualiza um ALI (ex: cadastrar cliente, alterar pedido). - Saída Externa (SE): Processo elementar que envia dados para fora da fronteira e contém lógica de processamento matemático, relatórios sumarizados ou cálculos derivados. - Consulta Externa (CE): Processo elementar que envia dados para fora sem realizar cálculos ou alterar o estado do sistema (ex: listagem simples de clientes com filtro). 3. Complexidade Funcional e Cálculo Final: - Cada função é classificada em Baixa, Média ou Alta complexidade com base na quantidade de Tipos de Dados (TD) e Tipos de Registro (TR). A soma ponderada resulta no total de Pontos de Função Não Ajustados (PFNA).

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    User["Requisitos Funcionais do Usuário"] --> APF["Análise de Pontos de Função (IFPUG)"]
    APF --> Data["Funções de Dados: ALIs (Internos) e AIEs (Externos)"]
    APF --> Trans["Funções de Transação: EEs (Entradas), SEs (Saídas), CEs (Consultas)"]
    Data & Trans --> Matrix["Matriz de Complexidade (TDs e TRs)"]
    Matrix --> TotalPF["Total de Pontos de Função (Tamanho Funcional)"]
    TotalPF --> Estima["Estimativa de Prazo e Custo (Produtividade: Horas/PF)"]
    style User fill:#e1f5fe,stroke:#01579b
    style APF fill:#fff3e0,stroke:#e65100
    style Data fill:#f3e5f5,stroke:#7b1fa2
    style Trans fill:#f3e5f5,stroke:#7b1fa2
    style TotalPF fill:#e8f5e9,stroke:#2e7d32
    style Estima fill:#e0f2f1,stroke:#00695c

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Independência Tecnológica: Um sistema de compras terá exatamente os mesmos Pontos de Função quer seja escrito em Java, Python, Go ou C#. - Normalização de Produtividade: Permite comparar com precisão a produtividade de diferentes equipes através da métrica Horas gastas por Ponto de Função. - Estimativa Precoce de Projetos: Capacidade de dimensionar cronogramas e custos ainda na fase de especificação de requisitos. - Norma Internacional ISO/IEC 20926: Adoção de padrão reconhecido mundialmente e exigido em licitações públicas e contratos corporativos.


🛠️ 2. Implementação Prática em Engenharia de Software, Métricas de Tamanho e Análise de Pontos de Função (APF)

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// function_points_calculator.py (Calculadora de Pontos de Função Não Ajustados)
def calculate_function_points():
    """Calcula Pontos de Função segundo a tabela de pesos IFPUG."""
    # Matriz de pesos [Baixa, Média, Alta]
    WEIGHTS = {
        "ALI": [7, 10, 15],
        "AIE": [5, 7, 10],
        "EE":  [3, 4, 6],
        "SE":  [4, 5, 7],
        "CE":  [3, 4, 6]
    }

    # Inventário Funcional do Sistema de E-Commerce
    inventory = {
        "ALI": {"baixa": 2, "media": 3, "alta": 1}, # Tabelas de Usuários, Pedidos, Produtos...
        "AIE": {"baixa": 1, "media": 1, "alta": 0}, # Gateway de Pagamento, ERP Fiscal
        "EE":  {"baixa": 5, "media": 4, "alta": 2}, # Cadastros e Mutações
        "SE":  {"baixa": 3, "media": 2, "alta": 1}, # Relatórios Analíticos com Cálculos
        "CE":  {"baixa": 6, "media": 3, "alta": 0}  # Listagens e Consultas Simples
    }

    total_pf = 0
    print("=== Apuração de Pontos de Função (IFPUG) ===")
    for func_type, counts in inventory.items():
        w = WEIGHTS[func_type]
        subtotal = (counts["baixa"] * w[0]) + (counts["media"] * w[1]) + (counts["alta"] * w[2])
        total_pf += subtotal
        print(f"{func_type:4} -> Baixas: {counts['baixa']} | Médias: {counts['media']} | Altas: {counts['alta']} | Subtotal: {subtotal:3d} PF")

    print("-" * 50)
    print(f"Total de Pontos de Função Não Ajustados: {total_pf} PF")

    # Estimativa de esforço assumindo taxa média da indústria de 10 horas/PF
    taxa_produtividade = 10 # Horas por PF
    esforco_total_horas = total_pf * taxa_produtividade
    print(f"Esforço Estimado de Engenharia         : {esforco_total_horas} horas")
    print(f"Prazo para Equipe de 4 Engenheiros     : {esforco_total_horas / (4 * 140):.1f} meses")

if __name__ == '__main__':
    calculate_function_points()

💡 Análise Passo a Passo do Código

  1. Tabela de Pesos Padrão IFPUG: Aplica multiplicadores formais consagrados internacionalmente para cada tipo de componente.
  2. Classificação por Complexidade: Pondera o esforço real considerando se a tela ou tabela possui dezenas de campos ou poucos atributos.
  3. Conversão em Prazos Reais: Transforma pontos abstratos de software em horas e meses de trabalho baseados na velocidade histórica da equipe.

🎯 3. Próximos Passos & Sequência Didática