Accueil / Articles

Pourquoi React a gagné le front-end tandis que le back-end est resté polyglotte.

Pourquoi les grandes entreprises combinent React avec des services Java, Go et Python tout en conservant Node.js pour les couches BFF, avec des conseils pour les développeurs juniors sur ce qu’ils doivent apprendre ensuite.

Éditeur : REACTAPP.TOP6 min de lecture1477 mots

Sources: Why Your Favorite Apps Use React on the Frontend, but Not Node.js on the Backend

React a définitivement dominé le côté frontend. Le côté backend n’a jamais produit de concurrent à sa hauteur, et toute personne passant d’un cours sur le stack MERN à une entreprise avec un trafic réel s’en rend rapidement compte.

Les bootcamps présentent souvent Mongo, Express, React et Node comme une solution complète : un seul langage pour l’ensemble du stack, permettant de développer des applications full-stack. Les projets personnels et les petites implémentations CRUD semblent confirmer cela. Cependant, un premier emploi dans une entreprise comptant des millions d’utilisateurs montre un tableau différent. L’interface utilisateur est bien sûr basée sur React. Les services principaux sont écrits en Java, les microservices à fort débit en Go, et le pipeline d’apprentissage automatique en Python. Node.js apparaît principalement dans une couche légère qui agrège les API pour le frontend. À grande échelle, il agit comme un assistant utile pour les backends lourds, et les raisons en sont spécifiques.

Première raison : un thread, de nombreuses tâches

Node.js exécute JavaScript sur un seul thread. Il gère les opérations d’entrée/sortie de manière excellente, mais ne peut effectuer qu’une seule tâche gourmande en CPU à la fois. Imaginez un restaurant doté d’un serveur extrêmement rapide : prendre les commandes, ce qui correspond à la gestion des bases de données et des réseaux, ne pose aucun problème. Cependant, si un client commande un repas de cinq plats nécessitant trente minutes de préparation, ce qui représente du travail pour le CPU, ce serveur est bloqué tandis que tous les autres clients doivent attendre.

Une plateforme vidéo illustre bien ce phénomène en environnement de production. Lorsqu’un utilisateur télécharge un fichier 4K, le serveur doit :

  1. Recevoir le fichier.
  2. Le reconvertir en plusieurs résolutions, comme 1080p, 720p et 480p.
  3. Créer des miniatures.
  4. Extraire les métadonnées.
  5. Stocker les résultats aux bons endroits.

Exécuter tout cela à l’intérieur du processus Node bloque son boucle d’événements. D’autres téléchargements attendent, d’autres appels API sont mis en file d’attente, et l’application cesse de répondre. Java et Go utilisent plusieurs threads, ce qui permet à l’un de traiter la vidéo tandis que d’autres gèrent le trafic API et l’authentification. Node est excellent pour les tâches à forte charge I/O telles que les API, les chats en temps réel et le streaming de données. Les tâches à forte charge CPU constituent son point faible, or les grandes applications en contiennent beaucoup.

Deuxième raison : les microservices permettent à chaque équipe de choisir

Les grandes entreprises ont pour la plupart cessé de développer des monolithes. Un monolithe regroupe l’authentification, les paiements, les notifications et les recommandations dans une seule base de code. Une architecture de microservices les divise en services indépendants qui communiquent via le réseau.

Cette séparation permet à chaque équipe de choisir un langage. Une équipe chargée des paiements peut opter pour Java car il s’est avéré fiable dans les transactions financières. Une équipe de chat en temps réel peut choisir Go en raison de sa capacité à gérer des milliers de connexions simultanées. Une équipe chargée des recommandations peut choisir Python grâce à ses bibliothèques d’apprentissage automatique. Node n’est alors qu’une des options parmi plusieurs et reste rarement le choix par défaut.

Pourquoi Go et Java dominent

Go est né chez Google, conçu pour résoudre les problèmes des langages précédents. Ses forces :

  • Concurrence. Les goroutines permettent de gérer un très grand nombre de connexions simultanées avec très peu de mémoire.
  • Démarrage. Les programmes se compilent en code machine natif et s’exécutent presque instantanément.
  • Déploiement. Seul un binaire sans dépendances en temps d’exécution est nécessaire pour le déploiement.

Uber s’en sert pour certains de ses services les plus fréquentés, Twitch pour les chats en temps réel, et Dropbox a constaté d’importantes améliorations de performance après avoir transféré certaines parties de son stack de Python.

Java est le choix par défaut dans le secteur des entreprises depuis plus de 25 ans. Il est démodé mais fiable :

  • Il a fait ses preuves dans la banque, les compagnies aériennes et le grand e-commerce.
  • Son écosystème comprend Spring Boot, Hibernate et des milliers de bibliothèques.
  • Le typage statique permet de détecter de nombreux erreurs au moment de la compilation, avant la mise en production.
  • Les outils de profilage, de surveillance et de débogage ont été affinés pendant des décennies.

Netflix, Amazon et Airbnb utilisent tous des composants backend majeurs basés sur Java. Ces entreprises ont besoin de fiabilité à une échelle énorme et ne suivent pas les tendances.

Troisième raison : héritage et inertie

Les grandes entreprises ont une longue histoire. Amazon a été fondée en 1994, Netflix en 1997, Google en 1998. Elles disposent de millions de lignes de code en Java, C++ et Python, d’une infrastructure développée au fil des décennies, ainsi que d’ingénieurs experts dans ces langages. Une réécriture en Node simplement parce que c’est à la mode n’est pas envisageable. Un CTO d’une grande entreprise ne prendra pas le risque de mettre en jeu le système de paiement, qui est la partie générant directement des revenus, pour un nouveau langage simplement parce qu’il est populaire auprès des développeurs en ligne.

