Fluxo de lava.
Fluxo de lava é um antipadrão em que código obscuro e inacabado se solidifica em produção porque ninguém o entende o bastante para removê-lo.
No jargão de programação de computadores, fluxo de lava é um antipadrão que ocorre quando o código-fonte de computador escrito sob condições subótimas é implantado em um ambiente de produção e, em seguida, ampliado enquanto ainda está em estado de desenvolvimento. O termo deriva da ocorrência natural da lava que, uma vez resfriada, solidifica-se em rocha difícil de remover. De forma semelhante, esse código se torna difícil de refatorar ou substituir devido às dependências que surgem ao longo do tempo, exigindo a manutenção da compatibilidade retroativa com o design original e incompleto.
Causas
O fluxo de lava pode ocorrer por uma variedade de motivos dentro de um processo de desenvolvimento de software:
- Pressão para cumprir prazos, levando soluções temporárias a se tornarem permanentes
- Documentação inadequada, que impede a compreensão do propósito do código
- Falta de testes automatizados, o que torna a refatoração arriscada
- Mudanças frequentes na equipe de desenvolvimento, levando à perda de conhecimento
Consequências
Código não refinado que se torna parte da infraestrutura do software aumenta a complexidade do sistema, e a base de código fica cada vez mais difícil de entender e manter. Isso leva a:
- A necessidade de compatibilidade retroativa, que pode sufocar a inovação e impedir a adoção de soluções mais novas e eficientes
- Aumento da dívida técnica, que se acumula ao longo do tempo, resultando em custos mais altos de mudança e manutenção
- Obstáculos à refatoração ou à melhoria do sistema devido ao medo de quebrar componentes dependentes
Impacto nas equipes
As equipes de desenvolvimento frequentemente sentem o impacto do fluxo de lava quando membros entram e saem da equipe:
- Perda de conhecimento sobre aspectos do código do sistema quando os desenvolvedores originais saem
- Relutância dos novos desenvolvedores em refatorar código desconhecido, levando a mais complexidade à medida que eles adicionam em vez de limpar
Estratégias de mitigação
Várias práticas podem mitigar os efeitos do antipadrão fluxo de lava:
- Promover boas práticas de documentação para um entendimento claro do código
- Incentivar revisões de código regulares para detectar práticas subótimas cedo
- Priorizar a refatoração como parte integrante do ciclo de vida de desenvolvimento
- Manter uma suíte abrangente de testes automatizados para reduzir o risco nas mudanças
Exemplo
O ramo legado abaixo sobrevive a toda limpeza: não há teste, ticket nem documentação, apenas um comentário de alerta, então ninguém sabe para que ele serve e ninguém tem coragem de apagá-lo.
class Pricing {
// ninguém lembra quem ativa esta flag; não remover, algo pode quebrar
private static final boolean LEGACY_MODE = Boolean.getBoolean("pricing.legacy");
double price(Order order) {
double total = order.total() * 1.1;
if (LEGACY_MODE && order.items() > 10) {
total = legacyAdjust(total); // ???
}
return total;
}
private double legacyAdjust(double total) {
return Math.floor(total * 0.97);
}
}
A saída é registrar o comportamento atual com testes de caracterização, confirmar que o ramo não é usado e então removê-lo:
// 1. Testes de caracterização registram o comportamento atual antes de qualquer mudança
@Test
void addsTenPercentMarkup() {
assertEquals(110.0, new Pricing().price(new Order(100.0, 1)), 1e-9);
}
// 2. Uma busca no código e a configuração de produção mostram que ninguém define pricing.legacy,
// então o ramo é removido; os testes confirmam que nada mais mudou
class Pricing {
double price(Order order) {
return order.total() * 1.1;
}
}
Código inalcançável é apenas código morto, e o controle de versão o guarda de qualquer forma, então não há motivo para mantê-lo “por via das dúvidas”.
Adaptado do artigo da Wikipédia “Lava flow (programming)” (revisão 1309138267), disponível sob a licença CC BY-SA 4.0; o texto foi traduzido e editado, e exemplos foram adicionados.