← Tous les articles

Philosophie de l'ingénierie : Yukihiro Matsumoto (Matz)

Yukihiro Matsumoto, créateur de Ruby, photographié par Christopher Adams en 2018

Points clés à retenir

  • Concevoir pour les humains, pas pour les machines. Matz a fait du plaisir du programmeur la fonction objectif et a laissé le silicium régler l’addition. Chaque choix syntaxique répond à la question « comment une personne se sentira-t-elle en lisant ceci ? » avant « à quelle vitesse les octets se déplaceront-ils ? »
  • La moindre surprise, c’est ma moindre surprise. Le principe n’est pas un sondage sur les attentes des débutants ; c’est un auteur expérimenté qui minimise sa propre frustration, mesurée après avoir bien appris Ruby.
  • MINASWAN : la culture est un résultat de conception. « Matz est gentil, alors nous sommes gentils » montre que la communauté d’un langage est une surface que l’on peut concevoir, et non un simple accident découlant de sa grammaire.
  • Ruby, c’est un seul goût appliqué sans relâche. Sa cohérence vient de la synthèse : Perl, Smalltalk, Lisp, Ada, Eiffel harmonisés en une seule voix plutôt qu’en moyenne d’un comité.

Le principe

« Pour moi, le but de la vie consiste en partie à éprouver de la joie. Les programmeurs ressentent souvent de la joie lorsqu’ils peuvent se concentrer sur le côté créatif de la programmation, c’est pourquoi Ruby est conçu pour rendre les programmeurs heureux. » – Yukihiro Matsumoto1

La plupart des langages sont conçus en optimisant pour la machine. Vitesse de compilation, organisation de la mémoire, nombre d’instructions, tout ce qui importe au silicium. Matz a inversé la priorité. Il a décidé que l’humain au clavier était l’interlocuteur qui comptait, et que le rôle de la machine était de le servir. « Les machines devraient servir les êtres humains », a-t-il dit. « Souvent, les programmeurs servent les machines inconsciemment. Laissez les machines vous servir. »2

La joie est ici une contrainte de conception stricte, et non un sentiment vague déguisé en ingénierie. Si la joie de l’humain est la fonction objectif, alors chaque choix syntaxique, chaque nom de méthode, chaque valeur par défaut devient une question sur la manière dont une personne se sentira en lisant et en écrivant le code, plutôt que sur la vitesse de déplacement des octets. Matz a rendu le compromis explicite et honnête : Ruby dépenserait les cycles de la machine pour acheter le confort du programmeur. La même conviction fait du goût un système structurel plutôt qu’une décoration : l’expérience de la personne qui fait le travail devient la préoccupation porteuse au lieu d’une réflexion après coup appliquée à la fin.

Une seule décision gouverne tout ce qui suit : concevoir pour les humains, pas pour les machines. La syntaxe, la culture, la devise de la communauté en découlent toutes. Le reste de cet article retrace comment la quête du bonheur personnel d’une seule personne s’est durcie en une position d’ingénierie défendable, et pourquoi « servir l’humain » se révèle aussi rigoureux que « servir la machine », loin d’en être un repli.

Contexte

Yukihiro Matsumoto est né dans la préfecture d’Osaka, au Japon, le 14 avril 1965, et a grandi à Tottori à partir de l’âge de quatre ans.3 Il se décrit comme un passionné des langages, non pas un linguiste, mais un passionné des langages de programmation. Il était programmeur autodidacte jusqu’à la fin du lycée, et il a obtenu un diplôme en sciences de l’information à l’Université de Tsukuba, où il a travaillé dans un laboratoire de recherche axé sur les langages de programmation et les compilateurs.3 La fascination est venue d’abord ; Ruby en a été le résultat final.

Il a baptisé Ruby en février 1993 : le nom a surgi lors d’une discussion en ligne avec son collègue Keiju Ishitsuka, avant qu’une seule ligne de code n’ait été écrite, puis il l’a développé au fil des années suivantes.13 La motivation était l’insatisfaction. « Je voulais vraiment un langage de script véritablement orienté objet et facile à utiliser », a-t-il expliqué. « J’en ai cherché un, mais je n’en ai pas trouvé. »4 Perl était puissant mais, à son goût, pas vraiment orienté objet. Python était orienté objet mais, à son goût, pas assez agréable. Il a donc construit le langage qu’il voulait lui-même utiliser. Il a publié la première version publique le 21 décembre 1995.3

