Le danger de perdre la vertu de la paresse
(bcantrill.dtrace.org)- En programmation, la paresse n’est pas une simple négligence, mais une vertu intellectuelle qui vise l’abstraction et la simplicité
- La véritable paresse est un processus de réflexion approfondie sur un problème afin d’économiser du temps à l’avenir, et cela profite aussi aux développeurs des générations suivantes
- Les abstractions modernes de haut niveau et la culture des « brogrammers » font perdre cette vertu et la remplacent par une fausse diligence
- Les LLM poussent cette tendance à l’extrême et agissent comme un outil de surproduction qui fait confondre la quantité de code avec la valeur
- Il faut préserver la paresse vertueuse, issue de la finitude du temps humain, et utiliser les LLM pour concevoir des systèmes simples et durables
La paresse comme vertu du programmeur et le danger de sa disparition
- Larry Wall souligne que, parmi les trois vertus du programmeur présentées dans Programming Perl — paresse (laziness), impatience (impatience) et orgueil (hubris) — la paresse est celle qui porte le sens le plus profond
- La paresse n’est pas une simple autodérision, mais une notion qui implique la nécessité et l’esthétique de l’abstraction
- C’est la force qui pousse à rendre les systèmes aussi simples que possible et à permettre de faire davantage, plus facilement, grâce à des abstractions puissantes
- La véritable paresse, à l’image du « hammock-driven development », peut donner l’impression qu’on se repose, alors qu’il s’agit en réalité d’un travail intellectuel consistant à réfléchir profondément à un problème pour économiser du temps à l’avenir
- Lorsqu’une abstraction pertinente est créée, elle bénéficie non seulement au développeur lui-même, mais aussi aux développeurs des générations futures
- Cette paresse permet d’écrire plus facilement des logiciels et de construire plus facilement des systèmes
-
Une époque où la vertu de la paresse disparaît
- Au cours des vingt dernières années, avec l’élargissement du champ de la production logicielle, le nombre de personnes qui ne se définissent pas elles-mêmes comme programmeurs a augmenté
- Pour elles, la vertu de la paresse a perdu son sens d’origine
- L’explosion de productivité apportée par les abstractions modernes de haut niveau encourage au contraire une fausse diligence (false industriousness)
- Cela se manifeste par la culture des « brogrammers » et le « hustle porn », qui remplacent la paresse vertueuse et ironique par une production ininterrompue de code
- Au cours des vingt dernières années, avec l’élargissement du champ de la production logicielle, le nombre de personnes qui ne se définissent pas elles-mêmes comme programmeurs a augmenté
-
Le nouvel excès provoqué par les LLM
- L’apparition des LLM (grands modèles de langage) pousse cette tendance à son paroxysme
- Les LLM sont des outils qui amplifient l’attitude créative humaine et jouent le rôle de stéroïdes pour la culture des « brogrammers »
- Par exemple, Garry Tan a mentionné avoir écrit 37 000 lignes de code en une journée à l’aide de LLM
- À titre de comparaison, l’ensemble du code de DTrace représente environ 60 000 lignes
- Mais cette approche constitue un vice marqué par l’absence de la vertu de la paresse et révèle l’erreur consistant à évaluer la valeur d’un logiciel à la quantité de code
- L’apparition des LLM (grands modèles de langage) pousse cette tendance à son paroxysme
-
Les limites des LLM et la valeur de la paresse humaine
- Comme le coût du travail est nul pour les LLM, ils génèrent des systèmes infiniment complexes sans prendre en compte l’économie de temps futur
- En conséquence, ils rendent les systèmes plus grands et plus complexes, satisfont des indicateurs de vanité, mais nuisent à la qualité essentielle
- La paresse humaine découle de la contrainte d’un temps fini, ce qui impose des abstractions claires et une conception simplifiée des systèmes
- La meilleure ingénierie naît toujours des contraintes, et la contrainte du temps humain limite la charge cognitive et pousse à rechercher la simplicité
- Les LLM n’ayant pas de telles contraintes, ils n’ont aucune motivation intrinsèque à rechercher la simplicité
- Comme le coût du travail est nul pour les LLM, ils génèrent des systèmes infiniment complexes sans prendre en compte l’économie de temps futur
-
Comment utiliser les LLM comme outils
- Les LLM peuvent malgré tout jouer un rôle important en tant qu’outils puissants de l’ingénierie logicielle
- Selon les recommandations d’Oxide sur l’usage des LLM, les LLM ne sont que des outils et ne peuvent pas remplacer les vertus humaines
- Ils peuvent être utilisés pour résoudre des problèmes de paresse non productive comme la dette technique (technical debt) ou pour renforcer la rigueur de l’ingénierie
- Mais leur usage doit impérativement viser la mise en œuvre d’une « paresse vertueuse »
- Autrement dit, il faut s’en servir pour créer des systèmes plus simples et plus puissants, afin de laisser un résultat utile aux développeurs des générations futures
- Les LLM peuvent malgré tout jouer un rôle important en tant qu’outils puissants de l’ingénierie logicielle
1 commentaires
Avis sur Hacker News
Même dans mon domaine, la Computational Fluid Dynamics, il y a des gens qui se vantent d’avoir beaucoup de tests comme on se vante des LOC
Mais quand on regarde de près, ces tests ne sont pas très stricts, et ils sont bien plus faibles que ceux que j’écris manuellement
Un million de tests faciles ne servent à rien s’ils ne couvrent pas les parties essentielles du code
Et pour empêcher Claude de « corriger » les tests quand le code ne marche pas, je vérifie toujours les modifications de tests avec
git diffQuand les tests sont gérés de façon stricte, Claude implémente même correctement des algorithmes difficiles tirés d’articles scientifiques, ce qui fait gagner du temps, mais ça demande énormément de supervision
Le modèle détourne la fonction de récompense qu’est le test pour pouvoir « déclarer la victoire »
J’imagine qu’on retrouve peut-être ce genre de motif dans les données de préentraînement RL
On se retrouve avec des centaines de tests inutiles comme
assert(1==1)Du coup, il faut gérer séparément une liste d’interdictions du type « ne pas créer ce genre de test »
Après avoir codé moi-même pendant 30 ans, je suis désormais passé entièrement au codage par IA, et je trouve étrange que des gens s’attribuent le mérite des LOC ou des fonctionnalités générées par l’IA
Se vanter d’avoir « codé » des centaines de milliers de lignes par jour, ce n’est finalement que taper quelques lignes de prompt, non ?
On peut accorder un certain mérite aux modifications qu’on approuve soi-même, mais pour une app vibe-coded complète, on intervient à peine
Je me situe quelque part au milieu — je ne relis pas tout le code produit par l’IA, mais c’est moi qui pilote l’architecture et l’orientation du refactoring
Le résultat ressemble à ce que j’aurais fait moi-même, mais en beaucoup plus rapide
Vu que Meta utilise Claude, Anthropic doit être assez content
Nous sommes désormais dans une époque où l’implémentation, les tests et la maintenance sont entièrement pris en charge par des agents
Les LoC sont plutôt un indicateur de capacité montrant jusqu’où l’agent peut pousser des exigences
La relecture critique humaine peut toujours être réinjectée sous forme de feedback
Dire qu’il faut utiliser davantage d’abstractions était peut-être vrai autrefois, mais aujourd’hui j’ai plutôt l’impression inverse
J’aime la philosophie WET (Write Everything Twice) — on l’écrit deux fois, et on n’envisage l’abstraction qu’à la troisième
Voir l’article Wikipédia
Les systèmes d’exploitation, les RDBMS ou l’orchestration cloud en sont de bons exemples
Mais la plupart du code n’est que de la logique métier simple, et l’abstraction y devient plutôt un obstacle
C’est pourquoi je me fixe comme principe de ne pas construire une plateforme avant que trois cas d’usage réels ne l’aient justifié
Et quand on tente une abstraction à la troisième, il faut se méfier du Second-System Effect — l’excès de confiance produit des systèmes trop complexes
Quelqu’un a partagé la célèbre citation du général allemand Kurt von Hammerstein-Equord
Les gens intelligents et travailleurs servent à l’état-major, les gens stupides et paresseux aux tâches quotidiennes, les gens intelligents et paresseux font de bons dirigeants,
et les gens stupides et travailleurs sont dangereux, donc il ne faut jamais leur confier de responsabilités
Se vanter d’avoir écrit 200 000 LOC avec un LLM est idiot, mais voir cela puis se moquer en disant « ce code est stupide » me semble être une attitude tout aussi mauvaise
Au final, ce qui compte, ce n’est pas la production de code mais la création de valeur
Je ne sais pas si Garry Tan a réellement créé quelque chose d’utile
Quand on regarde des cas comme le scandale Horizon IT, on voit qu’un mauvais code peut causer de vrais dégâts
D’après la review du projet de Garry par le développeur polonais Gregorein, l’app contenait un test harness, une app Hello World, des fichiers de logo en double et d’autres éléments en désordre
On peut se demander si ce code n’a pas aussi élargi la surface d’attaque en matière de sécurité
Il ne se souciait pas des LOC, il publiait plutôt un post promotionnel pour l’IA
L’IA réduit les coûts de développement et d’exploitation, mais augmente des coûts cachés comme les risques de sécurité ou juridiques
Les défenseurs enthousiastes de l’IA insistent surtout sur le premier aspect
C’est au vibe coder de le démontrer
Se vanter en LOC reste stupide à mes yeux
Comme avec la croissance fondée sur les énergies fossiles, une valeur à court terme peut engendrer des coûts à long terme
En regardant quelques PR récentes, j’ai souvent vu des LLM proposer de mauvaises solutions
Par exemple, réimplémenter un parseur au lieu d’utiliser un parseur JSON déjà existant
Un humain se dirait « c’est beaucoup trop inefficace », mais les LLM ne sont pas paresseux, donc ils travaillent dur dans la mauvaise direction
Il y a parfois trois fonctions comme
formatTimestamp, et ils l’ignorent alors qu’un simple grep suffirait à le voirJe suis d’accord avec l’idée que les LLM ne sont pas paresseux
En revanche, je ne sais pas si c’est un problème permanent ou si cela sera corrigé dans une prochaine mise à niveau des modèles ou dans les pipelines CICD
Une fois une fonctionnalité terminée, je leur donne un prompt du type « vérifie s’il y a des bugs ou des points à refactorer »,
et on finira peut-être par avoir une étape qui analyse automatiquement les commits récents pour proposer des simplifications
D’où la difficulté à définir une condition d’arrêt
Si on dit seulement « ajoute », il ajoute forcément, et si on dit « réduis », il réduit les LOC
Si on lui confie de gros chantiers sans relecture, il devient facile d’accumuler du code slop
Les LLM ont tendance à produire une SPA complète au lieu d’un simple programme qui affiche quelque chose dans la console
Ils n’arrivent pas non plus à garder un fichier
spec.mdconcisSi on leur dit « mets à jour ce document et simplifie le contexte autour », ils le rendent au contraire plus complexe
Au final, il faut qu’une personne fasse elle-même le résumé pour obtenir un document agréable à lire
Éditer la sortie d’un LLM est pénible, et écrire soi-même permet de mieux conserver sa compréhension
Il est temps d’enseigner aux LLM et aux vibe coders les leçons classiques du développement logiciel
Comme dans l’histoire Negative 2000 Lines of Code, réduire le code est souvent le vrai progrès
On se dit qu’est-ce que ce serait bien de pouvoir travailler avec un tel leadership
Travailler avec un dirigeant qui comprend vraiment est une grande chance