Apprendre un langage de programmation de A à Z.


Dans cet article, je vais vous présenter la stratégie complète que j’utilise pour appréhender et apprendre un nouveau langage de programmation.

Contrairement à quasiment tous les tutos sur Internet, cette méthode se veut généraliste et parfaitement applicable pour tous les langages. Elle a surtout pour objectif de vous montrer quoi apprendre, dans quel ordre, et où aller chercher l’information.

Donc préparez-vous un bon café, car cet article est très dense en informations.


Introduction

Avant de commencer, je tiens à préciser que cette méthode s’adresse avant tout aux personnes qui pratiquent déjà la programmation, et qui souhaitent étendre leurs connaissances en apprenant un nouveau langage.

En effet, avant d’apprendre un outil, les débutants ont besoin d’apprendre ce qu’est la programmation et comment elle fonctionne, ce qui peut prendre plusieurs mois.

Donc si vous débutez et qu’il s’agit de votre premier ou second langage, je vous conseille de suivre une démarche purement ludique, grâce à un cours sur l’excellent Open Classroom. Le choix du langage n’est pas important, car le but est uniquement d’apprendre.

En revanche, si vous en êtes à votre quatrième, sixième ou dixième langage, ce genre de cours est une perte de temps, car il va repasser sur des explications que vous avez déjà vues et revues dans d’autres langages.

D’où l’intérêt de ma méthode : aller chercher les bonnes informations tout en mettant à profit votre expérience. En appliquant correctement cette stratégie, vous allez être en mesure d’apprendre les bases d’un nouveau langage en moins d’une semaine.


Partie 0 : quel langage apprendre et pourquoi ?

C’est sûrement l’étape la plus importante de ce guide, et malheureusement, beaucoup de gens ne font pas l’effort de vraiment comprendre pourquoi apprendre CE langage et pas un autre.

C’est souvent dû au syndrome de l’objet brillant (être attiré par la nouveauté), une recommandation bateau du genre “TOP 10 des langages à apprendre pour 2021”, ou une autre connerie du genre…

La question n’est pas tant “quel langage choisir”, mais “qu’est-ce que vous voulez faire et comment ?”.

Ça parait logique, mais il y a des subtilités. Imaginons que vous voulez faire de la programmation web. D’accord, mais il y a plein de langages pour faire ça. En réfléchissant de cette manière, vous allez toujours finir par tirer au hasard.

Maintenant, imaginons que vous voulez faire de la programmation web front-end, avec un écosystème qui vous permet d’avancer rapidement dans votre travail sans avoir à réinventer la roue à chaque projet ? Dans ce cas, JavaScript est un bon point de départ.

Il faut que vous poussiez la réflexion au maximum sur ce que vous voulez faire si vous voulez avoir une chance de trouver la perle rare, celle qui corresponde parfaitement à vos attentes.

Car si vous ne faites pas cette démarche, vous risquez d’abandonner votre apprentissage en cours de route, ou de vous entêter sur un langage que vous détestez ou qui ne vous servira à rien.

Bref, faites ce petit exercice, et ne vous laissez pas distraire par des âneries que l’on entend partout.

Ce n’est pas parce que Perl, Go ou Scala sont des langages (généralement) bien payés qu’il faut les apprendre absolument. Si ce n’est qu’une question d’argent, autant devenir CTO, vous serez mieux payé que n’importe quel dev, peu importe le langage.

Au contraire, ne vous précipitez pas et prenez le temps de trouver votre Ikigai. Ne vous inquiétez pas, l’expérience, les opportunités et le salaire suivront.

Une de mes images préférées ❤️

Et si vous voulez apprendre un langage pour un job en particulier, ou parce que vous avez du temps libre… C’est bien aussi ! L’important, c’est que vous trouviez votre compte, parfois quitte à ne pas suivre les tendances.


Partie 1 : appréhender le langage (<1H)

On ne se lance pas dans l’apprentissage d’une nouvelle technologie la fleur au fusil, sans même savoir ce qu’il en retourne. Pour apprendre de manière efficace, il faut d’abord se renseigner au maximum.

Pour les langages de programmation, une excellente manière de commencer est de se regarder les paradigmes du langage, c’est-à-dire les grands concepts, les grandes fonctionnalités, ce qui le différencie de ses concurrents.

