7 min leitura • Guide 535 of 877
Gerenciando Código Legado em Projetos Ativos
Código legado requer manuseio cuidadoso para evitar quebrar funcionalidades existentes enquanto permite novo desenvolvimento. O GitScrum ajuda times a rastrear trabalho relacionado a legado separadamente, planejar melhorias incrementais e manter visibilidade clara no equilíbrio entre carga de manutenção e desenvolvimento de features.
Estratégias de Código Legado
| Estratégia | Quando Usar | Esforço |
|---|---|---|
| Adicionar apenas testes | Alto risco, mudado frequentemente | Baixo |
| Extrair e testar | Módulo vale preservar | Médio |
| Envolver e substituir | Padrão Strangler Fig | Médio-Alto |
| Reescrita completa | Obsoleto, impossível de manter | Alto |
Trabalhando com Código Legado
FRAMEWORK DE MELHORIA DE CÓDIGO LEGADO
1. AVALIAR O CÓDIGO LEGADO
┌─────────────────────────────────────────────────┐
│ Para cada componente legado, avaliar: │
│ │
│ Frequência de Mudança: │
│ ├── Alta: Modificado mensalmente → Priorid. │
│ ├── Média: Modificado trimestr. → Planejar │
│ └── Baixa: Raramente tocado → Deixar │
│ │
│ Taxa de Bugs: │
│ ├── Alta: Bugs frequentes → Corrigir │
│ ├── Média: Bugs ocasionais → Melhorar │
│ └── Baixa: Estável → Manter │
│ │
│ Cobertura de Testes: │
│ ├── Nenhuma: Sem testes → Add test │
│ ├── Baixa: < 40% → Melhorar │
│ └── Boa: > 70% → Manter │
└─────────────────────────────────────────────────┘
2. CATEGORIZAR ABORDAGEM
┌─────────────────────────────────────────────────┐
│ │
│ Alta Frequência de Mudança │
│ │ │
│ ┌──────────┼──────────┐ │
│ │ ENVOLVER │ EXTRAIR │ │
│ │ E │ E │ │
│ │ SUBST. │ TESTAR │ │
│ │ │ │ │
│ ├──────────┼──────────┤ │
│ │ ADIAR │ ADICIONAR│ │
│ │ (custo │ APENAS │ │
│ │ excede │ TESTES │ │
│ │ benefício│ │ │
│ └──────────┴──────────┘ │
│ Baixa Qual. │ Alta Qualidade │
│ │
└─────────────────────────────────────────────────┘
Regra do Escoteiro
PRÁTICA DE MELHORIA INCREMENTAL
REGRA: Deixe o código melhor do que encontrou
AO TOCAR CÓDIGO LEGADO:
┌─────────────────────────────────────────────────┐
│ Antes de fazer sua mudança: │
│ 1. Adicione testes para o código que modificar │
│ 2. Verifique que testes capturam comportamento │
│ │
│ Faça sua mudança: │
│ 3. Implemente a feature/correção │
│ 4. Garanta que testes continuam passando │
│ │
│ Deixe melhor: │
│ 5. Pequena refatoração (renomear, extrair) │
│ 6. Adicione documentação faltante │
│ 7. Melhore cobertura de teste levemente │
│ │
│ Restrição: Melhoria adiciona ≤30% ao tempo │
└─────────────────────────────────────────────────┘
EXEMPLO:
┌─────────────────────────────────────────────────┐
│ Tarefa: Adicionar cálculo de desconto ao pedido│
│ Estimativa: 3 horas │
│ │
│ Budget de melhoria: ~1 hora │
│ │
│ Melhorias feitas: │
│ ├── Adicionei 3 testes para calculateTotal │
│ ├── Renomeei variáveis confusas │
│ ├── Extraí lógica duplicada para helper │
│ └── Adicionei JSDoc para métodos públicos │
│ │
│ Resultado: Feature funciona + código melhor │
└─────────────────────────────────────────────────┘
Padrão Strangler Fig
ESTRATÉGIA DE SUBSTITUIÇÃO GRADUAL
ABORDAGEM STRANGLER FIG:
┌─────────────────────────────────────────────────┐
│ Novas features usam novo código │
│ Features antigas migram gradualmente │
│ Legado encolhe com o tempo │
└─────────────────────────────────────────────────┘
IMPLEMENTAÇÃO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ANTES: │
│ ┌────────────────────────────────────┐ │
│ │ Sistema Legado Monolítico │ │
│ │ ├── Módulo A (usuários) │ │
│ │ ├── Módulo B (pagamentos) │ │
│ │ ├── Módulo C (relatórios) │ │
│ │ └── Módulo D (notificações) │ │
│ └────────────────────────────────────┘ │
│ │
│ DURANTE (gradual): │
│ ┌────────────────────────────────────┐ │
│ │ Façade/Proxy │ │
│ │ ├─► Novo Módulo A ✓ │ │
│ │ ├─► Novo Módulo B 🔄 │ │
│ │ └─► Legado (C, D) ainda funciona │ │
│ └────────────────────────────────────┘ │
│ │
│ DEPOIS: │
│ ┌────────────────────────────────────┐ │
│ │ Novo Sistema │ │
│ │ ├── Novo Módulo A ✓ │ │
│ │ ├── Novo Módulo B ✓ │ │
│ │ ├── Novo Módulo C ✓ │ │
│ │ └── Novo Módulo D ✓ │ │
│ └────────────────────────────────────┘ │
│ │
│ BENEFÍCIOS: │
│ • Risco minimizado (sempre funciona) │
│ • Valor entregue continuamente │
│ • Pode pausar/continuar conforme capacidade │
│ • Rollback possível em cada etapa │
│ │
└─────────────────────────────────────────────────────────────┘
Gestão de Backlog de Legado
Separando Trabalho de Legado
BACKLOG DE MELHORIA DE LEGADO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ BACKLOG DE FEATURES (normal): │
│ ├── [FEAT] Nova dashboard de analytics │
│ ├── [FEAT] Integração com Slack │
│ └── [FEAT] Export de relatórios │
│ │
│ BACKLOG DE LEGADO (separado): │
│ ├── [LEGACY] Adicionar testes ao módulo de pagamento │
│ ├── [LEGACY] Extrair serviço de autenticação │
│ ├── [LEGACY] Migrar queries para ORM │
│ └── [LEGACY] Documentar API de integração antiga │
│ │
│ ALOCAÇÃO DE CAPACIDADE: │
│ ───────────────────────── │
│ Features novas: │ 80% │
│ Melhoria de legado: │ 15% │
│ Bugs/manutenção: │ 5% │
│ │
│ POR SPRINT (10 dias): │
│ • 8 dias em features │
│ • 1.5 dias em melhoria de legado │
│ • 0.5 dias em manutenção │
│ │
└─────────────────────────────────────────────────────────────┘
Métricas de Legado
RASTREANDO PROGRESSO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ COBERTURA DE TESTES: │
│ ───────────────────── │
│ Jan: ████░░░░░░░░░░░░░░░░ 22% │
│ Fev: ██████░░░░░░░░░░░░░░ 31% │
│ Mar: ████████░░░░░░░░░░░░ 38% │
│ Abr: ██████████░░░░░░░░░░ 45% │
│ Meta: ██████████████████░░ 80% │
│ │
│ TAXA DE BUGS EM CÓDIGO LEGADO: │
│ ────────────────────────────── │
│ Jan: 12 bugs/mês │
│ Fev: 9 bugs/mês (-25%) │
│ Mar: 7 bugs/mês (-22%) │
│ Abr: 5 bugs/mês (-29%) │
│ Tendência: ↓ Melhorando │
│ │
│ VELOCIDADE EM ÁREAS LEGADAS: │
│ ──────────────────────────── │
│ Tempo médio para mudança: │
│ Jan: 8 horas → Abr: 4 horas │
│ Redução: 50% │
│ │
│ % DO CODEBASE MODERNIZADO: │
│ ────────────────────────── │
│ Módulos migrados: 3/8 (37.5%) │
│ Linhas de código legado: 45K → 32K (-29%) │
│ │
└─────────────────────────────────────────────────────────────┘
Melhores Práticas
Checklist de Implementação
CHECKLIST DE GESTÃO DE LEGADO
═════════════════════════════
AVALIAÇÃO:
☐ Inventário de código legado feito
☐ Áreas de alto risco identificadas
☐ Cobertura de testes medida
☐ Dependências mapeadas
☐ Prioridades definidas
PROCESSO:
☐ Backlog de legado separado criado
☐ Capacidade dedicada alocada
☐ Regra do Escoteiro adotada
☐ Testes antes de mudanças (obrigatório)
TÉCNICAS:
☐ Strangler Fig para grandes migrações
☐ Refatoração incremental para pequenas
☐ Interfaces limpas entre legado e novo
☐ Feature flags para transições
MÉTRICAS:
☐ Cobertura de testes rastreada
☐ Taxa de bugs monitorada
☐ Velocidade em legado medida
☐ Progresso de migração visível
CULTURA:
☐ Time entende valor de melhoria
☐ Tempo de legado é respeitado
☐ Documentação é valorizada
☐ Conhecimento é compartilhado
Código legado bem gerenciado deixa de ser um fardo - torna-se um ativo que melhora a cada sprint.