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 altMomentan bin ich freiberuflich unterwegsThemen: Java und SecurityWie bist du zur Informatik bzw. Softwareentwicklung gekommen?Computer fand ich interessantErster Rechner: 486Erstes Programm mit 12 Jahren geschrieben: Text-Adventure in BasicViel Macromedia Flash: ActionScript 2 (ECMA Script Derivat)Mit 16 auf ein technisches Gymnasium gegangenSoftware und HardwareDesignHauptsächlich JavaWelche Ausbildung bzw. Studium im Bereich der Informatik hast du absolviert?Studium WirtschaftsinformatikViel AbwechslungNie das Interesse verlorenTutorentätigkeit in SoftwaretechnikMasterarbeit im Bereich künstliche IntelligenzSemantic Web TechnolgiesHadoopMit welcher Programmiersprache arbeitest du im Alltag?Hauptsächlich JavaNebenbei Kotlin und ScalaLieblingsprogrammierspracheKlar man arbeitet mit manchen Sprachen lieber als mit anderen.Jedoch ist das nicht einfachImmer eine Frage wie vertraut man mit der Sprache istFaszinierend finde ich ScalaSehr viel dabeiStichwort: Typelevel ProgrammingJedoch: Steile Lernkurve und manchmal eine Sytax zum WegrennenAuch sehr wissenschaftlich orientiertForschungssprache etc.Compiler finde ich tollTolle InferenzHier möchte ich noch mehr lernenPraktikabel finde ich KotlinKompatibel mit Java und der Compiler hilft mehrTypinferenz val/var etc.Nulltypes ist interessantKein Fan der Lamdba-Syntax, da geschweifte Klammer für mich zu überladen wirktGeht schnell voranCoroutines sehen toll ausBessere Abstraktion für parallele Programmierung im Vergleich mit JavaJavaScriptIch möchte mal wirklich was Nettes mit machenLeider nie wirklich die Zeit gefundenIch finde Flow Types toll und auch normale LinterJSON in Javascript fühlt sich einfach besser anHaskellVerdreht einem den Kopf 😉Gut zum Lernen von FPVerständnis für Equational Reasoning steigtAngst vor Monaden wird genommen, da Monaden einen klaren Zweck erfüllenBspw. pure functional IO -> IO MonadeNie produktiv eingesetztJavaKenne ich am bestenEntdecke doch immer was Neues (z.B. java.nio)Lambda-Syntax sehr angenehmLeider etwas komplexes TypsystemReferenz- vs. primitive TypenType ErasureSehr große CommunityFunktionale Programmierung
Wie würdest du die funktionale Programmierung (FP) einem Einsteiger erklären?FP ist ein ProgrammierparadigmaEine bestimmte Ansicht wie ein Computerprogramm gestaltet wirdGrundlegendes Element: FunktionEs basiert auf dem Lambda-Kalkül von Alonzo ChurchFormale Sprache zur Untersuchung von FunktionenFormal: Grammatik und Alphabet unwidersprüchlich durch Mathematik ausgedrücktBeschreibt Umwandlungsregeln wie Funktionen bspw. auf Argumente angewendet werdenVerzicht auf die Änderung eines globalen ZustandsUnterschied zu imperativ: Zustandsänderung durch ImperativeErleichtert semantische AnalyseBedeutung? Ersetze Funktionen rekursiv durch ihren RückgabewertForm der Auswertung: SubsitutionsmodellProblem: I/OIm Lambda-Calculus geht es um die Anwendung von Umformungsregeln auf Lambda-Ausdrücken bis keine Regel mehr anwendbar istWenn 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ösungenProzeduren kümmern sich um Input und Output und „füttern“ einen funktionelen KernBeschreibung des Effektes mit puren Funktionen welche dann mit einem Interpreter ausgeführt werden (Stichwort: Monaden)Seiteneffekte am Rand der Applikation und wohldefiniertOhne Angst an die Materie herangehen und Verständnisfehler akzeptierenWelche wichtigen Konzepte zeichnen die FP aus?Einfaches Nachvollziehen von Verhalten (Substitutionsmodell)Trennung von Beschreibung und eigentlicher AusführungKein geteilter globaler ZustandKomposition von FunktionenFunktionen höherer OrdnungKlare Trennung von VerantwortlichkeitenImplizite Informationen können explizit modelliert werdenFP ist ja eigentlich schon uralt! Warum sollte man sich heute (wieder) damit beschäftigen?Neues Paradigma: Neue Lösungen für alte ProblemeMehrkern-Prozessoren: Funktionen auf je einem Kern ausführenVgl. 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 MeinungKeine Seiteneffekte, dadurch einfacheres NachvollziehenFunktionen sind per se kompositionierbar Keine Seiteneffekte, dadurch bessere TestbarkeitInput -> OutputFunktionen in einem Kontext ausführenBeispiel: TransaktionenImperativ: begin -> code -> endFunktional: Transaction(f) map(g) flatMap(Transaction(h)) runMan arbeitet mit WertenEinmal erstellt ändern sich diese nichtGegenargumenteMit OOP lassen sich Klassen modellieren, die einer Funktion ähnelnSpecification Pattern: Create Specification and run against CandidateVeränderbare Strukturen dominant in JavaImmutables keine Alternative: SpeicherLösung: Purely functional data structures (siehe vavr)Immutable: Keine Änderung -> neue Instanz, jedoch Structural SharingPersistent: Alte Struktur bleibt erhaltenWie schwer fiel/fällt dir der Wechsel zwischen FP und OOP?Ökonomische Sicht: Solange FP bis Kosten größer als anderes ParadigmaSprache?FP Wissen?Am Anfang eine riesen LernkurveViele Konzepte, die erst verstanden werden müssen und eingeordnetHistorische Recherche hat mir auch ein bisschen dabei geholfenIch kann nicht alles in FPDas FP gibt es auch nichtBspw. sind LISP und Clojure untypisiertOCAML und Haskell stark typisiertÄhnlicher Kampf wie bspw. JavaScript vs. JavaAber auch Scala vs. JavaZiel: Produktiv arbeiten. Code der unseren Ansprüchen genügt.Ich benutze FP da, wo es Sinn macht und soweit mein Verständnis mich trägtNutzt du im Alltag nur Konzepte der FP in OO-Sprachen oder rein funktionale Sprachen?Primäre Sprache: JavaJava ist keine funktionale SpracheDie Bedeutung eines Java-Programs ist definiert durch das Memory ModelDas Memory Model regelt, wie Threads durch Speicher miteinander kommunizierenD.h. per se gibt es shared mutable stateJedoch funktionale KonzepteUnveränderliche WerteFunktionen benutzenMonadenCombinatorenIch nutze Kotlin und JavaMagst du persönlich lieber FP, OO oder eine Kombination aus beiden und warum?Mir gefällt die Idee von FP besserOOP hatte ein paar Versprechen die nicht ganz eingehalten wurdensiehe lambdafyCode Reuse: Compose functionsWie können auch unerfahrene Entwickler mit FP beginnen?Code-Katas: Probleme mit Funktionen lösenOnline 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 8Wie kam es zu deinem Vortag auf der Javaland?Ich war letztes Jahr auf der Javaland und habe Leute auf dem Newcomer-Track gesehenIch 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ördenIn diesem Rahmen gibt es den Newcomer-TrackLeute, die zuvor nicht auf einer Konferenz gesprochen habenMan meldet sich mit Thema und Mentor anDer Track geht über beide Konferenztage hinwegIch habe mich mit meinem Thema beworben und mit Johannes Link als MentorFalls man keinen Mentor angibt, bekommt man einen zugeteiltJohannes 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 MentorAn das Mentoring bin ich über Walery Strauch gekommen, einer unserer MitorganisatorenUm ehrlich zu sein, wusste ich beim Kennenlernen nicht, dass er recht bekannt ist und ein Fachbuch über TDD geschrieben hatHier auch mal Grüße an euch Johannes und Walery 🙂Wie hast du das Thema deines Vortrags gefunden?Ich hatte etwas mit FP in Java eingereichtArtem Kozlov und ich hatten bereits bei der majug einen ähnlichen Vortrag gehaltenNach dem ersten Treffen mit Johannes war klar, dass das viel zu weit gegriffen istWir haben uns dann zusammen auf das Thema Combinator Pattern in Java 8 festgelegtWie 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ärfenAbstract: Leute ansprechen und die Erwartungen genau beschreibtWelches Publikum will ich ansprechen? Was für Voraussetzungen erwarte ich vom Publikum?Danach ging es dann los.Folien erstellt und mit Johannes ausgetauschtWeiterhin hatte ich einen Probevortrag und Kommentare eingearbeitet Ich möchte Mark Paluch nochmals für den Tipp mit dem Comparator-Typ dankenDieser nutzt CombinatorAm Ende war der Foliensatz da und ich war glücklich 🙂Inzwischen finde ich Google Docs da ganz angenehmWas hast du selbst durch den Vortrag gelernt?Nicht so viel Aufregug 🙂 Alles halb so schlimmHaltung, Haltung, HaltungIn einem Foto sitze ich mit dem Schultern nach vorne und mache einen recht beklemmten EindruckDas nächste mal schnappe ich mir was zu trinken 🙂Dass es klapptDass die Leute von der majug echt klasse sind (das wusste ich eigentlich schon vorher :-D)Dass Nicolai und Marc super Tipps gebenDass Johannes ein richtig guter Mentor istDass Leute mir zuhörenDass es nicht schlimm ist, wenn Leute den Raum verlassenDass ich langsamer sprechen mussDass ich die Leute evtl. mehr einbindeWas hat dir der Vortrag rückblickend gebracht?Votrag auf der Karlsruhe Java User Group, Artikel in der Java AktuellErfahrungKontakteFachartikel
Wie kam es zu deinem ersten Fachartikel?August 2016 habe ich meinen Blog umgekrempelt und einen ersten ernsthaften Eintrag geschrieben.Nicolai Parlog war zu der Zeit bei uns an der majug und hat einen Vortrag gehalten.Da habe ich gesehen, dass er auf Sitepoint den Java-Channel aufgemacht hat.Ich habe mir gedacht: Fragen kostet nichts und und meinen Artikel angeboten.Nicolai fand den Artikel gut und hat mich gefragt ob ich denn nicht weiter schreiben möchte.Nach der JavaLand hat mich Wolfgang Taschner angeschriebenArtikel erscheint im AugustWie aufwendig ist das Schreiben eines Artikels?Kommt auf den Artikel an und wie viel Vorwissen vorhanden istEin Kreis aus drei SchrittenRechercheSchreibenNacharbeitungKommentare des Editors einarbeiten Beherrschst du die Technik schon vor dem Schreiben oder lernst du durch/für den Artikel?Meist interessiere ich mich für das Thema und probiere es dann in meinen Artikeln anzuwenden.Aber durch das Schreiben und das Feedback wird der Stoff noch einmal verinnerlichtWelches Feedback hast du bislang zu deinen Artikeln (z.B. Functional FizzBuzz) bekommen?Gemischt: Von den Leuten, die es gelesen haben, habe ich relativ viel Gutes gehörtIch hatte aber auch recht harte Kritik.Ich hätte bspw. nicht das richtige Verständnis von referrentieller Transparenz etc.Man lernt nie aus. Wenn die Kritik wertneutral vorgetragen wird, dann nehme ich sie gerne anWichtig zwischen persönlicher und fachlicher Ebene zu unterscheidenManchmal fühle ich mich dennoch angegriffenDa hilft Kaffee, 20 Minuten Pause oder Feierabend 🙂Aus- und Weiterbildung
Bildest du selbst Entwickler-Nachwuchs aus und wenn ja, wie ist das Vorgehen?Nein, ich bilde keinen Entwickler-Nachwus aus.Ich war Mentor in einem Coder-Dojo für KinderIch hatte mal Studenten, die bei mir im Projekt mitgearbeitet habenIch glaube Eigeninitiative ist wichtigWas ist das letzte Fachbuch mit Bezug zur Programmierung, das du selbst gelesen hast?Immer wieder: Functional Programming in ScalaGerade dabei: Reactive Design Patterns von Roland Kuhn, Implementing Domain Driven Design von Vaughn VernonWas ist dein absolutes Lieblingsbuch mit Bezug zur IT/Programmierung und warum?Functional Programming in ScalaSehr ausführlich und umfangreichCompanion BookletSehr gut geschriebenHast du Tipps zur Aus-/Weiterbildung für angehende Softwareentwickler/-innen?Ich kann nur außerhalb der Ausbildung sprechenRichtung finden, die einen interessiertEvtl. Lernpfad aufbauen mit Lernziel und StundenplanAusgleich ist sehr wichtigWenn der Kopf den ganzen Tag brennt, dann darf man auch gerne mal nichts in der Freizeit machenIch denke Lernen ist ein Teil des BerufsDurch den Arbeitgeber gefördert werden und geordnetHast du Tipps für Ausbilder/-innen im IT-Bereich?auf gleicher Augenhöhe zusammenarbeitenLeading by Example ist sehr nett Literaturempfehlungen
Gregor hat einen Haufen interessanter Bücher empfohlen, die ich bislang teilweise auch noch nicht kannte. Vielleicht ist ja auch etwas Spannendes für dich dabei!
*
Functional Programming in Scala*
*
Akka in Action*
*
The Leprechauns of Software Engineering*
*
Softwaretests mit JUnit: Techniken der testgetriebenen Entwicklung*
*
Reactive Design Patterns*
*
Implementing Domain-Driven Design*
Links
Permalink zu dieser Podcast-EpisodeRSS-Feed des PodcastsGregor Trefs (@gtrefs) bei TwitterGregors BlogCombinator Pattern with Java 8Six Ways to functional FizzBuzz with Vavrgtrefs (Gregor Trefs) bei GitHubCombinator Pattern in Java 8 (Vortragsfolien)majug · Mannheim Java User GroupJava aktuell – Das MagazinJavaLandIn-depth: Functional programming in C++Vavrpresentation/slides.md at master · lambdafy/presentationA Companion Booklet to FPiS – Higher OrderTypeclassopedia (Haskell)