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.

seuraavia askeleita

Kuluneen viikon olen lähinnä hoidellut monenlaisia käytännön asioita, joita yrityksen käynnistäminen vaatii, ja hahmotellut mielessäni kokonaiskuvaa toimintatavoista. Nyt ajattelin istahtaa alas hetkeksi ja hahmotella millaisia asioita aion käsitellä tässä blogissa lähiaikoina. Tarkoituksena on paitsi kommentoida erilaisia ajankohtaisia ja muuten tärkeitä tai mielenkiintoisia aiheita, myös esitellä omaa toimintaani ja osaamistani erilaisten projektien muodossa. Tässä kirjoituksessa piirtelen hieman karttaa maastosta, jossa lähiaikoina tulen liikkumaan, ja toivoakseni onnistun herättelemään mahdollisten tukijoideni ja asiakkaideni mielenkiintoa.

kirjoja ja kirjoituksia

Koska liiketoimintani tulee pitkällä tähtäimellä rakentumaan erikoisosaamisen varaan, olen varannut itselleni aikaa lukemiselle ja pohtimiselle. Osaamista täytyy ylläpitää ja kehittää edelleen. Tietysti myös väitöskirjani loppuunsaattaminen vaatii aikaa ja energiaa, mutta tästä aiheesta kirjoitan myöhemmin. Lähiviikkoina tulen kirjoittamaan jonkinlaisia arvosteluja ja kommentaareja tärkeistä kirjoista, joita olen lukenut ja joita voin suositella muillekin. Jotkin näistä ovat yleistajuisempia, toiset teknisempiä tai matemaattisempia.
Luetellakseni muutamia esimerkkejä, tulen esittelemään sellaisia kirjoittajia kuin Pedro Domingos, David Vernon, David Mumford, Jeff Hawkins, Ray Kurzweil ja Marcus Hutter. Keskeisiä aiheita ovat erilaiset tekoälyyn ja älykkäisiin järjestelmiin liittyvät ideat ja tekniikat. Tulen kirjoittamaan myös ajankohtaisista aiheista, uutisista ja läpimurroista ja kommentoimaan niitä.

projekteja ja kokeiluja

Edellisessä kirjoituksessani väitin hiukan provosoivasti ja itsetietoisestikin olevani henkilö, joka kykenisi periaatteessa yksinään toteuttamaan kokonaisen järjestelmän palvelimilta useisiin päätelaitesovelluksiin saakka. Tällaisesta henkilöstä käytetään usein nimitystä full-stack -kehittäjä, vaikka termin tyypillinen merkitys on kylläkin hiukan suppeampi, ja tarkoittaa henkilöä joka on minua huomattavasti rutinoituneempi työtehtävissään. En markkinoi itseäni full-stack -kehittäjänä, mutta en halua jättää tätä väitettä pelkäksi kehuskelevaksi heitoksi, vaan todistaa sen. Tarkoitukseni on toteuttaa kuvatunlainen kokonaisuus vaiheittain, dokumentoiden prosessi tässä blogissa.
Tavoitteena tässä kirjoitussarjassa on toisaalta tehdä alaa vähemmän tuntemattomille selkeämmäksi, millaisia asioita modernien tietojärjestelmien toteuttaminen vaatii, ja millaisia osasia niissä on. Toisaalta haluan kuvailla nopeaa tekniikan kehitystä viimeisen 20 vuoden aikana; olen kuitenkin nähnyt läheltä ne ajat, jolloin nykyisen kaltaisia työkaluja ja apujärjestelmiä ei vielä ollut, ja suuri osa järjestelmien koodista ja konfiguroinneista piti vaivalloisesti kirjoittaa itse. Nykyään olemme tilanteessa, jossa yhden henkilön on mahdollista kohtuullisessa ajassa suoriutua kaikista työvaiheista.
Kirjoituksissa tullaan käsittelemään sellaisia asioita kuin virtuaalikoneet, Docker, REST ja JSON sekä Android. Valtavirrasta tulen poikkeamaan sillä tavoin, että tulen käyttämään funktionaalista ohjelmointia, joten tulen käsittelemään myös sellaisia asioita kuin Haskell ja Yesod. Kaikki tämä on kuitenkin vasta runkoa varsinaiselle ydinasialle, joka on tietysti oppivat ja älykkäät järjestelmät. Tulen siis kirjoittamaan myös sellaisista asioista kuin relationaalinen oppiminen, neuroverkkojen ja Bayesin verkkojen lisäksi. Tällaisten tekniikoiden käyttö bisneksessä vaatii kuitenkin tietynlaisen pohjatyön ja runkotekniikan, ja haluan osoittaa ymmärtäväni riittävästi myös tästä puolesta. Tietysti tarvitsen myös omiin tarkoituksiini, esimerkiksi esittelyjä varten, jonkinlaisen perusjärjestelmän käyttööni. Tämän järjestelmän rakentamista tulen kuvailemaan tässä blogissa.