Elixir: la potion magique du développement web?
by Simon Tirant (7 min read)
đ Adieu PHP, Ruby, Python, Java et JavaScript ⊠Elixir est arrivĂ© !
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].
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.â
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:
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:
- Site officiel dâElixir
- Wikipedia: Elixir
- Alchemist.camp: vidĂ©o dâintroduction Ă Elixir
- Wikipedia: Erlang
- Wikipedia: BEAM
- Wikipedia: Ruby
- Wikipedia: La programmation fonctionnelle
- Wikipedia: La programmation orientée objet
- Wikipedia: Les effets de bord
- React : documentation sur les hooks
PS : Merci à Olivier Deprez de 7 Lieues Technologies pour sa relecture et ses précieux conseils.