modulaarista järjestelmäkehitystä

Ennen graafitietokantoihin syventymistä ajattelin kirjoittaa hieman ajatuksia modulaarisuudesta. Kun ryhtyy rakentamaan prototyyppijärjestelmää, varsinkin jos sitä tekee yksin, ei kannata tuhlata aikaa epäolennaiseen vaan keskittyä tärkeimpiin uusiin ideoihin. Toisaalta järjestelmät ovat lähtökohtaisesti laajoja ja sisältävät monia osasia, joten niiden rakentaminen on työlästä.

Erityisen työlästä järjestelmien rakentamisesta tulee, jos haluaa rakentaa kaiken itse. Myyttinen ohjelmistokehityksen sankaritarina on sellainen, jossa kokeilujen ja oppimisen myötä kaikki valmiit ratkaisut todetaan jollakin lailla vajavaisiksi ja päädytään lopulta tekemään kaikki alusta saakka uusiksi itse. Nämä ajat alkavat vähitellen olla ohitse. Suuntaus on nykyään sellainen, että vain ’se oleellinen’ oma juttu tehdään itse, ja loput kootaan valmiista palasista. Syynä muuttuneeseen tilanteeseen on toisaalta se, että modulaarisuus on parantunut ja kirjastot ovat kehittyneet, toisaalta laitteistosta on tullut riittävän tehokasta jotta kaikesta ei tarvitse puristaa aivan viimeisiä tehoja irti. Ajattelutavatkin ovat muuttuneet: siedetään paremmin sitä, että aivan kaikki yksityiskohdat eivät ole oman mielen mukaisia.

Omat verkkosivuni ovat hyvä esimerkki modulaarisesta kehittämisestä. En halunnut käyttää kovin paljon aikaa itse alustan rakentamiseen, koska se ei ole liiketoimintani ytimessä. Verkkosivujen tarkoitus on lähinnä toimia välineenä markkinoinnissa, välittää tietoa ja tarjota alusta blogille, joten oleellista on sisällöntuotanto. Tarvitsen palvelimia eri tarkoituksiin, joten pelkkä verkkosivun ylläpitopalvelu ei riittänyt, mutta en missään tapauksessa halunnut myöskään käyttää paljon aikaa laitteiston kanssa.

Kuten sarjan edellisessä osassa kerroin, hankin yritykselleni Nebulalta pilvipalvelimet. Ne ovat konesalissa olevia virtuaalipalvelimia, joita voi ottaa käyttöön ja poistaa käytöstä tarpeen mukaan. OpenStack tarjoaa helppokäyttöisen rajapinnan, jonka kautta palvelimia voi pystyttää ja hallita verkkoselaimessa. SSH-salausavaimilla hallinnasta saa turvallista, ja virtuaalipalvelimet ovat valmiiksi konfiguroituja, eristettyjä yksiköitä jotka tekevät vain niille määriteltyä tehtävää. Ympäristö voidaan rajata tarkasti, jolloin se on hallittavissa myös tietoturvan kannalta, ja resursseja ei kulu ylimääräiseen.

Suuria data- ja käyttäjämääriä ei voi hallita yksittäisillä koneilla. Virtuaalikoneista saa helposti rakennettua myös useamman palvelimen klustereita, ja kuorman jakamiseen klusteriin kuuluvien palvelimien välillä on valmiita ratkaisuja. Esimerkiksi Apachen Sparkilla pystyy tekemään hakuja suuresta datajoukosta siten, että useampi kone työstää hakutuloksia tahoillaan ja lopuksi tulokset yhdistetään. Neo4j-graafitietokantakin tukee tietokannan hajauttamista usealle palvelimelle. Neo4j:n ja Sparkin yhdistämiseen on valmiita ratkaisuja.

Pilvipalvelimet tekevät laitteistosta modulaarista, laajennettavaa ja hallittavaa. Docker tekee saman ohjelmistoille. Docker-säiliöt, joita voi ajatella ikään kuin ’rahtikontteina’, ovat periaatteessa hyvin kevyitä virtuaalikoneita, joissa kussakin on tarkoitus pyörittää yhtä rajattua palvelua. Samalla palvelimella, esimerkiksi laskentakeskuksen uumenissa sijaitsevalla virtuaalipalvelimella, voi olla useampi Docker-säiliö pyörimässä yhtä aikaa, kussakin niistä jokin erillinen järjestelmän osa, ja nämä osat voivat kommunikoida keskenään. Kunkin säiliön tehtävät ja rajapinnat on tarkkaan määritelty.