Les 3 paradigmes les plus connus sont bien sûr le trio procédural/orienté objets/fonctionnel. Mais il y en a d’autres, en voici quelques-uns que j’aime bien :

  • Orienté objets.
  • Concepts fonctionnels : mais sans que ce soit de la PF à 100%.
  • Générique : permettre l’utilisation de types génériques, à condition que ce soit déclaré et bien encadré (pas comme en JavaScript…).
  • Structuré : c’est pour moi le paradigme le plus important, car il permet d’éviter que le code devienne un gros bordel. D’où mon grand amour pour Java et C#.
  • Statique : je déteste tout ce qui est macros, évaluations et préprocesseurs.
  • Concepts événementiels : car c’est beaucoup plus pratique pour travailler avec des GUI.

Pour certaines personnes, l’absence ou la présence de certains paradigmes peut-être éliminatoire. Par exemple, je me vois mal repartir sur un langage 100% procédural un jour dans ma vie (mais qui sait…).

Une autre chose à regarder en détail est le système de typage du langage, car c’est indicateur de la manière dont vous allez travailler avec lui. Encore une fois, voici quelques règles que j’aime bien :

  • Très fortement typé : je n’ai pas envie que mon programme compare des chaînes de caractères ou des booléens avec des entiers sans mon autorisation (comme en JavaScript).
  • Statique : quand je donne un type à une variable, je ne veux pas qu’il change en cours de route (comme en PHP).
  • Type exprimé : je n’ai pas envie que mon programme détecte le type de mes variables à ma place (comme en Python).

Troisième chose à regarder : les différentes implémentations. En effet, le langage seul ne fait pas tout, et il est bon de regarder ce qu’il se trouve autour.

Par exemple, j’ai longtemps été fâché avec C#, car il est très peu dissociable du framework .NET, qui était auparavant propriétaire et réservé exclusivement à l’environnement Windows (ce qui n’est plus le cas aujourd’hui).

Autre exemple, j’aime bien TypeScript, mais quitte à choisir, je préfère m’orienter vers les langages qui profitent de la technologie WebAssembly, plutôt que la transpilation en JavaScript.

La dernière chose, mais pas des moindres, c’est de jeter un petit coup d’œil à la syntaxe. Ce n’est pas la manière la plus objective de juger un langage, mais ça permet de savoir à quoi vous attendre.

Pour étudier ces 4 points (paradigmes, typage, implémentations et syntaxe), je vous recommande tout simplement d’aller vous documenter sur la page Wikipédia du langage (en anglais si possible). Tout y est indiqué, et les articles sont généralement de très bonne qualité.

Souvenez-vous que l’un des critères les plus importants lorsque vous choisissez un langage, c’est que vous vous sentiez bien avec. Si ce n’est pas le cas, vous allez juste perdre en productivité et en efficacité.

Partir du principe que vos goûts n’ont pas d’importance est une erreur. Un bon programmeur, c’est quelqu’un qui construit rapidement des applications fiables et de qualité. Et pour faire ça, il a besoin de bons outils.


Partie 2 : le fonctionnement (<2H)

Le langage que vous avez décidé d’apprendre est utile est vous met l’eau à la bouche ? Super, on va pouvoir passer à l’apprentissage. Mais pas si vite !

Une erreur que beaucoup de personnes font est de sauter la théorie pour passer directement au code. Mais en réalité, il est très pertinent de s’intéresser d’abord au fonctionnement du langage, car cela vous donnera des informations clé vis-à-vis de la manière dont vous allez travailler avec lui, ses opportunités et ses faiblesses.

N’oubliez pas qu’un développeur qui ne comprend pas comment ses outils fonctionnent, c’est un développeur inutile qui va passer sont temps à faire des copiés-collés de Stack Overflow.

Ça ne viendrait pas à l’idée d’un soldat de partir au front sans savoir comment fonctionne son arme, c’est la même chose pour un développeur.

Ainsi, intéressez-vous à ce qui se cache derrière ce langage. Voici quelques questions magiques :

  • S’agit-il d’un langage compilé ou interprété ?
  • Quelles implémentations sont disponibles ? Quels sont leurs avantages ? Leurs inconvénients ?
  • Compile-t-il directement en code machine ? En assembleur ? En un langage intermédiaire ? Dans un autre langage (et si oui, lequel) ?
  • Tourne-t-il sur une machine virtuelle ? Laquelle ? Avec quels autres langages est-il compatible ?
  • Permet-il d’interagir directement avec les ressources de la machine (CPU, RAM…), ou est-ce prit en charge automatiquement ? Possède-t-il un garbage collector ?
  • Dans quel contexte s’utilise-t-il (serveur web, navigateur web…) ? Comment fonctionne ce contexte ? On n’apprend pas PHP sans connaître la manière dont fonctionne le web.
  • Implémente-t-il certains paradigmes à 100% (Java pour la POO, Haskell pour la PF) ? Si oui, comment (hiérarchie des classes, copies automatiques…) ?
  • Avec quelles technologies ce langage s’associe-t-il (frameworks, bibliothèques, autres langages…) ?

