Faragiri

Apprendre les langages de programmationla programmation

Ce qu'un langage demande vraiment : la syntaxe d'un week-end, puis les paquets, les versions et le verrou qui décident si le programme tourne ailleurs.

6Sections
7Min de lecture
2Profondeur

Un langage, en coupe

Le cours est le noyau, et la journée se perd dans les anneaux

L'apprentissage va du milieu vers le dehors. Un programme cesse de marcher sur une deuxième machine dans les deux anneaux extérieurs, que personne ne couvre.

  1. le langage lui-mêmeLa syntaxeBoucles, fonctions, la façon dont il écrit une liste. Un week-end, et c'est ce que tout le monde appelle apprendre un langage
  2. 02La bibliothèque standardElle se consulte au lieu de s'apprendre, et c'est la bonne façon de s'en servir
  3. 03Le gestionnaire de paquetsUn par langage, tous de la même forme, aucun au premier chapitre
  4. 04Le verrou et la version du moteurLes deux seules choses qui diffèrent entre deux machines faisant tourner le même code
  5. 05Compilation, tests, publicationLà où un projet cesse d'être un fichier et devient quelque chose qui se transmet

Elle ne dit rien de la difficulté. Les anneaux du dehors ne sont pas plus durs que le noyau, ils ne sont simplement pas enseignés, et pour un lecteur français ils sont documentés en anglais, ce qui n'est pas la même dépense.

Karim Lefèvre a écrit cent quatre-vingts lignes en mars, dans une petite agence de Villeurbanne : un outil qui transforme l'export mensuel de la banque en tableau de suivi. En septembre il a repris le dossier sur un ordinateur neuf, lancé l'installation des dépendances, et la troisième ligne du programme ne passe plus. Personne n'a touché à son code. Une bibliothèque a publié une version mineure entre mars et septembre, et une fonction a changé de place.

La syntaxe lui avait coûté un week-end. Ce qui lui a coûté une journée n'est pas de la syntaxe, et porte le même nom dans les douze langages rangés ici : la façon dont un projet déclare ce dont il dépend, et la façon dont une deuxième machine est amenée à être d'accord.

Un langage n'est pas une langue

Le français fait ici une distinction que l'anglais n'a pas, et elle est exactement la bonne. Une langue a des locuteurs, un usage et une tolérance : une phrase ambiguë passe, parce qu'un être humain en face répare. Un langage n'a rien de tout cela. Il a une spécification et une implémentation, et une seule implémentation décide du sens.

La conséquence arrive au premier message d'erreur. Quand l'interpréteur refuse une ligne, il n'a pas mal compris et il n'y a personne à convaincre : il applique une règle écrite quelque part, que vous pouvez aller lire. Chercher l'intention derrière un refus est le réflexe qu'on apporte d'une langue, et il ne sert à rien ici. Ce qui reste vrai quel que soit le langage est rangé dans les bases de la programmation ; ce qui change d'un langage à l'autre est ce sujet.

La seconde conséquence se voit sur chaque ligne d'un projet français. Les mots-clés, la bibliothèque standard et presque tous les paquets sont en anglais, et un identifiant français au milieu produit une expression bilingue dont l'accord ne tient pas : adherents.filter(estAJour) mêle deux grammaires, et le pluriel français ne survit pas au passage. La convention des équipes françaises est le code en anglais et les commentaires en français. Ce n'est pas une capitulation, c'est la seule façon d'obtenir une expression qui se lise dans un seul sens.

Ce qu'un langage vous demande vraiment d'apprendre

Un cours couvre les boucles, les fonctions et la façon dont le langage écrit une liste. Cette matière est réelle, et c'est la petite moitié. Dessous se tiennent un gestionnaire de paquets, un fichier de verrouillage, une étape de compilation, un lanceur de tests, un formateur et une façon de publier. Aucun de ces objets n'apparaît dans le cours, parce qu'aucun n'appartient au langage. Ce sont eux qui font qu'un programme qui marche cesse de marcher sur une autre machine, ou sur la même quatre mois plus tard.

La forme, elle, est la même partout. uv, npm et cargo font le même travail sous trois noms : chacun lit un fichier qui liste ce dont le projet a besoin, le résout en versions exactes, et écrit ces versions exactes ailleurs. Apprendre la forme une fois fait que le deuxième langage coûte une fraction du premier, et c'est ce qui rend le choix du premier langage moins lourd qu'il n'en a l'air.

Trois caractères de ponctuation décident de ce qui s'installe

La panne de septembre vient d'un numéro. 2.4.1 se lit majeure 2, mineure 4, correctif 1, et ce n'est pas une décoration. C'est une promesse : un correctif répare, une mineure ajoute sans casser ce qui existait, une majeure a le droit de casser. Le numéro est donc une déclaration sur ce qui arrivera à votre code si vous acceptez la mise à jour.

Ce qu'un fichier de projet enregistre est presque toujours un intervalle et non une version, et c'est la ponctuation qui porte l'intervalle. Le caret dans ^2.4.1 accepte 2.9.0 et refuse 3.0.0. C'était le réglage de Karim, et c'est le bon par défaut : il prend les correctifs et reste du bon côté de la promesse. Il signifie aussi qu'installer un mardi et installer un jeudi peuvent donner deux bibliothèques différentes, ce qui est précisément ce qui s'est produit entre mars et septembre.