Esimerkiksi omalla verkkopalvelimellani on yhdessä Dockerissa MySQL-tietokanta ja toisessa WordPress-julkaisualusta. Docker Compose -työkalun avulla voin määritellä tämän kokonaisuuden yhdessä tiedostossa ja käynnistää sen yhdellä komennolla. Tietokannan data ja julkaisujärjestelmän käyttämät tiedostot voivat olla erillisessä tallennusyksikössä, jonka voi irrottaa pilvipalvelimesta ja yhdistää toiseen. Pystyn muutamassa minuutissa pystyttämään toiselle virtuaalipalvelimelle identtisen ympäristön OpenStackin ja Dockerin avulla, yhdistämään tallennusyksikön tai siitä tehdyn varmuuskopion, ja liittämään verkko-osoitteen uuteen palvelimeen. Käyttämällä API-rajapintoja pystyisin periaatteessa automatisoimaan nämä toimenpiteet komentojonoksi, jonka voin suorittaa omalla läppärilläni. Samoin voisin tehdä komentojonoja, joilla saan kasvatettua palvelimen resursseja kuorman kasvaessa ja pienennettyä niitä kysynnän laantuessa.

Modulaarisuusajattelu ulottuu lopulta myös yksittäisiin ohjelmistoihin. WordPress oli helppo valinta julkaisualustaksi sen takia, että se on hyvin modulaarinen ja siihen löytyy paljon valmiita lisäosia. Tämän takia itse perusjärjestelmä voidaan pitää yksinkertaisena ja tarjota ilmaiseksi. Maksullisilla lisäosilla saa käyttöön edistyneitä ominaisuuksia. Yrityskäyttäjälle oli hyvin helppo ja nopea ratkaisu ottaa käyttöön WordPressin peruspaketti virtuaalipalvelimen Docker-säiliön sisällä, asentaa maksullinen ja helposti muokattava ulkoasuteema, sekä ottaa käyttöön automaattinen roskapostin torjunta, hakukoneoptimointi ja varmuuskopiointi ostamalla sopivat lisäosat. Ulkoasuohjeet ja grafiikat tilasin asiantuntevalta graafikolta. Sivuston pystytykseen ja säätämiseen meni vain hyvin vähän aikaa, ja pystyin keskittymään varsinaiseen sisällön tuottamiseen, kuten halusinkin. Sivuston kaatuessa saan automaattisen hälytyksen, ja pääsen ssh-yhteyden kautta heti tutkimaan ja korjaamaan tilanteen.

Oman järjestelmäni kehittämisessä haluan noudattaa kuvatun kaltaista modulaarista ajattelua. Toisaalta haluan tehdä järjestelmästäni modulaarisen, jotta sen voi helposti ottaa käyttöön ja yhdistää muihin järjestelmiin. Toisaalta haluan käyttää sen kehittämisessä valmiita palasia, jotta pystyn omistamaan mahdollisimman suuren osan ajasta varsinaisten ydinosasten kehittämiseen.

Seuraavaksi lopulta graafitietokantoja ja varsinaista ydinasiaa.

projektin aloitus

Aloitan nyt uuden blogikirjoitusten sarjan, jossa esittelen omaa sisäistä kehitysprojektiani. Tarkoituksena on toisaalta esitellä työskentelytapojani sekä asioita, joita osaan tehdä, mutta myös esitellä uudenlaisia ideoita liittyen digitaalisten järjestelmien kehittämiseen.

Tavoitteena on rakentaa oppiva datan analysointijärjestelmä, jota voisi käyttää erilaisilla laitteilla ja myös verkkoselaimessa. Lyhyellä tähtäimellä sen on tarkoitus olla pienimuotoinen referenssiprojekti, jolla voisi esitellä ja kokeilla erilaisia ideoita, mutta keskipitkällä aikavälillä toivoisin voivani kehittää sen pohjalta suoraan asiakkaille markkinoitavan tuotteen. Tämä tietysti edellyttäisi yrityksen laajentamista tai sopivien yhteistyökumppanien löytämistä. Tekniikka on kuitenkin kehittynyt niin pitkälle, että prototyypin pystyy rakentamaan yksinäänkin.

