- Regra 1: não é possível prever onde um programa vai gastar tempo. Gargalos surgem em lugares inesperados, então não tente melhorar a velocidade até que fique comprovado que ali está o gargalo
- Regra 2: medir vem primeiro. Ajustes de desempenho só devem ser feitos depois da medição, e otimização só deve ser considerada quando uma parte do código domina o todo
- Regra 3: algoritmos complexos são lentos para n pequeno. Algoritmos complexos têm constantes grandes; a menos que n frequentemente cresça muito, use métodos simples. Mesmo que n cresça, aplique primeiro a regra 2
- Regra 4: algoritmos complexos têm mais bugs e são difíceis de implementar. É desejável usar algoritmos simples e estruturas de dados simples
- Regra 5: dados são o núcleo. Se você escolher a estrutura de dados correta e organizá-la bem, o algoritmo quase se revela por si só. O centro da programação não é o algoritmo, mas a estrutura de dados
Filosofia e citações relacionadas
- As regras 1 e 2 têm o mesmo sentido da máxima de Tony Hoare: “otimização prematura é a raiz de todo mal”
- Ken Thompson reinterpretou as regras 3 e 4 como “na dúvida, use o método simples (Brute Force)”
- As regras 3 e 4 são exemplos da filosofia de design KISS (Keep It Simple, Stupid)
- A regra 5 já havia sido mencionada por Fred Brooks em The Mythical Man-Month e
costuma ser resumida como “escrever código simples usando objetos inteligentes”
1 comentários
Comentários do Hacker News
Isso lembrou a palestra do Jonathan Blow
Ele abordou isso pela ótica da produtividade. No início do desenvolvimento de Braid, implementou quase tudo com arrays simples e só mudava quando surgia um gargalo
Foi marcante a frase: “Mais importante do que velocidade ou memória é o tempo de vida necessário para implementar um programa”
Se você leva a sério a Rule 1, as Rules 3 a 5 vêm naturalmente
Se você aceita a premissa de que não dá para prever gargalos, então escrever código simples e medir vira a única estratégia racional
Na prática, o fracasso mais comum não é otimização prematura, e sim abstração prematura. Criamos camadas complexas por uma flexibilidade que não era necessária, e isso acaba aumentando o custo de manutenção
Tive a experiência, nos anos 90, de precisar implementar uma busca em dataset às 2 da manhã
Eu estava cansado, então fiz uma busca linear para corrigir depois, mas na prática a diferença foi de apenas 6 segundos em um teste de 4 horas
No fim eu até alterei, mas não houve diferença significativa
Concordo totalmente com a Rule 5
Quanto mais difícil o problema, mais ele costuma ser resolvido por meio de melhorias iterativas na estrutura de dados e na API. Quando a estrutura fica bem definida, o fluxo de controle se torna natural
LLMs são fracos nesse tipo de raciocínio estrutural. Eles sugerem bem fluxos de controle complexos, mas não sabem projetar bem estruturas de dados combináveis
Venho de engenharia elétrica (E.E.) e, graças à Rule 3, não tive grandes problemas no início da carreira
Mas depois, ao migrar para sistemas de grande escala, n cresceu e a complexidade passou a importar de verdade
O “big iron” da época a que Rob Pike se referia era parecido com o ambiente embarcado de hoje
Se dois algoritmos têm dificuldade de implementação parecida, eu escolho o mais rápido para entradas grandes
Texto relacionado: Less Than Quadratic
Muitas vezes as pessoas escolhem uma abordagem O(n²) simples demais e acabam vendo tudo explodir em produção
Acho que as regras do Pike são melhores do que os aforismos tradicionais
Frases como “otimização prematura é a raiz de todo mal” perdem o contexto e são fáceis de interpretar mal
A versão do Pike é clara e difícil de usar de forma errada
Havia uma formulação antiga de que “a Rule 5 se resume a ‘deixe código burro usar objetos inteligentes’”,
mas na era orientada a objetos isso acabou se deturpando em uma crença errada de esconder a complexidade
Depois de mais de 10 anos mantendo a mesma base de código, internalizei completamente as regras de Pike
Seguir os princípios KISS/DRY e manter tecnologias comprovadas em vez de modismos foi mais estável no longo prazo
Na prática, o documento de princípios de desenvolvimento do nosso time é quase idêntico às regras de Pike
No começo dos anos 1990, na era do C++, troquei uma lista duplamente encadeada por realocação simples de array
Não só os bugs desapareceram, como ainda ficou mais rápido.
Aprendi que fazer operações caras com menos frequência é uma boa estratégia
É interessante comparar a regra “não faça tuning sem medir” com Latency Numbers Every Programmer Should Know, do Jeff Dean
Dean diz que é possível prever desempenho com conhecimento prévio
No fim, as duas posições podem ser conciliadas — na fase de design, você escolhe uma estrutura que intuitivamente seja rápida e, depois da implementação, faz o ajuste fino com base em medições
As Rules 1 e 2 só são absolutas quando se está lidando com um problema novo
Quando você constrói sistemas repetidamente no mesmo domínio, consegue prever gargalos com antecedência
Um desenvolvedor experiente pode ter uma noção aproximada de desempenho já antes do design