Warum React das Frontend dominiert hat, während das Backend weiterhin mehrsprachig bleibt.
Warum große Unternehmen React mit Java-, Go- und Python-Diensten kombinieren und Node.js für BFF-Schichten verwenden, zusammen mit Empfehlungen für Junior-Entwickler darüber, was sie als Nächstes lernen sollten.
Quellen: Why Your Favorite Apps Use React on the Frontend, but Not Node.js on the Backend
React hat die Frontend-Entwicklung entscheidend dominiert. Das Backend hat nie einen vergleichbaren Sieger hervorgebracht, und jeder, der von einem Kurs zum MERN-Stack in ein Unternehmen mit echtem Traffic wechselt, bemerkt das in der Regel schnell.
Bootcamps verkaufen oft Mongo, Express, React und Node als ein zusammenhängendes Konzept: eine Sprache für den gesamten Stack und vollständige Full-Stack-Anwendungen, die leicht umsetzbar sind. Nebenprojekte sowie kleine CRUD-Implementierungen scheinen dies zu bestätigen. Doch ein erster Job in einem Unternehmen mit Millionen von Nutzern zeigt ein anderes Bild. Die Benutzeroberfläche ist wie erwartet React-basiert. Die Kerndienste werden in Java entwickelt, die Hochleistungs-Mikroservices in Go, und der Machine-Learning-Pipeline in Python. Node.js kommt hauptsächlich in einer dünnen Schicht zum Einsatz, die APIs für das Frontend aggregiert. In großem Maßstab fungiert es dabei als hilfreicher Assistent für die leistungsstarken Backends – und die Gründe dafür sind spezifisch.
Grund eins: ein Thread, viele Aufgaben
Node.js führt JavaScript in einem einzigen Thread aus. Er bewältigt I/O hervorragend, erledigt aber gleichzeitig nur eine rechenintensive Aufgabe. Stellen Sie sich ein Restaurant mit einem äußerst schnellen Kellner vor. Das Entgegennehmen von Bestellungen – was dem Arbeiten mit Datenbanken und Netzwerken entspricht – bereitet keinerlei Probleme. Ein Kunde, der ein fünfgängiges Menü bestellt, das dreißig Minuten in der Küche braucht – was der rechenintensive Teil darstellt –, lässt diesen Kellner einfrieren, während alle anderen warten müssen.
Eine Video-Plattform zeigt, was das in der Praxis bedeutet. Ein Benutzer lädt eine 4K-Datei hoch, und der Server muss Folgendes tun:
- Die Datei empfangen.
- Sie in mehrere Auflösungen umcodieren, wie zum Beispiel 1080p, 720p und 480p.
- Vorschaubilder erstellen.
- Metadaten extrahieren.
- Die Ergebnisse an den richtigen Orten speichern.
Das Ausführen all dessen innerhalb des Node-Prozesses blockiert dessen Event-Loop. Andere Uploads warten, andere API-Aufrufe werden in der Warteschlange gehalten, und die Anwendung reagiert nicht mehr. Java und Go nutzen mehrere Threads, sodass einer sich mit dem Video beschäftigen kann, während andere den API-Verkehr und die Authentifizierung abwickeln. Node eignet sich hervorragend für I/O-intensive Aufgaben wie APIs, Echtzeit-Chat und Datenströmung. CPU-intensive Aufgaben sind seine Schwachstelle – große Anwendungen enthalten viele davon.
Grund zwei: Microservices ermöglichen es jedem Team, selbst zu entscheiden
Große Unternehmen haben größtenteils auf die Entwicklung von Monolithen verzichtet. Ein Monolith kombiniert Authentifizierung, Zahlungen, Benachrichtigungen und Empfehlungen in einer einzigen Codebasis. Eine Microservice-Architektur teilt sie in unabhängige Dienste auf, die über das Netzwerk miteinander kommunizieren.
Diese Trennung ermöglicht es jedem Team, eine Sprache selbst auszuwählen. Ein Zahlungsteam kann Java wählen, da es sich in Finanztransaktionen bewährt hat. Ein Team für Echtzeit-Chats kann Go wählen, weil es in der Lage ist, Tausende von gleichzeitigen Verbindungen zu verwalten. Ein Team für Empfehlungen kann Python wählen, aufgrund seiner Machine-Learning-Bibliotheken. Node bleibt schließlich nur eine von mehreren Optionen und ist selten die Standardwahl.
Warum Go und Java dominieren
Go entstand bei Google und wurde entwickelt, um die Schwächen früherer Sprachen zu beheben. Seine Stärken sind:
- Parallelisierung. Goroutinen können eine enorme Anzahl von gleichzeitigen Verbindungen mit sehr wenig Speicher aufrechterhalten.
- Startzeit. Programme werden in nativen Maschinencode kompiliert und starten fast sofort.
- Einbetrieb. Es wird lediglich ein einzelnes Binärdatei ohne Laufzeitabhängigkeiten bereitgestellt.
Uber setzt es für einige seiner am stärksten genutzten Dienste ein, Twitch für den Echtzeit-Chat, und Dropbox berichtete von erheblichen Leistungsverbesserungen nach dem Umstieg einiger Komponenten seines Systems von Python.
Java ist seit über 25 Jahren die Standardwahl in der Unternehmenswelt. Es ist zwar veraltet, aber zuverlässig:
- Es hat sich in der Bankenbranche, bei Fluggesellschaften und im großen E-Commerce bewährt.
- Sein Ökosystem umfasst Spring Boot, Hibernate sowie Tausende von Bibliotheken.
- Durch statische Typisierung werden viele Fehler bereits zur Kompilierzeit, vor der Produktion, erkannt.
- Tools zur Profilierung, Überwachung und Fehlerbehebung werden seit Jahrzehnten weiterentwickelt.
Netflix, Amazon und Airbnb betreiben wichtige Backend-Komponenten darauf. Diese Unternehmen benötigen Zuverlässigkeit in enormem Umfang und verfolgen keine Trends.
Grund drei: Veraltete Systeme und Trägheit
Große Unternehmen haben eine lange Geschichte. Amazon wurde 1994 gegründet, Netflix 1997 und Google 1998. Sie verfügen über Millionen von Zeilen Code in Java, C++ und Python, Infrastrukturen, die über Jahrzehnte aufgebaut wurden, sowie Ingenieure, die in diesen Sprachen Experten sind. Eine Umstellung auf Node allein wegen des Trends ist nicht in Frage gekommen. Ein CTO in einem großen Unternehmen wird das Zahlungssystem – den Teil, der direkt Einnahmen erbringt – nicht auf eine neue Sprache setzen, nur weil sie bei Entwicklern im Internet beliebt ist.
Warum React die Ausnahme ist
Diese gleichen Unternehmen haben React übernommen, weil es ein echtes Problem gelöst hat. Zuvor waren komplexe Benutzeroberflächen schwierig in der Handhabung: verwickeltes jQuery, verwirrende Backbone-Muster sowie der Digest-Zyklus von Angular 1.x. React brachte eine Komponentenarchitektur, einen virtuellen DOM für bessere Leistung, eine deklarative Benutzeroberflächenprogrammierung sowie ein umfangreiches Ökosystem einschließlich Next.js und React Native. Es gewann, weil es den Alternativen überlegen war.
Node hatte auf dem Server nie einen vergleichbaren entscheidenden Vorteil. Er ist gut und eine solide Wahl für bestimmte Anwendungsfälle, doch für die meisten anspruchsvollen Backend-Aufgaben ist er nicht eindeutig besser als Java, Go oder Python – daher ist er nicht die automatische Wahl.
Wie eine große Anwendung aufgebaut ist
In einem typischen Diagramm ruft die React-Frontend-Schicht eine API-Gateway auf, wobei ein Router jede Anfrage an den richtigen Backend-Dienst leitet. Dahinter befinden sich:
- Ein Node.js backend-for-frontend, der frontendspezifische Logik, API-Aggregation sowie Echtzeit-Ereignisse verarbeitet. Hier zeigt Node seine Stärken.
- Java-Kerndienste, die Zahlungen, Bestellungen, Benutzerauthentifizierung sowie Lagerverwaltung abwickeln – die Teile, die unter keinen Umständen ausfallen dürfen.
- Go-Dienste, die Echtzeit-Chat, Streaming sowie alle Anwendungen mit hoher Konkurrenzbelastung bewältigen.
- Python-Dienste, die Empfehlungen, Bildverarbeitung sowie Analytik umfassen.
Jeder Dienst besitzt seine eigenen Datenbanken, und die Dienste kommunizieren über gRPC, WebSockets oder Nachrichtenqueues wie Kafka. Bei der Frontend-Entwicklung gibt es einen klaren Sieger. Das Backend ist vielsprachig – je nach Aufgabe wird das passende Werkzeug verwendet.
Eine kurze Vergleich der Sprachen
- Node.js eignet sich für Startups, MVPs und BFF-Schichten. Die Entwicklung verläuft schnell, das npm-Ökosystem ist riesig und JavaScript-Entwickler sind überall zu finden. Es eignet sich jedoch nicht gut für Videoverarbeitung oder Finanztransaktionen.
- Java ist das zuverlässige Arbeitstier. Es hat eine steile Lernkurve und eine langsame Startzeit, doch es ist die richtige Wahl, wenn ein Ausfall um 3 Uhr morgens am Black Friday inakzeptabel ist.
- Go ist das, was eine Backend-Sprache aussehen könnte, wenn sie heute neu entworfen würde: schnell, einfach und koncurrentfähig. Der Nachteil ist ein jüngeres Ökosystem im Vergleich zu Java.
- Python dominiert den Bereich der Datenwissenschaft und des maschinellen Lernens. Für APIs mit hoher Konkurrenz ist jedoch das Global Interpreter Lock ein echter Engpass.
- C++ eignet sich für Anwendungen, bei denen maximale Geschwindigkeit erforderlich ist, wie z. B. Spiel Engines, eingebettete Systeme und Hochfrequenzhandel. Es ist nicht für Web-APIs gedacht.
Was das für Junior-Entwickler bedeutet
Das macht Node keineswegs schlecht. Es bleibt eine hervorragende Wahl für Startups und MVPs, bei denen die Geschwindigkeit beim Markteintritt entscheidend ist, für Backend-Layer, für Echtzeitfunktionen wie Chat und Live-Updates, für serverlose Funktionen auf AWS Lambda oder Vercel Edge sowie für Prototypen, mit denen Ideen vor dem Einsatz einer komplexeren Technologiebasis getestet werden können.
Jeder, der ein großes Unternehmen anstrebt, sollte sich nicht allein auf MERN verlassen. Die nützlichere Gewohnheit ist es, zu lernen, wie Systeme funktionieren, damit für jede Aufgabe das richtige Werkzeug gewählt werden kann. Die schwächere Einstellung besteht darin zu glauben, dass das Kennen von JavaScript bereits ausreicht, um alles zu können.
Die besten Entwickler sind nicht an eine einzige Sprache gebunden. Eine Person kann JavaScript für die Benutzeroberfläche verwenden, bei der Überprüfung auf Java-Dienste zurückgreifen, verstehen, warum ein Team Go für einen Microservice gewählt hat, und erkennen, wann Python besser geeignet ist. Sie sind Polyglotten, weil sie verstehen, dass unterschiedliche Probleme unterschiedliche Lösungen erfordern – und nicht, um anzugeben.
Das richtige Werkzeug für jede Aufgabe
React hat die Oberhand in der Benutzeroberflächenentwicklung gewonnen, und jeder große Konzern verwendet es aus gutem Grund. Den Backend-Bereich lässt sich besser als Ökosystem beschreiben als als Wettbewerb. Java, Go, Python, C++, Rust und Node haben alle ihren Platz, und die Unternehmen hinter den alltäglichen Anwendungen zwingen nicht alles in eine einzige Sprache.
Das Ziel eines Entwicklers ist es, Probleme zu lösen – nicht einfach die Sprache zu verwenden, mit der er bereits vertraut ist – und manchmal bedeutet das, etwas Neues zu lernen. Ein Junior-Entwickler mit einem MERN-Zertifikat sollte nicht in Panik geraten. Node ist ein guter Ausgangspunkt. Setzen Sie dort an: Schauen Sie sich ein Java Spring Boot-Projekt an, schreiben Sie einen kleinen Go-Microservice und finden Sie heraus, warum der Zahlungsdienst des Unternehmens in Java und nicht in JavaScript geschrieben ist. Die besten Ingenieure sind nicht die, die die meisten Sprachen kennen, sondern die, die wissen, warum jede Sprache existiert und wann sie verwendet werden sollte.
Verwandte Artikel
- Ein React-Frontend mit Node, npm und Vite einrichten — Python-ähnliche Werkzeuge auf eine React-Plus-Vite-Stack umwandeln: Node installieren, node_modules ignorieren, mit Vite ein Scaffold erstellen und den lokalen Entwicklungsserver starten.
- Mehr als CRUD: Zehn Architekturgewohnheiten, die MERN-Apps wartbar halten — Erkennen Sie die systemischen Gewohnheiten, die eine MERN-App im Laufe ihres Wachstums gesund halten: Datenbesitz, API-Verträge, abgeleiteter Zustand, schichtweiser Code, kompakte Payloads und konsistente Fehlermeldungen.