Käynnistän projektin yleensä jonkinlaisella selvitysvaiheella, jossa tutkin millaisia tekniikoita ja työkaluja tarvitaan halutun lopputuloksen saavuttamiseksi. Tässä vaiheessa yleensä myös teen kokeiluja ja rakentelen nopeita prototyyppejä saadakseni käytännön tuntumaa ideoihini. En takerru sellaisiin työkaluihin ja tekniikoihin, jotka tunnen jo valmiiksi, vaan yritän selvittää sopivimmat vaihtoehdot, koska en pelkää uusien asioiden opettelua. Joitakin rajoitteita täytyy kuitenkin asettaa, jotta päästään liikkeelle ripeästi. Kaikkea ei kannata tehdä täysin uusilla työkaluilla.

Tärkeimmät rajoitteet tässä projektissa tulevat siitä, että haluan käyttää funktio-ohjelmointia ja graafitietokantoja dataa käsittelevissä ydinmoduuleissa. Kirjoitan näistä aiheista lisää myöhemmin, mutta näihin päätöksiin vaikuttavat omat kokemukseni siitä, että funktio-ohjelmoinnilla saa tehtyä vaativia algoritmillisia asioita hallittavammin ja nopeammin kuin perinteisemmillä ohjelmointikielillä. Käyttämäni menetelmät puolestaan ovat graafipohjaisia, ja käsiteltävä data on hyvin monimuotoista, joten graafitietokannat tekevät datan käsittelystä luontevampaa ja helpompaa.

Projektiin täytyy ilmiselvästi kuulua palvelinkomponentteja, jotta samaa dataa voidaan käyttää useilla laitteilla ja verkkoselaimilla. En halua käyttää aikaa laitteiden kanssa tappelemiseen, joten vuokrattavat pilvipalvelimet ovat helppo ratkaisu. Haluan myös käyttää Suomessa sijaitsevia palvelimia, ja palvelun täytyy olla skaalautuva jotta laajentuminen on mahdollista tulevaisuudessa. Koska työskentelen yksin, haluan käyttää mahdollisimman paljon valmiita, toimiviksi todettuja moduuleita. Tämän vuoksi pilvialustan täytyy tukea Dockeria, joka mahdollistaa tällaisten valmiiksi paketoitujen modulaaristen palikoiden helpon käyttöönoton.

Näillä perusteilla alustava projektiympäristö on hahmottunut seuraavasti: pilvipalvelinten tarjoajaksi valikoitui kotimainen Nebula. Heiltä saan skaalautuvat OpenStack-palvelimet valmiilla Docker-tuella. Graafitietokannaksi on valikoitunut neo4j, koska siinä on hyvä skaalautuvuus tulevaisuutta ajatellen, valmiita rajapintoja useisiin työkaluihin sekä valmis Docker-paketti. Vakuutuin myös siitä, millä tavalla itse graafitietokanta on rakennettu, mutta tästä lisää myöhemmin. Palvelinpuolen ohjelmointia teen alkuun Haskellilla ja Yesodilla, koska ne ovat minulle tuttuja ja niillä pääsen nopeasti liikkeelle. Tuotantokäyttöön tulevia sovelluksia varten on kuitenkin löydettävä kypsemmät työkalut, ja alustavasti olen aikonut tutkia Scala-ohjelmointikieltä ja Apache Sparkia, mutta selvitän muitakin vaihtoehtoja. Selaimen puolella haluan pitäytyä mahdollisimman kevyissä ratkaisuissa, ja minulle tutuista työkaluista Bootstrap ja jQuery ovat tällä hetkellä vahvimpia. Työpöytä- ja mobiilisovellusten kanssa en halua käyttää liikaa aikaa, joten Qt ja Android ovat tuttuina ja yleisinä ympäristöinä luonteva valinta.

Seuraava vaihe on se, että pystytän palvelimelle neo4j-tietokannan ja teen kevyen prototyyppisovelluksen, jolla pystyn selaamaan tietokantaa ja tekemään siihen pieniä muutoksia. Raportoin edistymisestä ensi viikolla, ja samalla käyn läpi mietteitäni graafitietokannoista yleisesti.