Suche
Interview mit Frank Müller

Go: Googles Sprache für skalierbare Systeme

Redaktion JAXenter

Frank Müller

Nebenläufig, statisch typisiert, leicht auf verschiedene Plattformen kompilierbar und mit reichhaltig Bibliotheken und Werkzeugen ausgestattet bietet sich Google Go für skalierende Anwendungen an. Über die Konzepte und Vorzüge der Programmiersprache spricht Frank Müller auf der DevOps Conference 2015 – und in unserem Interview.

JAXenter: Du stellst auf der DevOpsCon Google Go vor. Kannst du die Sprache zu Beginn kurz charakterisieren?

Frank Müller: Die drei ursprünglichen Entwickler Rob Pike, Ken Thompson und Robert Griesemer blicken auf eine lange Erfahrung mit Multics, Unix, B und Plan 9 zurück. Sie hatten mit Go eine Sprache im Sinn, welche die Sicherheit und Performanz statisch kompilierter Sprachen mit der Ausdrucksstärke und dem Komfort dynamisch typisierter Sprachen verbindet. Nutzer von C-Sprachen finden sich daher ebenso schnell zurecht wie beispielsweise Python-Enwickler.

Neben der sehr einfachen Sprache – die Spec umfasst nur ein handliches HTML-Dokument – erhält der Entwickler eine moderne und mächtige Nebenläufigkeit, eine umfassende Standardbibliothek sowie schnelle und praktische Tools. Die hiermit erstellten Binaries sind statisch gelinkt, lassen sich somit also schnell verteilen. Dank Cross-Compiling funktioniert dies auch in heterogenen Umgebungen.

Google Go gilt als systemnahe Sprache ja auch als Konkurrent zu C/C++. Was macht Go besser?

Frank Müller: Ich würde sie nicht direkt als Ersatz für C/C++ sehen. Diese haben zum Beispiel bei Betriebssystemkernen und Treibern noch Vorteile. Jedoch spielt Go seine Stärken bei technisch orientierten Anwendungen aus. Insbesondere die oben genannte Nebenläufigkeit ist etwas sehr natürliches in Go-Programmen, ein wichtiges Strukturmittel. Die miteinander kommunizierenden leichtgewichtigen Prozesse, Goroutinen genannt, werden auch bei einer Anzahl von mehreren Tausend durch die Runtime auf einem Threadpool je nach Bedarf auf die verfügbaren Kerne verteilt. Dies erleichtert die Skalierung sowohl auf individuellen als auch auf verteilten System. Bei letzteren hilft die Nebenläufigkeit, gleichzeitig Daten für den Versand über das Netz aufzubereiten und empfangene Daten zu verarbeiten. Auch unter Last lässt sich so ein robustes Antwortverhalten sicherstellen. Die Standardbibliotheken helfen hierbei ebenso wie die erweiterten Bibliotheken, die das Go-Team extra anbietet.

Daneben ist jedoch auch das Toolset sehr mächtig. Mit nur einem Programm werden die Programme kompiliert, externe Bibliotheken geladen, Tests durchgeführt, der Code einheitlich formatiert, typische Fehler analysiert, Fixes angewandt und eine Dokumentation für das Web generiert. Dies alles geschieht mit sehr großer Geschwindigkeit, was die Anwender der Sprache immer wieder fasziniert.

In deinem Vortrag auf der DevOps präsentierst du Go als Sprache für skalierbare Systeme. Welche Vorzüge hat Go in diesem Kontext der Skalierbarkeit?

Frank Müller: Neben den verfügbaren Bibliotheken zur Netzwerkprogrammierung, Codierung und Kryptographie kann ich nur immer wieder die bereits genannte Nebenläufigkeit betonen. Sie ist es, die ja auch bereits Erlang/OTP zu ihrem Einsatz in skalierenden Anwendungen verholfen hat. Der Entwickler erhält hiermit eine Elastizität, die das jeweilige System ideal ausnutzt. Die zunehmende Anzahl an Kernen in den Systemen ist ja bereits seit Jahren zu beobachten. Natürlich gibt es diesen Vorteil nicht umsonst, der Entwickler muss sich an die Goroutinen als Strukturierungsmittel gewöhnen. Sie können zwar Speicher untereinander teilen, dies wird in der Regel jedoch nur aus Effizienzgründen gemacht, indem sich verschiedene Goroutinen auf nicht überlagernde Bereiche beschränken. Vielmehr ist es jedoch üblich, dass Daten über Channels zwischen den Goroutinen versandt werden. Damit kommt die Arbeitsweise dem ursprünglichen Gedanken der Objektorientierung viel näher als so manche OO-Sprache: Kapselung und Nachrichten.

Eine weitere Stärke wird von Außenstehenden oft als Schwäche gesehen. Ich rede hier vom Verzicht auf Exceptions und der Nutzung von Rückgabewerten des Typs „error“. Gerade in nebenläufigen Programmen sind Exceptions nur schwer dem Verursacher zuzuordnen. Die Nutzung von Rückgabewerten führt hingegen zur unmittelbaren Behandlung, zur Ergänzung um Kontextinformationen oder dem Versand über Channels für eine kontrollierte Behandlung.

Wie ist der aktuelle Entwicklungsstand von Go? Sprache – Bibliotheken – Frameworks – Tooling?

Frank Müller: Der Sprachstandard ist sehr robust, die letzten Versionen haben nur mehr Detailänderungen enthalten. Wichtiger ist jedoch das kompilierte Ergebnis. Hier gab es bisher noch leichte Schwächen beim Garbage Collecting, was glücklicherweise mit der kommenden Version 1.5 stark verbessert wird. Dazu kommen weitere Prozessoren, die nativ unterstützt werden. Die Bibliotheken befinden sich auf einem für die Entwicklung von Server-Backends sehr guten Stand. Sie sind umfangreich, mächtig und komfortabel. Einzig der Bereich GUIs wird nicht unterstützt. Hier gibt es jedoch in der Community erste Bemühungen, so wie diese auch viele weitere Bibliotheken zur Verfügung stellt.

