Blogialustaksi Elixir / Phoenix

Tämän blogin tekninen alusta meni taannoin taas uusiksi. Alustan uusimisesta on tullut minule eräänlainen traditio, koodikata, jolla olen tutustunut uusiin ohjelmointikieliin. Tällä kertaa vuorossa oli Phoenix Framework ja Elixir -ohjelmointikieli.

Olen rakentanut tämän blogin ennen mm. Julialla, Clojurella ja Racketilla. Edelliset blogialustani olivat niin sanottuja sivugeneraattoreita: järjestelmä itse oli asennettuna vain omalle koneelleni, kun palvelimelle siirrettiin vain lopputuloksena syntyneet staattiset html- ja muut tiedostot.

Tällä kertaa lähdin luomaan dynaamisempaa sivustoa, koska valitsemani teknologia vaikutti sellaiseen erityisen soveltuvalta. Tässä artikkelissa en kuitenkaan kovin syvälle teknisiin yksityiskohtiin mene, vaan tarkastelen aihetta yleisemmällä tasolla, lähtien siitä miten ylipäänsä päädyin taas uuden ohjelmointikielen pariin.

Polku teknologiavalintaan

Phoenixin valintaan — nyt jo puolitoista vuotta sitten — minut johti kaksi erillistä polkua. Toissaalla olin innostunut funktionaalisesta Elm-ohjelmointikielestä web-käyttöliittymien toteutukseen ja toisaalla olin aloittanut tutustumisen Ruby on Railsiin, joka oli pieni aukko web-sivistyksessäni.

Rails-maailmaa tutkiessani törmäsin pian siihen, että osa Ruby-ohjelmoijista näytti olevan siirtymässä itse uuteen ohjelmointikieleen ja kehitysalustaan — kuten myös itse Elixirin isä José Valim. Tämä oli sinänsä outoa, sillä Rails on yleisesti hyvänä pidetty systeemi webkehitykseen, etenkin Rails-tekijöiden itsensä mielestä. Aloin epäillä valintaani ja vilkuilemaan tämän uuden ihmeen perään.

Elm taas tarvitsee kaverikseen palvelinohjelmiston ja sama ohjelmointikieli, josta en ollut ennen kuullutkaan nousi toistuvasti esiin. Molemmat ovat funktionaalisia kieliä, joissa arvojen muuttumattomuus on keskeistä. Kummallista tässä oli se, että nopealla vilkaisulla Elixirin tyyppijärjestelmä oli melko vaatimaton — kun taas Elm nojaa vahvasti tyypitykseen Haskellin tapaan. Mitä Elm-koodarit näkivät tässä kielessä?

Sekä Railsin että Elmin tapauksessa kyseessä oli sama parivaljakko: Elixir-kieli ja Phoenix Framework web-ohjelmointikehys. En heti tuolloin puolitoista vuotta sitten vielä halunnut aiheesta kirjoittaa, sillä halusin ensin varmistua etten ole vain hypen perässä juoksemassa.

Olen kuitenkin jäänyt koukkuun. Kävi ilmi, että Phoenix on itse asiassa vain portti kovempiin teknologioihin, kuten Erlang virtuaalikone BEAM ja sen päälle vuosien saatossa rakentunut ohjelmointialusta OTP.

Phoenix Framework

Ensivilkaisulla Phoenix oli kuin mikä tahansa Model—View—Controller -ohjelmisto, ja useampaan sellaiseen tutustuneena alkuunpääsy olikin helppoa. Pian kuitenkin kävi selväksi, että tässä on nyt jotain uutta.

Ohjelmistokehys on rakenteeltaan selkein mitä olen kohdannut. MVC ja siihen liittyvät ideat eivät yksittäisinä sinänsä ole uusia, mutta kokonaisuus on poikkeuksellisen onnistunut. Funktionaalisuus näkyy kaikessa: koko HTTP pyyntö/vastaus -kierto ajatellaan pyynnön funktiona: HTTP-pyyntö, yksinkertaistettuna URL-tekstijono, muunnetaan askel askeleelta selaimelle palautettavaksi vastaukseksi.

Palvelinohjelma on siis ketju transformaatioita datalle. Elixir-kielessä tälle funktioiden yhdistämiselle on oma merkintätapansa, joka lisäksi helpottaa ketjun ajattelua. Edellisen funktion tuloste annetaan seuraavalle ensimmäisenä argumenttina.


request
  |> route()
  |> middleware()
  |> action()

Sama tyyli jatkuu kontrollerin toiminnon sisälläkin. Haetaan tiedot kannasta pyynnön parametrien perusteella, ja lopulta tehdään viewissä muunnos rakenteellisesta datasta pyytäjälle kelpaavaksi vastaukseksi, kuten html:ksi. Mahdolliset template-tiedostot muutetaan jo käännösaikana funktioiksi, mikä tekee niistä varsin ripeitä.

