Simon Tirant's blog

đŸ‡«đŸ‡· 🇬🇧
← All blog posts
Magicien disparaissant dans un nuage de fumée

Elixir: la potion magique du développement web?

by Simon Tirant (7 min read)

Tagged as elixir phoenix web ruby rails erlang beam

👋 Adieu PHP, Ruby, Python, Java et JavaScript 
 Elixir est arrivĂ© !

Logo du langage Elixir

Qu’est-ce que c’est que ce truc Ă  la Merlin l’Enchanteur ⚗ ?

Pour commencer, voyons l’historique d’Elixir : c’est un langage crĂ©Ă© en 2011 par JosĂ© Valim, un ancien membre de la core team du framework Ruby on Rails 💎, ce qui en fait un langage trĂšs rĂ©cent ; d’autant plus qu’il n’a commencĂ© Ă  gagner en notoriĂ©tĂ© qu’à partir de 2015. Il est purement fonctionnel (bye bye l’orientĂ© objet) et sa grande force rĂ©side dans son paradigme de programmation concurrente, basĂ© sur les capacitĂ©s multi-coeurs des processeurs modernes.

☎ Du tĂ©lĂ©phone fixe Ă  What’s App đŸ“±

Mais cette derniĂšre caractĂ©ristique ne sort pas de nulle part. En vrai, elle sort tout droit de la fin des annĂ©es 1980 đŸ„đŸ’ŸđŸ•čđŸ›č, puisqu’Elixir a Ă©tĂ© conçu sur les fondations d’un autre langage. En effet, en 1987 Ericsson sort Erlang, un langage alors propriĂ©taire - qui deviendra open source en 1998 - destinĂ© Ă  ĂȘtre utilisĂ© dans des commutateurs tĂ©lĂ©phoniques, entre autres, et qui se base sur sa propre machine virtuelle : BEAM (Bogdan/Björn’s Erlang Abstract Machine). C’est cette derniĂšre qui est Ă  l’origine du systĂšme multitĂąche d’Erlang, distribuant les opĂ©rations sur plusieurs cƓurs, lĂ  oĂč d’autres langages vont utiliser le multithreading (plusieurs processus exĂ©cutĂ©s sur un seul et mĂȘme processeur). Quand on voit aujourd’hui que mĂȘme un tĂ©lĂ©phone portable possĂšde 6 Ă  8 cƓurs 💕, on comprend facilement en quoi la vieille technologie d’Ericsson trouve un Ă©cho intĂ©ressant pour des applications actuelles.

L’autre gros avantage d’Erlang, dont hĂ©rite Elixir, est la “tolĂ©rance aux pannes“ (fault tolerance). Et pour mieux vous parler de ce concept, je vais directement citer l’ami Mark Wilbur, pĂ©dagogue sur Elixir et crĂ©ateur du site Alchemist.Camp, au dĂ©but de sa vidĂ©o d’introduction Ă  Elixir, traduite de l’anglais par mes soins :

Erlang a essentiellement Ă©tĂ© crĂ©Ă© pour ĂȘtre tolĂ©rant aux pannes. Il a Ă©tĂ© conçu pour l’industrie des tĂ©lĂ©coms, donc le contraire d’une page web oĂč un peu d’indisponibilitĂ© [..] n’est pas si grave. Évidemment vous n’en avez pas envie mais, vous savez, si je ne peux pas aller sur Twitter pendant 30 minutes environ, ce n’est pas la fin du monde. Alors que si je dĂ©croche mon tĂ©lĂ©phone et qu’il n’y a pas de tonalitĂ©, c’est plutĂŽt un gros problĂšme ; des gens pourraient littĂ©ralement mourir si cela arrivait, car les gens ne pourraient pas accĂ©der au 911 [service des urgences amĂ©ricain, ndt], etc. Donc, la chose dans laquelle Erlang excelle, c’est de s’occuper de plein, plein de processus simultanĂ©s - comme des appels tĂ©lĂ©phoniques simultanĂ©s ou des messageries instantanĂ©es ou des choses comme ça. Et si une partie quelconque du systĂšme s’effondre, il est supervisĂ© par d’autres parties de ce systĂšme qui vont le redĂ©marrer et qui peuvent avoir des modĂšles d’organisation plutĂŽt complexes. Et c’est en rĂ©alitĂ© un type de choses qui est difficile Ă  faire avec la plupart des langages de programmation et la plupart des machines virtuelles. Alors ils le balancent au niveau du systĂšme et ont tout un paquet de containers Docker organisĂ©s par quelque chose comme Kubernetes. Avec Elixir, avec Erlang, c’est juste intĂ©grĂ© avec OTP [“Open Telecom Platform”, la plateforme logicielle/machine virtuelle fournie avec Erlang, ndt].

