"Código" Limpo, Desempenho Horrível (2023)
Críticas ao design orientado a objetos no estilo “Clean Code” argumentam que a ênfase em métodos minúsculos, hierarquias polimórficas profundas e internals ocultos pode levar a mau desempenho ao contrariar caches de CPU e adicionar indireção. Os comentaristas contrapõem que esses padrões foram pensados para melhorar a legibilidade e a manutenibilidade, e que os gargalos reais muitas vezes estão em outro lugar (por exemplo, I/O de rede, frameworks pesados) em vez do despacho virtual. O tema mais amplo é que “princípios” de programação como DRY, funções pequenas e interfaces são úteis apenas quando aplicados com julgamento a domínios e restrições específicas, e não seguidos como dogma.
Valor e limitações do Clean Code
- Muitos veem o livro como um andaime útil para desenvolvedores em início de carreira que precisam de estrutura.
- Outros argumentam que ele ensina práticas ruins ou estreitas (“código OO limpo” apenas) e é ativamente prejudicial, até para iniciantes.
- Reclamação comum: ele incentiva regras dogmáticas (funções minúsculas, polimorfismo, evitar comentários) e uma postura moralista que rotula a discordância como “não profissional”.
- Alguns mencionam uma edição mais nova, destinada a corrigir interpretações equivocadas, mas sua qualidade é descrita como incerta.
Desempenho vs. manutenibilidade
- Debate central: abstrações “limpas” (especialmente OO e polimorfismo) frequentemente prejudicam o desempenho, mas podem facilitar a manutenção e a extensibilidade.
- Vários defendem que o desempenho deve ser guiado por medições: escreva código simples e depois otimize os pontos críticos.
- Outros contrapõem que certos estilos (polimorfismo dinâmico pesado, camadas profundas de abstração) podem tornar um sistema globalmente lento, e não apenas nos pontos críticos.
OO, polimorfismo e alternativas
- Muitos observam que o exemplo clássico usa polimorfismo em tempo de execução e vtables, que são conhecidos por ser mais lentos do que dados planos e
switch, especialmente em loops apertados. - Alguns destacam que compiladores modernos fazem inline de funções pequenas muito bem; a principal custo é o despacho dinâmico, não o “clean code” em si.
- Alternativas mencionadas: tipos soma com
matchexaustivo, despacho procedural (switches ou tabelas), polimorfismo estático e abstrações de custo zero em linguagens mais novas.
Tamanho e estrutura de funções
- Forte desacordo sobre regras de comprimento de funções.
- Alguns preferem funções muito pequenas, de propósito único, por clareza; outros consideram esse estilo fragmentado e mais difícil de acompanhar.
- Funções longas, mas lineares, podem ser aceitáveis se fizerem “uma coisa coerente”; a divisão artificial pode prejudicar a legibilidade.
Princípios vs. dogma
- Vários comentaristas enfatizam que princípios como DRY, SRP e “clean code” são ferramentas de baixo nível com trade-offs, não leis universais.
- A aplicação excessiva leva a acoplamento morto, fragmentação, baixa coesão e problemas de desempenho.
- Tema consensual: use julgamento; o contexto (complexidade do domínio, necessidades de desempenho, tamanho da equipe, extensibilidade) deve orientar o design.
Críticas ao artigo e aos exemplos
- Alguns acham que a crítica ataca um exemplo de brinquedo, sem foco em desempenho, e portanto equivale a um espantalho.
- Outros respondem que o exemplo veio do próprio livro e demonstra concretamente como o estilo promovido pode degradar o desempenho, o que é um ponto válido mesmo que a intenção original fosse pedagógica.
Queixas mais amplas do ecossistema
- Vários comentários sugerem que, em apps do dia a dia, os piores problemas de desempenho vêm menos de padrões OO e mais de stacks pesadas (por exemplo, Electron, “web tech” no desktop) e de latência de rede, não apenas do tamanho de funções ou do polimorfismo.