A l'occasion de l'asynconf j'ai pu faire un talk pour expliquer l'importance d'apprendre plusieurs langages de programmation.
Quand on parle de langage de programmation une question qui revient assez souvent est la question suivante :
Quel est le meilleur langage de programmation ?
Malheureusement, il n'existe pas de réponse simple à cette question car si un langage était objectivement "meilleur" que les autres, on ne s'embêterait pas à utiliser différents langages de programmation et on utiliserait ce fameux "meilleur" langage. Derrière cette question ce cache une inquiétude assez classique et la peur de choisir le "mauvais" langage. Dans les faits, votre premier langage de programmation n'a pas autant d'importances que vous ne le pensez et il est même possible que vous n'utilisiez pas ce premier langage lors de votre premier travail.
En réalité, les langages de programmation ne sont ni plus ni moins que des outils qui permettent de répondre à des problématiques plus ou moins précises. Il existe aujourd'hui de nombreux langages de programmation parce que les problématiques à résoudre sont très variées et on n'utilisera pas nécessairement le même langage suivant la situation. Typiquement, les problématiques ne sont pas les même si on souhaite générer de simples pages HTML ou pour gérer un tchat instantané avec des milliers de messages, ou encore pour traiter des grosses quantité de données.
Si le seul outil que vous avez est un marteau, vous tendez à voir tout problème comme un clou
Il est très tentant, surtout en début de carrière, d'essayer d'utiliser un seul langage pour absolument toutes les problématiques que l'on rencontre. Cette état d'esprit s'avère rapidement contre-productif parce que vous allez vous retrouver à créer des solutions complexes pour des problèmes qui pourraient être résolu plus simplement avec d'autres langages.
À titre d'exemple, dans une entreprise pour laquelle j'ai travaillé, nous utilisions PHP quotidiennement et nous en étions très satisfaits car le langage répondait parfaitement à notre problématique qui était de générer des pages HTML. Un jour une nouvelle problématique s'est présentée quand on a voulu mettre en place un système permettant à plusieurs utilisateurs de travailler sur une interface commune avec un système de temps réel. Ne connaissant que PHP nous avons décidé de l'utiliser même si ce n'est pas un cas d'utilisation typique. Pour l'aspect temps réel on a dû passer par la technique de long polling qui consiste à laisser tourner des requêtes longtemps pour transférer des message. On a réussi à mener ce projet à bien mais nous avons rencontré de nombreuses problématiques.
On aurait pu arriver plus rapidement à la solution si on avait choisi d'utiliser une technologie plus en adéquation avec notre problème (websockets et nodejs par exemple).
Même si en début de carrière on aura tendance à se focaliser sur un langage en particulier, c'est plus votre capacité à résoudre des problèmes qui sera mise en avant plus tard dans votre carrière. Pour beaucoup de projets on ne vous imposera pas forcément une technologie mais on se contentera de vous énoncer la problématique à résoudre et ça sera votre rôle de choisir la bonne technologie à utiliser et vous devrez choisir la bonne technologie en fonction de la situation. Ainsi, connaître plusieurs langages ou plusieurs frameworks va vous permettre de répondre à la problématique de manière plus efficace plutôt que d'utiliser votre langage préféré quelque soit la situation. Explorer plusieurs choses va vous permettre d'avoir un éventail plus large d'outils que vous allez pouvoir utiliser en fonction de vos problématiques et c'est pour ça qu'il est important de passer un peu de temps à explorer pour étoffer votre éventail de technologies.
C'est aussi une tendance que vous allez retrouver dans de nombreuses entreprises qui utilisent plusieurs technologies pour leurs projets. Plusieurs équipes n'utilisent pas forcément les mêmes langages de programmation parce que leurs problématiques sont différentes. Faites donc attention aux arguments du style "L'entreprise X utilise le langage A" Car dans la réalité les entreprises n'utilisent pas forcément un seul et unique langage et n'hésitent pas à changer de technologie lorsque les problèmatiques évoluent (ce qui est efficace aujourd'hui ne le sera peut être pas pour le problèmes de demain).
Un autre biais concernant les langages de programmation est le fait de penser que la sortie d'un nouveau langage ou une nouvelle technologie vient rendre obsolète les technologies précédentes. Typiquement, lors de la sortie de NodeJS j'ai vu beaucoup de commentaires se demandant si PHP n'était pas mort. De la même manière, les mêmes messages sont apparus lors de la sortie de golang "NodeJS est mort maintenant qu'il y a golang". Et ainsi de suite à chaque nouvelle sortie...
Comme indiqué précédemment, les langages sont des outils et la sortie d'un nouveau langage ne veut pas nécessairement dire que l'outil que l'on utilisait jusqu'à maintenant n'est plus capable de répondre à la problématique qu'il résolvait. Les langages ne deviennent pas automatiquement obsolètes dès la sortie d'un nouveau langage de programmation...
Il y a plusieurs raisons principales qui peuvent faire qu'un nouveau langage apparaisse :
Un autre aspect intéressant de l'apprentissage de nouveaux langages est le fait que cela permet d'améliorer nos compétences globales en tant que développeur.
L'apprentissage de nouveaux langages permet par exemple de découvrir de nouveaux paradigmes de programmation et de nouvelles manières d'organiser notre code. Ces techniques et méthodes d'organisation sont alors transversales et peuvent être utilisées sur plusieurs langages de programmation.
À titre d'exemple, j'ai à un moment donné décidé d'explorer le langage Elixir. L'exploration de ce langage m'a permis de découvrir le paradigme de programmation fonctionnel, qui met au centre de la logique les fonctions plutôt que les objets/class. Le langage, en me forçant à utiliser cette manière de travailler, m'a permis de mieux découvrir les concepts derrière ce type de programmation et c'est aujourd'hui une manière de travailler que je réutilise notamment en JavaScript. Aussi, apprendre le langage Elixir a fait de moi un meilleur développeur JavaScript. De la même manière, cela m'a permis de découvrir les principes de fonctions pures et d'immutabilité qui sont des concepts très utilisés sur React.
La découverte de nouveaux langages permet aussi d'affiner vos préférences et d'évaluer ce que vous aimez et ce que vous n'aimez pas. Souvent plusieurs langages vont permettre de répondre à une même problématique et le choix va se faire avant tout sur une affinité plus ou moins forte avec la solution choisie.
Typiquement, il y a quelques années je me suis mis en tête de découvrir Ruby avec le framework Ruby en rails. C'est un langage et un framework que j'ai beaucoup aimé lorsque j'ai commencé à l'utiliser Surtout pour ses capacités de metaprogramming qui permettent de rajouter des méthodes à la volée lors de l'exécution du code. Malheureusement, avec la pratique j'ai découvert les inconvénients de ce type de programmation qui fait qu'il n'est pas possible d'analyser le code de manière statique. Lorsque l'on reçoit un objet on ne peut pas connaître à l'avance les méthodes qui vont être disponibles dessus car il faut exécuter le code pour cela. Cette approche fonctionne bien avec le principe de convention de Ruby on Rails mais s'avère problématique pour moi dans la pratique.
Grâce à cette expérience, je sais maintenant que je préfère un code plus facile à analyser statiquement qu'un code dynamique. Cela me permet de mieux argumenter mes choix et d'argumenter mes choix lorsque je dois trancher entre plusieurs technologies (par exemple pour choisir entre Laravel & Symfony).
Si vous êtes arrivé jusqu'ici vous vous demandez comment vous allez trouver le temps pour apprendre tous ça ! Rassurez vous vous n'êtes pas obligé de connaître parfaitement tous les langages de programmation, L'important est surtout de connaître les particularités, les forces et les faiblessesdes différentes technologies et une simple explorationpeut suffirevous aurez tout le temps de plus explorer en profondeur la technologie lorsque vous l'utilisez réellementmais l'important est de savoir qu'elles existent pour pouvoir l'utiliser lorsque vous en avez besoin.
En revanche, si vous débutez, ne vous focalisez pas forcément tout de suite sur l'apprentissage de plusieurs langages. Commencez par bien maîtriser votre premier langage de programmation pour acquérir les compétences de base avant de vous lancer sur l'exploration de nouveaux outils. J'ai malheureusement rencontré beaucoup trop de personnes qui tentent de découvrir toutes les technologies dès le début de leur apprentissage. Sans recul cela ne sert à rien car vous n'allez pas être en mesure de comparer les choses et de comprendre les particularités de chaque outil. Au début il faut avant tout chercher à obtenir les connaissances transversales comme l'algorithmique, les paradigmes de programmation et votre esprit logique.