Bien sûr pas besoin de rédiger une thèse, une petite heure de recherches (éventuellement deux) suffit largement.

Vous trouverez toutes les informations dont vous avez besoin sur Wikipédia et sur la documentation officielle, qui contient généralement une partie dédiée à la technique.

Et si vous ne comprenez pas un concept (machine virtuelle, implémentation, transpilation…), prenez le temps de faire des recherches à son sujet, vous n’en ressortirez que grandie.

Passons maintenant à la pratique.


Partie 3 : les concepts de base (<2H)

On parle ici des concepts vraiment bateaux, indispensables à la création d’un programme, même très simples.

Ces concepts sont les mêmes dans tous les langages, donc vous n’allez pas apprendre grand-chose, mais il faut y passer quand même.

En voici une liste non-exhaustive :

  • Formatage d’une ligne de code : point virgule ?
  • Formatage d’un bloc de code : accolades ? Indentation ? Mots-clés ?
  • Types de données : int, float, string, objets.
  • Variables et constantes.
  • Opérateurs : arithmétique (+, -, %), logiques (&&, ||, !), de comparaison (==, <, <=).
  • Conditions : if, switch, match.
  • Boucles : while, for, foreach.
  • Fonctions : paramètres, type de retour, passage par référence ou par valeur ?
  • Structures de données.
  • Espaces de noms.

Pour la POO :

  • Classes : champs, accesseurs (propriétés) et méthodes.
  • Surcharge.
  • Héritage.
  • Polymorphisme : classes abstraites et interfaces.
  • Champs et méthodes statiques.

Pour la PF :

  • Types immutables.
  • Fonctions pures.
  • Composition de fonctions : chaîner des fonctions pour former des comportements plus complexes.
  • Fonctions d’ordre supérieur (high-order functions) : passage de fonctions en paramètre d’autres fonctions.

Parfois, certains concepts manquent à l’appel dans certains langages. Dans ce cas, c’est une bonne pratique de chercher des alternatives dès maintenant.

Tout ça s’apprend très rapidement, car il ne s’agit que de piqûres de rappel. De plus, la plupart des documentations comprennent un “tour”, une section ultra-condensée dédiée à tous les concepts de base. Avec ça, comptez 2h d’apprentissage à tout casser.

Je vous recommande vivement d’avoir un petit fichier de code ouvert pour tester les exemples au fur et à mesure.

Ne copiez-collez pas les exemples de la doc ! Réécrivez-les en entier, voir créez les vôtres. C’est beaucoup plus ludique et ça vous permet d’intégrer ces concepts plus efficacement. Pas besoin de faire de vrai programme pour l’instant, mais ça ne saurait tarder.


Partie 4 : les concepts spécifiques (6-12H)

Chaque langage a ses particularités, ses concepts spécifiques qui le différencie des autres langages, et que vous devez apprendre si vous voulez le maîtriser à son plein potentiel.

Pour cela, continuez à lire le “tour du langage” présent sur la documentation officielle. Ces concepts sont généralement mis à la fin, car ce sont en général les plus complexes.

À ce stade, vous pouvez commencer à vraiment pratiquer. Je vous conseille vivement de faire de la résolution de problèmes algorithmiques, du style LeetCode, Exercism, CodinGame ou Rosetta Code.

C’est particulièrement efficace, car ça vous force à utiliser le langage de manière optimale, à identifier vos points de blocages et d’incertitudes, et à les corriger (merci Stack Overflow).

Une fois arrivé à ce stade, vous commencez à bien savoir de quoi vous parlez, et vous êtes en mesure de faire vos premières applications sans problème. C’est théoriquement ici que vous pouvez mettre votre apprentissage de côté et commencer à réaliser des choses.

Cependant, si vous voulez utiliser ce langage de manière sérieuse, je vous invite à continuer au moins jusqu’à la fin de la partie 5, car c’est celle qui va vraiment vous faire exploser en efficacité.