Le nom était une petite plaisanterie. Les deux hommes ont opté pour Ruby, une pierre précieuse, un clin d’œil à Perl, le langage auquel Ruby répondait en partie. Une perle, puis un rubis : un successeur nommé comme une mise à niveau progressive.4 Pendant des années, Ruby fut un phénomène principalement japonais, ses listes de diffusion et sa documentation étant en japonais. La percée mondiale est venue plus tard et de l’extérieur : David Heinemeier Hansson a construit Ruby on Rails par-dessus, et Rails a porté Ruby au reste du monde au milieu des années 2000.4 Le langage qu’une seule personne avait construit pour son propre bonheur est devenu le substrat des applications web de toute une génération.

Le travail

La conception de Ruby : la joie et le principe de moindre surprise

Matz prononçant le discours d'ouverture à EuRuKo 2011, photographié par Mathias Meyer

L’idée la plus citée à propos de Ruby est le « principe de moindre surprise » : le langage devrait se comporter comme on s’y attend, afin que l’on consacre son attention au problème et non à l’outil. Matz adhère au principe mais corrige une lecture erronée fréquente. « Le principe de moindre surprise, c’est le principe de ma moindre surprise », a-t-il dit. « Et cela signifie le principe de moindre surprise après avoir très bien appris Ruby. »5

Cette correction résume toute la philosophie en une seule phrase. Il n’a pas sondé les programmeurs pour faire la moyenne de leurs attentes. Il a conçu le langage pour minimiser sa frustration, pariant qu’un langage qui ravissait son propre auteur, un utilisateur expérimenté et exigeant, en ravirait d’autres une fois qu’ils auraient atteint la maîtrise. « Je voulais minimiser ma frustration pendant la programmation, donc je veux minimiser mon effort en programmation », a-t-il dit. « Je veux moi-même prendre du plaisir à programmer. »5 Ruby est un langage personnel qui a su passer à l’échelle. Sa cohérence n’est pas celle d’un comité ; c’est la cohérence d’un seul goût appliqué sans relâche.

Concevoir pour les humains, pas pour les machines

Matz traite le logiciel comme un médium destiné aux personnes, et non comme un ensemble d’instructions pour le matériel. « Ne sous-estimez pas le facteur humain », a-t-il dit. « Même si nous sommes devant des ordinateurs, ce sont des médias. Nous travaillons pour l’humain, avec l’humain. La plupart de nos tâches sont liées aux humains après tout. »5 Il pousse l’idée au-delà du slogan : l’interface, pour Matz, c’est le produit tout entier. « Si votre système a une mauvaise interface, personne ne l’utilisera. L’interface ou la surface du système, qu’elle s’adresse aux utilisateurs ou à d’autres machines, est donc très importante. »2

Le corollaire est un refus de se soumettre aux préférences de la machine. Interrogé sur la relation entre l’humain et l’ordinateur, Matz a été direct : « Nous sommes les maîtres. Ce sont les esclaves. »6 La machine existe pour servir l’intention du programmeur, et un langage qui force l’humain à penser comme un processeur inverse la relation. Les blocs de Ruby, son modèle où tout est objet, ses noms de méthodes lisibles – Array#each, Integer#times, String#upcase – dépensent tous de la complexité d’implémentation pour que la surface se lise comme une intention.

MINASWAN : la culture comme résultat de conception

L’artefact le plus inhabituel de Ruby n’est pas une fonctionnalité ; c’est une norme communautaire. Matz a une attitude célèbre pour sa gentillesse et sa patience, et cette disposition s’est propagée en une devise : MINASWAN – « Matz est gentil, alors nous sommes gentils ».7 Aux débuts de Ruby, lorsque les discussions s’envenimaient sur les listes de diffusion, des membres de la communauté la brandissaient pour instaurer un ton plus chaleureux. Elle s’est répandue jusqu’à devenir une identité.8

La leçon que la plupart des concepteurs de langages manquent, c’est que la culture est elle aussi une surface de conception. Un langage est plus que sa grammaire ; c’est l’expérience de poser une question et d’obtenir une réponse généreuse, de lire une bibliothèque dont l’auteur tenait à ce que vous compreniez. Matz a conçu la syntaxe, et par l’exemple il a également conçu la posture sociale qui l’entoure. Un langage construit pour rendre les programmeurs heureux a fait naître une communauté attachée à la bienveillance parce que la même valeur animait les deux : la communauté, c’est le principe de moindre surprise appliqué aux personnes.

