Meine primäre Programmiersprache ist schon sehr lange Python. Ich bin kein Softwareentwickler; dennoch liefere ich damit gut funktionierenden Code und damit auch Lösungen — meist Plugins/Module für bestehende Komponenten, aber auch mal ein Backend für IoT-Devices. Das meiste davon entstand im Rahmen meiner Erwerbsarbeit und steht daher unter NDA.

hello_world.go

Schon länger besteht jedoch der Wunsch, eine weitere Programmiersprache zu können, weshalb ich mir Gedanken über meine Anforderungen an eine neue Programmiersprache gemacht habe:

  • Die Sprache sollte kompiliert werden müssen; es sollte also keine Skriptsprache mehr sein.
  • Die Sprache sollte statisch typisiert sein.
  • Die Sprache sollte plattformübergreifend, zumindest aber auf Linux und macOS gut lauffähig sein.
  • Die Sprache sollte architekturübergreifend, inkl. Cross-Compiling, verwendbar sein. Ich möchte also auch in der Lage sein, auf einer Intel- oder AMD-CPU Binaries für ARM zu bauen.

Evaluiert habe ich folgende Programmiersprachen, jeweils eine Woche. Meine Testaufgabe waren lediglich ein paar einfache REST-API-Aufrufe und das damit verbundene Parsen von JSON.

  • Rust: Alle reden davon, ich wollte es also auch mal wissen. Um ehrlich zu sein, war mir die Einstiegshürde (von Python kommend) zu hoch; gleichzeitig empfand ich das Tooling als wenig attraktiv, und mir fehlte das von Python gewohnte “Batteries included”. Rust ist sicher eine hervorragende Programmiersprache, aber eben doch nicht meine.
  • C: Im Hackerspace- und CCC-Umfeld wird häufig C verwendet, was naheliegend ist für die vielen ESP32, die überall herumliegen. Die Lernkurve war zumindest anfangs noch ganz OK; allerdings empfand ich das Tooling als eher altertümlich und auch das “Batteries included” fehlte mir wieder. Dazu kommen noch die diversen footguns, die die sichere Verwendung dieser alten Sprache nicht gerade einfacher machen.
  • Go: Bekannt vor allem durch das ganze Container- und DevOps-Tooling war natürlich auch Go eine Sprache, die in Betracht kam. Im Vergleich zu Rust oder C konnte ich mich recht schnell an das Tooling gewöhnen. Von Python kommend wirkt Go fast schon wie eine Low-Level-Programmiersprache. Gefallen hat mir auch, dass es wieder “Batteries included” gibt.

So war die Entscheidung schnell gefallen: Es sollte Go werden. Nicht evaluiert habe ich Zig, was sicher auch eine gute Programmiersprache ist; zum Zeitpunkt der Entdeckung hatte ich mich jedoch bereits entschieden.

“Learning by Doing”

Learning by Doing ist sehr effizient, vor allem, da man dabei auch viele Fehler macht und daraus lernt.

Zuerst habe ich die meisten privat laufenden Python-Tools durch neue Implementierungen in Go ersetzt. Dies umfasst diverse Prometheus-Exporter, aber auch das angepasste Lademanagement, welches mein EVCC “optimiert”.

Aufgefallen ist mir dabei unter anderem, wie viel kleiner meine Container wurden: in einem Fall ging es von ca. 300 MiB auf ca. 15 MiB herunter — das ist ordentlich.

Die (oft) deutlich bessere Performance von Go spielte hier nur selten eine Rolle; nichts, was ich privat betreibe, läuft im Maßstab von Google, Cloudflare oder Amazon.

Unerwartet schnell habe ich gelernt, dass Fehler auch Freunde sind (Go hat ein sehr explizites Error-Handling) und dass Exceptions weniger nett sind, als das Konzept zunächst klingt.

Dokumentation

Neben A Tour of Go empfand ich vor allem Go by Example als sehr hilfreich. Die offizielle Dokumentation der Sprache ist ebenfalls sehr gut und verständlich.

Bücher

Der nächste Schritt war dann ein Deep Dive in Form von Abendlektüre und beinhaltete zwei Bücher, die ich hier kurz vorstellen möchte.

Learning Go: An Idiomatic Approach to Real-World Go Programming (English Edition)

Vor allem, wenn man von einer anderen Sprache kommt, ist dieses Buch sehr hilfreich, da es zeigt, wie man idiomatischen Code erstellt, der auch zu den Patterns der Sprache passt.

Zu oft ist es mir passiert, dass ich versucht habe, “pythonic” Code zu schreiben, obwohl ich jetzt auf Go unterwegs bin, wo Dinge eben anders getan werden sollten oder sogar müssen.

Effektiv habe ich das Buch am Abend in einer Woche komplett verschlungen; es ist meiner Ansicht nach jeden Cent wert.

100 Go Mistakes and How to Avoid Them (English Edition)

Wie schon weiter oben erwähnt: Aus Fehlern lernt man. Und der Autor dieses Buches hat mindestens 100 Fehler sehr oft gemacht, sodass ich direkt vom Profi lernen kann.

Das Buch ist eine sehr gute Ergänzung, da man im einen Buch über idiomatischen Code lernt, wie Code aussehen sollte, und in diesem hier, wie genau er nicht aussehen sollte.

Zugegeben: ca. ein Drittel der genannten Fehler wären mir auch ohne Kenntnisse der Sprache aufgefallen; bei wiederum anderen wäre ich direkt in das offene Messer gelaufen.

AI / KI

Zum Lernen habe ich auch KI-generierte Inhalte verwendet. Anfangs hatte ich in meinem Editor (Visual Studio Code) noch Copilot aktiviert, aber zumindest auf dem privaten PC wurde diese Erweiterung nach einigen Tests deinstalliert.

Man lernt nicht oder nur sehr langsam, wenn einem die KI immer die “beste” Lösung vorschlägt, und manchmal läuft man auch einen komplett falschen Pfad entlang.

Mittlerweile verwende ich nur noch OpenCode und beziehe ein paar Tokens durch OpenRouter. Hin und wieder hilft mir auch Perplexity bei der Recherche.

KI darf privat meinen Code nur noch reviewen oder mir in bestimmten Fällen etwas Unterstützung geben. Meist reichen die Reviews aus, um meinen Code zu verbessern. Agenten sollen privat keinen Code für mich schreiben. Ich möchte den Lerneffekt mitnehmen, die Basics verstehen und in Fallen laufen. Scheitern ist Teil des Weges.

Fazit

Go macht mir sehr viel Spaß, und ich konnte das neue Wissen auch schon im beruflichen Kontext umsetzen. Der Blick über den Python-Tellerrand hat mir gut getan.