O custo real da complexidade desnecessária
Por que over-engineering costuma ser o caminho mais rápido para o fracasso de um projeto.
Complexidade cobrada com juros compostos
Complexidade é a maior causa de falência técnica que já vi de perto. Cada abstração “por precaução” é um contrato implícito com o futuro — e o futuro sempre cobra a conta.
“A única coisa mais cara que resolver o problema errado é resolver o problema certo com três camadas de indireção que ninguém pediu.”
Sinais de alerta
- Abstrações que existem para um único caso de uso.
- Frameworks internos para coisas que o ecossistema já resolve.
- “Vamos deixar plugável” antes de existirem dois plugs.
- Configuração dinâmica para algo que muda uma vez por ano.
- Camadas de mapeamento entre objetos idênticos.
Heurística prática
Antes de criar uma abstração, pergunte:
- Existem dois clientes reais hoje?
- O custo de extrair depois é proibitivo?
- O comportamento realmente varia, ou só o nome?
Se a resposta for “não” para as três, inline é a resposta certa.
Um exemplo concreto
// Antes — flexibilidade que ninguém pediu
public interface UserNotifier {
void notify(User user, NotificationPayload payload);
}
public class EmailUserNotifier implements UserNotifier { /* ... */ }
// Depois — o sistema só manda email, ponto
public class EmailService {
public void sendWelcome(User user) { /* ... */ }
}
Quando o segundo canal aparecer, você extrai a interface em cinco minutos, com testes verdes e com a cabeça clara sobre o que realmente muda.
Resumo
Comece pela dor real, não pela elegância teórica. Clean Code é sobre custo de manutenção, não sobre quantidade de interfaces por megabyte.