mruby : la philosophie dans un espace contraint

En avril 2012, Matz a publié mruby en open source – une implémentation légère et embarquable de Ruby conçue pour fonctionner là où Ruby complet est trop lourd : microcontrôleurs, systèmes embarqués, appareils grand public.9 Elle respecte un sous-ensemble de la spécification Ruby ISO/IEC 30170 et se présente comme un petit interpréteur doté d’un compilateur de bytecode et d’une machine virtuelle, embarquable dans du C ou du C++ à la manière de Lua.10

mruby est intéressant précisément parce qu’il met la philosophie à l’épreuve sous pression. Lorsque l’on dispose de kilo-octets de RAM et d’aucun luxe en matière de cycles, « concevoir pour les humains » survit-il ? La réponse de Matz a été de conserver l’expressivité de Ruby tout en allégeant le poids de l’environnement d’exécution – d’apporter le plaisir d’écrire Ruby jusqu’à la couche du firmware plutôt que de forcer les développeurs embarqués à descendre vers le C. Le pari centré sur l’humain a tenu même là où il était le plus hostile.

La méthode

La méthode de Matz, c’est de l’empathie formalisée en une discipline de conception. Le geste récurrent consiste à se demander non pas « qu’est-ce qui est correct pour la machine ? » mais « que ressentira la personne ? » – puis à payer quel que soit le coût d’implémentation qu’exige cette réponse.

Le deuxième geste est la synthèse. Ruby est ouvertement dérivatif : la pragmatique et les expressions régulières de Perl, le modèle objet pur et le passage de messages de Smalltalk, la flexibilité de Lisp, des éléments d’Ada et d’Eiffel.4 Matz n’a pas inventé un nouveau paradigme. Il a emprunté les meilleures idées des langages qu’il admirait et les a harmonisées en une seule voix cohérente. Peu de concepteurs exercent ce goût : la discipline de prendre plutôt que d’inventer, et la discipline plus difficile encore de faire en sorte que les parties empruntées s’accordent au lieu de s’entrechoquer. Le principe de moindre surprise est en partie une cohérence interne : une fois que vous avez appris un coin de Ruby, le suivant se comporte de la manière que le premier vous a appris à attendre.

Le troisième geste est l’honnêteté quant au compromis. Matz n’a jamais prétendu que Ruby était le choix rapide, et il l’a dit clairement, plutôt que de revendiquer la chaleur tout en optimisant discrètement pour les bancs d’essai. Le coût est réel et concret : parce que tout en Ruby est un objet, même un entier est un objet de première classe, et l’arithmétique s’effectue en lui envoyant le message + plutôt qu’en exécutant une instruction machine brute.14 La commodité de 5.times ou de (1..n).map – traiter les nombres comme des objets auxquels on peut parler – se paie par une surcharge de répartition et d’allocation qu’un int en C n’engage jamais. Matz a choisi la surface lisible et a laissé l’environnement d’exécution absorber la facture, ce qui est exactement le pari énoncé clairement.

Chaîne d’influence

Qui l’a façonné

Larry Wall et Perl. Ruby a hérité de la sensibilité pragmatique et orientée résultats de Perl, ainsi que de son ADN d’expressions régulières. Matz lui-même a présenté Ruby comme une réponse à Perl – en conservant le côté pratique, en corrigeant ce qu’il percevait comme son absence de véritable orientation objet. (Influence directe)4

Smalltalk. La conviction que tout est un objet – les entiers, les classes, nil – et que le calcul s’effectue par l’envoi de messages provient de Smalltalk. C’est l’héritage structurel le plus profond du modèle objet de Ruby. (Influence directe)4

Lisp, Ada et Eiffel. Lisp a apporté la flexibilité et l’idée que le langage devrait se plier au programmeur ; Ada et Eiffel ont apporté d’autres éléments concrets de syntaxe et de conception. Ruby en est la synthèse. (Influences formatrices)4

Qui il a façonné

