Funktionale Programmierung, Konferenzvorträge und Fachartikel im Gespräch mit Gregor Trefs sind das Thema der einhundertsechsten Episode des Anwendungsentwickler-Podcasts.
TL;DR
Mit Gregor Trefs bespreche ich, wie du als IT-Azubi funktionale Programmierung lernen und in Java einsetzen kannst. Reine Funktionen machen das Verhalten deines Codes nachvollziehbar, während unveränderliche Werte und kombinierbare Funktionen helfen, Verantwortlichkeiten aufzuteilen. Am Combinator-Pattern und an FizzBuzz wird deutlich, wie sich diese Konzepte praktisch ausprobieren lassen. Ein eigenes Blog und der Austausch in einer User Group helfen dir, dein Wissen zu vertiefen und erste Fachartikel oder Vorträge vorzubereiten.
Kapitelmarken
[00:00:01] Thema und Einführung
[00:01:36] Gregor Trefs und sein Weg zur Softwareentwicklung
[00:05:35] Erfahrungen mit Java, Scala, Kotlin und Haskell
[00:10:42] Kotlin, Typsysteme und IDE-Werkzeuge
[00:14:17] Neue Konzepte in vertrauter Java-Syntax lernen
[00:15:40] Einstieg mit Onlinekursen, Büchern und einer Lerngruppe
[00:20:14] Reine Funktionen und das Substitutionsmodell
[00:23:52] Memoization und Effekte getrennt ausführen
[00:26:39] Funktionen höherer Ordnung und Composability
[00:31:08] Unveränderliche Werte und persistente Datenstrukturen
[00:36:03] Funktionale Werkzeuge mit Vavr
[00:39:57] Funktionale Konzepte im Entwicklungsteam
[00:43:23] Monaden und Berechnungen in einem Kontext
[00:45:46] Gesetze, Lambda-Kalkül und Ein- und Ausgabe
[00:50:32] Praktisch anfangen und Fachbegriffe verstehen
[00:53:31] Das Combinator-Pattern am Beispiel von Prüfregeln
[00:58:41] JavaLand-Newcomer-Track und den Vortrag vorbereiten
[01:04:00] Java User Group Mannheim und erste eigene Vorträge
[01:08:14] Functional FizzBuzz und die Regeln der Aufgabe
[01:10:09] Funktionaler Kern und Pattern Matching
[01:12:56] FizzBuzz mit Strömen und Funktionen lösen
[01:16:52] Wiederkehrende Muster und FizzBuzz in Interviews
[01:20:03] FizzBuzz in der IT-Ausbildung
[01:20:44] Feedback und Umgang mit harter Kritik
[01:24:09] Vom Blog zum Fachartikel und durch Schreiben lernen
[01:28:19] Als Einsteiger:in Wissen veröffentlichen
[01:29:59] Bücher zu funktionaler Programmierung und Softwaredesign
[01:36:54] Kontakt zu Gregor und Konzepte im Team ausprobieren
[01:39:30] Eigene Beiträge veröffentlichen und Feedback geben
Inhalt
Folgende Fragen gehen wir im Verlaufe des Interviews durch.
Allgemeines zur Person
Wie ist dein Name und wo arbeitest du?
Gregor Trefs, 31 Jahre alt
Momentan bin ich freiberuflich unterwegs
Themen: Java und Security
Wie bist du zur Informatik bzw. Softwareentwicklung gekommen?
Computer fand ich interessant
Erster Rechner: 486
Erstes Programm mit 12 Jahren geschrieben: Text-Adventure in Basic
Viel Macromedia Flash: ActionScript 2 (ECMA Script Derivat)
Mit 16 auf ein technisches Gymnasium gegangen
Software und Hardware
Design
Hauptsächlich Java
Welche Ausbildung bzw. Studium im Bereich der Informatik hast du absolviert?
Studium Wirtschaftsinformatik
Viel Abwechslung
Nie das Interesse verloren
Tutorentätigkeit in Softwaretechnik
Masterarbeit im Bereich künstliche Intelligenz
Semantic Web Technolgies
Hadoop
Mit welcher Programmiersprache arbeitest du im Alltag?
Hauptsächlich Java
Nebenbei Kotlin und Scala
Lieblingsprogrammiersprache
Klar man arbeitet mit manchen Sprachen lieber als mit anderen.
Jedoch ist das nicht einfach
Immer eine Frage wie vertraut man mit der Sprache ist
Faszinierend finde ich Scala
Sehr viel dabei
Stichwort: Typelevel Programming
Jedoch: Steile Lernkurve und manchmal eine Sytax zum Wegrennen
Auch sehr wissenschaftlich orientiert
Forschungssprache etc.
Compiler finde ich toll
Tolle Inferenz
Hier möchte ich noch mehr lernen
Praktikabel finde ich Kotlin
Kompatibel mit Java und der Compiler hilft mehr
Typinferenz val/var etc.
Nulltypes ist interessant
Kein Fan der Lamdba-Syntax, da geschweifte Klammer für mich zu überladen wirkt
Geht schnell voran
Coroutines sehen toll aus
Bessere Abstraktion für parallele Programmierung im Vergleich mit Java
JavaScript
Ich möchte mal wirklich was Nettes mit machen
Leider nie wirklich die Zeit gefunden
Ich finde Flow Types toll und auch normale Linter
JSON in Javascript fühlt sich einfach besser an
Haskell
Verdreht einem den Kopf ;-)
Gut zum Lernen von FP
Verständnis für Equational Reasoning steigt
Angst vor Monaden wird genommen, da Monaden einen klaren Zweck erfüllen
Bspw. pure functional IO -> IO Monade
Nie produktiv eingesetzt
Java
Kenne ich am besten
Entdecke doch immer was Neues (z.B. java.nio)
Lambda-Syntax sehr angenehm
Leider etwas komplexes Typsystem
Referenz- vs. primitive Typen
Type Erasure
Sehr große Community
Funktionale Programmierung
Wie würdest du die funktionale Programmierung (FP) einem Einsteiger erklären?
FP ist ein Programmierparadigma
Eine bestimmte Ansicht wie ein Computerprogramm gestaltet wird
Grundlegendes Element: Funktion
Es basiert auf dem Lambda-Kalkül von Alonzo Church
Formale Sprache zur Untersuchung von Funktionen
Formal: Grammatik und Alphabet unwidersprüchlich durch Mathematik ausgedrückt
Beschreibt Umwandlungsregeln wie Funktionen bspw. auf Argumente angewendet werden
Verzicht auf die Änderung eines globalen Zustands
Unterschied zu imperativ: Zustandsänderung durch Imperative
Erleichtert semantische Analyse
Bedeutung? Ersetze Funktionen rekursiv durch ihren Rückgabewert
Form der Auswertung: Subsitutionsmodell
Problem: I/O
Im Lambda-Calculus geht es um die Anwendung von Umformungsregeln auf Lambda-Ausdrücken bis keine Regel mehr anwendbar ist
Wenn wir aber nur Umformungsregeln haben, wie modellieren wir dann Input und Output und bleiben dem Lambda-Kalkül treu?
Anders gefragt, wie bleibt eine funktionale Sprache mit I/O pur?
Verschiedene Lösungen
Prozeduren kümmern sich um Input und Output und "füttern" einen funktionelen Kern
Beschreibung des Effektes mit puren Funktionen welche dann mit einem Interpreter ausgeführt werden (Stichwort: Monaden)
Seiteneffekte am Rand der Applikation und wohldefiniert
Ohne Angst an die Materie herangehen und Verständnisfehler akzeptieren
Welche wichtigen Konzepte zeichnen die FP aus?
Einfaches Nachvollziehen von Verhalten (Substitutionsmodell)
Trennung von Beschreibung und eigentlicher Ausführung
Kein geteilter globaler Zustand
Komposition von Funktionen
Funktionen höherer Ordnung
Klare Trennung von Verantwortlichkeiten
Implizite Informationen können explizit modelliert werden
FP ist ja eigentlich schon uralt! Warum sollte man sich heute (wieder) damit beschäftigen?
Neues Paradigma: Neue Lösungen für alte Probleme
Mehrkern-Prozessoren: Funktionen auf je einem Kern ausführen
Vgl. John Carmack: "My pragmatic summary: A large fraction of the flaws in software development are due to programmers not fully understanding all the possible states their code may execute in. In a multithreaded environment, the lack of understanding and the resulting problems are greatly amplified, almost to the point of panic if you are paying attention. Programming in a functional style makes the state presented to your code explicit, which makes it much easier to reason about, and, in a completely pure system, makes thread race conditions impossible."
Spaß
Welche Vorteile hat FP gegenüber der Objektorientierung (OO)?
Meine Meinung
Keine Seiteneffekte, dadurch einfacheres Nachvollziehen
Funktionen sind per se kompositionierbar
Keine Seiteneffekte, dadurch bessere Testbarkeit
Input -> Output
Funktionen in einem Kontext ausführen
Beispiel: Transaktionen
Imperativ: begin -> code -> end
Funktional: Transaction(f) map(g) flatMap(Transaction(h)) run
Man arbeitet mit Werten
Einmal erstellt ändern sich diese nicht
Gegenargumente
Mit OOP lassen sich Klassen modellieren, die einer Funktion ähneln
Specification Pattern: Create Specification and run against Candidate
Veränderbare Strukturen dominant in Java
Immutables keine Alternative: Speicher
Lösung: Purely functional data structures (siehe vavr)
Immutable: Keine Änderung -> neue Instanz, jedoch Structural Sharing
Persistent: Alte Struktur bleibt erhalten
Wie schwer fiel/fällt dir der Wechsel zwischen FP und OOP?
Ökonomische Sicht: Solange FP bis Kosten größer als anderes Paradigma
Sprache?
FP Wissen?
Am Anfang eine riesen Lernkurve
Viele Konzepte, die erst verstanden werden müssen und eingeordnet
Historische Recherche hat mir auch ein bisschen dabei geholfen
Ich kann nicht alles in FP
Das FP gibt es auch nicht
Bspw. sind LISP und Clojure untypisiert
OCAML und Haskell stark typisiert
Ähnlicher Kampf wie bspw. JavaScript vs. Java
Aber auch Scala vs. Java
Ziel: Produktiv arbeiten. Code der unseren Ansprüchen genügt.
Ich benutze FP da, wo es Sinn macht und soweit mein Verständnis mich trägt
Nutzt du im Alltag nur Konzepte der FP in OO-Sprachen oder rein funktionale Sprachen?
Primäre Sprache: Java
Java ist keine funktionale Sprache
Die Bedeutung eines Java-Programs ist definiert durch das Memory Model
Das Memory Model regelt, wie Threads durch Speicher miteinander kommunizieren
D.h. per se gibt es shared mutable state
Jedoch funktionale Konzepte
Unveränderliche Werte
Funktionen benutzen
Monaden
Combinatoren
Ich nutze Kotlin und Java
Magst du persönlich lieber FP, OO oder eine Kombination aus beiden und warum?
Mir gefällt die Idee von FP besser
OOP hatte ein paar Versprechen die nicht ganz eingehalten wurden
siehe lambdafy
Code Reuse: Compose functions
Wie können auch unerfahrene Entwickler mit FP beginnen?
Code-Katas: Probleme mit Funktionen lösen
Online Kurse: Coursera, EDX, etc.
Bücher: Learn you a Haskell for a greater good (Miran Lipovaca) Functional Programming in Scala (Paul Chiusano, Rúnar Bjarnason)
Vorträge auf Konferenzen
Worum ging es in deinem Vortrag auf der JavaLand?
Es ging um das Combinator Pattern in Java 8
Wie kam es zu deinem Vortag auf der Javaland?
Ich war letztes Jahr auf der Javaland und habe Leute auf dem Newcomer-T