Von großen Frameworks wird hingegen in der Regel abgesehen. Hier spiegelt sich wie auch bei den Tools die Unix-Vergangenheit des Go-Teams wieder. Es herrscht die Philosophie der kleinen und speziellen zusammenarbeitenden Werkzeuge vor. So sind die als Packages bezeichneten Bibliotheken wie auch das „go“-Tool ausgelegt. Dementsprechend ist auch weniger der Trend zu einer mächtigen IDE zu finden. Vielmehr sind die Entwickler froh, auf bewährte Editoren und in ihnen integrierte Makropakete zurückgreifen zu können.

Einzige Schwäche ist der Debugger. Hier steht nur der „gdb“ zur Verfügung, der nicht gerade durch seinen Komfort bekannt ist. Ich muss jedoch zugeben, dass ich hier durch meine Smalltalk-Vergangenheit auch verwöhnt bin.

Kannst du vielleicht in einem Beispiel aus der Praxis beschreiben, wo sich Go bereits heute im Einsatz bewährt hat?

Frank Müller: Hier gibt es inzwischen so einige. Neben unserem Juju sind unter anderem Bestandteile von Google Kubernetes, Docker, Heroku, Dropbox, Iron.io, GitHub, CloudFlare und vielen mehr in Go entwickelt. Bereits bei diesen Namen wie auch bei einer detaillierteren Betrachtung der weiteren Projekte fällt auf, dass Clouds und Anwendungen in skalierbaren Umgebungen das wesentliche Einsatzgebiet der Sprache sind. Hier hat sie in gleichem Maße ihre Heimat gefunden, wie Java in Geschäftsanwendungen eingesetzt wird.

Jetzt stellst du Go ja auf einer DevOps-Konferenz vor. Was macht Go für DevOps-Teams interessant?

Frank Müller: Eines der Ziele der Go-Entwickler war die Nähe zu dynamisch typisierten Sprachen, was sich in der Syntax, den extrem kurzen Build- und Test-Zyklen und dem einfachen Deployment widerspiegelt. Gerade dieser Mix spricht sowohl traditionelle Entwickler wie auch die normal Skripts nutzende Betriebsseite an. Beide sprechen dann schon mal technisch die gleiche Sprache.

Dies ermöglicht nicht nur die produktive initiale Entwicklung systemnaher und skalierender Anwendungen. Viel wichtiger ist die ebenso schnelle Umsetzung von Änderungsanforderungen, die sich laufend aus dem Betrieb ergeben. Gemeinsam mit entsprechenden CI-Systemen wird hier die notwendige Qualität für einen sicheren Betrieb aufrecht gehalten, ohne die Realisierungszeit stark zu belasten.

Du bist auch beim Praxisworkshop dabei: „Software-Entwicklung, Provisionierung und DevOps in der Cloud“. Was ist die Hauptmessage, die du den Teilnehmern dort vermitteln möchtest?

Frank Müller: An dieser Stelle vertrete ich weniger die Vorzüge der Sprache Go als der des Produkts, welches wir bei Canonical mit Go entwickelt haben: Juju. Cloud-Anbieter wie zum Beispiel Amazon oder Microsoft stellen zwar wunderbar flexible Infrastrukturen bereit, die den kleinen Start wie auch das bedarfsgerechte Resizing ermöglichen. Jedoch ist es nicht immer leicht, die virtuellen Rechner mit Software zu bestücken und zu konfigurieren. Hier greift Juju die Idee des Paketmanagement auf, wie es bereits bei den verschiedenen Linux-Distributionen zu finden ist. Diese von uns als „Charms“ bezeichneten Pakete beinhalten nicht nur Anweisungen zur Installation von Services auf einem Knoten oder innerhalb eines Containers auf einem Knoten. Sie definieren auch konfigurierbare Betriebsparameter sowie Schnittstellen zu anderen Services, wir bezeichnen diese als Relationen, die sich damit schnell herstellen lassen. Gleichzeitig sind auch Hooks – hierbei handelt es sich um Programme beziehungsweise Skripte, die bei definierten Ereignissen automatisch gestartet werden – und Actions – ebenfalls Programme oder Skripte, jedoch zur Ausführung auf Befehl durch den Anwender – in den Charms enthalten. Eine Vielzahl von Charms wird über einen Store angeboten, Charms für eigene Anwendungen lassen sich dazu recht einfach entwickeln.

All dies kann der Nutzer komfortabel über die Kommandozeile wie auch über eine Web GUI, die selbst als Service installiert wird, bedienen. Ein Start mit einer lokalen Umgebung für Tests und spätere Wahl unterschiedlicher Cloud-Anbieter ist kein Problem. Damit möchten wir dem Nutzer einige seiner Sorgen vor dem Einstieg in die Welt der Clouds – public wie private – nehmen.

Frank Müller arbeitet als Software Engineer im Juju Core Team bei Canonical, dem Unternehmen hinter der Linux-Distribution Ubuntu. Seit bald 25 Jahren in der professionellen IT führte ihn sein Berufsweg von der Administration hochverfügbarer Umgebungen über die Leitung internationaler Entwicklungsteams bis zur Entwicklung skalierbarer Architekturen. Seit 1999 ist Frank zudem als Fachautor für diverse IT-Magazine sowie des Buchs „Systemprogrammierung mit Google Go“ bekannt und gibt Vorträge zu unterschiedlichen Themen rund um die Softwareentwicklung.

Verwandte Themen:

Geschrieben von
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.