Alchemist.Camp

Ce sont ces deux caractĂ©ristiques - la programmation concurrente et la tolĂ©rance aux pannes - issues du temps oĂč le web n’était mĂȘme pas encore inventĂ© par Tim Berners-Lee (1989) đŸ‘šđŸ’», qui permettent une haute disponibilitĂ© de la donnĂ©e et qui font d’Erlang, ainsi que d’Elixir, les technologies adoptĂ©es par les trois plus importantes applications de messagerie instantanĂ©e au monde : WhatsApp et Facebook Messenger utilisent Erlang, tandis que Discord a fait le choix d’Elixir. Mais d’autres types d’applications, telles que les chatbots đŸ€– ou les services de streaming đŸ“ș, ont tout Ă  gagner de la programmation concurrente et de la tolĂ©rance aux pannes.

Une syntaxe qui paie 
 Ruby sur l’ongle 💍

Si Erlang est aussi bien, alors pourquoi nous parler d’Elixir ❓ Quel est l’intĂ©rĂȘt de crĂ©er un langage supplĂ©mentaire ❓

Alors, pour commencer, il y a des amĂ©liorations techniques Ă  Erlang qui sont apportĂ©es par Elixir, notamment vis-Ă -vis du polymorphisme et de la mĂ©taprogrammation. Cependant je ne vais pas m’étendre sur celles-ci car je ne suis clairement pas compĂ©tent en la matiĂšre. Contentons-nous de rester Ă  un niveau plus “vulgaire” de comprĂ©hension et allons plutĂŽt aborder le point de la syntaxe d’Elixir. À la base, Erlang est un langage Ă  la syntaxe rustique - pour ne pas dire rĂ©barbative - avec beaucoup de code conventionnel rĂ©pĂ©titif (“boilerplate code“), ce qui le rend difficile Ă  lire et parfois mĂȘme Ă  dĂ©buguer. Étant un ancien “Rubyiste“, comme nous l’avons dit plus haut, JosĂ© Valim avait Ă  cƓur d’apporter une syntaxe bien plus sexy 💃 et abordable que ce que proposait le langage d’Ericsson ; car c’est en partie ce qui fĂ©dĂšre les dĂ©veloppeurs autour d’une technologie en particulier, comme ça a Ă©tĂ© le cas avec Ruby. Il s’est donc directement inspirĂ© du langage inventĂ© en 1995 par le japonais Yukuhiro Matsumoto. Sa syntaxe est une des raisons qui ont fait de Ruby le langage Ă  succĂšs qu’il est aujourd’hui, adoptĂ© par bon nombre de startups innovantes dans les annĂ©es 2000 - 2010. Les comparaisons entre du Ruby et de l’Elixir sont d’ailleurs frappantes de similitude ❗ Exemple avec un basique “Hello World“ :

Ruby :

puts 'Hello World!'

Elixir :

IO.puts "Hello World!"

C’est un comble quand on sait que dans Ruby tout est objet, alors qu’Elixir est purement fonctionnel ❗ Ce dernier point est d’ailleurs, Ă  mon sens, une autre caractĂ©ristique - encore une fois hĂ©ritĂ©e d’Erlang - Ă  ajouter Ă  la liste des avantages d’Elixir. En effet, qui dit programmation fonctionnelle dit absence d’effets de bord, et dit donc meilleur suivi et meilleure comprĂ©hension de la donnĂ©e 
 pour l’homme comme pour la machine ❗ Ce qui rĂ©sulte en un code plus maintenable et plus rĂ©utilisable ♻.

