Node, Go, Java, C# ou Elixir?
Vous voulez réaliser une application Web et vous vous demandez quelle plateforme convient le mieux si elle doit avoir un jour un grand nombre d'utilisateurs...
On voit souvent paraître le billet d'un développeur expliquant pourquoi il abandonné le langage X et réécrit son application web en langage Y. Pour un autre, c'est l'inverse, il réécrit son application de Y en X. Cela arrive rarement pour des applications locales ou sur mobiles. Le choix du langage de développement est plus crucial sur le Web, c'est pourquoi il m'a paru utile de réaliser cette étude sur les différentes plateformes en vogue, avec les avantages et inconvénients de chacune, et pour quel type d'application elles conviennent le mieux. Cela devrait aider à éviter une réécriture du code après quelques mois de développement...
Pour quel type d'application?
- C'est la plateforme de la créativité. Le dynamisme de JavaScript offre des capacités uniques pour la création de fonctionnalités nouvelles.
- Une application qui répond à des évènements s'implémente plus facilement en JavaScript (simulation, robotique).
- Les applications en temps réel profitent du mode asynchrone. Par exemple un site de discussion en ligne.
- Les applications avec beaucoup d'échanges, d'entrées-sorties.
- Ne convient pas pour un site dont les utilisateurs sollicitent beaucoup le processeur du serveur, comme le traitement d'images ou de son.
Avantages
- La plupart des programmeurs connaissent le langage JavaScript, le démarrage du projet est donc immédiat et simplifié du fait que le langage d'interface est le même. Cela évite de raisonner de façon différente sur le backend et le frontend.
- De nombreux langages sont compilés en JavaScript et peuvent donc fonctionner sur Node si on a un autre langage de prédilection.
- Facilité d'inclure des modules avec NPM que d'autres plateformes comme ROR peuvent lui envier.
- En utilisant un framework comme Express, on peut développer et mettre en ligne une application en quelques minutes...
- On peut écrire des requêtes de BD en JavaScript plutôt que SQL (c'est plus simple) sans être dépaysé.
- De même pour les données JSON qui sont fréquentes sur le Web.
- On profite du multi-coeur avec le module Cluster.
Inconvénients
- L'environnement évolue continuellement, le framework favori aujourd'hui sera remplacé par un autre dans quelques mois... Mais rien n'empêche de continuer avec les mêmes outils.
- Le mode orienté évènements avec une boucle de traitement est un problème pour un site car quand des clients abusent, c'est l'ensemble du site qui est ralenti. On peut toutefois contrôler ces excès de charge avec des outils spécialisés.
- On reproche le code spaghetti avec les callbacks... Ils n'ont rien d'obligatoire, il est facile d'écrire le code différemment avec des fonctions nommées, c'est une question de style. Le problème subsiste cependant quand on utilise du code tiers.
- Le comportement sur une charge importante peut être difficile à évaluer.
Quels sites connus utilisent Node.js?
- MySpace avec Express. Cela lui permet de créer facilement de nouvelles fonctions.
- Yahoo l'utilise là où cela convient à coté d'autres langages.
- Paypal a remplacé Java par Node.js, avec un meilleur résultat.
- Ancestry.com est construit entièrement sur Node (100M req/jour).
- Netflix.com. Son blog explique comment il a résolu le problème de charge importante.
- Groupon a migré ses sites de Ruby, Java et PHP a une solution Node.js unique, plus l'API Gofer et Node cached.
- Twitter a migré en 2017 son activité mobile sur Node + Express + React PWA (Progressive Web App).
- Uber gère la disponibilité des chauffeurs et clients avec Node.
Pour quel type d'application?
- Pour des services ou applications web classiques.
- Quand on veut recruter des développeurs sans expérience.
- Quand la productivité est le premier facteur.
- Quand le code source est très important et doit être modifié souvent.
- Semble particulièrement adéquat pour le logiciel du cloud ou lié à celui-ci.
Avantages
- Un ensemble d'outils de développement complet et efficace.
- Un langage simple favorisant le travail collaboratif et la maintenance du code.
- Une compilation très rapide.
- Utilise peu de mémoire.
- La concurrence est construite dans le langage.
- Pas besoin d'installer un runtime comme celui de Java, seul le programme suffit.
- Le site du langage est très pratique. Son accessibilité est sans rapport avec celui des autres.
Inconvénients
- Le langage est plutôt limité, il faut s'attendre à taper plus de code qu'avec les autres. Cela le rend ennuyeux.
- Des bibliothèques peuvent faire défaut pour votre application.
Quels sites connus l'utilisent?
- Google est le premier utilisateur.
- Docker.
Pour quel type d'application?
- Toutes les applications traditionnelles qui utilisent des bases de données et communiquent avec de nombreux clients.
- Quand on veut être sûr de disposer de toutes les bibliothèques utiles et de frameworks coté serveur tels ceux que fournit Apache.
- Pour avoir plus de chance de trouver des développeurs expérimentés.
Avantages
- De nombreux outils open source ont été développés en Java pour faire fonctionner de grands sites web, notamment par la fondation Apache.
- Outils de profiling et déboguage même sur un cluster de machines.
- Immense bibliothèque.
- Le multithread rend les sessions indépendantes et évitent le blocage de l'une par l'autre. Cela utilise plus de ressources cependant.
- Peut fonctionner en mode distribué (comme Erlang).
- Peut fonctionner en mode asynchrone (comme Node) avec le module Vert.x.
Inconvénients
- C'est sans doute la plateforme qui requiert le plus de ressources matérielles. On ne peut installer Java sur tout serveur.
- Il est plus difficile de se familiariser avec Scala qu'avec d'autres langages. Quand à Java, il est très verbeux et il est plus difficile de passer de l'idée à la réalisation.
Quels sites connus l'utilisent?
- Twitter utilise Scala.
- Tous les sites qui utilisent Hadoop d'Apache, ce qui inclut Facebook, utilisent aussi Java.
- Java est extrèmement répandu comme backend de sites Web, utilisant les outils Apache ou non.
Pour quel type d'application?
- Le site du langage le recommande pour l'e-commerce, les banques, les télécommunications, la messagerie et applications similaires.
- Convient pour les applications web classiques quand on est certain d'avoir de très nombreux utilisateurs.
- Lorsque de très nombreux utilisateurs sont connectés simultanément et interagissent indirectement (sur les mêmes objets).
Avantages
- Sait gérer un très grand nombre d'utilisateurs.
- Egalement spécialisé pour les systèmes distribués à tolérance de panne. La tolérance de panne est un de ses principes de base.
- Garbage collector sans pauses sur les applications qui durent.
- Base de donnée intégrée Mnesia pour des recheches complexes (pas pour des documents).
Inconvénients
- Moins de bibliothèques que les autres.
- Le langage Erlang est lent - mais la plateforme dans son ensemble compense ce défaut.
- La communauté est réduite. Cela se traduit par un manque de documentation et de support.
Quels sites connus l'utilisent?
- Whatsapp a été écrit en Erlang. Le nombre d'utilisateurs approche le milliard.
Pour quel type d'application?
- La plateforme originellement pour Windows a été rendue portable pour fonctionner sur le Cloud avec tout OS. Elle convient donc au applications en ligne de tout type fonctionnant sur le cloud.
- .NET Native compile les applications AOT ce qui convient pour les applications mobiles.
Avantages
- Le compilateur Roslyn et l'environnement d'exécution CoreCLR sont open source.
- Exécution interprétée par JIT ou compilée AOT.
- Visual Studio offre un environnement de développement très complet et peut produire des applications pour Windows, Linux ou Mac sur le même poste.
- On peut installer des versions différentes de .NET sur le même serveur, dans des conteneurs, et ainsi tester une nouvelle version avant de remplacer la précédente.
Inconvénients
- Pour les applications déjà développées pour .NET Framework, la migration vers .NET Core n'est pas immédiate, une part du code doit être réécrit.
- Il manque de nombreuses bibliothèques et les outils de développement ne sont pas au niveau de .NET (en 2016).
Quels sites connus l'utilisent?
- StackOverflow, le site de questions pour développeurs est basé sur .NET et Dapper.
Pour quel type d'application?
- Peu de startups utilisent PHP pour faire fonctionner une application Web. C'est plutôt le langage des sites amateurs. Mais la version typée du langage, Hack, pourrait supporter une large audience et PHP 7 également.
- C'est le plus économique quand à l'hébergement, et il convient donc pour un site aux objectifs limités.
Avantages
- PHP est facile à installer avec un serveur Apache.
- Il est disponible chez tous les hébergeurs.
- Sa bibliothèque de fonctions est presque universelle et les frameworks comme Laravel fournissent des environnements d'applications prêts à l'emploi.
- Il est conçu pour s'interfacer avec des bases et données.
- Il n'a pas besoin de template pour construire des pages, le langage est le template.
Inconvénients
- Le langage, dérivé des anciens outils de ligne de commande, est rustique et incohérent.
- PHP était très peu sûr, jusqu'à la version 7, qui oblige maintenant à utiliser mysqli au lieu de mysql.
Quels sites connus l'utilisent?
- Facebook a été construit en PHP mais utilise maintenant Hack, un langage dérivé. Par ailleurs Facebook utilise aussi de nombreux outils pour gérer une charge importante.
- Wikipedia est basé sur PHP, mais c'est moins une application qu'un serveur de pages. De même pour Wordpress.com.
- Dailymotion a migré son code PHP agé de 10 ans vers PHP 7, après un essai de HHVM. PHP 7 offre les mêmes performances et une migration plus aisée.
- Tumblr a migré de PHP 5 à PHP 7 en 2015.
Conclusion
Vous pouvez constater que les plus grands sites peuvent utiliser une des cinq solutions sans problème apparemment. Quelque fois ils abandonnent une plateforme au profit d'une autre et ce n'est pas toujours en faveur de la même. Cela montre que la meilleure plateforme dépend surtout de l'application que l'on veut réaliser.
Note: Ruby On Rails est décrit dans la page sur le langage Ruby. Il existe encore d'autres plateformes que je n'ai pas citées à cause de leurs inconvients (évolutivité, lenteur, difficulté à déboguer, insécurité.