Le second fichier est celui que personne ne lit, et c'est lui qui tranche. Il est produit et non écrit, il enregistre la résolution de chaque intervalle à un instant donné, et il se dépose dans le dépôt avec le reste. Un fichier de verrouillage se commite, sinon il n'a servi à rien : celui de Karim existait sur son ancienne machine et n'était pas dans le dépôt, ce qui en faisait un fichier temporaire de plus. C'est aussi la première marche de la mise en production, et elle se franchit avant d'avoir un serveur.

  • uv add pandas écrit l'intervalle dans le fichier de projet et la version exacte dans le verrou
  • uv sync sur la deuxième machine installe depuis le verrou au lieu de résoudre à nouveau
  • uv lock --upgrade est le geste volontaire par lequel les versions bougent, un jour choisi
  • uv tree affiche l'arbre complet des dépendances sur un seul écran
  • git add uv.lock est l'étape qui manquait au mois de mars

Un serveur qui renvoie une ligne

Combien de paquets il faut donner à un langage avant qu'il sache répondre

Le même programme trivial dans quatre langages, en comptant ce qui s'installe et non ce qui est déclaré.

Paquets directs et indirects installés pour un serveur qui renvoie une ligne de texte. Comptés ici, un après-midi, à titre indicatif et non officiel.

  1. JavaScriptPresque rien n'est livré, et le registre fournit le reste49
  2. Rustcargo est officiel, la moitié web ne l'est pas4
  3. PythonUne grande bibliothèque standard, et un petit cadre par-dessus2
  4. GoLe serveur est dans la bibliothèque standard, et le projet ne déclare rien0

Un compte élevé n'est pas une faiblesse. Un écosystème qui fournit tout avance plus vite qu'un comité, et la facture se règle en arbres de dépendances plutôt qu'en attente d'une version du langage.

Ce qui arrive dans la boîte, et ce qu'on assemble

Les langages diffèrent énormément par ce qui est livré avec eux, et la différence se compte. Pour le même serveur qui renvoie une ligne de texte, un projet Go installe 0 paquet et un projet JavaScript 49. La version Rust en installe 4 et la version Python 2. Le serveur est dans la bibliothèque standard d'un côté et dans le registre de l'autre, et c'est la même décision prise deux fois en sens contraire.

Aucun des deux bouts n'est meilleur. Un écosystème qui fournit tout avance plus vite qu'un comité, et le prix se paie en arbres de dépendances plutôt qu'en attente d'une version du langage. L'outil de Karim déclare quatre dépendances et en installe trente et une, parce que ces quatre en amènent d'autres. Ce n'est pas de la négligence : lire un classeur .xlsx demande de décompresser une archive et d'y parcourir du XML, et Karim n'allait pas écrire cela pour un tableau de suivi.

C'est l'axe à regarder avant de commencer un langage plutôt qu'après. Il prédit à quoi ressemble la première semaine, sur quoi porteront les disputes d'outillage, et quelle part du code que vous livrez aura été écrite par quelqu'un d'autre.

Où l'on cale, et le langage qu'on n'a pas choisi

Le blocage classique est le deuxième langage, et il est causé par la réussite du premier. Quelqu'un apprend Python, se met à l'aise, et prend cette aisance pour de la fluidité en programmation. Puis il ouvre Rust, rencontre un compilateur qui refuse du code où il ne voit rien d'anormal, et lit ce refus comme un verdict sur lui-même. Ce n'en est pas un. Le premier langage a enseigné une syntaxe et un écosystème, le second facture les hypothèses que le premier laissait passer.

Le second blocage est français, et il vient de la formation. Le BTS SIO, l'école 42, OpenClassrooms et les bootcamps financés par le CPF arrivent chacun avec leur langage, donc le lecteur français n'a souvent pas choisi le sien. La question qu'il se pose n'est pas lequel apprendre mais si ce n'est pas le mauvais, et il la garde pour lui, parce qu'il n'est pas certain d'avoir le droit de la poser au milieu d'une formation qu'on lui paie. Il a le droit, et la réponse tient en une ligne : une fois l'écosystème compris, un changement de langage se compte en semaines, pas en années.

Le troisième blocage est plus petit et plus fréquent. On essaie d'apprendre un langage en lisant sur le langage, sans rien installer, parce que l'installation est la partie ennuyeuse. L'installation est le sujet.

Ce qu'on ouvre en 2026

Pour Python, uv est la réponse courante et il a pris la place de trois outils : pip pour installer, virtualenv pour isoler, pyenv pour la version de l'interpréteur. Il fait les trois, il est gratuit et ouvert, et il écrit le verrou qui manquait à Karim. Pour JavaScript, npm est livré avec Node et reste le choix par défaut, à la place de la recopie manuelle d'un dossier de bibliothèques dans le projet. Pour Rust, cargo arrive avec le langage et il n'y a jamais eu de deuxième option, ce qui est l'argument discret des langages qui ont tranché tôt.

Les trois sont gratuits et ouverts, et joignables depuis la France sans compte, sans abonnement et sans détour ; le prix français de ce sujet n'est pas là. Il est que la documentation d'un paquet, ses messages d'erreur et la réponse de 2019 qui règle la panne sont en anglais, et que cela pèse réellement sur le choix d'une dépendance. À qualité comparable, on prend le paquet dont on peut lire la page, et c'est ainsi qu'une agence de Villeurbanne se retrouve sur une bibliothèque moins bonne et mieux documentée.

Reste la question avec laquelle presque tout le monde arrive et que le verrou ne tranche pas : sur lequel des douze passer les six prochains mois. Elle ne se règle pas dans le langage. Elle se règle par l'endroit où le code doit tourner, et le plus fréquenté de ces endroits est le développement web, où la deuxième machine n'est plus celle d'un collègue mais celle d'un inconnu.

À côté

Au-dessus