Pular para conteúdo

Aula 17 - Gestão de Projetos com Metodologias Ágeis e Kanban 📋

Objetivo Pedagógico

Objetivo: Compreender a dinâmica de gestão de projetos de software utilizando métodos ágeis (Scrum, Kanban, Scrumban), limitadores de trabalho em progresso (WIP Limits), mapeamento do fluxo de valor (VSM) e Cumulative Flow Diagrams (CFD).


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

A gestão moderna de engenharia de software superou modelos prescritivos rígidos em favor de abordagens empíricas e adaptativas fundamentadas na teoria das filas e nos princípios do Lean Software Development.

O método Kanban e a gestão de fluxo apoiam-se em quatro pilares matemáticos essenciais: 1. A Lei de Little (Little's Law): - Expressa formalmente a relação em sistemas de filas em estado estacionário: $\(WIP = Throughput \times Lead\ Time\)$ - Para reduzir o tempo de entrega (Lead Time) sem sobrecarregar a equipe, a intervenção mais eficaz não é tentar forçar o aumento do ritmo de trabalho, mas reduzir deliberadamente o Trabalho em Progresso (WIP - Work in Progress). 2. Work In Progress (WIP Limits): - Limites numéricos estritos aplicados a cada coluna do quadro Kanban. Quando uma coluna atinge seu teto de WIP, os engenheiros são impedidos de puxar novas tarefas (Stop Starting, Start Finishing), sendo incentivados a atuar como colaboradores para destravar tarefas represadas (Swarming). 3. Métricas de Fluxo Analíticas: - Lead Time: Tempo decorrido desde a criação da demanda pelo usuário até sua entrega em produção. - Cycle Time: Tempo decorrido desde o início ativo do desenvolvimento até a conclusão. - Cumulative Flow Diagram (CFD): Gráfico de áreas empilhadas que revela gargalos de processo, acúmulos de trabalho e taxa de chegada vs. conclusão ao longo do tempo.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph LR
    Backlog["Backlog de Engenharia"] --> Ready["Pronto para Dev (WIP: 5)"]
    Ready --> InDev["Em Desenvolvimento (WIP: 3)"]
    InDev --> CodeReview["Revisão por Pares (WIP: 2)"]
    CodeReview --> QA["Validação QA & CI (WIP: 2)"]
    QA --> Done["Entregue em Produção (Throughput)"]
    Note["Gargalo Detectado: Review atingiu WIP 2! Nenhuma nova tarefa entra em Dev."]
    style Backlog fill:#e1f5fe,stroke:#01579b
    style InDev fill:#fff3e0,stroke:#e65100
    style CodeReview fill:#ffebee,stroke:#c62828
    style Done fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Puxar vs. Empurrar (Pull System): Tarefas só avançam quando o estágio subsequente possui capacidade livre garantida pelos limites de WIP. - Mapeamento do Fluxo de Valor (VSM): Identificação e eliminação de desperdícios, esperas ociosas e retrabalho no ciclo de desenvolvimento. - Previsibilidade por Simulação de Monte Carlo: Projeções probabilísticas de datas de entrega baseadas no histórico real de Throughput em vez de estimativas intuitivas. - Feedback Loops e Cadências Ágeis: Reuniões diárias focadas no fluxo do quadro, revisões e retrospectivas para melhoria contínua.


🛠️ 2. Implementação Prática em Gestão Ágil, Kanban e Métricas de Fluxo

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

// kanban_flow_metrics.py (Cálculo de Lead Time e Previsão com Monte Carlo)
import random

def calculate_cycle_time_stats(lead_times: list[float]):
    """Calcula percentis de entrega de histórias de usuário."""
    sorted_times = sorted(lead_times)
    p50 = sorted_times[int(len(sorted_times) * 0.50)]
    p85 = sorted_times[int(len(sorted_times) * 0.85)]
    p95 = sorted_times[int(len(sorted_times) * 0.95)]
    print(f"=== Métricas de Fluxo (Amostras: {len(lead_times)}) ===")
    print(f"p50 (Mediana)    : {p50:.1f} dias")
    print(f"p85 (Compromisso): {p85:.1f} dias (85% de confiança)")
    print(f"p95 (Conservador): {p95:.1f} dias")

def simulate_monte_carlo(historical_throughput: list[int], remaining_tasks: int, iterations: int = 1000):
    """Simulação de Monte Carlo para previsão probabilística de término."""
    days_to_complete = []
    for _ in range(iterations):
        tasks = remaining_tasks
        days = 0
        while tasks > 0:
            daily_rate = random.choice(historical_throughput)
            tasks -= daily_rate
            days += 1
        days_to_complete.append(days)

    days_to_complete.sort()
    confidence_85 = days_to_complete[int(iterations * 0.85)]
    print(f"Previsão Monte Carlo: 85% de chance de concluir em até {confidence_85} dias de trabalho.")

if __name__ == '__main__':
    historical_lead = [3.2, 4.5, 2.1, 7.8, 4.0, 5.2, 9.1, 3.8, 4.1, 6.0]
    calculate_cycle_time_stats(historical_lead)
    simulate_monte_carlo(historical_throughput=[1, 2, 0, 3, 2, 1, 0, 4], remaining_tasks=15)

💡 Análise Passo a Passo do Código

  1. Uso de Percentis p85/p95: Elimina o erro clássico de planejar prazos utilizando médias matemáticas em distribuições assimétricas.
  2. Simulação de Monte Carlo: Gera milhares de cenários possíveis utilizando o Throughput real registrado pela equipe de engenharia.
  3. Decisões Baseadas em Dados: Substitui prazos fixos arbitrários por acordos de nível de serviço com intervalo de confiança probabilística.

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