Einleitung

Clojure-Begeisterte aus aller Welt kamen vor kurzem wieder zur größten europäischen Konferenz zu diesem Thema zusammen. Auch die bevuta war wie bisher jedes Jahr mit drei Entwicklern dabei. Gastgeber war zum zweiten Mal Berlin. Der große Kinosaal in der Kulturbrauerei im schönen und pulsierenden Prenzlauer Berg bot zwei Tage lang die Bühne für Vorträge rund um die Programmiersprache. Dies ist unser Bericht für alle, die keine Gelegenheit hatten, dabei zu sein.

Zwei Themen tauchten dieses mal immer wieder in Vorträgen und Gesprächen auf: Data Science und AI/Machine Learning. Die Vorträge zu diesen Themen haben wir deshalb zusammengefasst und den anderen vorangestellt.

Data Science

Obwohl es einige Programmiersprachen gibt, die größere Datenmengen effizienter verarbeiten können als Clojure, erfreut sich Clojure wegen seiner Datenfreundlichkeit großer Beliebtheit bei Menschen, die in diesem Bereich arbeiten.

Elise Huard zeigte in ihrem Vortrag The Return of Clojure Data Science nützliche Tools zum Verarbeiten und Auswerten für Clojure-Entwickler. Sie gab dabei einen Überblick über verschiedene Notebooks und deren Visualisierungsfähigkeiten sowie Bibliotheken, die das Verarbeiten von Daten erleichtern.

Ebenso verknüpft mit diesem Thema war Nils Blum-Oestes Intro to Probabilistic Programming and Clojure's Anglican, das demonstrierte, wie mit probabilistischen Methoden Daten ausgewertet können. Er stellte die Grundlagen der eingebetteten DSL Anglican vor und wie man deren Hilfe bayessche Statistikauswertungen vornehmen kann.

AI/Machine Learning

Künstliche Intelligenz und maschinelles Lernen waren das zweite große Thema, das immer wiederkehrte.

Fergal Byrne erläuterte in seinem mit Louise Klodt erstellten Vortrag The Feynman Machine: AI architecture in Clojure/Neanderthal die Architektur seines auf neurowissenschaftlichen Erkenntnissen basierten, selbstlernenden Systems OgmaNeo. Dieses ist fähig, zu lernen, wie es selbstständig ein Modellauto steuern kann und benötigt dazu nur ein Raspberry Pi 3.

Mit Clojure Tools for Symbolic Artificial Intelligence stellte Saul Johnson vor, wie er ein System von symbolistischen Regeln in Clojure implementierte, anhand dessen eine KI aus bekannten Regeln weitere Schlüsse ableiten kann. Paper und Präsentation kann man online nachlesen.

Simon Belak, der schon auf der letzten EuroClojure gesprochen hatte, trainierte sein selbstlernendes neuronales Netz, eine Prinzessin zu retten.

Weitere interessante Vorträge auf der EuroClojure 2017

otplike – Erlang/OTP processes and behaviours for Clojure von Alexey Aristov

Bei dem otplike-Projekt geht es darum, einige Funktionalitäten von Erlang/OTP nach Clojure zu portieren. Damit können Ketten von einander abhängiger asynchroner Prozesse erzeugt werden, die überwachen können, ob ihre Nachbarprozesse noch laufen, und diese nötigenfalls auch wieder starten können. Diese Bibliothek basiert auf core.async und abstrahiert einige Muster, die man häufig ohnehin manuell implementiert.

Moving People with Clojure von Abhinav Sarkar und Kartik Gupta

Abhinav und Kartik trugen einen Erfahrungsbericht darüber vor, wie sie das Backend einer Motorrad-Lieferservice-App mit 300.000 Nutzern, das ursprünglich in Go geschrieben war, auf Clojure umgebaut haben. Sie zeigten, wie sie Livedaten zum testen nutzten, wie sie im laufenden Betrieb nach und nach auf das Clojure-Backend umzogen und erzählten von den daraus resultierenden Vorteilen wie einfacherer Entwicklung und sehr viel schnellerer Veröffentlichung neuer Features.

Building a collaborative web app with ClojureScript von Gijs Stuurman

Basierend auf der Idee von Google Docs, wo ein und dasselbe Dokument gleichzeitig von mehreren Nutzern bearbeitet werden kann, erstellte Gijs mit ClojureScript eine kollaborative REPL, die CREPL. Mit der CREPL kann man Clojure-Code simultan im Browser bearbeiten und auch ausführen. In manchen Unterrichtssituationen oder sogar wenn man remote Pair-Programming betreiben möchte, kann dieses Werkzeug sehr nützlich sein.

