Prefira duplicação em vez da abstração errada (2016)
Escopo do Debate: Duplicação vs. Abstração
- Muitos concordam com a ideia central: abstrações prematuras ou “erradas” podem ser mais prejudiciais do que uma pequena duplicação local.
- Outros contrapõem que a duplicação em grande escala pode se tornar catastrófica, especialmente em sistemas de longa duração, com vários clientes ou várias equipes.
- Vários argumentam que o slogan costuma ser lido de forma errada; ele diz respeito a evitar abstrações prematuras ou casuais, não a uma licença para copiar e colar para sempre.
Quando a Duplicação é Útil
- Implementações repetidas podem ser uma ferramenta para descobrir a abstração correta: “faça duas ou três vezes, depois refatore” (regra de três / WET).
- A duplicação é vista como mais barata e mais segura no início, especialmente quando os requisitos de negócio e as fronteiras do domínio ainda não estão claros.
- Alguns preferem fluxos isolados, um pouco duplicados, em vez de uma “abstração deus” frágil com muitas flags e condicionais.
Quando as Abstrações Dão Errado
- Exemplos: frameworks excessivamente genéricos, polimorfismo forçado, “monólitos distribuídos” em microservices, frontends pesados em Redux e DRY levado ao extremo.
- Abstrações erradas tendem a:
- Codificar semelhanças acidentais em vez de conceitos realmente compartilhados.
- Espalhar acoplamento oculto, tornando cada mudança arriscada e global.
- Acumular parâmetros booleanos/de configuração e cadeias de chamadas complexas.
- Alguns sustentam que qualquer abstração mantível é melhor do que duplicação generalizada além de uma escala “de minimis”; outros discordam fortemente.
Heurísticas e Regras Práticas
- Heurísticas comuns:
- Não abstraia após uma única ocorrência; considere após duas; aja após três, se elas realmente representarem o mesmo conceito e mudarem pelas mesmas razões.
- Prefira abstrações que sejam óbvias e se justifiquem por sua própria interface, não apenas pelo conhecimento dos chamadores.
- Favoreça acoplamento frouxo e bibliotecas de suporte simples em vez de frameworks profundos, centralizados e “espertos”.
- Abstraia para facilitar a substituição futura, não para reutilização especulativa.
LLMs e a Curva de Custo
- Alguns observam que LLMs tornam a duplicação mais barata de criar e refatorar, potencialmente deslocando a balança para código mais simples e mais duplicado.
- Outros relatam que LLMs introduzem mais duplicação e podem deixar passar todas as ocorrências ao refatorar, então as abstrações ainda importam.
- A visão geral: a IA muda a economia, mas não elimina a necessidade de raciocinar sobre abstração vs. duplicação.