Les 5 règles de programmation de Rob Pike (1989)
(cs.unc.edu)- Règle 1 : il est impossible de prédire où un programme passera son temps. Les goulots d’étranglement apparaissent là où on ne les attend pas, donc n’essayez pas d’améliorer les performances tant qu’il n’est pas prouvé qu’il s’agit réellement d’un goulot d’étranglement
- Règle 2 : la mesure d’abord. Le réglage des performances ne doit être fait qu’après mesure, et l’optimisation ne doit être envisagée que lorsqu’une partie du code domine clairement l’ensemble
- Règle 3 : les algorithmes complexes sont lents pour les petits n. Les algorithmes complexes ont de grandes constantes ; tant que n ne grandit pas souvent, il faut utiliser une méthode simple. Et même si n grandit, il faut d’abord appliquer la règle 2
- Règle 4 : les algorithmes complexes comportent plus de bugs et sont plus difficiles à implémenter. Il est préférable d’utiliser des algorithmes simples et des structures de données simples
- Règle 5 : les données sont essentielles. Si l’on choisit la bonne structure de données et qu’on l’organise correctement, l’algorithme devient presque évident. Le cœur de la programmation n’est pas l’algorithme, mais la structure de données
Philosophie et citations associées
- Les règles 1 et 2 ont le même sens que l’adage de Tony Hoare : « l’optimisation prématurée est la racine de tous les maux »
- Ken Thompson a réinterprété les règles 3 et 4 en « en cas de doute, utilisez la méthode simple (Brute Force) »
- Les règles 3 et 4 sont un exemple de la philosophie de conception KISS (Keep It Simple, Stupid)
- La règle 5 avait déjà été évoquée par Fred Brooks dans The Mythical Man-Month,
souvent résumée par « écrire un code simple en utilisant des objets intelligents »
1 commentaires
Réactions sur Hacker News
Cela rappelle la conférence de Jonathan Blow
Il l’abordait sous l’angle de la productivité. Au début du développement de Braid, il a implémenté presque tout avec de simples tableaux, puis n’a modifié les choses qu’au moment où des goulets d’étranglement apparaissaient
Sa phrase « ce qui compte plus que la vitesse ou la mémoire, c’est le temps de vie humaine nécessaire pour implémenter un programme » était marquante
Si l’on prend la Rule 1 au sérieux, les Rules 3 à 5 en découlent naturellement
Si l’on admet qu’il est impossible de prédire les goulets d’étranglement, alors écrire du code simple et mesurer devient la seule stratégie rationnelle
En pratique, l’échec le plus fréquent n’est pas l’optimisation prématurée, mais l’abstraction prématurée. On crée des couches complexes pour une flexibilité inutile, et cela finit par alourdir le coût de maintenance
Dans les années 90, j’ai dû implémenter à 2 heures du matin une fonction de recherche dans un jeu de données
J’étais fatigué, alors je l’ai faite en recherche linéaire en me disant que je corrigerais plus tard, mais en réalité cela n’a représenté que 6 secondes d’écart sur un test de 4 heures
J’ai fini par le corriger, mais il n’y avait pas de différence significative
Je suis totalement d’accord avec la Rule 5
Plus le problème est difficile, plus il se résout par des améliorations itératives des structures de données et des API. Quand la structure est bien pensée, le flux de contrôle devient naturel
Les LLM sont faibles sur ce type de réflexion structurelle. Ils proposent facilement des flux de contrôle complexes, mais sont mauvais pour concevoir des structures de données composables
Je viens de l’électrotechnique (E.E.), et la Rule 3 m’a évité de gros problèmes au début de ma carrière
Mais plus tard, en passant à des systèmes de grande taille, n a augmenté et la complexité est devenue réellement importante
Le “big iron” de l’époque de Rob Pike ressemblait aux environnements embarqués d’aujourd’hui
Si deux algorithmes ont une difficulté d’implémentation comparable, je choisis celui qui est plus rapide sur de grandes entrées
Article lié : Less Than Quadratic
Souvent, des gens choisissent une approche O(n²) trop simpliste et finissent par exploser en production
Je trouve les règles de Pike meilleures que les maximes habituelles
Des phrases comme « l’optimisation prématurée est la racine de tous les maux » perdent facilement leur contexte et se prêtent aux malentendus
La version de Pike est claire et difficile à détourner
Il existait une vieille formule disant que « la Rule 5 se résume à laisser du code stupide utiliser des objets intelligents »,
mais à l’époque de l’orienté objet, cela a au contraire dérivé en croyance erronée masquant la complexité
Après plus de dix ans sur la même base de code, j’ai totalement intériorisé les règles de Pike
Respecter les principes KISS/DRY et conserver des technologies éprouvées plutôt que des technologies à la mode s’est révélé plus stable sur le long terme
En pratique, le document de principes de développement de notre équipe dit presque la même chose que les règles de Pike
Au début des années 1990, à l’époque du C++, j’ai remplacé une liste doublement chaînée par une simple réallocation de tableau,
et non seulement les bugs ont disparu, mais c’était même plus rapide.
J’ai appris qu’effectuer moins souvent les opérations coûteuses est une bonne stratégie
Il est intéressant de comparer la règle « ne faites pas de tuning sans mesurer » avec Latency Numbers Every Programmer Should Know de Jeff Dean
Dean dit qu’avec des connaissances préalables, on peut prédire les performances
Au fond, les deux positions peuvent être conciliées : au moment de la conception, on choisit intuitivement une structure rapide, puis après l’implémentation, on affine sur la base de mesures réelles
Les Rules 1 et 2 ne sont absolues que lorsqu’on traite un problème nouveau
Quand on construit des systèmes de manière répétée dans le même domaine, on peut prédire à l’avance les points de blocage
Un développeur expérimenté peut avoir une intuition approximative des performances avant même la conception