Gregor Trefs über funktionale Programmierung, Konferenzen und Fachartikel – Anwendungsentwickler-Podcast #106
IT-Berufe-Podcast - En podkast av Stefan Macke - Mandager
Kategorier:
Funktionale Programmierung, Konferenzvorträge und Fachartikel im Gespräch mit Gregor Trefs sind das Thema der einhundertsechsten Episode des Anwendungsentwickler-Podcasts. 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-Track gesehen Ich fand das toll. Stellenweise besser als die "Etablierten" Da war mir klar: Das willst du machen. Was ist der Newcomer-Track und wie wurdest du betreut? Die JavaLand möchte den Nachwuchs förden In diesem Rahmen gibt es den Newcomer-Track Leute, die zuvor nicht auf einer Konferenz gesprochen haben Man meldet sich mit Thema und Mentor an Der Track geht über beide Konferenztage hinweg Ich habe mich mit meinem Thema beworben und mit Johannes Link als Mentor Falls man keinen Mentor angibt, bekommt man einen zugeteilt Johannes kenne ich schon seit ca. 2-3 Jahren Er hat in Heidelberg ein Code Dojo für Kinder veranstaltet und ich war mit dabei als Mentor An das Mentoring bin ich über Walery Strauch gekommen, einer unserer Mitorganisatoren Um ehrlich zu sein, wusste ich beim Kennenlernen nicht, dass er recht bekannt ist und ein Fachbuch über TDD geschrieben hat Hier auch mal Grüße an euch Johannes und Walery :-) Wie hast du das Thema deines Vortrags gefunden? Ich hatte etwas mit FP in Java eingereicht Artem Kozlov und ich hatten bereits bei der majug einen ähnlichen Vortrag gehalten Nach dem ersten Treffen mit Johannes war klar, dass das viel zu weit gegriffen ist Wir haben uns dann zusammen auf das Thema Combinator Pattern in Java 8 festgelegt Wie hast du dich auf deinen Vortrag vorbereitet? Johannes und ich haben uns ein paar mal getroffen. Oft im Cafe, aber auch bei mir zu Hause. Thema schärfen Abstract: Leute ansprechen und die Erwartungen genau beschreibt Welches Publikum will ich ansprechen? Was für Voraussetzungen erwarte ich vom Publikum? Danach ging es dann los. Folien erstellt und mit Johannes ausgetauscht Weiterhin hatte ich einen Probevortrag und Kommentare eingearbeitet Ich möchte Mark Paluch nochmals für den Tipp mit dem Comparator-Typ danken Dieser nutzt Combinator Am Ende war der Foliensatz da und ich war glücklich :-) Inzwischen finde ich Google Docs da ganz angenehm Was hast du selbst durch den Vortrag gelernt? Nicht so viel Aufregug :-) Alles halb so schlimm Haltung, Haltung, Haltung In einem Foto sitze ich mit dem Schultern nach vorne und mache einen recht beklemmten Eindruck
