Go vs Node.js ist das Äquivalent von Äpfeln vs Orangen in der Webentwicklung. Wir vergleichen zwei völlig unterschiedliche Dinge, die dennoch in bestimmten Kontexten als echte Alternativen zueinander gesehen und verwendet werden können. Hier werden wir uns die Überlegungen ansehen, die bei der Wahl zwischen Go und Node.js für die Backend-Entwicklung eine Rolle spielen können.
Die beiden Technologien können auch in anderen Kontexten als Alternativen zueinander betrachtet werden, z. B. beim maschinellen Lernen und der Blockchain-Entwicklung. Die relativen Stärken und Schwächen der beiden Technologien für das Maschinenlernen und die Blockchain-Entwicklung liegen jedoch außerhalb des Rahmens dieses Blogbeitrags. Dieser Beitrag konzentriert sich auf die Entwicklung von Backend-Anwendungen.
Dieser Blog wird nicht versuchen, Go oder Node.js als die bessere Backend-Technologie darzustellen. Vielmehr soll ein Überblick über die wichtigsten technischen Eigenschaften beider Technologien gegeben werden, die je nach technischem Kontext einen Einfluss auf die Entscheidungsfindung haben können. Ebenso wie die geschäftlichen und strategischen Überlegungen, die oft ebenso einflussreich sind wie die technischen Qualitäten, wenn es darum geht, sich für einen Technologie-Stack zu entscheiden.
Einführung in Go und Node.js
Go ist eine statisch typisierte, kompilierte, serverseitige Programmiersprache, die auf C basiert. Sie ist vor allem für ihre zugewiesene Speicherverwaltung, ihre Fähigkeiten zur gleichzeitigen Programmierung und ihre Geschwindigkeit bekannt und wird hauptsächlich in der Backend-Webentwicklung eingesetzt. Die Sprache wird immer noch, sogar manchmal von Entwicklern, fälschlicherweise als „Golang“ bezeichnet. Sie wurde nie Golang genannt, aber die Angewohnheit, die sich nur schwer abgewöhnen lässt, ist auf den ursprünglichen Domainnamen der Open-Source-Sprache zurückzuführen – golang.org.
Node.js hingegen ist keine Programmiersprache, sondern eine plattformübergreifende Laufzeitumgebung für die Ausführung von JavaScript-Code, die auf der V8-JavaScript-Engine von Chrome aufbaut.
Bei beiden handelt es sich um Open-Source-Technologien, wobei Go ursprünglich von Robert Griesemer, Rob Pike und Ken Thompson bei Google entwickelt wurde. Wie Go wurde auch Node.js erstmals im Jahr 2009 veröffentlicht. Es wurde von dem amerikanischen Software-Ingenieur Ryan Dahl entwickelt (der 2018 auch Deno, eine JavaScript/TypeScript-Laufzeitumgebung für Backend-Anwendungen in Unternehmen, veröffentlicht hat) und anschließend von dem zu Samsung gehörenden US-Softwareunternehmen Joyent gesponsert.
Zusammengefasst ist Go eine serverseitige Programmiersprache und Node.js hilft JavaScript, als serverseitige Sprache zu funktionieren. Infolgedessen werden die beiden Technologien, obwohl sie unterschiedlichen Klassen angehören (Programmiersprache vs Programmiersprachen-Laufzeit), oft als rivalisierende Alternativen innerhalb eines Backend-Webentwicklungs-TechStack betrachtet.
Dieser Blog wird nicht versuchen zu Go oder Node.js als „die bessere“ Technologie zu verkaufen. Stattdessen werden wir ihre jeweiligen Stärken und Schwächen im Kontext der Backend-Webentwicklung betrachten, die sie als Alternativen zueinander betrachten können.
Beide sind großartige Technologien, die wichtige Beiträge zum sich noch entwickelnden Ökosystem der Webentwicklung geleistet haben. Es ist kein Konkurrenzkampf. Aber am Ende dieses kurzen Blogs sollten Sie eine klarere Vorstellung davon haben, wann und wo beide Technologien zum Einsatz kommen können. Und einige der wichtigsten geschäftlichen Erwägungen, die auch ein wichtiger Teil der Tech-Stack-Entscheidungen sind.
Wofür wird Go verwendet? Populäre Anwendungen der Programmiersprache
Google gab die Entwicklung von Go um das Jahr 2007 herum in Auftrag, um eine Lösung für die dringenden Herausforderungen zu finden, mit denen das Unternehmen damals konfrontiert war. Dazu gehörten Multi-Core-Maschinen, Netzwerke und Webentwicklung. Die damals von Google verwendeten Sprachen wie C, Java und Python begegneten diesen Herausforderungen mit Umgehungslösungen, anstatt sie direkt anzugehen. Griesemer, Pike und Thompson entwickelten Go, um genau das zu tun.
Mit Go entwickelte Tools
Eine der Stärken von Go als Sprache, die nativen Maschinencode kompiliert, ist, dass sie sich ideal für die Erstellung von Software-Entwicklungstools eignet. Einige der bekanntesten Tools, die mit Go entwickelt wurden, sind:
- Kubernetes
- Docker
- Terraform
- Hoverfly
Bekannte Anwendungen, die mit Go entwickelt wurden
Einige der bekanntesten Anwendungen sowie große IT-Unternehmen, die Go ausgiebig nutzen, sind:
YouTube – angesichts der Tatsache, dass Google die Entwicklung von Go in Auftrag gegeben hat, um seine eigenen Herausforderungen zu lösen, ist es keine Überraschung, dass es die Sprache auch ausgiebig nutzt. Die genaue Anwendung von Go in seinen Produkten wird vertraulich behandelt, aber hieße, dass Go in YouTube und Chrome verwendet wird.
Dropbox – der Cloud-Speicherriese für Verbraucher hat den größten Teil seiner Infrastruktur in Go entwickelt
Ein Cloud-Computing-Riese geht Skalierbarkeitsprobleme mit Golang an. Der größte Teil seiner Infrastruktur ist in Go geschrieben.
Netflix – Der Rend-Proxy der TV- und Film-Streaming-Plattform, der für die Skalierbarkeit der Daten entscheidend ist, setzt stark auf Go, wie im offiziellen NetflixTechBlog beschrieben.
IBM – IBM ist ein großer Befürworter von Go und hat zahlreiche Produkte zur Unterstützung seiner Go-Kunden entwickelt.
Stärken von Go
Einige der wichtigsten Vorteile von Go als Programmiersprache sind:
Schnelligkeit
Die Fähigkeit von Go, dank seiner C-Basis in nativen Maschinencode zu kompilieren, macht es zu einer extrem schnellen und effizienten Programmiersprache.
Einfache Syntax
Go hat eine extrem einfache Syntax, die aus nur 25 Schlüsselwörtern besteht, was die Lesbarkeit und Klarheit des Codes fördert. Eine einfachere Syntax bedeutet weniger Variablen in der Art und Weise, wie Dinge geschrieben werden können, was es wiederum den Tausenden von Entwicklern, die an Googles Produkten arbeiten, erleichtert, den Code der jeweils anderen effizient zu verstehen.
Und natürlich profitieren auch viel kleinere Projekte als die Softwareprodukte von Google davon. Denn wer in einem Entwicklungsteam mitarbeitet, profitiert von der schnellen Lesbarkeit des gesamten Code.
Skalierbarkeit
Die relative Einfachheit von Go spricht auch für deren Skalierbarkeit – eine weitere wichtige Anforderung von Google. Go wurde entwickelt, um große Herausforderungen zu lösen, und ihr Gleichzeitigkeitsmodell (Goroutinen), das die Gleichzeitigkeit (concurrency) nicht nur unterstützt, sondern verbessert, wurde als „für die Gleichzeitigkeit das, was Docker für die Virtualisierung ist“ beschrieben.
Die Fähigkeit von Go, bis zu 1000 gleichzeitige Anfragen pro Sekunde zu bewältigen, verschafft ihm einen großen Vorteil, wenn es um die Entwicklung von Software geht, bei der starke Skalierbarkeit eine Priorität ist.
Tooling
Die optimierte Syntax bzw, Aufbau von Go hat den Vorteil, dass sie ein einfach zu schreibendes Tooling ermöglicht. Das wiederum hat dazu geführt, dass über den Go-Befehl eine Vielzahl von Tools zur Verfügung steht, die die Verwaltung und Wartung von Go-Software erleichtern.
Einen tieferen Einblick in die Go-Tools erhalten Sie in diesem Blog-Artikel des Go-Experten Alex Edwards.
Etabliertheit
Obwohl Go, wie auch Node.js, erst 2009 auf den Markt kam, gilt es bereits als sehr ausgereift und robust. Wahrscheinlich mehr als Node.js, das unter ständigen Änderungen an seinen APIs leidet.
Schwächen von Go
Als einige Nachteile von Go als Programmiersprache werden gesehen:
Die Notwendigkeit, Go’s eingebaute Garbage Collection zu „tunen“, kann Entwickler verwirren
Während die eingebaute Garbage Collection (GC) im Allgemeinen für Go spricht, wenn es um die Skalierbarkeit geht, kann sie in bestimmten Szenarien auch Probleme verursachen. Das bedeutet, dass die GC möglicherweise an die Bedürfnisse einer bestimmten Softwareanwendung angepasst oder „tuned“ werden muss. Das kann für weniger erfahrene Go-Entwickler eine verwirrende, nicht immer geschätzte Variable sein.
Fehlerbehandlung
In Go sind alle Fehler Werte. Aus diesem Grund geben viele Funktionen am Ende einen Fehler zurück. Einige Kritikpunkte an Go’s Ansatz zur Fehlerbehandlung sind, dass es schwierig ist, eine gute Fehlerbehandlung zu erzwingen, dass Fehler keine Stack Traces haben und dass die Fehlerbehandlung selbst zu ausführlich ist.
Gute Go-Entwickler sind teuer und können schwer zu finden sein
Die Einstellung kompetenter, vor allem erfahrener Go-Entwickler ist relativ teuer, und im Vergleich zum JavaScript-basierten Node.js ist die Zahl der auf dem Markt verfügbaren Entwickler geringer, was die Einstellungszyklen ebenfalls verlängern kann. Laut der Stack Overflow-Umfrage für Entwickler aus dem Jahr 2021 liegt das internationale Durchschnittsgehalt für Go-Entwickler bei etwa 75.000 $, verglichen mit etwa 55.000 $ für Node.js-Entwickler.
Wofür wird Node.js verwendet? Beliebte Anwendungen der Programmiersprache
Im Backend einer Web-, Mobil- oder Desktop-Anwendung wird Node.js am häufigsten zur Entwicklung von APIs oder Diensten verwendet. Die Laufzeitumgebung wurde von Ryan Dahl als Lösung für das Problem entwickelt, JS außerhalb des Browsers ausführen zu können. Dazu nahm er die V8-Engine von Chrome, die JS am besten in Maschinencode umwandeln kann, und bettete sie in ein C++-Programm ein.
Das Ergebnis dieser Kombination ist Node.js, das die Chrome-Engine nutzt, aber eine Laufzeitumgebung zum Kompilieren und Ausführen von JS auf der Maschinenseite und nicht wie Chrome auf der Browserseite.
Die nicht blockierende asynchrone Natur von Node.js, bei der ein einzelner Thread mehrere Anfragen bedient, macht es zu einer idealen Lösung für Echtzeit- und andere datenintensive Anwendungen, die skaliert werden müssen.
Zu den Kategorien von Anwendungen, die häufig Node.js verwenden, gehören:
- Echtzeit Webanwendungen
- Streaming Anwendungen
- Messager Apps
- Chat Programme
- Social-Media Apps
- Virtuelle Emulatoren
- Multiplayer Spiele
- Collaborations-Tools
- APIs
Bekannte Anwendungen, die mit Node.js entwickelt wurden
Netflix – die Benutzeroberfläche und die Datenzugriffsschicht wurden mit Node.js erstellt.
Paypal – die Webanwendung der Zahlungsplattform nutzt Node.js für die Benutzeroberfläche der Webanwendung. Jeff Harrel, Senior Director of Payments Products and Engineering bei PayPal, erklärt die Rolle von Node.js in der App:
„NodeJS hilft uns dabei, diese Grenze (zwischen Browser und Server) zu überwinden, indem sowohl die Browser- als auch die Serveranwendungen in JavaScript geschrieben werden können. Es vereint unsere technischen Spezialitäten in einem Team, was es uns ermöglicht, die Bedürfnisse unserer Benutzer auf jeder Ebene des Technologiestacks zu verstehen und darauf zu reagieren.“
LinkedIn – die Serverseite der mobilen App von LinkedIn ist aufNode.js aufgebaut.
Mozilla – der Mozilla Firefox-Webbrowser ist eine Node.js-Anwendung. Mark Mayo, Principal Engineer von Firefox, erklärt warum:
„Wir haben uns aus zwei Gründen konkret für Node entschieden: Einer war der Speicherbedarf“ und „es war vorteilhaft, die gleiche Sprache sowohl auf der Server- als auch auf der Client-Seite verwenden zu können.“
Uber – Das Uber-System zum Abgleich zwischen Kunden und Fahrern war eine der ersten Anwendungen von Node.js in einer großen App. Die Laufzeitumgebung wurde wegen ihrer Geschwindigkeit bei der Informationsverarbeitung und ihrer Fähigkeit, Fehler zu korrigieren, ohne dass ein Neustart der Anwendung erforderlich ist, ausgewählt.
Stärken von Node.js
Einige der anerkanntesten Stärken von Node.js als Softwareentwicklungs-Technologie sind:
Einfachheit
Node.js ermöglicht es, dass eine Anwendung sowohl auf der Client- als auch auf der Serverseite eine einzige Sprache, nämlich JavaScript, verwendet. Dies hat den Vorteil, dass weniger Dateien und weniger Code benötigt werden, als wenn Front- und Backend unterschiedliche Sprachen verwenden würden. Es bedeutet auch, dass Code auf der Client- und Serverseite wiederverwendet werden kann, was widerum die Entwicklung beschleunigt.
Fullstack-JavaScript-Entwickler, die sowohl am Front- als auch am Backend einer Anwendung arbeiten können, könnten auch die abrechenbaren Entwicklungsstunden optimieren.
Markteinführungszeit
Die Leichtigkeit von Node.js und die Möglichkeit, auf Client- und Serverseite dieselbe Sprache zu verwenden, kann die Entwicklungszeit erheblich verkürzen. Auch die Bereitstellung ist einfach. Beide Eigenschaften können die Markteinführungszeit für mit Node.js entwickelte Anwendungen verkürzen.
Skalierbarkeit
Node.js-Systeme sind dank der eingebauten Lastverteilung und der Fähigkeit, große Mengen gleichzeitiger Verbindungen zu verarbeiten, von Natur aus skalierbar. Es ist auch einfach, neue Module zu bestehenden hinzuzufügen, wenn eine Anwendung vertikal oder horizontal skaliert wird.
Da immer mehr Anwendungen als Cloud-native Software entwickelt werden, ist die Eignung von Node.js innerhalb von Microservices-Architekturen, die auf Skalierbarkeit ausgelegt sind, eine Stärke.
Zukunftssicher
Als eine der bekanntesten und meistgenutzten nicht-sprachlichen Software-Entwicklungstechnologien wird Node.js noch lange Zeit von großer Bedeutung sein. Es gibt eine aktive Open-Source-Gemeinschaft und ein gesundes Angebot an Entwicklern, die sich mit Node.js auskennen und Erfahrung damit haben, ist auf dem Markt vorhanden.
Schwächen von Node.js
Einige Punkte die als Nachteile von Node.js gesehen werden sind:
Instabilität der API
Die vielleicht am häufigsten genannte Kritik von Entwicklern, die mit Node.js arbeiten, ist die Instabilität der API. Diese wird regelmäßig mit Updates aktualisiert, denen es an Abwärtskompatibilität fehlt. Das kann zu laufenden und oft unerwarteten Wartungsarbeiten führen, um die Codebasis einer Anwendung mit den API-Änderungen kompatibel zu halten.
Lücken in der Bibliotheksunterstützung
Da Node.js auf JavaScript basiert, leidet es unter denselben Unzulänglichkeiten des Bibliothekssystems wie die Programmiersprache. Mehrere der wichtigsten NPM-Registrierungen und Bibliotheken, auf die Node.js angewiesen ist, sind entweder unvollständig oder es fehlt eine angemessene Dokumentation. Die unvollständige Bibliotheksunterstützung ist vor allem ein Problem für weniger erfahrene Entwickler, die sich stärker auf den Support verlassen.
Nicht ideal für schwere CPU-basierte Berechnungen
Während die Qualitäten von Node.js als Single-Thread- und ereignisgesteuertes System viele seiner Stärken ausmachen, bedeuten sie auch, dass Node.js bei schweren CPU-basierten Rechenaufgaben suboptimal arbeiten kann. Die Ereignisschleife kann sich verlangsamen, wenn große CPU-gesteuerte Aufgaben eingeführt werden, da Node.js seine gesamte verfügbare CPU-Leistung nutzen muss, um sie zu bewältigen.
Die Einführung des Worker-Thread-Moduls von Node.js im Jahr 2018 bedeutet, dass nun mehrere Threads gleichzeitig ausgeführt werden können. Dies verbessert zwar die Situation, löst aber nicht vollständig das Problem, dass CPU-gebundene Berechnungsaufgaben die Ereignisschleife verlangsamen.
Asynchrones Modell
Das asynchrone Modell von Node.js ist eine Eigenschaft, die einen großen Vorteil für die Skalierbarkeit darstellt. Allerdings ist es auch schwieriger einzurichten und zu pflegen als lineare blockierende E/A-Codierung, zumal es häufig verschachtelte Aufrufe beinhaltet. Der erhöhte Schwierigkeitsgrad kann die Entwicklungszeit verlängern und die reibungslose Leistung einer Anwendung beeinträchtigen.
Fehlerbehandlung
Node.js ist dynamisch typisiert, was zu einer schlechten Fehlerbehandlung führt.
Wenn Sie mehr technische Details über die Unterschiede zwischen Go und Node.js Handhabung wollen:
- Datentypen, Variablen, und Konstanten
- Bedingte Anweisungen
- Schleifen
- Objekte
- HTTP-Server
- Middleware
- Verbrauchender APIs
- Datenbank-Verbindungen
Dieser Artikel, der auch Tutorials enthält, ist eine gute Quelle für einen tieferen Einblick.
Auswahl zwischen Go und Node.js für die Backend-Entwicklung – Abwägung technischer und strategischer Überlegungen
Direkte Vergleiche zwischen zwei Technologien sind ohne vollständigen Kontext immer schwierig und von fragwürdigem Wert. Da die beiden Technologien so unterschiedlich sind (Programmiersprache vs Laufzeitumgebung), ist dies besonders der Fall, wenn man Go vs Node.js als Optionen für die Backend-Entwicklung diskutiert.
Die Entscheidung für eine der beiden Sprachen hängt stark von den spezifischen technischen Anforderungen eines Softwareentwicklungsprojekts und von strategischen Überlegungen ab. Letztere können genauso einflussreich, wenn nicht sogar einflussreicher sein als erstere.
So könnte die Verwendung von Go anstelle von Node.js für eine bestimmte Anwendung die Leistung leicht verbessern. Wenn der Projektsponsor jedoch bereits über ein Team von JavaScript-Entwicklern verfügt und andere von ihm entwickelte und gewartete Softwareprodukte in ihren Backends eher Node.js als Go verwenden, wird Go wahrscheinlich nur dann gewählt, wenn seine Verwendung die Qualität der Anwendung wesentlich verbessert. Und zwar in einer Weise, die voraussichtlich den Gesamterfolg der App positiv beeinflussen wird.
Das Gleiche lässt sich auch für das umgekehrte Szenario sagen. Letztendlich muss ein Softwarearchitekt entscheiden, welche Backend-Technologie zu einer App führen wird, die den technischen Spezifikationen und Prioritäten entspricht. Die Entscheidung zwischen realisierbaren Tech-Stack-Alternativen wird dann in der Regel unter Berücksichtigung der Geschäftsstrategie getroffen.
Go vs Node.js – strategische Überlegungen
Es wurde bereits erwähnt, aber eine der Stärken von Node.js im Vergleich zu Go ist die relative Verfügbarkeit von Entwicklern. Die jüngste (2021) Stack Overflow-Entwicklerumfrage zeigt, dass über 36 % der Befragten im letzten Jahr mit Node.js gearbeitet haben, verglichen mit 10,5 % mit Go. Und fast 70 % der Entwickler hatten bereits mit JavaScript gearbeitet, was den Einstieg in Node.js potenziell einfacher macht.
Go war jedoch eine der Sprachen, die die meisten Entwickler, die noch nicht damit gearbeitet hatten, lernen wollten. 14,5 % wollten Go lernen, fast so viel wie JS und mehr als die 12 %, die Node.js lernen wollten. Das deutet darauf hin, dass die Zahl der Go-Entwickler auf dem Markt in den kommenden Jahren steigen könnte. Da aber auch die Nachfrage steigt, dürfte es auf absehbare Zeit schwieriger bleiben, Go- als Node.js-Entwickler einzustellen.
Gehälter von Go- vs Node.js-Entwicklern
Die Gehälter von Go-Entwicklern sind in der Regel höher als die von Node.js-Entwicklern, da es weniger auf dem Markt gibt und das Erlernen der Sprache das Beherrschen einer ganzen Sprache erfordert. Für einen Entwickler ist es in der Regel eine größere berufliche Investition, Go im Vergleich zu Node.js zu erlernen, vor allem, wenn er bereits mit JavaScript vertraut ist. Laut der internationalen Umfrage von Stack Overflow liegt das Durchschnittsgehalt eines Go-Entwicklers bei 75.599 Dollar. Für Node.js-Entwickler liegt das durchschnittliche internationale Gehalt mit etwas unter 55.000 Dollar deutlich niedriger.
Dies sind natürlich nur sehr allgemeine Zahlen, und das Gehalt, das ein Entwickler erzielen kann, hängt von einer Kombination von Faktoren ab – dem Grad der Expertise in einer Technologie, der Erfahrung und Expertise in ihrer Anwendung in spezifischen Szenarien und Kontexten sowie dem allgemeinen Tech-Stack.
In der Regel sind Go-Entwickler jedoch schwieriger und teurer zu rekrutieren als Node.js-Entwickler. Diese Tatsache kann den Ausschlag zugunsten von Node.js geben, es sei denn, es gibt starke technische Argumente, warum Go bevorzugt werden sollte.
Fazit: Die Wahl zwischen Node.js und Go für die Backend-Entwicklung ist eine Frage des richtigen Weges
Die Wahl zwischen Go und Node.js oder anderen Optionen wie Java und Python für das Backend einer Anwendung läuft auf eine Abwägung zwischen technischen und geschäftlichen Aspekten hinaus
Das Argument für Go ist im Allgemeinen am stärksten, wenn es sich um Anwendungen handelt, die einen hohen Prozessorbedarf haben oder Multithreading-Aufgaben erfordern. Unternehmen, die sich für einen auf Go aufbauenden Backend-Technologiestack entscheiden, sollten jedoch sicherstellen, dass sie ihre Entscheidung bewusst treffen. Gute Go-Entwickler sind schwieriger zu rekrutieren und oft deutlich teurer als Node.js-Entwickler.
Dies ist eine interessante Fallstudie eines Start-ups, das mit der Entwicklung seines MVP mit Go als Backend begann, bevor es aus strategischen Gründen zu Node.js migrierte.
Zusammenfassend lässt sich sagen, dass die Entscheidung für einen Tech-Stack sowohl im Kontext technischer als auch geschäftlicher Überlegungen getroffen werden sollte. Einer der größten und häufigsten Fehler bei der Softwareentwicklung ist das Streben nach technischer Optimierung, ohne sich ausreichend Gedanken über die geschäftlichen und strategischen Auswirkungen dieser Art von Optimierung zu machen.
Überwiegen die – manchmal marginalen – Leistungsvorteile Faktoren wie eine langsamere Markteinführung, höhere Entwicklungskosten, potenzielle Schwierigkeiten bei der Personalbeschaffung usw.? Die Antwort kann „ja“ lauten. Manchmal rechtfertigt der technische Vorsprung, den die Wahl eines Tech-Stacks bringt, andere Nachteile. Es kommt aber mindestens genauso häufig vor, dass dies nicht der Fall ist.
Unabhängig davon, ob Sie sich im Backend für Node.js oder Go oder ein anderes Tech-Stack-Dilemma entscheiden müssen, stellen Sie sicher, dass die Entscheidung unter voller Berücksichtigung der technischen und strategischen Stärken und Schwächen getroffen wird.