On tuskin sattuma, että Teknologiateollisuuden 100-vuotissäätiö päätti pari vuotta sitten rahoittaa Racket-ohjelmoinnin oppimateriaalin laatimisen yläasteen oppilaille. Materiaali on nyt kaikkien käytettävissä ja sattumaa ei liene sekään, että Racket on puhtaan funktionaalinen ohjelmointikieli monine funktionaalisine ominaisuuksineen, jotka yhtäältä helpottavat ohjelmoinnin oppimista ja toisaalta ohjaavat fiksuun tapaan laatia sovelluksia. Tiina Partasen laatima vaiheittain etenevä materiaali löytyy uteliaille osoitteesta https://racket.koodiaapinen.fi/.
Ajatus, että funktionaalinen ohjelmointi olisi vain aikuisten tai yliopistohörhöjen juttu, ei ole tätä päivää. Funktionaalinen ohjelmointimalli on oleellinen osa erästä maailman käytetyintä web-sovellusten laatimiseen soveltuvaa työkalua: React-kirjastoa. Funktionaalisen ohjelmoinnin paradigma näkyy vahvasti niissä työkaluissa, joita web-kehittäjät käyttävät juuri nyt.
Funktionaalinen ohjelmointi ohjaa sellaisten asioiden pariin, joita työelämässä tulee vastaan tämän tästä. Yksi näistä on, että sovelluksen tilan hallinta ja toiminnallisuus on eristetty toisistaan viisaasti. Sivuvaikutuksen käsite löytyy React-ohjelmoinnin oppaista ja sivuvaikutusten hallintaa pidetään erittäin tärkeänä seikkana React -pohjaista ohjelmistoa suunnitellessa. Sivuvaikutuksen käsitteen oivaltaminen on siis yhä tärkeämpi asia ohjelmoijan uraa aloittavalle. Se motivoi, kun tietää, että teoreettisemmistakin käsitteistä on oikeasti hyötyä myös käytännössä. Sivuvaikutuksen käsite on jokaisen funktionaalista ohjelmointia opiskelevan ja työssään hyödyntävän työkalu – on tärkeää oppia näkemään, missä tila muuttuu ja missä ei. Reactin uusimmissa versioissa sivuvaikutusten käsittely on pyritty eristämään yhden ja saman funktion(rajapinnan) taakse sen sijaan, että sivuvaikutuksia aiheutettaisiin ns. elinkaarimetodeissa (..mount, ..unmount, ..update jne.).
Toinen Reactissa näkyvästi esillä oleva käsite, korkeamman kertaluvun funktiot, on oleellinen osa React Hooks -rajapintaa. Kun vielä lisäämme käsitepalettiimme JavaScript -kielen perusominaisuuden kurituksen (currying) huomaamme, että moderni JavaScript-kirjasto, kuten React on täynnä funktionaalisen ohjelmoinnin aineksia. Ja vaikka ei funktionaalista Reactia koskaan käyttäisikään, funktionaalisen ohjelmoinnin perusfunktiot map, filter ja reduce tulevat vastaan niin monessa ohjelmointikielessä ja kirjastossa, että ne oivaltamalla voi käsitellä tietoa monin tavoin – yleensä näiden kolmen funktion avulla voi tehdä käytännössä kaiken.
Kompositio on funktionaalisen ohjelmoinnin tapa moduloida ja uudelleenkäyttää koodia. Kirjoittamalla korkeamman kertaluvun funktioita ja liittämällä niitä yhteen eri tavoin voidaan laatia hyvinkin ”taipuisaa” ja helposti uudelleenkäytettävää koodia.
Funktionaalisia suunnitteluperiaatteita voi opetella vaiheittain käsite käsitteeltä rauhassa edeten. Oliokielissä, kuten Javassa tilanne ei ole niin hyvä – ilman olioita ei Java-kielellä harjoitella ohjelmointia, eikä etenkään funktionaalista. Nykyään aika moni työkseen ohjelmointityötä tekevä elää oikein hyvin ilman olioitakin, varsinkin mitä uusiokäyttöön, polymorfisiin metodeihin ja syviin luokkahierarkioihin tulee. Applikaation tekemisen juoni alkaa tätä nykyä varsinkin web-sovelluksissa olemaan, että massiivisia oliohierarkioita ja monoliittisia applikaatioita ei laadita enää siinä määrin kuin ennen. Näin ollen olio-käsitteen merkitys typistyy helposti structiksi, rakenteeksi säilöä (rakenteista) dataa, ei niinkään käsitellä dataa (logiikka).
Miten funktionaalisen ohjelmoinnin käsitteitä sitten voisi oppia? Jos pohjalla on vahva JavaScript/React- osaaminen, niin käsitteitä voi oppia hyvin käytännön töissä koodia kirjoitellen ja sitä mukaa asioita oppien. Tuttu domain motivoi oppimaan, koska hyöty on käsin kosketeltavissa. Haittapuolena on, että tietyt käsitteet eivät ”näy” yhtä selkeästi JavaScript -koodissa kuin Haskell-koodissa ja JavaScript -koodi on funktionaalisen suunnittelun näkökulmasta vaikeammin tulkittavaa.
Jos haluaa nähdä funktionaalisen ohjelmoinnin ideat hyötykäytössä, Reactin uusin versio apukirjastoineen on hyvä työkalu. Jos taas haluaa tämän lisäksi oppia funktionaalisen ohjelmoinnin kovan ytimen, go for Haskell. Tekipä niin tai näin, niin hyöty sataa kyllä laariin todennäköisesti ennemmin kuin myöhemmin. Ja jos intoa on, niin molempi parempi!
Opettelipa funktionaalista sitten Haskellilla tai vaikka React-kirjaston uusilla versioilla, hauskinta funktionaalisen kielen tai funktionaalisen ohjelmoinnin työkalujen (kompositio, kuritus, korkeamman kertaluvun funktiot jne.) opiskelussa lienee, että aivan oppimisen alkuvaiheessa pärjää oikein hyvin vain kourallisella käsitteitä. Tästä ”käsitenuukuudesta” ovat hyviä esimerkkejä monet funktionaaliset kielet kuten Haskell, Scheme ja Racket.
Selma koira on haistanut kanaherkun ja tietää, että map, filter ja reduce riittävät useammankin kanaherkun käsittelemiseen.