Partie 5 : implémenter vos connaissances sur des petits projets (1-2 semaines)

L’objectif de cette partie est de vous mettre en situation réelle en travaillant sur des projets courts mais ludiques.

C’est aussi le moment de travailler sur l’architecture de vos applications, les bonnes pratiques du langage, et implémenter des patrons de conception.

L’essentiel est vraiment de s’appliquer et de ne pas faire un truc bâclé “tant que ça marche”. Cela implique de faire des plans (voir de l’UML si vous aimez ça), documenter votre code et écrire des tests unitaires, quitte même à faire du réusinage à la fin.

Je vous recommande de faire 4 à 6 projets de tailles variables, allant de 1h à 6h. Essayer de diversifier au maximum vos expériences, par exemple, en vous concentrant sur un concept particulier à chaque fois.

Il est important d’utiliser le moins de bibliothèques et de frameworks possibles, car bien qu’ils soient très pratiques, ils ne vont pas vous aider à apprendre le langage de manière optimale (c’est même le contraire).

Si vous êtes en panne d’imagination, pas de panique, voici des liens vers quelques centaines d’idées de projet. Comme ça, vous avez l’embarras du choix.

La liste de projets de Martyr2, diversifiée et séparée en plusieurs catégories.

Une liste très similaire par karan.

Un subreddit qui regroupe des centaines de challenges pour développeurs.

40 projets un peu plus conséquents

N’hésitez pas aussi à recréer des applications existantes (Twitter, Instagram, Discord…) en version minimaliste, c’est une manière très pédagogique de se mettre en situation !

À ce stade, vous maîtrisez très bien le langage, et vous êtes prêt à attaquer des projets professionnels sans problème.

Mais si vous souhaitez vraiment construire votre carrière autour de ce langage, je vous invite à passer à la partie 6, qui, je vous préviens, est loin d’être facile.


Partie 6 : travailler sur une grosse application (>2 mois)

Cette partie va vous permettre de passer du stade de connaisseur à professionnel de votre langage. Et le meilleur moyen de faire ça, c’est de travailler sur un VRAI projet d’envergure.

Évidement, si vous utilisez déjà ce langage pour votre travail, ce n’est pas la peine de faire autre chose à côté. En revanche, si ce n’est pas le cas, il va falloir vous lancer dans un projet en parallèle de votre travail/vos études.

2 mois, c’est long, et pour beaucoup, c’est compliqué de trouver la motivation. C’est pourquoi vous devez vous lancer dans un projet qui vous tient à cœur et qui vous donne l’envie brûlante de vous y consacrer un peu chaque jour.

Il peut s’agir d’un défi personnel, d’un projet open source, où même d’un side business pour espérer vous faire un peu de sous ! Bref, trouvez le truc qui vous fait vibrer.

Comme il s’agit d’un projet un peu sérieux, vous devez de mettre le paquet sur la conception et le suivi :

  • Cahier des charges.
  • Organisation des fonctionnalités et des règles métier.
  • Architecture technique.
  • Démarche de tests unitaires et d’intégration.
  • Veille et choix des outils (frameworks et bibliothèques).
  • Preuves de concept (POC).
  • Produit minimum viable (MVP).
  • Pourquoi pas une estimation de temps.

En un seul mot : soyez professionnel.

Si vous êtes toujours en panne d’imagination (décidément), je vous ai décoté une liste de 42 projets parfaits pour accomplir cette étape. Mais je vous préviens, ils sont assez hardcores ^^

Et que vous fassiez ça sur votre temps de travail ou votre temps libre, l’important est de toujours garder une démarche d’apprentissage : découvrez, apprenez, expérimentez et testez de nouvelles choses.

À ce stade, vous allez commencer à devenir une personne à haute valeur ajoutée sur ce langage bien précis, et vous pourrez vous lancer dans n’importe quel projet sans craintes.

Et pour les gens qui souhaitent devenir développeur freelance dans ce langage, après cette étape, vous aurez tout à fait les compétences pour lancer votre activité.


Partie 7 : la plongée profonde.

La plupart des développeurs qui apprennent un nouveau langage s’arrêtent en général à la partie 4 ou 5, voir 6 pour les plus courageux. Mais est-il possible d’aller encore plus loin ?

