Warum die Sprache Go?
Einleitung
Programmiersprachen sind Werkzeuge zur Erstellung von Produkten. Die bloße Verwendung einer bestimmten Sprache bestimmt nicht die Fähigkeiten eines Entwicklers. Die Wahl der Sprache und die Art und Weise, wie sie gehandhabt wird, können jedoch die Denkweise und die Entwicklungsrichtung eines Entwicklers direkt beeinflussen. Insbesondere der Vergleich der aktuell verwendeten Sprache mit anderen Sprachen kann den technischen Horizont erweitern und ein Gefühl für das Wesentliche entwickeln. In diesem Artikel möchte ich in fünf Aspekten erläutern, warum ich Go gewählt habe und inwiefern dies das Wachstum eines Entwicklers fördert.
1. Go ist eine Sprache, die Leistung und Produktivität in Einklang bringt.
Es gibt unzählige Programmiersprachen auf der Welt, und jede Sprache hat je nach ihren Eigenschaften Vor- und Nachteile.
- C bietet hervorragende Leistung und Low-Level-Kontrolle, erfordert jedoch eine manuelle Speicherverwaltung durch den Entwickler und verfügt über unzureichende High-Level-Funktionen, was zu geringer Produktivität und schwieriger Wartung führt.
- C++ und Rust unterstützen verschiedene fortgeschrittene Funktionen wie Objektorientierung, Templates und Metaprogrammierung, aber ihre Syntax ist komplex, die Lernkurve ist steil und die langsamen Kompilierungszeiten machen sie für iterative Deployments ungeeignet.
- Java und C# bieten Plattformunabhängigkeit und Stabilität und werden häufig für große Dienste eingesetzt, aber sie laufen auf schweren virtuellen Maschinen, was die Bereitstellungs- und Ausführungsumgebung komplex macht und hohe Ressourcenanforderungen stellt.
- Python und Javascript eignen sich aufgrund ihrer prägnanten Syntax und ihres reichen Ökosystems für die schnelle Entwicklung, aber ihre Ausführungsleistung ist gering und die Zuverlässigkeit des Ökosystems ist niedrig, was in großen Systemen strukturelle Grenzen offenbart.
Im Gegensatz dazu ist Golang eine Sprache, die ein hervorragendes Gleichgewicht zwischen Leistung und Produktivität aufweist. Da Go eine kompilierte Sprache wie C ist, garantiert sie eine hohe Ausführungsleistung und bietet gleichzeitig eine schnelle Kompilierungszeit, die die Bereitstellungsflexibilität auf Interpreter-Niveau ermöglicht. Das bedeutet, Go ist eine ausgewogene Sprache, die in den meisten Umgebungen stabil eingesetzt werden kann, ohne nennenswerte Nachteile.
2. Go verhindert Cargo Cult Programming.
Während des Zweiten Weltkriegs bauten die Alliierten auf pazifischen Inseln Luftwaffenstützpunkte, um den Krieg zu unterstützen. Die großen Mengen an Versorgungsgütern und militärischer Ausrüstung veränderten das Leben der Soldaten und Ureinwohner erheblich. Die Bewohner sahen zum ersten Mal Flugzeuge, die Kleidung, Konserven und andere Güter transportierten. Nach dem Krieg wurden die Stützpunkte aufgegeben, und es kam keine Fracht mehr an. Daraufhin verkleideten sich die Inselbewohner wie Fluglotsen, Soldaten und Seeleute, bauten etwas Ähnliches wie eine Start- und Landebahn und gaben mit Stöcken Landezeichen an Flugzeuge, um die Soldaten nachzuahmen. Sie setzten ihre Märsche fort, in der Hoffnung, dass Fracht per Fallschirm aus den Flugzeugen abgeworfen würde. Doch die Flugzeuge, auf die sie warteten, kamen nicht.
Cargo Cult Programming bezeichnet die Angewohnheit von Entwicklern, die äußere Form von Code oder Technologie nachzuahmen, ohne deren Prinzipien zu verstehen. Bei modernen Entwicklern, insbesondere im Bereich der Webentwicklung, kommt diese Angewohnheit, etwas ohne Verständnis zu imitieren, häufig vor. Dank Frameworks wie React, Next, Spring und Django ist die Entwicklung möglich, ohne die interne Struktur zu kennen, aber oft können selbst kleine Fehler nicht richtig behoben werden. Hinzu kommt, dass mit den jüngsten AI Code Generation Tools die Entwicklungsmethode, bei der Ergebnisse kopiert und eingefügt werden, anstatt Code selbst zu schreiben oder Prinzipien zu verstehen, immer verbreiteter wird.
Go lehnt diese Probleme auf der Ebene der Sprachphilosophie grundsätzlich ab. Go ist eine Sprache, die nicht Framework-zentriert, sondern Standardbibliothek-zentriert konzipiert ist. Entwickler können mit grundlegenden Bibliotheken wie net/http und database/sql einen echten Webserver auf Service-Niveau aufbauen und entwickeln dabei auf natürliche Weise ein intuitives Verständnis für Low-Level-Strukturen wie Netzwerke, Datenbanken und I/O. Eine solche Struktur, die es ermöglicht, die Grundlagen solide zu erlernen, ohne von Frameworks abhängig zu sein, bildet die Grundlage dafür, dass Entwickler das Wesentliche der Technologie nicht aus den Augen verlieren und kontinuierlich wachsen können.
3. Go bietet ein leistungsstarkes Parallelitätsmodell.
Moderne CPUs entwickeln sich nicht in Richtung einer Steigerung der Geschwindigkeit einzelner Kerne, sondern in Richtung einer Leistungssteigerung durch die parallele Nutzung mehrerer Kerne. Dementsprechend ist Parallelität, bei der ein Programm mehrere Aufgaben gleichzeitig verarbeiten kann, unverzichtbar geworden, und die Bedeutung von Sprachen, die dies effizient entwerfen und implementieren können, nimmt ebenfalls zu. Go ist eine Sprache, die für diese Umgebung optimiert ist. Eine Goroutine ist ein leichter Thread, der von Go bereitgestellt wird. Sie kann mit einem Stack von nur wenigen KB erstellt werden, und selbst Tausende von ihnen, die gleichzeitig ausgeführt werden, verbrauchen kaum Systemressourcen. Die Go-Runtime verteilt unzählige Goroutinen effizient auf OS-Threads über ihren eigenen M:N-Scheduler, und dieser Prozess wird automatisch optimiert, ohne dass der Entwickler direkt eingreifen muss. Dadurch kann der Entwickler Parallelitätslogik sicher und konsistent entwerfen, ohne komplexe Synchronisationslogik oder benutzerdefinierte Zeitplanung.
Darüber hinaus unterstützt Go aktiv moderne Parallelitätsdesigns unter Verwendung von Synchronisationswerkzeugen wie Mutex und WaitGroup sowie Channel und Context. Dank dieser Struktur kann der Entwickler ein praktisches Gefühl für Parallelität und Gleichzeitigkeit auf natürliche Weise erlernen, ohne sich in komplexen Theorien zu verstricken, und ein hohes Maß an Abstraktions- und Designfähigkeiten erreichen, die von Grund auf nutzbar sind.
4. Go ist eine Sprache, die von exzellenten Entwicklern mit Weitsicht entwickelt wurde.
Go wurde von legendären Entwicklern wie Robert Griesemer, Rob Pike und Ken Thompson bei Google initiiert. Insbesondere sind sie die Schöpfer von Unix und der Programmiersprache C sowie Größen im Bereich Compiler und Systemsoftware, was die technische Glaubwürdigkeit von Go an sich beweist. Dazu kommt die praktische Erfahrung und das Know-how im Betrieb großer Dienste von zahlreichen Google-Ingenieuren, wodurch Go von Anfang an auf die Lösung realer Probleme ausgerichtet war und sich mit einer konsistenten Philosophie und Ausrichtung entwickelt hat.
Andere Sprachen stiften oft Verwirrung in der Community und bei den Nutzern durch Inkompatibilität, Designänderungen, instabile Lizenzen oder nicht standardisierte Ökosysteme. Zum Beispiel wurde das Python-Ökosystem jahrelang durch die Inkompatibilität zwischen Version 2 und 3 gespalten, und Java sah nach der Übernahme durch Oracle eine Zunahme von Unternehmen, die aufgrund instabiler Lizenzrichtlinien zögerten, es einzuführen. Auch Node.js bietet noch immer kein konsistentes Modulsystem, da CJS und ESM nebeneinander existieren.
Im Gegensatz dazu ist Go eine Sprache, die Konsistenz und Stabilität als oberste Werte betrachtet. Das Go-Team achtet streng auf Abwärtskompatibilität und verfolgt bei der Einführung neuer Funktionen einen schrittweisen Integrationsansatz, um Konflikte mit bestehendem Code zu vermeiden. Auch die Syntax vermeidet unnötige Schlüsselwörter und begrenzt übermäßige Abstraktionen, um eine unnötige Komplexität der Sprache selbst zu verhindern. Darüber hinaus sorgt die konsistente offizielle Toolchain wie go fmt, go mod, go build, go test dafür, dass alle Go-Projekte dieselbe Entwicklungsumgebung und -struktur haben, und die leistungsstarke und praktische Standardbibliothek unterstützt die meisten Funktionen, die für die praktische Entwicklung erforderlich sind, wie Webserver, Dateiverarbeitung und Datenbankintegration, auch ohne separates Framework.