Voltar para a listaArquitetura • 5 min de leitura

O custo real da complexidade desnecessária

Por que over-engineering costuma ser o caminho mais rápido para o fracasso de um projeto.

Autor: Danilo FernandoPublicado em 10 de fevereiro de 2025
O custo real da complexidade desnecessária

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:

  1. Existem dois clientes reais hoje?
  2. O custo de extrair depois é proibitivo?
  3. 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.

#clean-architecture #decisões-técnicas