Besonders interessant waren seine Erläuterungen der Operational Transformations, die ein Verfahren darstellen, mit dem sich Bearbeitungen verschiedener Nutzer synchronisieren lassen. Das eigentliche Dokument besteht dabei für jeden Nutzer aus einem Log, das sämtliche vorgenommenen Änderungen akkumuliert. Die Logs jedes Nutzers können dabei auseinanderlaufen. Hier kommt der eigentliche Algorithmus der Operational Transforms zum Zuge, welcher divergierende Änderungsverläufe um weitere Operationen ergänzen kann, sodass letztlich alle zu einem gemeinsamen Endzustand konvergieren.

Dependency Heaven von Alex Miller

Alex Miller von Cognitect, der diese EuroClojure auch als Moderator und Mikrofonassistent glänzte, hat in seinem Vortrag die neue Bibliothek tools.deps sowie einen darauf aufbauenden neuen Clojure-Installer angekündigt. Dabei tritt tools.deps an, das Problem von Bibliotheks-Abhängigkeiten neu zu denken, was im Kontext der JVM im Wesentlichen die Konstruktion eines Classpaths bedeutet. Der Unterschied zu bisherigen Lösungen wie Leiningen oder Boot besteht darin, dass tools.deps einerseits - ganz im Sinne der Simplizitäts-Philosophie - nur dieses eine Problem löst. Andererseits soll es nicht nur auf Maven-Abhängigkeiten beschränkt sein, sondern bspw. auch ermöglichen, einfache Verzeichnisse mit Clojure-Dateien einzubinden. Da mit Clojure 1.9 erstmals eine Clojure-Version mit einer externen Abhängigkeit (nämlich clojure.spec) erscheinen wird, wird besagter neuer Installer tools.deps verwenden, um diese abzubilden. Zudem wird er einen neuen Clojure-Launcher - ein Script namens clj - installieren. Dieser verarbeitet deps.edn-Dateien, welche Abhängigkeiten im Format von tools.deps beschreiben, um einen Classpath zu konstruieren - vergleichbar etwa damit, wie lein die project.clj und profiles.clj behandelt. Sowohl tools.deps als auch der Installer befinden sich allerdings noch in Entwicklung und es wird noch etwas dauern, bis sie produktionsreif sind.

spec loves data structures von Michał Marczyk

Michał setzte hier seine Vortragsreihe über Datenstrukturen mit einer Rekapitulation seiner bisherigen Arbeit fort. Dabei legte er den Fokus vor allem darauf, wie in den letzten Jahren generative Tests halfen, unentdeckte Bugs sowohl in seiner eigenen Implementierung der Datenstrukturen als auch in der der Core-Library von Clojure aufzudecken. Inzwischen ist er glühender Verfechter der Möglichkeiten von clojure.spec, generative Tests zu erzeugen und demonstrierte, wie er mit großem Nutzen davon in sowohl Black-Box-Tests zur Überprüfung der Einhaltung der API-Erfordernisse seiner Datenstrukturen als auch in White-Box-Tests zur Gewährleistung von Performance-Garantien und interner Invarianten Gebrauch machte. Wenn man sich für das detaillierte Innenleben von Datenstrukturen interessiert, dann ist dieser Vortrag wieder einmal sehr empfehlenswert.

Simple AND Secure von Joy Clark

Joy gab Empfehlungen, wie man eine simple aber zugleich sichere Web-App implementiert. Sie verwies dabei auf mögliche Fallstricke und aktuelle Angriffsszenarien. Eine von ihr erstellte Modell-Web-App, die noch stetig weiterentwickelt wird, kann man hier finden.

Tear down this wall - rethink distributed systems von Christian Betz

Der Vortragende schlug vor, Grenzen, wie die zwischen Frontend und Backend, bei der Entwicklung aufzulösen und Systeme mehr als Ganzes von miteinander verbundenen Modulen zu betrachten.

Um dies zu illustrieren zeigte er, wie in seiner Firma auch große Projekte von einem einzigen Git-Repository beherbergt, aber dann in einzelne Projekte aufgespalten werden. In mehreren Projekten verwendeter Code wird in Bibliotheken ausgelagert, auf die sich dann die verschiedenen Projekte beziehen. Um mehrere Projekte gleichzeitig laufen zu lassen wird lein monolith verwendet.

Using Clojurescript to launch iOS/Android apps to 1M users von Emin Hasanov

