C’est bientôt Noël. Et si vous vous faisiez le cadeau d’apprendre quelque chose de radicalement nouveau, comme un nouveau langage de programmation ?
Il y a un an, j’ai quitté mon travail pour voyager pendant un an. Ce voyage a été l’occasion de prendre du recul sur beaucoup de choses dans la vie, dont la place qu’occupe mon métier de développeur et la manière dont je le pratique.
J’ai fait le constat que je faisais beaucoup de veille, passive comme active, mais essentiellement dans le domaine du web. C’est bien pour avoir une bonne vision des possibilités offertes par un écosystème, mais pas suffisant pour avoir un esprit critique acéré. C’est une des remarques que l’on retrouve dans le très bon article Hype Driven Development, publié récemment : les choix techniques sont souvent faits parce que les outils sont cools, un élément clé de décision dans de nombreux projets. Sur le long terme, ces choix se paient par cette vision d’un plaisir court-termiste, un plaisir qui disparaît vite lorsque la découverte est passée ou que la technologie devient à sont tour dépassée. Une des solutions que propose l’auteur, c’est de s’entourer des gens avec de fortes compétences techniques, qui connaissent notamment différents paradigmes, outils, méthodes. C’est ce genre de personne que j’aimerais devenir. Je vais vous parler de ce que j’ai commencé : apprendre de nouveaux langages, pour étendre ma culture technique.
On a tous des projets à côté qu’on a jamais fait pour x raisons. Apprendre un nouveau langage est un bon moyen de les réaliser, tout en testant les limites du langage. J’ai donc commencé à apprendre des langages pour réaliser ces projets que j’avais en tête. Nous avons un tous un temps fini que l’on peut consacrer à du développement (ou tout projet en général), autant faire des trucs intéressants.
J’ai donc appris les langages qui me faisaient envie, dans l’optique de me lancer des projets que je souhaitais réaliser. J’ai commencé par le Go, langage populaire en ce moment, qui a l’avantage et l’inconvénient d’être supporté par Google. J’ai appris les bases du langage en lisant et refaisant les exemples du Go by example, que j’ai d’ailleurs, lors de mon apprentissage, traduit en français. Cette série d’exemples permet de rentrer assez vite dans des spécificités du langage, et on progresse rapidement en la suivant.
Comme j’avais envie d’apprendre comment fonctionne le rendu 3D, j’ai réalisé un raytracer. Il s’agit d’un programme qui calcule le rendu d’une scène en 3D en calculant la lumière, les ombres, les reflets… de manière algorithmique. Go a de bonnes performances, ce qui fait de lui un bon candidat pour ce genre de projets. C’était vraiment agréable et motivant de travailler dans quelque chose de vraiment différent de ce que je fais au quotidien. De plus, travailler sur un projet un peu gros m’a permis de me faire une idée plus précise du langage : comment on organise un projet, constater dans quelle mesure la librairie standard est fournie (très bien !) et documentée (très mal !), comprendre certains des choix, apprendre à utiliser certains des outils, comme go perf, qui permet de profiler le temps d’exécution. Le projet ne révolutionnera pas le monde de la 3D, mais je me suis éclaté.
J’ai aussi commencé à apprendre le Python, langage élégant aimé, entre autres, par ceux qui font du traitement de données, de l’apprentissage automatique, des réseaux de neurones. Je l’ai appris en faisant les « Python Koans », des exercices pour apprendre la syntaxe et les fonctionnalités du langage à travers des tests automatisés, grâce au TDD. Avant de me lancer dans des projets de machine learning, j’utilise aujourd’hui ce langage pour découvrir la cryptographie grâce aux challenges de cryptopals. Le bilan est que ce n’est pas si compliqué (la progression des challenges, que ce soit dans la difficulté ou la manière dont sont amenées les choses, est bien réalisée), et je découvre avec plaisir un pan de l’informatique que je connais très mal.
Voici les choix que j’ai fait, mais bien d’autres seraient pertinents : le haskell, langage majeur de la programmation fonctionnelle, le rust pour sa manière de programmée hyper protégée, le scala pour voir l’univers Java sous un angle différent… Les possibilités sont vraiment nombreuses. Prenez ceux qui vous branchent, et faites des trucs qui vous font envie avec.
Quelques semaines sur un nouveau langage ne vont pas changer votre vision du métier tout de suite. Pour profiter pleinement de ses enseignements, il va falloir creuser plus le langage, faire des projets non-triviaux, comprendre les raisons des choix dans certaines librairies, peut-être écrire les votres… Bref, aller au delà de la simple découverte.
Pour le moment, je suis au début de l’apprentissage. J’ai une connaissance modeste des deux langages que j’ai présenté. Il ne faut surtout pas s’arrêter là pour avoir une bonne vision des choses. Clément Bouillier proposait il y a quelques semaines un modèle de maturité, inspiré par la pyramide des besoins de Maslow, pour décrire les différentes étapes de l’apprentissage d’un nouveau langage :
La première étape, c’est de savoir survivre : connaître les types de base, les mots-clés (for, if, etc.), les fonctions les plus classiques de la librairie standard. Un fois qu’on a cela, on progresse dans sa connaissance des outils, et de ce qu’il y a autour du langage. En même temps (l’idée de pyramide montre ici ses limites), on progresse dans les idiomes du langage. A terme, on maîtrise le langage quand on est capable de faire des choix argumentés entre les différentes possibilités en fonction du contexte.
Un autre moyen d’apprendre, c’est de d’écrire et enseigner ses découvertes aux autres. Je me rends compte en en parlant que je n’ai rien écrit sur python et Go sur ce blog, mais quand j’ai appris Symfony il y a quelques années, les divers articles écrits sur le sujet m’ont permis de mettre en forme ce que j’apprenais et d’être plus rigoureux dans ce que je retenais. Et cela a ouvert des horizons professionnels très intéressants auxquels je n’avais pas pensé au départ (réalisation de formations, propositions de missions, rencontres, etc)
J’ajouterais qu’apprendre un langage de programmation est un moyen parmi tant d’autres d’élargir votre culture technique. Ce n’est certainement pas la seule pour développer vos compétences ! En vous lançant dans quelque chose d’encore plus différent (faire des pâtisseries, apprendre à dessiner, construire des murs…), vous trouverez des connections avec votre métier. Ne vous forcez pas à apprendre des choses qui vous rebutent ceci-dit : faites le simplement car c’est passionnant, et les pièces du puzzle finiront par s’assembler sans que vous en preniez conscience.