En linguistique, l'hypothèse de Sapir-Whorf soutient que notre langue influe sur notre pensée. Bien sûr, c’est plus compliqué et controversé que ça, et je vous encourage à lire les pages Wikipédia (en particulier en langue anglaise) si la linguistique vous intéresse.
Cette hypothèse tient-elle en programmation, si on l’applique à la réinvention de la roue ?
Application naïve
Que ce soit en informatique ou en linguistique, on se rend compte rapidement que le langage influe sur les programmes/concepts qu’il est plus ou moins facile d’exprimer.
En effet, les personnes parlant plusieurs langues finissent par se rendre compte que certains mots n’existent pas dans certaines langues. Voici deux exemples :
- Le mot "bully" en anglais a un sens très précis appliqué aux enfants dans un contexte scolaire. La meilleure traduction en français semble être "tyran", mais "enfant tyran" a déjà un sens dans un contexte familial, donc on ne peut pas vraiment utiliser ce mot sans devoir l’expliquer en français.
- Avez-vous déjà eu besoin de redémarrer une voiture qui n’avait plus de batterie en la poussant puis en essayant de démarrer en seconde ? En créole réunionnais, on dit simplement qu’on "choque" la voiture.
En programmation, c’est un peu pareil :
- impossible d’utiliser les génériques avant Go 1.18
- l’utilisation de la récursion terminale est interdite en Python
Et c’est d’ailleurs pour ça que la question des génériques dans Go a attiré autant de discussions. Selon la loi de Wadler, ce qui est plus facile à comprendre dans un langage de programmation génère le plus de discussions, stériles qui plus est. Quoi de plus facile à comprendre qu’une fonctionnalité manquante ?
Application plus profonde
(Comme dirait @SpaceFox, pas de métaphore filée ici non plus.)
Non, la partie qui m’intéresse le plus, c’est quand un langage de programmation pousse à faire des choix différents. Le sujet est vaste, alors je vais me concentrer sur la question de la gestion des dépendances.
Go
Un point crucial dans le billet de @nohar est que le langage Go encourage à minimiser le nombre de dépendances. Russ Cox, qui a largement influencé la gestion des dépendances dans Go, a écrit sur le problème avec les dépendances logicielles, décrivant un processus très strict avant d’ajouter une dépendance. Je pense que cette réticence fait que la gestion des paquets dans Go a mis un certain temps à évoluer. (Est-elle aussi pratique que dans d’autres langages aujourd’hui ? Je ne sais pas.)
Cette philosophie se voit partout. C’est le cas de @nohar qui supprime testify, ou les conseils de r/golang. Un autre exemple ? Dans le channel Slack #golang au travail, un développeur demandait "quelle alternative à net/http
?" Même s’il existe un certain nombre d’alternatives (cf. par exemple ce qui est supporté par l’agent Go d’Elastic APM), le conseil le plus populaire a été de dire que même si net/http
c’est un peu bas niveau, c’est très bien. (Quelqu’un a même dit que s’en servir était un rite de passage.) C’est complètement inenvisageable en Python par exemple, mais c’est aussi parce que le module http
souffre de nombreux défauts.
JavaScript et Rust
Du côté complètement opposé, JavaScript et Rust ont des gestionnaires de paquets (npm, yarn, cargo) qui ont toujours visé à rendre aussi simples que possible l’ajout d’une nouvelle dépendance. De nombreux paquets populaires ont de nombreuses dépendances transitives. C’est sûrement pratique pour développer, mais ça alourdit le code et c’est particulièrement pénible quand il faut résoudre une faille de sécurité. create-react-app a presque 100k stars sur GitHub et des dizaines de vulnérabilités. (Ces vulnérabilités n’en sont pas dans le contexte de create-react-app, mais npm audit les remonte par défaut.)
Les autres langages
Les autres langages se situent un peu entre ces extrêmes, dans mon expérience, je ne vais donc pas les évoquer.
Mais du coup, est-ce que les langages de programmation influent sur les réinventions de la roue ? Tout comme en linguistique, difficile de répondre par oui ou par non. Voici ma réponse :
Le langage en lui-même, non. Il est sûrement faisable en Go d’avoir autant de dépendances qu’en Rust. Mais comme on l’a vu, la communauté et les outils influent certainement, oui. Et, de manière sûrement aussi importante, les personnes attirées par Go sont attirées par ces même idées, et viennent renforcer la communauté : ici encore, corrélation n’est pas causalité.