Pourquoi React est l’exception

Ces mêmes entreprises ont adopté React parce qu’il a résolu un problème réel. Avant lui, les interfaces utilisateur complexes étaient difficiles à gérer : des codes jQuery enchevêtrés, des modèles Backbone confus, le cycle de traitement d’Angular 1.x. React a introduit l’architecture de composants, un DOM virtuel pour améliorer les performances, une interface utilisateur déclarative, ainsi qu’un écosystème immense incluant Next.js et React Native. Il a gagné parce qu’il était supérieur aux alternatives.

Node n’a jamais eu d’équivalent aussi indispensable du côté serveur. C’est un outil solide et adapté à certains usages, mais pour la plupart des tâches backend sérieuses, il n’est pas clairement supérieur à Java, Go ou Python, ce qui en fait pas le choix automatique.

Comment est structurée une grande application

Un diagramme typique montre l’interface frontend React qui appelle une passerelle API, un routeur qui envoie chaque requête au bon service backend. Derrière cela :

  • Un backend-for-frontend en Node.js gère la logique spécifique à l’interface frontend, l’agrégation des API et les événements en temps réel. C’est là que Node excelle.
  • Les services principaux en Java gèrent les paiements, les commandes, l’authentification des utilisateurs et l’inventaire, les composants qui ne doivent absolument pas tomber en panne.
  • Les services en Go s’occupent des chats en temps réel, du streaming et de tout ce qui nécessite une forte concurrence.
  • Les services en Python couvrent les recommandations, le traitement d’images et l’analyse de données.

Chaque service possède ses propres bases de données, et les services communiquent via gRPC, WebSockets ou des files de messages telles que Kafka. Le frontend a un vainqueur évident. Le backend est polyglotte, et c’est l’outil adapté qui est choisi pour la tâche.

Une comparaison rapide des langages

  • Node.js convient aux startups, aux MVP et aux couches BFF. Le développement est rapide, l’écosystème npm est immense et les développeurs JavaScript sont partout. Il est peu adapté au traitement vidéo ou aux transactions financières.
  • Java est le cheval de bataille fiable. Son apprentissage est difficile et son démarrage lent, mais c’est le choix à retenir lorsque l’échec à 3 heures du matin pendant le Black Friday est inacceptable.
  • Go représente ce à quoi pourrait ressembler un langage backend conçu aujourd’hui : rapide, simple et concurrentiel. Son inconvénient est un écosystème plus jeune que celui de Java.
  • Python domine la science des données et l’apprentissage automatique. Cependant, pour les API à forte concurrence, le verrou d’interpréteur global constitue un véritable goulot d’étranglement.
  • C++ convient aux cas exigeant une vitesse maximale, tels que les moteurs de jeux, les systèmes embarqués et le trading haute fréquence. Il n’est pas destiné aux API web.

Quelles en sont les conséquences pour les développeurs juniors

Rien de tout cela ne rend Node moins bon. Il reste un choix excellent pour les startups et les MVP où la rapidité de mise sur le marché est cruciale, pour les couches backend servant les interfaces frontend, pour les fonctionnalités en temps réel comme les chats et les mises à jour en direct, pour les fonctions serverless sur AWS Lambda ou Vercel Edge, ainsi que pour les prototypes visant à tester des idées avant de choisir une stack plus lourde.

Tout ceux qui visent une grande entreprise ne devraient pas compter uniquement sur MERN. Une habitude plus utile est d’apprendre comment fonctionnent les systèmes, afin de pouvoir choisir l’outil adapté à chaque tâche. L’approche erronée consiste à penser que connaître JavaScript signifie pouvoir tout faire.

Les développeurs les plus compétents ne sont attachés à aucune langue de programmation en particulier. Une personne peut écrire du JavaScript pour l’interface, utiliser un service Java lors de sa révision, comprendre pourquoi une équipe a choisi Go pour un microservice, et reconnaître quand Python est la meilleure solution. Ce sont des polyglottes parce qu’ils comprennent que différents problèmes exigent différentes solutions, et non par désir de se montrer.

L’outil adapté à chaque tâche

React a dominé la couche d’interface et toutes les grandes entreprises l’utilisent pour de bonnes raisons. Le backend peut être mieux décrit comme un écosystème que comme un champ de bataille. Java, Go, Python, C++, Rust et Node ont tous leur place, et les entreprises qui développent des applications courantes n’imposent pas l’usage d’une seule langue.

L’objectif d’un développeur est de résoudre des problèmes, pas d’utiliser simplement la langue qui lui est déjà familière ; parfois, cela signifie apprendre quelque chose de nouveau. Un développeur junior titulaire d’un certificat MERN ne doit pas paniquer. Node constitue un bon point de départ. Continuez à explorer : examinez un projet Java Spring Boot, écrivez un petit microservice en Go, et découvrez pourquoi le service de paiement de l’entreprise est écrit en Java et non en JavaScript. Les meilleurs ingénieurs ne sont pas ceux qui connaissent le plus grand nombre de langages, mais ceux qui comprennent pourquoi chacun existe et quand l’utiliser.

Lectures complémentaires

  • Combien de demandes un serveur Node.js peut-il vraiment gérer ? — Tests de charge d’une API Express sur Heroku et AWS comparés à Django, une estimation de capacité de 40 000 requêtes par seconde, ainsi que les facteurs qui ralentissent les API réelles.