La réponse est oui, grâce à un processus que j’ai appelé la plongée profonde. Le but de cette étape est d’apprendre absolument tout ce qu’il y a à savoir sur ce langage :

  • Connaître toutes les subtilités de la syntaxe.
  • Connaître et savoir implémenter toutes les bonnes pratiques et patrons de conceptions.
  • Connaître toutes les bonnes pratiques.
  • Savoir programmer de manière ultra-optimisée.
  • Savoir programmer de manière claire et compacte.
  • Savoir programmer avec d’autres outils, d’autres IDE et d’autres implémentations.
  • Avoir un panel d’outils, bibliothèques et frameworks afin de toujours choisir la meilleure manière d’attaquer un nouveau problème.

Mais contrairement à ce que beaucoup pensent, ce n’est pas en ne faisant que pratiquer un langage que l’on atteint ce résultat.

Les développeurs ayant 10 ans d’expérience dans un seul langage ne sont pas forcement les meilleurs développeurs du monde pour ce langage (même s’il faut reconnaître qu’ils sont très forts).

La clef du succès est d’apprendre pro-activement, il faut que ce soit votre priorité numéro 1. Évidement, à ce stade, les ressources sont plus rares et coûteuses, mais voici quelques pistes à explorer :

  • Éplucher la documentation au peigne fin : il faut que vous connaissiez tous les concepts, ou du moins savoir qu’ils existent.
  • Lire des livres : ce sont des mines de connaissances qui vont parfois traiter en détails d’un sujet très pointu que vous n’aurez jamais trouvé sur la documentation ou sur un tuto.
  • Suivre des formations : bien que payantes et chères, elles ont l’avantage de creuser plus en profondeur que n’importe quel tutoriel que vous pourriez trouver sur le net, tout en étant plus compactes que les livres et poussant plus à la pratique.
  • Suivre l’activité autour de ce langage : à ce stade, il ne s’agit plus d’un apprentissage à un instant T, il faut suivre son évolution, analyser ses nouveautés et être à jour concernant son environnement (outils, frameworks…).
  • Construire une boite à outils.
  • Travailler sur des projets hardcores : le but est de dépasser vos limites, de sortir de votre zone de confort et de vous faire transpirer. Je vous renvoie encore une fois vers cette liste de projets difficiles, mais extrêmement intéressants.

Vous vous doutez bien que ce processus prend des années, mais c’est justement un avantage, car très peu de développeurs poussent leur apprentissage jusqu’à là.

Ainsi, vous allez rentrer dans le cercle des 1% des meilleurs développeurs réguliers sur ce langage. Vous ne serez plus un codeur, mais un véritable maître en la matière.

Et si jamais vous arrivez au bout de cette partie, est-ce que ça veut dire que vous êtes devenu un dieu vivant et que vous n’avez plus rien à apprendre ? Non. C’est strictement impossible de tout connaître, et l’apprentissage peut continuer pendant des dizaines d’années.

Vous seul êtes en mesure de savoir quand vous décidez de terminer votre apprentissage pro-actif, mais pour le coup, ma méthode se termine ici.


Avant de vous quitter, j’aimerais simplement relativiser un peu : vous n’avez pas à maîtriser un langage à 100% pour devenir un bon développeur.

Cette méthode est là pour vous donner le processus d’apprentissage d’un langage de programmation de A à Z, le plus rapidement et efficacement possible. Mais souvenez-vous qu’un langage de programmation n’est qu’un outil. Un outil important, certes, mais un outil quand même.

Est-ce que vous considérez qu’il est important d’investir autant de travail et d’effort dans cet outil ? Si oui, foncez ! Si non, ce n’est pas grave.

Je vais vous confier quelque chose. Sur les 8 ou 9 langages que je connais, j’ai poussé seulement la moitié d’entre eux jusqu’à la fin de la partie 5. Et vous savez combien ont dépassé la partie 6 ? Un seul, et je ne pense même pas l’emmener jusqu’à la partie 7.

Apprendre un langage de programmation, c’est bien, mais le monde du développement, c’est aussi des frameworks, des architectures, et d’autres compétences qui ne relèvent même pas de la programmation ! Bref, apprenez ce que vous voulez, mais surtout, n’arrêtez jamais d’apprendre.

Si vous avez des remarques, des questions ou des propositions pour améliorer ce guide, laissez-les dans les commentaires juste en dessous. Et sur ce, je vous donne rendez-vous sur la newsletter des développeurs ultra-efficaces.