html =
  req_params
  |> Domain.get_records()
  |> filter()
  |> order()
  |> render()

Vaikeahan tätä kokonaisuutta on yrittää muutamalla rivillä tässä selittää, mutta koen joka tapauksessa tämän olevan todella ymmärrettävä ja selkeä tapa ajatella ohjelman toimintaa. Yleisesti ottaen yksi Phoenixin vahvuus on nimenomaan läpinäkyvyys. Jokseenkin koko toimintoketju on kehittäjän nähtävissä ja muokattavissa, ilman pinnan alla tapahtuvaa taikuutta.

Perinteisen pyyntö/vastaus -meiningin lisäksi Phoenix tukee kanavia (channels), jotka ovat tyypillisesti websocketien avulla toteutettuja pysyviä kaksisuuntaisia yhteyksiä selaimen ja palvelimen välillä.

Uusi ohjelmointikieli, Elixir

Uuden ohjelmointikielen kanssa on aina kysymys: mistä lähden liikkeelle? Lähdenkö lukemaan pulteista ja muttereista, ja opiskelemaan kielen ominaisuuksia oppikirjasta. Vai lähdenkö suoraan vain tekemään projektia.

Phoenix, sen dokumentaatio ja siitä kirjoitetut artikkelit vaikuttivat kattavilta, joten päätin lähteä suoraan rakentamaan blogialustaa Phoenixilla, opetellen Elixiriä vähitellen matkan varrella.

Sain kuin sainkin ensimmäisen version sivustosta tehtyä malliesimerkkejä seuraillen ja muokkaillen, ilman syvempää ymmärrystä Elixir-kielestä. Innostuin nopeasti sen verran, että ostin Phoenix-aiheisen kirjan.

Ruokahalu kasvoi syödessä ja aloin kiinnostua enemmän itse Elixir-kielestäkin. Hankin toisenkin kirjan — tällä kertaa itse kielen perusteista — ja aloin soveltaa Elixiriä myös muihin aiheisiin: algoritmit, shell-skriptaus, slackbot, Raspberry Pi, sensorit, itsenäiset ohjelmistoagentit… Huomasin, ettei Elixir ole vain verkkopalveluja varten, vaan kielestä on muutkin kiinnostuneet, erityisesti IoT -ja robotiikkapuolella tälle on selvästi tilausta.

Erlang?

Erlang? Hetkinen? Kuulostaa 80-luvulta? Erlang on Ericssonilla kehitetty kieli puhelinverkkoja varten, jonka lähdekoodi avattiin 1998. Erlang voi jo syntaksinsa osalta vaikuttaa vieraalta monille koodareille. Oleellisinta Erlangissa ei kuitenkaan ole itse kieli vaan virtuaalikone BEAM, jossa ohjelmakoodi ajetaan.

Elixir-koodi käännetään Erlang -tavukoodiksi ja ajetaan virtuaalikoneessa, kuten vaikkapa Scala tai Clojure Java-virtuaalikoneessa. Samoin kuin Scala voi hyödyntää olemassaolevia Java-kirjastoja, voi Elixiristä kutsua suoraan Erlang-kirjastoja. Elixir itse on kohtuu tuore ohjelmointikieli (Elixir 1.0 vuonna 2014, Phoenix 1.0 vuonna 2015 [edit]), mutta se voi hyödyntää 20 vuoden kehitystyötä vikasietoisten ja skaalautuvien järjestelmien kehityksestä.

Kenelle

Suosittelen Phoenixiin tutustumista oikeastaan kaikille (palvelinpuolen) webkehityksen ammattilaisille. Se tarjoaa hyvin suunnitellun, toimivan ja läpinäkyvän kokonaisuuden, jonka kanssa on helppo päästä alkuun, mutta tarjoaa valtavasti muutakin. Enkä edes maininnut suorituskykyä vielä (ennätys lienee edelleen 2 miljoonaa yhtäaikaista websocket-yhteyttä yhdellä palvelimella).

Elixir ja sen perustana oleva Erlang virtuaalikone tarjoaa paljon opittavaa ja mahdollisuuksia muillekin kehittäjille. Esimerkiksi Nerves-projekti tuo sulautetut järjestelmät käden ulottuville, vaikka laitteistopuoli ei vielä muuten olisikaan kovin tuttua.

Elixir, Phoenix Framework, Erlang VM. Kannattaa laittaa teknologiatutkalle, jos eivät siellä vielä ole.

Linkkejä

  • Phoenix Framework — Productive. Reliable. Fast. A productive web framework that does not compromise speed and maintainability.
  • Elixir — Elixir is a dynamic, functional language designed for building scalable and maintainable applications.
  • Erlang — Build massively scalable soft real-time systems
  • Nerves project — Craft and deploy bulletproof embedded software in Elixir
  • 2M websocket connections — The Road to 2 Million Websocket Connections in Phoenix, article
comments powered by Disqus
2017-09-19