Drie dagen workshop door John A. De Goes: Functional Scala

Tijd voor een kant van software ontwikkeling die wij niet vaak tegenkomen: Functional programming. John de Goes heeft een goede naam in de wereld van functioneel programmeren, en vooral bij de scala programmeurs. Met deze driedaagse workshop belooft hij ons de fijne kneepjes bij te brengen van o.a. pure functies, het naar boven pushen van je beoogde side-effects, en een geheel nieuwe library om dit allemaal soepel te laten verlopen.

Iedere dag hielden we ons aan hetzelfde format: van 9 tot half 6 doorknallen en continu zorgen dat we niet te ver achter John zijn uitleg, live coding en de uit te voeren opdrachten raakten. Het tempo lag erg hoog, maar gelukkig is John een erg goede begeleider van de veelal nieuwe en ook theoretische stof die voorafgaat aan het goed begrijpen van functioneel programmeren. Tijdens de workshop was er gelukkig genoeg tijd voor vragen en extra uitleg, wanneer hierom gevraagd werd, en we kregen twee korte en een lange pauze om de stof even te laten bezinken onder het genot van een lekker Nederlands ‘time for a caramel cookie!’.

Dag 1.

De basis van functioneel programmeren ligt eigenlijk voor een groot deel in de wiskunde. Hier begon John de dag mee, na een kort welkom en een zeer welkome kop koffie. Hij vertelde over het wiskundige begrip van een Set, een verzameling van types, en vervolgens liet hij zien hoe dat eruit ziet in Scala. Zo doende bouwde hij verder uit naar meer features en concepten uit het functioneel programmeren en viel vaak terug op deze eerste twee uur, die toch de basis lijken te vormen van de stof voor de komende dagen. Alle essentials werden behandeld: types, functions, higher order functions, polymorphic functions, higher kinded types. Veel van deze stof was nieuw, en toen we net voor de dagafsluiting een samenvatting hadden verwacht, legde John in het laatste half uur nog ‘even’ het begrip type classes uit. (In het kort, type classes zijn in functioneel programmeren wat interfaces in OO zijn, maar je kunt ze ad hoc creëren!).

Dag 2.

De tweede dag begon gelukkig met een herhaling van deze type classes, wat toch wel de meest complexe stof van de vorige dag was. Deze dag werd vrijwel geheel besteed aan het begrip van type classes, en hun implementatie in scala. De rest van de dag werden een hoop termen behandeld die je in functioneel programmeren (en wiskunde) tegenkomt: semigroups, monoid, functor, zip, applicative, monad, foldable, en traversable. John legde uit dat eigenlijk al deze termen implementaties van type classes zijn. Zo is in java 8 de streaming API toegevoegd die op collections map en flatMap aanbiedt. In functioneel programmeren zijn dit implementaties van twee type classes: Functor en Monad. Zijn meest gestelde check-vraag bij het publiek was dan ook: What is a functor? (inderdaad, gewoon een type class).

Dag 3.

De laatste dag van de training moesten we in de opdrachten onze kennis van de afgelopen twee dagen toepassen en een echte applicatie schrijven, die side effects heeft. John introduceerde de scalaz library ZIO (Z-IO), welke wordt gebruikt om side effects af te handelen op een manier zoals o.a. Haskell dat ook doet. De kennis van de afgelopen dagen, en de ZIO library hebben we vervolgens gebruikt om gezamenlijk een galgje applicatie te maken. Het was erg leuk de workshop af te sluiten met een soort mini ‘afstudeeropdracht’, waar alle kennis van de voorgaande daten moest worden toegepast.

Conclusie.

Mocht je de kans krijgen een workshop Functional Programming van John bij te kunnen wonen, sla deze dan zeker niet over. Zelfs als je geen plannen of ambities hebt iets met functioneel programmeren te doen, is de theorie waarop het paradigma is gebaseerd ook nuttig en toepasbaar in andere programmeer stijlen.

John gaat erg snel door de stof heen, maar tegelijkertijd is het niet nodig alle theorie in je op te nemen om een beeld te vormen van wat functioneel programmeren nu eigenlijk is en wat de toepassingen zijn. De opdrachten en de interactie met de groep zijn erg nuttig en brengen je aan het denken over de manier waarop je nu een programma schrijft, en hoe je de structuur met kleine ingrepen inzichtelijker zou kunnen maken.

Deniz & Chiel