Le web de l’ère Rails. Ruby on Rails a fait de Ruby le langage par défaut de toute une génération de startups et a donné au « bonheur du développeur » un argument commercial : des programmeurs plus heureux livraient plus vite, de sorte que le langage centré sur l’humain remportait des projets sur l’économie, et pas seulement sur le ressenti.

L’attente de base de toute une génération. Après Ruby, les programmeurs s’attendaient à ce que les langages soient agréables – qu’ils se lisent comme de la prose, qu’ils pardonnent, qu’ils enchantent. Cette attente a redéfini le seuil que les langages plus récents devaient franchir pour être pris au sérieux.

Crystal et Elixir. Crystal emprunte la syntaxe de Ruby presque entièrement tout en se compilant en code natif via un backend LLVM.11 Elixir, le langage fonctionnel de José Valim pour la BEAM, transporte la sensibilité ergonomique de Ruby dans le monde concurrent ; Valim cite son « expérience antérieure en Ruby » pour nombre de ses constructions empruntées.12 L’esthétique de Ruby a survécu à son environnement d’exécution. (Lignée stylistique)

Le fil conducteur

Voici la tension productive. Matz optimise pour le bonheur humain et reconnaît honnêtement qu’il dépense les cycles de la machine pour y parvenir. L’autre pôle de l’ingénierie optimise pour la machine – John Carmack comptant les cycles jusqu’à ce que l’image tienne dans le budget, Linus Torvalds défendant le « bon goût » comme la structure de données qui fait disparaître le cas particulier. Carmack et Torvalds demandent ce que le matériel mérite ; Matz demande ce que l’humain mérite. Aucun des deux pôles n’a tort. Les meilleurs systèmes vivent dans la dispute entre les deux – assez expressifs pour qu’une personne prenne plaisir à les écrire, assez disciplinés pour que la machine ne soit pas insultée. Matz est la preuve que « concevoir pour l’humain » est une position d’ingénierie légitime et rigoureuse, et pas seulement un confort. (Pont de la série)

Ce que j’en retiens

Je construis des outils pour développeurs et des infrastructures d’orchestration pour agents d’IA, et le pari de Matz est celui que je continue de faire : l’humain dans la boucle est l’interlocuteur qui compte. Un agent de programmation, tout comme un langage de programmation, est une interface entre l’intention d’une personne et l’exécution d’une machine. S’il vous surprend, vous combat, ou vous force à penser comme la machine au lieu de penser au problème, il a échoué – aussi astucieux que soient ses rouages internes. Tout l’intérêt de ces rouages internes est de rendre l’expérience lisible pour la personne. C’est aussi pourquoi je garde la surface honnête et la pile mince – le manifeste sans build, c’est le principe de moindre surprise appliqué à une chaîne d’outils. Et tout comme Matz refusait de prétendre que Ruby était rapide, je préfère être honnête sur le compromis plutôt que de le cacher : la qualité est la seule variable, et le bonheur du programmeur fait partie de la qualité, il ne s’y oppose pas.

FAQ

Quelle est la philosophie d’ingénierie de Yukihiro Matsumoto ?

Matz conçoit des langages de programmation pour le bonheur et la productivité de l’humain plutôt que pour l’efficacité de la machine. Son but déclaré : « Ruby est conçu pour rendre les programmeurs heureux. »1 Il traite l’expérience du programmeur – lisibilité, joie, moindre surprise – comme la contrainte de conception primordiale, et accepte un environnement d’exécution plus lent comme le prix honnête de ce service. « Les machines devraient servir les êtres humains », a-t-il dit. « Laissez les machines vous servir. »2

Qu’est-ce que le principe de moindre surprise dans Ruby ?

C’est l’idée que le langage devrait se comporter comme un utilisateur expérimenté l’attend, en minimisant les frictions. Matz précise que cela signifie « le principe de ma moindre surprise » – il a conçu Ruby pour minimiser sa propre frustration en tant qu’utilisateur expérimenté, et « le principe de moindre surprise après avoir très bien appris Ruby », et non la surprise d’un débutant le premier jour.5

Que signifie MINASWAN ?

MINASWAN signifie « Matz est gentil, alors nous sommes gentils » – une devise de la communauté Ruby née de l’attitude gentille et patiente de Matsumoto. Les premiers rubyistes la brandissaient pour instaurer un ton généreux sur les listes de diffusion, et elle est devenue une partie de l’identité culturelle de Ruby.78 Elle reflète l’idée que la communauté d’un langage est elle-même une surface de conception.