Emins Vortrag drehte sich um die Frage, ob React Native reif genug ist, dass eine Firma, die nicht über denselben Umfang an Ressourcen wie Facebook verfügt, damit erfolgreich eine plattformübergreifende Mobile-App entwickeln kann. Um die Sache noch interessanter zu machen, fügte er auch noch ClojureScript dem Technologiemix hinzu. Dies war für uns von besonderem Interesse, da wir uns vor Kurzem in einer ähnlichen Situation befanden. Wir hatten uns dabei dafür entschieden, das Ganze mit purem React Native zu lösen, um nicht in noch obskurere Bugs zu laufen. Emin fuhr fort, eine sehr beeindruckende und detaillierte Präsentation der App, die seine Firma gebaut hatte, zu geben und es schien so, dass sie für ihre mutige Entscheidung belohnt worden waren.

Unravel your REPL von Paulus Esterhazy

Die REPL ist das Herzstück in der Clojure-Werkzeugkiste (wie eigentlich eines jeden LISPs). Sie hat entscheidenden Einfluss darauf, wie wir mit unserem Code interagieren und darum, so argumentierte Paulus, sollten wir mehr Aufmerksamkeit darauf verwenden, diese weiterzuentwickeln. Aus diesem Grunde begann er das Unravel-Projekt, ein funktionsreicher und benutzerfreundlicher in ClojureScript geschriebener Kommandozeilen-REPL-Client. Es nutzt das Unrepl-Protokoll zur Kommunikation mit dem Host-Prozess, welcher nette Features wie automatische und fortsetzbare Auslassung von tief verschachtelten oder sehr langen Listen ermöglicht. Ebenso stellt es in ähnlicher Weise, wie es CIDER für Emacs tut, kontextabhängige Dokumentationen zur Verfügung. Wenn auf der Kommandozeile repln euer Ding ist, dann schaut euch das an!

Microservices with Vase and Linkerd von Peter Brachwitz

Ein oft übersehener und unterschätzter Aspekt einer Microservice-Architektur ist ihre operative Komplexität. Während Vase für sich beansprucht, ein datengetriebener, deklarativer produktionsreifer Unterbau für Mircroservices zu sein, zeigte Peter, dass dies nur bedingt wahr ist: Um Vase-Microservices produktiv einsetzen zu können, benötigt man in Wirklichkeit weit mehr als das, was Vase bietet, so z.B. Service-Discovery, zuverlässige Fehlererkennung / -behebung und Monitoring. Im Folgenden zeigte er aber, dass die Lage nicht hoffnungslos ist. Getreu dem Motto, dass es kein Softwareentwicklungs-Problem gibt, das man nicht durch eine weitere Schicht Indirektion lösen kann, stellte er dem Publikum linkerd vor. Dieser Service sitzt als transparenter Proxy vor euren Microservices und behandelt viele der vorher beschriebenen Belange. Obwohl das auf den ersten Blick toll klingt, versäumte Peter dankenswerterweise nicht, darauf hinzuweisen, dass auch diese Lösung ihre Tücken birgt, die man mit der Fortsetzung des vorgenannten Mottos zusammenfassen könnte: “außer dem Problem von zu vielen Schichten Indirektion.” Mit anderen Worten: Nun hat man einen weiteren Service im System, der auf verschiedene Arten kaputtgehen kann und gepflegt werden will. Ein sehr umsichtiger und gut durchdachter Vortrag!

Generative Programming and Verification von Nada Amin

Dieser Vortrag war wahrscheinlich der anspruchsvollste von allen. Es ging darum, wie man die Performance von Programmen durch das generative Umschreiben von Code mit Mechanismen wie Loop-Unrolling verbessern kann und gleichzeitig den Orginalcode leicht les- und wartbar erhalten kann. Der handgeschriebene Code wird dabei zuerst interpretiert und dann in ein weiteres Codedokument transformiert, wo dann Konstrukte wie Loops in einzelne Codezeilen aufgelöst werden. Dann wird dieser viel längere Code zu sehr viel performanterem Maschinencode kompiliert.

Nada benutzte Beispiele, die in Scala geschrieben wurden, wo durch Typendefinitionen bestimmt werden kann, welche Teile des Codes schon im Voraus interpretiert werden sollen und welche erst später.

Sie zeigte ebenso, wie die Verifikation einfließender Daten darin eingeflochten werden kann.

Obwohl sie Scala benutzte, hoffte sie, einige Konzepte zu verbreiten, die dann ebenso in Clojure verwendbar sind.

EuroClojure 2017 - Ein Fazit

Wieder einmal hatten wir eine tolle Zeit:

Spannende Vorträge zu Themen, die einem im Alltag immer wieder auch selbst begegnen und die andere Lösungen als die eigenen aufzeigten ebenso, wie Vorträge zu Aspekten von Clojure, die einem ansonsten nicht täglich über den Weg laufen.

Das ganze fand in einem hippen, anregenden Umfeld statt, das abseits der Konferenz inspirierenden Input bot.

Und nicht zuletzt war es schön, viele nette Mitclojurianer zu treffen.