Pour l’anecdote, c’est justement pour ces raisons que la cĂ©lĂšbre librairie front-end React est en train de doucement migrer d’un systĂšme de composants Ă©crits sous la forme de classes vers des composants fonctionnels - mĂȘme si elle ne va pas les abandonner avant longtemps. À ce sujet, vous pouvez lire la fin de la documentation officielle de React concernant l’introduction des hooks : Les raisons de l’adoption des hooks.

“Les classes sont dĂ©routantes pour les gens comme pour les machines.”

Documentation de React

La deuxiĂšme raison au succĂšs de Ruby est son framework Ruby on Rails qui a permis Ă  de nombreuses Ă©quipes rĂ©duites de dĂ©veloppeurs de gagner en productivitĂ© dans l’écriture et l’organisation du code, ainsi que de monter leurs projets plus rapidement ; Elixir a lui aussi son Ă©quivalent Ă  Rails : un beau framework web orientĂ© MVC nommĂ© Phoenix đŸŠ…đŸ”„ ; disposant de fonctionnalitĂ©s, convoitĂ©es par de nombreux dĂ©veloppeurs, augmentant la productivitĂ© et rĂ©duisant les temps de dĂ©veloppement : telles que le scaffolding (littĂ©ralement â€œĂ©chafaudage”) qui permet de gĂ©nĂ©rer automatiquement du code - incluant la crĂ©ation de la table en base de donnĂ©es, du gabarit (“template“) HTML et des contrĂŽleurs - Ă  partir d’une simple ligne de commande dans le terminal. Ceci permet donc de crĂ©er une page pleinement dynamique en 5 secondes Ă  peine ❗ Mais c’est Ă  peu prĂšs lĂ  que s’arrĂȘte la comparaison avec les deux technologies, car les performances ne sont pas du tout les mĂȘmes.

Qui c’est qu’a la plus grosse ? đŸŽïž

Voyez ci dessous un tableau comparatif, issu encore une fois de la vidĂ©o d’introduction du site Alchemist.Camp:

Tableau comparatif des langages/frameworks PHP, Java/Golang, Rails, Node, Elixir/Phoenix

Selon Mark Wilbur, le crĂ©ateur du site en question, Ruby est trĂšs bien pour monter une application rapidement ; notamment car son framework augmente beaucoup la productivitĂ© des dĂ©veloppeurs. Il va donc plutĂŽt s’adresser Ă  des startups 🩄 ayant une petite Ă©quipe, ou encore Ă  des dĂ©veloppeurs travaillant seuls ; mais la croissance du projet devra forcĂ©ment amener Ă  faire des choix technologiques afin d’optimiser l’application, par exemple migrer vers Node. C’est d’ailleurs la principale critique qu’on rencontre Ă  propos de Ruby : son manque de capacitĂ© Ă  monter en charge (scalability). Les grosses performances vont plutĂŽt se trouver du cĂŽtĂ© d’un langage robuste tel que Java, qui prĂ©sente une plus grande rapiditĂ© d’exĂ©cution, utilise le multi-threading et facilite les tests, mais qui va plutĂŽt s’adresser Ă  de grosses compagnies 🏭 ayant de gros projets ; des usines Ă  code dotĂ©es d’équipes de dĂ©veloppeurs consĂ©quentes et hiĂ©rarchisĂ©es, ainsi que des budgets plus importants permettant des deadlines plus longues.

Le combo Elixir/Phoenix va donc rĂ©unir les qualitĂ©s de ces deux mondes : en affichant une bonne productivitĂ© - Ă  l’instar d’un Ruby on Rails - couplĂ© Ă  d’assez bonnes performances, en facilitant lui aussi les tests et en permettant un meilleur suivi de la donnĂ©e (programmation fonctionnelle) ; et bien sĂ»r en ajoutant sa touche Erlang : la programmation concurrente et la tolĂ©rance aux pannes ❗

Sources:

PS : Merci à Olivier Deprez de 7 Lieues Technologies pour sa relecture et ses précieux conseils.

Go up arrow