Man generiert weniger Bugs

Jan Jogen / Funktionale Programmierung


Gute Software-Developer bilden das Rückgrat von Valtech Mobility. Einer davon, der promovierte Mathematiker Jan Jongen, beschäftigt sich mit Schwarmintelligenz und funktionaler Programmierung – im Gespräch gibt er Einblicke in die etwas komplexeren Gebiete seiner Profession:

Was ist deine Rolle bei Valtech Mobility?

Ich bin als Product Owner für die Infotainment- sowie die Schwarmdienste zuständig. In dieser Rolle treffe ich alle Absprachen mit dem Kunden hinsichtlich des Scopes und der funktionalen Anforderungen. Zudem arbeite ich an der Architektur für die Dienste und helfe dem Team bei organisatorischen Tätigkeiten.

Wie definiert ihr den Begriff „Schwarmdienst“?

Wir reden hier von Diensten, die Informationen bereitstellen, die durch die Kommunikation der Fahrzeuge untereinander ermittelt werden. Das spielt besonders bei einem Next-Generation-Kartendienst, den wir für einen unserer Kunden entwickelt haben, eine wichtige Rolle. Für eine möglichst aktuelle und präzise Warnung vor gefährlichen oder staubelasteten Streckenabschnitten werden in erster Linie Daten, die fahrende Fahrzeuge auslesen, herangezogen.

Schwarmintelligenz ist noch ein exploratives Thema. Vor welchen besonderen Herausforderungen steht man da?

Einerseits hatten wir es mit riesigen Datenmengen zu tun – wir hatten mehr, aktuellere und präzisere Daten als der marktführende Kartenbereitsteller zur Verfügung. Hinzu kam, dass der Kunde den Dienst sehr schnell umgesetzt haben wollte. Für die Entwicklung waren lediglich drei Monate angesetzt.

Wie geht man mit so einer Herausforderung um?

Um einen so komplexen Dienst mit so vielen Funktionen innerhalb solch kurzer Zeit entwickeln zu können, sind wir als Team schnell zu dem Entschluss gekommen, dass dies nur mit einer funktionalen Programmiersprache möglich ist.

Warum?

Wir mussten uns nach Möglichkeiten umsehen, wie wir schon in der Entwicklung Fehlerquellen reduzieren können, insbesondere für nebenläufige Anwendungen – die nicht einfach zu entwickeln und auch schwerer zu testen sind. In der Funktionalen Programmierung werden Seiteneffekte vermieden, das führt zu weniger Abhängigkeiten im Code und somit zu weniger Fehlern. Typische Java-Probleme werden vermieden, man bekommt beispielsweise keine Null Pointer Exceptions – d.h. keinen Zugriff auf ungültige Null-Werte – und keine Fehler durch ungültige Programmzustände. Kurzum: Man generiert weniger Bugs.

Welche Programmiersprache wurde verwendet?

Produktiv wird bei uns aktuell die Programmiersprache Scala eingesetzt. Scala setzt wie Java auch auf die JVM (Java Virtual Machine) auf, bietet aber mehr Fähigkeiten aus der Funktionalen Programmierung. Wir benutzen für die nebenläufigen Funktionen das Programmierkonstrukt der „Futures“.

Was genau ist das für ein Konstrukt?

Futures stehen für Werte, die vielleicht aktuell noch nicht berechnet sind, aber irgendwann in der Zukunft zur Verfügung stehen. Die Berechnung erfolgt dabei nebenläufig mit Funktionen. Futures sind ein mächtiges Programmierkonzept, insbesondere in der Kombination mit Berechnungs-Pipelines um Parallelität auszunutzen. Sie ersetzen z.B. Architekturen mit Callbacks (wobei Prozeduren übergeben werden, die zu späteren Zeiten aufgerufen werden) und erlauben kompakten und deskriptiven Code. Deskriptiver Code beschreibt das zu lösende Problem, aber nicht die Umsetzung in jedem Detail. Dadurch wird der Source-Code sehr kompakt.

Was wäre denn ein typisches Problem aus der Praxis, das man damit löst?

Beispielsweise die Suchanfrage nach POIs (Points of Interest) und die Implementierung einer Request-Pipeline zur Beantwortung dieser Anfragen. Dabei gilt es die Suchanfrage, nehmen wir „Tankstelle in Düsseldorf“, auszuwerten und zu beantworten. Zuerst wird die Anfrage aufgeschlüsselt: Was wird gesucht und wo wird gesucht? Dann müssen wir, da es eine Vielzahl externer Anbieter für diverse Datenarten (z.B. für Tankstellen, Hotels, Parkhäuser) gibt, die relevanten Provider bestimmen. Alle für die Anfrage ausgewählten Daten-Provider werden befragt, also müssen in der Ergebnismenge Duplikate entfernt und die verbleibenden Ergebnisse priorisiert werden. Daraus wird eine Antwort generiert, die dann zurück in das Fahrzeug transportiert wird. Das ist eigentlich ein schönes Beispiel, denn diese Problemstellung bietet viele Möglichkeiten für nebenläufige Berechnungen, um die Beantwortung der Suchanfrage zu beschleunigen.

Wie viel mathematisches Verständnis ist notwendig, um funktional programmieren zu können?

Letztendlich kann jeder auch funktional programmieren. Wenn man die notwendige Neugier und Interesse an programmiertechnischen Abstraktionen hat, ist das kein Hexenwerk. Wir sehen darin großes Anwendungspotential, insbesondere bei den Schwarmdiensten – und würden uns über Verstärkung freuen. Der erste Schritt wäre einfach unsere Digital Talent Guides anzusprechen.

Weitere Themen