Hva er funksjonell programmering? đ€
To norske eksperter forklarer deg hva funksjonell programmering er, og hvorfor du bĂžr prĂžve.
I kode24 sin spalte Ukas Koder har mange norske utviklere snakka varmt om funksjonell programmering.
«Det skjer sÄ mye spennende i funksjonell programmering nÄ at Norge etterhvert mÄ forstÄ at det er veien Ä gÄ» sa Kaare Nilsen i Arktekk.
«Jeg er en stor tilhenger av funksjonell programmering, spesielt i kombinasjon med god statisk typing» uttalte Ingar Almklov i Bekk.
Men vet den gjengse norske utvikler hva funksjonell programmering egentlig er? Vi spurte Facebook-fÞlgerne vÄre, og etter 189 stemmer ledet «nei» med 71 prosent.
SĂ„ kode24 mĂžtte utviklerne Magnar Sveen og Christian Johansen i Kodemaker for Ă„ prĂžve Ă„ forklare deg hva funksjonell programmering er for noe rart.
Det meste de gjÞr pÄ jobben skrives i Clojure og ClojureScript; sprÄk som er kompatible med henholdsvis Java og JavaScript, og som mer eller mindre tvinger utviklerne over pÄ nettopp funksjonell programmering.
For Ă„ starte fra starten; hva er funksjonell programmering?
Det er en tilnÊrming til programmering, altsÄ en paradigme.
Begrepet kommer fra matematikken; en funksjon skal vĂŠre som en matematisk formel, som tar noe inn, og gir noe ut. Og dette skal vĂŠre 100 prosent forutsigbart.
Det skal vĂŠre 100 prosent forutsigbart.
SÄ funksjoner skal alltid gi de samme resultatene nÄr de samme parameterne mates inn, uavhengig av tid.
Grunnideen, om man tar utgangspunkt i objektorientering, er Ä splitte data og funksjoner i to. I stedet for objekter med metoder pÄ, lar vi data vÊre det den er, og bruker lÞsrevne funksjoner.
Og hva fĂžrer dette til, rent praktisk?
I objekt-orienterte sprÄk har du ofte veldig konkrete funksjoner, som for eksempel «game.changeScore(20)». I funksjonell programmering bruker man gjerne fÊrre funksjoner, som fÞlger med sprÄket og er mer generelle. For eksempel «update(game, score, 20)».
Yatzy kan nesten utelukkende skrives med slike funksjoner. Her ser du Yayzy med ClojureScript og funksjonell programmering:
Yatzy med samme logikk i Javascript blir langt mer kode.
Dessuten har du ingen objekter, men verdier: strenger, tall, maps og lister. Du kan tenke pĂ„ det som «snapshots» av objekter â som aldri endrer seg
Yatzy-koden er imponerende kort, men skremmende gresk. SĂ„ hva er vitsen?
Det slutter Ä vÊre gresk nÄr du har det grunnleggende vokabularet under huden. NÄr for eksempel «vals» og «frequencies» sitter like godt som «map» og «filter».
Den stĂžrste fordelen er at dataflyten gjennom programmet blir eksplisitt. Det er tydeligere hvor ting kan endre seg og hvorfor, som gjĂžr det lettere Ă„ komme inn som ny i en funksjonell kodebase.
Du ser fort at her skjer det ingen magiske ting, det skjer ingenting uten at du har bedt om det, sÄ du slipper Ä forholde deg til hva som skjer i andre deler av kodebasen samtidig. Den luksusen fÄr du ikke i en objekt-orientert kode.
Det er ogsÄ mye enklere Ä finne feil; nÄr ingen data endrer seg uten at du har bedt om det, slipper du Ä «hÄpe pÄ» at den samme feilen melder seg igjen. I objektorienterte sprÄk kan alle objektene finne pÄ hva de vil til enhver tid, mens du i funksjonell programmering sitter i en mer sentral styringsrolle.
Dessuten kan du gjenbruke mye kode, og blir flink pĂ„ Ă„ se generelle lĂžsninger pĂ„ problemer â i alle sprĂ„k.
Ja, hvorfor finnes det egne sprÄk for funksjonell programmering, egentlig?
Du kan programmere funksjonelt i alle sprÄk. Men sprÄket begrenser deg, og du kan bli avhengig av Ä bruke ting som imutable.js.
Med for eksempel Clojure eller Elm tvinges du over til funksjonell programmering, og de gir deg de generelle funksjonene du trenger.
Da jeg skulle lĂŠre meg Clojure rakk jeg Ă„ skrive Ă©n parantes fĂžr «hĂžh, hvordan gjĂžr jeg egentlig dette?». Tidligere hadde jeg for eksempel bare skrevet «score++» for Ă„ Ăžke et tall, men nĂ„ gikk ikke det. Hvis det hadde gĂ„tt, hadde jeg ikke lĂŠrt noe â disse egne sprĂ„kene lar deg ikke hoppe over lĂŠringen.
OgsÄ kan du eventuelt gÄ tilbake til hverdagen i Javascript eller Java med en ny verktÞykasse.
Men nÄr man ser pÄ funksjonell kode er det lett Ä tenke at det er mye vanskeligere enn tradisjonell programmering?
Det er annerledes enn det du er vant til. Og jeg vil tvert i mot si at funksjonell programmering er veldig mye enklere, nÄr du har kommet inn i det.
Jeg jobba i mange herrens Är med objektorienterte sprÄk, og nÄr jeg slutta med dem var det en veldig lettelse. Det er sÄ mye du ikke lenger trenger Ä ta hensyn til, som var sÄ inngrodd i meg at jeg ikke klarte Ä se at det var et problem fÞr jeg slapp Ä ha problemet.
Det handler jo mest om forutsigbarhet. Du vet at nÄr du sender datastrukturen dit, sÄ endrer den seg ikke, og funksjonene gjÞr alltid det samme. Det hÞres kanskje litt kult ut? Men det er veldig kult! Og du mÄ bare oppleve det!
OgsÄ finnes det visst to skoler innen funksjonell programmering?
Ja. Blant annet Clojure og ClojureScript, som vi tar utgangspunkt i her, er dynamisk typet funksjonell programmering. Mens blant annet Elm og Haskell er statisk typet funksjonell programmering.
De ber deg modellere verdenen din pÄ forhÄnd; «sÄnn ser alle typene mine ut, de er lagt opp sÄnn og sÄnn». Deretter inspiseres koden din for en sanity-sjekk, typene flyter gjennom funksjonene og slikt, og du fÄr en streng og god sjekk pÄ om koden kommer til Ä kjÞre.
SÄ med statisk typet funksjonell programmering fÄr du endel hjelp, men du betaler ogsÄ en kostnad. For om du for eksempel skal fÄ JSON inn i koden din, mÄ du definere hvordan all dataen kommer til Ä se ut. SÄ om JSON-dataen pÄ et tidspunkt endres, kan koden din slutte Ä fungere. Mens det i et dynamisk typet sprÄk kanskje ville sklidd inn og fungert.
Statisk typing kan i enkelte sprĂ„k dras veldig langt, og fort ende opp som en noksĂ„ avansert Ăžvelse â litt "universitetsprogrammering", om du vil.
Men det hÞres litt «universitet» ut det dere driver med, ogsÄ. Er dere mer opptatt av koden enn produktet?
Vi er vel litt mer i den skolen som er opptatt av koden i seg selv, men det er bare fordi vi har kjent ettersmaken av den fĂžrste skolen â som bare er opptatt av Ă„ fĂ„ ut produktet.
Det handler ikke nÞdvendigvis om at koden skal bli sÄ vakker, men at man skal skjÞnne hva som skjer, og hvorfor. For pÄstanden om at det ikke spiller noen rolle hva slags sprÄk man bruker bare det gir verdi for kunden, er feil.
Poenget med software er Ä holde den soft. Man mÄ kunne endre den. Og nÄr software slutter Ä vÊre soft, som jeg tror veldig mange har opplevd, blir det veldig vondt for veldig mange.
Hvor bÞr man starte, om man vil prÞve seg pÄ funksjonell programmering?
Clojure er den ene Lisp-dialekten som har litt medvind, men i det store og det hele er det et nisjesprÄk. Elm har kanskje mest traction nÄ, mens det var Scala som var stort for noen Är siden. SÄ dette gÄr litt opp og ned.
Men selv er jeg veldig fornÞyd med Clojure; det fungerer sÄ bra for meg, som jobba i veldig mange Är med Javascript og Java. Og uansett ville jeg starta med et funksjonelt sprÄk. Man blir flinkere pÄ funksjonell programmering ved Ä starte med et funksjonelt sprÄk.
Vi har laget screencast-en zombieclj.no, hvor vi lager et spill med Clojure, som har fÄtt mye skryt. OgsÄ ville jeg sett talk-en Simple made Easy av Clojure-skaper Rich Hickey. Gir den gjenklang, er det pÄ tide Ä finne fram parantesene og skrive Clojure.
Og hvilke type utviklere bĂžr prĂžve seg?
Alle! Selv om det er et kjedelig svar.