Quels langages ont influencé Ruby ?

Ruby est une synthèse délibérée. Il a puisé la sensibilité pragmatique et les expressions régulières de Perl, le modèle objet pur et le passage de messages de Smalltalk, la flexibilité de Lisp, ainsi que des éléments d’Ada et d’Eiffel. Matz a combiné les fonctionnalités qu’il admirait en un seul langage cohérent plutôt que d’inventer un nouveau paradigme.4


Sources


  1. Bill Venners, “The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I.” Artima Developer, 29 September 2003. “For me the purpose of life is partly to have joy… so Ruby is designed to make programmers happy.” 

  2. Bill Venners, “Matz on Craftsmanship: A Conversation with Yukihiro Matsumoto, Part III.” Artima Developer, 2003. “Machines should serve human beings… Let machines serve you.” Also: interface as the surface of the system. 

  3. “Yukihiro Matsumoto.” Wikipedia. Born 14 April 1965 in Osaka Prefecture, raised in Tottori from age four; University of Tsukuba information science; first Ruby release 21 December 1995; mruby (April 2012). 

  4. Sinclair Target, “The Ruby Story.” Two-Bit History, 19 November 2017. Started 1993; “I really wanted a genuine object-oriented, easy-to-use scripting language”; naming with Keiju Ishitsuka after a gemstone / nod to Perl; influences from Perl, Smalltalk, Lisp, Ada, Eiffel; “I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy”; Rails-driven global breakout. 

  5. Bill Venners, “The Philosophy of Ruby, Part I.” Artima Developer, 2003. “The principle of least surprise means principle of least my surprise”; “I wanted to minimize my frustration during programming”; “Don’t underestimate the human factor… We are working for human, with human.” 

  6. “Yukihiro Matsumoto.” Wikiquote, citing The Philosophy of Ruby, A Conversation with Yukihiro Matsumoto, Part I, Bill Venners, Artima Developer, 2003. “We are the masters. They are the slaves.” 

  7. “Yukihiro Matsumoto.” Wikipedia. “Matz’ demeanor has brought about a motto in the Ruby community: ‘Matz is nice and so we are nice,’ commonly abbreviated as MINASWAN.” 

  8. “MINASWAN.” Wiktionary. Initialism of “Matz is nice and so we are nice”; origin and use as a community-tone norm in Ruby’s early days. 

  9. “Mruby.” Wikipedia. mruby open-sourced April 2012 under Matsumoto’s direction; lightweight, embeddable implementation for constrained environments; conforms to a subset of ISO/IEC 30170. 

  10. “mruby – Lightweight Ruby.” mruby.org. Embeddable interpreter, bytecode compiler (mrbc), and virtual machine; embeddable into C/C++ in a manner similar to Lua; ISO/IEC 30170:2012 compliance. 

  11. “Crystal (programming language).” Wikipedia. “With syntax inspired by the language Ruby… it compiles to much more efficient native code using an LLVM backend.” 

  12. José Valim, “Elixir Design Goals.” elixir-lang.org, 8 August 2013. “Given my previous background in Ruby, it is natural that some of the constructs added were borrowed from Ruby.” Also: Elixir runs on the BEAM (Erlang VM), per “Elixir (programming language),” Wikipedia

  13. “Ruby (programming language).” Wikipedia. “The name ‘Ruby’ originated during an online chat session between Matsumoto and Keiju Ishitsuka on 24 February 1993, before any code had been written for the language.” 

  14. “class Integer.” Ruby Core Reference. “An Integer object represents an integer value.” Arithmetic operators such as self + other are documented as public instance methods, meaning integer arithmetic is performed via method dispatch on an object rather than a raw machine instruction. 

Articles connexes

Philosophie de l'ingénierie : Roberto Ierusalimschy

Roberto Ierusalimschy a conçu Lua autour d'un seul principe — des mécanismes, pas des règles imposées — un langage petit…

24 min de lecture

Philosophie de l'ingénierie : Guido van Rossum, la lisibilité compte

Guido van Rossum a bâti Python sur un seul pari : le code est lu bien plus souvent qu'il n'est écrit, si bien que le lan…

17 min de lecture

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 min de lecture