Le plaisir de créer des logiciels-jouets
(blog.jsbarretto.com)- Créer des logiciels-jouets est une façon de retrouver le plaisir et la créativité qui sont au cœur du développement logiciel
- À une époque où l’IA et l’industrialisation font disparaître la joie pure du développement logiciel, réaliser de petits programmes-jouets comme projets personnels permet d’acquérir des connaissances utiles en pratique et une compréhension plus profonde
- Les logiciels-jouets suivent la règle du 80:20 : obtenir un maximum de fonctionnalités avec un minimum de code, et l’essentiel est d’éviter la surconception et l’obsession de la finition
- Sans dépendre d’outils d’IA comme les LLM, l’expérience même de construire par soi-même, en se confrontant directement aux difficultés, constitue le vrai plaisir de l’apprentissage et de la progression
Pourquoi il faut créer plus de programmes-jouets
- Citation célèbre de Richard Feynman : « Ce que je ne peux pas créer, je ne le comprends pas » → l’expérience de fabriquer quelque chose soi-même mène à une compréhension profonde
- Contrairement au conseil classique de « ne pas réinventer la roue », le fait de fabriquer soi-même la roue enseigne bien plus que la lecture ou l’apprentissage théorique
- Récemment, l’IA et l’industrialisation du logiciel menacent le plaisir et le sens de l’artisanat dans le développement
- La création de logiciels-jouets permet de retrouver ce plaisir simple qui nous faisait tomber amoureux de l’informatique
Principes des programmes-jouets : Keep it simple
- Les logiciels-jouets suivent le principe du 80:20 : 80 % des fonctionnalités avec 20 % de l’effort
- L’objectif n’est pas le produit final, mais la simplicité et l’implémentation directe des principes essentiels
- Mise en garde contre l’over-engineering : l’accent est mis sur l’écriture du seul code réellement nécessaire
- Il est recommandé de laisser tous les chemins de code non encore implémentés, puis d’étendre l’implémentation à mesure que le besoin apparaît
- Même un système qui semble petit peut, dans la pratique, se révéler étonnamment facile à construire
Bénéfices annexes des logiciels-jouets
- Les connaissances acquises dans les projets-jouets aident souvent bien plus qu’on ne l’imagine, au travail, pour traquer des problèmes, corriger des bugs et éviter des erreurs
- Le fait de se confronter directement aux contraintes apporte des éclairages sur la nature même du logiciel et peut aussi conduire à des solutions innovantes
Exemples : liste de projets de logiciels-jouets
Cette liste rassemble, avec leur niveau de difficulté et leur durée estimée, différents types de projets-jouets implémentés directement au cours des 15 dernières années. Chaque projet inclut une brève description et des ressources complémentaires
- Moteur de regex (difficulté 4/10, 5 jours) : interprétation de regex de style POSIX et identification des chaînes correspondantes, pour comprendre en profondeur le fonctionnement interne des expressions régulières
- Noyau d’OS x86 (difficulté 7/10, 2 mois) : inclut une CLI, des pilotes simples, un gestionnaire mémoire, avec possibilité d’ajouter un système de fichiers en mémoire, des exécutables ELF, une GUI, l’isolation des processus, etc.
- Émulateur GameBoy/NES (difficulté 6/10, 3 semaines) : compréhension d’un jeu d’instructions simple et du matériel, implémentation du PPU, du PSG et de formats de cartouches particuliers
- Jeu GameBoy Advance (difficulté 3/10, 2 semaines) : petit jeu basé sur des sprites, communauté de développement GBA active, architecture système qu’on peut tout à fait maîtriser seul
- Moteur physique 2D (difficulté 5/10, 1 semaine) : mécanique newtonienne de base et gestion simple des collisions, extensible à des formes complexes, l’inertie, des algorithmes de résolution, les soft bodies ou des interactions composites
- Interpréteur dynamique (difficulté 4/10, 1 à 2 semaines) : interpréteur parcourant un arbre ; créer son propre langage procure un plaisir à la fois technique et créatif
- Compilateur de type C (difficulté 8/10, 3 mois) : système de types simple et environnement cible, conception d’une architecture prenant en charge diverses optimisations et plusieurs backends
- Éditeur de texte (difficulté 5/10, 2 à 4 semaines) : à partir d’entrées/sorties de fichiers simples, possibilité d’utiliser un toolkit UI (QT/GTK, etc.), préférence pour la console, avec fonctionnalités supplémentaires comme Unicode, coloration syntaxique, multi-buffer, LSP, etc.
- Runtime async (difficulté 6/10, 1 semaine) : dans le cas de Rust, gestion de tâches
impl Futureet implémentation de la concurrence, avec ajout du réveil I/O - Hash Map (difficulté 4/10, 3 à 5 jours) : compréhension du fonctionnement interne, apprentissage du closed addressing et de l’open addressing, de la règle du robin hood, ainsi que des performances et des bons cas d’usage
- Rasteriser / Texture Mapper (difficulté 6/10, 2 semaines) : apprentissage de la structure du pipeline graphique 3D, des mathématiques vectorielles, du Z-buffer, avec approfondissement possible vers le texture mapping et les algorithmes de shading
- Rendu par Signed Distance Field (difficulté 5/10, 3 jours) : représentation mathématique de l’espace, visualisation simple, meilleure compréhension des shaders et des mathématiques vectorielles
- Moteur voxel (difficulté 5/10, 2 semaines) : plus facile à appréhender si l’on a une expérience en graphisme 3D ou en développement de jeux, avec défis supplémentaires possibles comme les textures, la génération procédurale ou le réseau
- Machine virtuelle threaded (difficulté 6/10, 1 semaine) : interpréteur rapide, implémentation d’un interpréteur optimisé sans génération de code spécifique à l’architecture, avec des performances pouvant rivaliser avec celles d’un compilateur
- Toolkit GUI (difficulté 6/10, 2 à 3 semaines) : après une première expérience de création d’outils UI de base, possibilité d’implémenter soi-même des fonctions avancées comme un moteur de layout, le text shaping ou l’accessibilité
- Simulateur de mécanique orbitale (difficulté 6/10, 1 semaine) : implémentation simple d’un modèle newtonien de gravitation, extensible aux interactions entre plusieurs corps célestes, aux algorithmes d’intégration, à la visualisation, voire à l’utilisation de données de la NASA
- Bitwise Challenge (difficulté 3/10, 2 à 3 jours) : jeu entièrement reproductible à partir d’un état 64 bits, excellent exercice de gestion créative de l’état, avec règles détaillées disponibles sur GitHub
- Framework ECS (difficulté 4/10, 1 à 2 semaines) : implémentation directe d’une architecture Entity-Component-System, intégration au système de types du langage, avec réglage possible des contraintes et des performances
- Émulateur CHIP-8 (difficulté 3/10, 3 à 6 jours) : machine virtuelle simple des années 1970, rapide à implémenter, permettant d’observer et d’exécuter de nombreux fan games
- Moteur d’échecs (difficulté 5/10, 2 à 5 jours) : on commence par les règles puis on progresse peu à peu ; perdre contre le moteur qu’on a soi-même écrit est une étape marquante dans la progression d’un développeur
- Shell POSIX (difficulté 4/10, 3 à 5 jours) : compréhension des principes et des limites d’un shell fondé sur POSIX, ainsi que de la profondeur de la compatibilité avec le langage shell réel et des nombreuses astuces qu’elle implique
Conseils sur l’usage d’outils comme les LLM
- Les outils avancés comme les LLM sont utiles, mais le véritable apprentissage devient plus profond quand on explore soi-même
- Plutôt que de regarder des solutions existantes, on peut tirer un sentiment d’accomplissement plus fort du processus d’exploration de l’inconnu et de la recherche de sa propre réponse
- Mener un projet-jouet sans LLM peut sembler difficile au début, faute d’habitude, mais avec le temps on ressent un plaisir technique propre et un fort sentiment d’accomplissement
- Se déplacer en voiture ne permet pas de ressentir le « runner’s high » d’un coureur → c’est dans l’expérience directe, et non dans le raccourci, que l’on trouve une joie profonde
3 commentaires
Je comprends bien l’idée qu’il faut essayer sans LLM. Quand il n’y a pas besoin de développer rapidement, j’ai l’impression que construire soi-même en comprenant chaque élément un à un est plus amusant et plus gratifiant.
Vous parliez donc d’un projet perso. En voyant seulement le titre, j’ai cru qu’il s’agissait de développer un logiciel pour des jouets. Haha.
Avis Hacker News
Je me demande qui utilise les LLM comme moteur de recherche. Avant, je cherchais sur Google des choses comme « pros cons mysql mongodb », puis je lisais la documentation officielle, des forums, des blogs et Stack Overflow, ce qui prenait beaucoup de temps. Mais j’ai toujours apprécié le temps passé à apprendre en lisant. Maintenant, je donne au LLM des prompts plus précis du genre « avantages et inconvénients de mysql vs mongodb pour stocker des photos, avec des liens de référence ». Ça permet de cerner rapidement l’essentiel, et j’aime le fait d’avoir aussi les liens pour ne pas dépendre des hallucinations. Il m’arrive aussi de lui demander des choses plus concrètes, comme « conçois un data schema pour stocker des métadonnées de photos dans postgres, je veux séparer X dans une autre table », mais je ne le fais que quand je sais exactement à quoi le résultat doit ressembler. En gros, je l’utilise quand je veux éviter de perdre du temps à taper ou quand j’oublie momentanément un nom de type précis (
intvsinteger, etc.)/src/fooet explique-moi commentbarFeaturey est implémentée. Maintenant regarde le projet/src/bazet explique-moi pourquoi l’approche de foo s’applique difficilement à baz ». Je ne lui demande pas de faire quelque chose de nouveau ; je m’en sers pour traduire dans mes idées ce qui existe déjà dans le projet. Le développement vraiment nouveau et stimulant, j’ai envie de le coder moi-mêmeL’une des meilleures décisions de ma carrière a été un projet personnel mené pendant six mois de pause entre deux emplois. J’avais à l’origine beaucoup de projets à lancer, mais comme je n’avais pas de contraintes, le périmètre ne cessait de gonfler et je finissais souvent par ne rien terminer. J’ai donc décidé de n’investir qu’une semaine par projet. Je ne faisais que ce qu’il était possible de faire en une semaine. Partir de zéro et construire en une semaine quelque chose d’utilisable dans un nouveau langage, un nouveau framework ou un domaine peu familier a énormément renforcé ma confiance. Ça m’a aussi rappelé pourquoi j’aimais programmer au départ. Si vous avez quelques mois de pause entre deux postes, au lieu de préparer des entretiens à la Silicon Valley, fabriquer simplement des toy projects peut vous surprendre par tout ce que vous savez déjà
Développer des toy software, c’est comme entretenir des vélos, des voitures ou des bateaux. C’est plaisant. Mais réparer son vélo de trajet quotidien, c’est stressant. Créer du toy software, c’est amusant, mais dès que je veux vraiment l’utiliser un jour, je découvre tous les bugs, et je n’ai plus le temps de les corriger ; c’est tout le dilemme
Je suis surpris de voir autant d’avis négatifs sur les LLM. Les LLM vous servent l’information à la cuillère. Quand on démarre un nouveau projet, on ne commence évidemment pas en sachant tout. On fait de son mieux, on se plante, puis on étudie, on comprend pourquoi ça n’a pas marché, et on ajuste avec une nouvelle approche : c’est ça, le vrai apprentissage. Si on suit simplement un tutoriel parce qu’on sait déjà tout, on ne fait pas l’expérience concrète des limites ni des vrais avantages et inconvénients de chaque méthode. Par exemple, si on essaie de construire un parseur avec des expressions régulières, on découvre soi-même qu’elles ne gèrent pas les expressions récursives, et on apprend aussi au passage les structures plus complexes ou les problèmes de complexité temporelle. En implémentant soi-même un compilateur optimisant et en butant sur toutes sortes d’astuces d’optimisation, on finit par comprendre pourquoi les vrais compilateurs sont conçus ainsi. Il faut aussi écrire soi-même un moteur de layout pour ressentir à quel point même une notion comme
widthest pénible à traiter correctement. Il n’y a pas de meilleure expérience que celle de l’apprentissage par essais et erreurs. Même si les LLM évitent certaines erreurs, j’aimerais qu’on ne rate pas pour autant ces occasions d’apprentissage importantesMoi aussi, j’ai passé des années, les week-ends et les nuits, à faire d’innombrables projets bizarres pour apprendre l’infographie. Je n’ai pas gagné un centime avec ça, mais c’est ce qui m’a permis d’obtenir le job de mes rêves. Quelques liens vers des réalisations représentatives :
J’ai l’impression qu’on a vraiment besoin de l’esprit de « plaisir de programmer » mis en avant par ce texte. À l’ère du coding par agents IA, c’est peut-être encore plus précieux. En revanche, j’ai l’impression que l’estimation de l’auteur sur le temps nécessaire pour ces toy projects est beaucoup trop courte. Je ne suis peut-être pas dans la moyenne, mais même en supposant qu’on n’y travaille que 2 ou 3 heures par jour, je pense qu’une grande partie de cette liste ne se termine pas en quelques jours. Rien que la phase de recherche avant de commencer prend déjà pas mal de temps. Par exemple, j’ai récemment remplacé mon blog Pelican par mon propre static site generator Odin ; même à raison de 2 à 3 heures par jour, ça m’a pris deux semaines. Et pourtant, c’était probablement plus simple que les autres projets de la liste
Je suis d’accord avec le conseil « n’utilisez pas les LLM pour ce genre de projets », mais je pense qu’il ne faut pas le prendre de manière trop extrême. La question de savoir comment se faire aider par l’IA, et pourquoi cela semble différent du fait de demander de l’aide à une personne, est d’ailleurs intéressante. Si le billet disait en bas « si vous avez un ami très bon en programmation, ne lui demandez jamais d’aide », ce serait étrange. Un ami expert comprend le contexte et vous aide à résoudre le problème par vous-même. Presque personne n’a sans doute essayé de dire explicitement à l’IA : « je ne veux pas que tu résolves le problème à ma place ; guide-moi comme le ferait un ami expert ». Bien sûr, pour l’instant, elle peut en être incapable ou le faire imparfaitement, mais dans un ou deux ans, ce type de guidance deviendra peut-être tout à fait naturel. Donc, prendre l’habitude de préciser clairement quel type d’aide on veut me paraît une bonne chose. Il n’est pas nécessaire de partir du principe qu’un LLM ne fournira que des réponses fausses
Grâce au vibe coding basé sur Claude, j’ai enfin recommencé un side project amusant après très longtemps. Une fois les outils et le processus assimilés, j’ai rapidement construit en quelques semaines toute une série d’apps : un tableau de bord familial calendrier/météo, une appli de lecture Bluesky (qui masque les posts déjà vus), un tableau de bord PM d’entreprise gamifié, une extension Chrome qui masque des posts Reddit après un certain temps, ou encore une appli qui remplace un plugin WordPress plus maintenu. Au début, je laissais Claude faire beaucoup de choses, comme améliorer l’UI, mais maintenant j’ai appris à me satisfaire d’un niveau de finition à 90 % et à concentrer mes efforts sur les nouvelles fonctionnalités plutôt que sur le raffinement
Cette liste est vraiment impressionnante. Un bon nombre des projets que l’auteur juge faciles me sembleraient d’un niveau de difficulté bien plus élevé. Mais elle a clairement un effet motivant : elle me donne envie de relancer mes propres toy projects. En revanche, la conclusion sur l’apprentissage avec les LLM est plus nuancée. Tout dépend entièrement de la manière dont on les utilise. Par exemple, une demande du type « implémente-moi simplement ce problème » est catastrophique pour apprendre, alors que « explique-moi la structure d’ELF au niveau le plus abstrait, en te concentrant sur le “pourquoi” » est au contraire un formidable accélérateur d’apprentissage. Le fait de ne plus faire soi-même toute la recherche peut être un inconvénient, mais si l’on garde une vraie posture intellectuelle, le simple fait de pouvoir avoir à tout moment un échange socratique de questions-réponses constitue un énorme accélérateur d’apprentissage
Les projets présentés ici sont de très bonnes idées, mais aucun ne m’intéresse vraiment. Dans ces moments-là, je me demande si j’ai réellement aimé programmer un jour