Olemme aiheeseen liittyen pitäneet podcastia: Kuinka koodariksi pääsee sekä ennakkoluulot koodaamiseen liittyen. Miikka pyöräytti myös videon koodiuran aloittamisen tueksi.
Mutta asiaan:
Koodari koodaa, eli tekee tietokoneohjelmointia, tämä tarkoittaa yksityiskohtaisten ohjeiden kirjoittamista tietokoneelle, siitä miten tämän pitää toimia tietyssä tilanteessa. Koodi eli ohjeet eivät itse asiassa rajaudu edes tiettyihin tilanteisiin, vaan ohjeet täytyy antaa aivan kaikille tilanteille ja asioille, joita tietokoneen halutaan tekevän.
Tietokone ei osaa olettaa eikä ymmärtää mitä ohjelmoija haluaa sen tekevän, vaan tekee tasan sen mitä käsketään. Jos sovellusta käytettäessä tuntuu siltä, että edessä oleva laite osaa ennustaa kaikki tarpeet mitä sille esittää ja vieläpä täyttää ne. Tämä ei johdu laitteen älykkyydestä, vaan laitteelle annettujen ohjeiden älykkyydestä. Joukko ohjelmistokehittäjiä on osannut rakentaa laitteelle annetut ohjeet niin, että se täyttää kaikki toiveesi ja näyttää vieläpä hyvältä tehdessään sen.
Yleensä tarkoitus on valjastaa tietokoneen laskentateho työkaluksi, tekemään työ ihmisen laskentatehon puolesta. Nykyaikaiset ohjelmat ja sovellukset ovat suoraan verrattavissa helmitauluun, joka kehittyi taskulaskimeksi, joka on nykyään vain yksi sovellus muiden keskellä taskupuhelimessa tai jonka tehtävän hoitaa jokin suuremman kokonaisuuden aliohjelma.
Nykyaikaiset ohjelmistot ovat vain edistyneempiä versioita edellä mainituista, joissa yhteen pakettiin on koottu taskulaskimen tekemä työ, tehtävien asioiden taustalle automatisoidusti. Kun ennen työntekijä käytti laskinta monimutkaisempien laskujen suorittamiseen ja kirjoitti tarvittavat tulokset niille kuuluviin paikkoihin, pyritään tämä nykyään tekemään työntekijän puolesta. Tavoitetila on minimoida käyttäjän tekemät tehtävät, näin siihen käytetyn ajan tarve laskee, eikä inhimillisiä virheitä pääse syntymään, joka kääntyy suoraan säästetyiksi resursseiksi ja paremmaksi tuottoasteeksi.
Käytät tälläkin hetkellä jonkun ohjelmistokehittäjän rakentamia ohjeita laitteelle, jolla luet tätä tekstiä. Sinun vuorovaikutuksesi edessäsi olevan päätelaitteen kanssa noudattaa ns. frontend (käyttöliittymä) puolen ohjeita. Nämä ohjeet kertovat edessäsi olevalle laitteelle miltä sen käyttäminen tulee näyttämään ja tuntumaan sinusta.
Varsinainen sisältö kuten tämä lukemasi teksti, joka voi koostua myös kuvista, videosta tai miltei mistä tahansa muusta, sijaitsee nk. backend ohjeiden hallitsemilla palvelimilla. Palvelin on nimitys tietokoneelle, joka on rakennettu ja ohjeistettu tekemään tiettyä tehtävää tehokkaasti, samoin kuin kotitietokone tai matkapuhelin on nimitys tietokoneelle, joka soveltuu paremmin omaan tehtäväänsä.
Tämä teksti siis sijaitsee fyysisesti Outokummussa olevan tietokoneen tietokantarakenteen solukossa. Kun klikkasit tai tökkäsit jotakin asiaa, joka oli (frontend) ohjeistettu olemaan ruudulla jossakin tietyssä paikassa, oli laitteesi ohjeistettu saapumaan tähän osoitteeseen, jossa tämä sivu sijaitsee. Kun laitteesi saapui tälle sivulle, on sivua ohjeistettu näyttämään juuri siltä miltä se nyt näyttää. Koska tämän sivun ulkonäkö ei yksinään tuota sinulle kovin paljon arvoa, olemme ohjeistaneet sen pyytämään Outokummussa sijaitsevalta tietokoneelta tämän tekstin ja nämä kuvat juuri sinua varten. Kun Outokummussa oleva tietokone saa pyyntömme, sen (backend) ohjeet heräävät henkiin ja lähtevät etsimään pyytämämme sisältöä. Kun ohjeet löytävät sisällön, lähettää tietokone ne takaisin sinun laitteellesi, jossa (frontend) ohjeistus ottaa niistä kopin ja asettelee ne ohjeiden mukaisesti paikoilleen nautittavaksi.
Tietokoneet ovat siis todella monimutkaisia mutta itsessään tyhmiä laitteita. Tietokone tietää asioita, mutta se ei osaa tehdä tiedolla mitään ilman tarkkoja ohjeita mitä tehdä tällä tiedolla. Nämä ohjeet pitää siis kertoa, ohjelmoida tai koodata tietokoneelle.
Jos koodaaminen on vain ohjeiden antamista ja algoritmien kirjoittamista, niin eikö koodarin päivät käy pitkäksi koodia naputtaessa? Jos asia olisi näin yksinkertainen niin kyllä varmasti kävisi.
Lähestytään asiaa esimerkillä. Yksi ohje tietokoneelle, jotta se osaa tehdä jonkin asiakokonaisuuden on algoritmi, näitä kuulee usein verrattavan ruokaohjeisiin, eli kuvaukseen resursseista ja askeleista millä nämä resurssit muutetaan raaka-aineista annokseksi. Vertaus on varsin osuva, mutta tosielämässä tietokoneelle annettavat ohjeet ovat useampia ruokaojeita paljon monimutkaisempia.
Jos verrataan esimerkiksi lihapullien ohjetta, joka on kirjoitettu tekstinä ihmiselle, samoihin ohjeisiin kirjoitettuna koneelle. Kuvitellaan tilanne, että käytössämme on tuotantolinja valmiudessa oleva robottikäsivarsi, jolle meidän pitää antaa ohjeistus lihapullien valmistamiseen. Tämä tarkoittaa jo itsessään, että robotin toimintaa ohjaa satojen tuhansien rivien ohjeistus siitä, miten sen voi liikkua ympäristössä.
1. “Sekoita korppujauho maitoon ja anna imeytyä.”
Robotille pitää ohjeistaa matemaattisesti korppujauhojen, maidon, kulhon ja vispilän lähtö- / päätös sijainti ja liikerata kulhoon varovaisesti kaatamista ja niiden siellä sekoittamista varten. Robotti ei myöskään ymmärrä imeytymisen käsitettä, joten sille määritetään jokin raaka-aineiden määrään suhteutettu aika, jonka se odottaa. Toinen vaihtoehto on liittää konenäköä sen toimintaan, joka on jo itsessään robottikäsiverteen verrattavissa oleva kasa vaadittuja lisäohjeita.
2. “Kuori ja hienonna sipuli. Voit halutessasi pehmentää sipulin paistamalla sen pannussa.”
Kun korppujauhojen imeytymisajastin raksuttaa alaspäin, voidaan aktivoida ohjeet sipulin kuorimiseen ja hienontamiseen. Tämä tapahtuu kohdan 1. tapaan antamalla tarkat matemaattiset koordinaatit kaikille liikkeille, jotka robotti suorittaa. Missä veitsi sijaitsee? Missä sipulit? Jos sipulit ovat erikokoisia, tämä täytyy ottaa jotenkin huomioon, muuten liian pieni sipuli ei pysy kourassa tai koura murskaa liian suuren sipulin. Mihin siirretään sipulin kuoret? Entä kannat? Mihin veitsi lasketaan, kun tarpeeksi sipuleita on kuorittu ja hienonnettu? Robotilla ei myöskään ole preferenssiä tarvitseeko sipulin olla pehmeää, preferenssi täytyy joko ohjeistaa robotille tai se voidaan määrittää tapahtumaan vaikka näennäisen satunnaisesti.
Ohjeistuksen edetessä se muuttuu jatkuvasti monimutkaisemmaksi ja virhealttiimmaksi, tästä saa jo hieman kuvaa siitä minkälaisia ongelmia ohjeiden kirjoittamiseen tietokoneelle liittyy. Myös virheet ohjeissa saattavat johtaa katastrofaalisiin lopputuloksiin, pilkkuvirhe paistoajassa ja lihapullat palavat, sama virhe yhden liikkeen koordinaateissa niin hella tai robotti murskaantuu kasaksi jätemetallia. Hyvien ohjeiden kirjoittaminen on siis jatkuvaa ongelmanratkaisua, joka ei taatusti käy pitkäveteiseksi, jos sen tekemiseen on tarpeeksi resursseja.
Monimutkaisten ongelmien ratkaisemiseksi täytyy löytää oikeat ohjeet ja toteutustavat näille ohjeille. Mitä monimutkaisemmista ohjeista on kyse, sitä enemmän niiden arkkitehtuuria täytyy suunnitella etukäteen, jotta voidaan välttyä suuremmilta ongelmilta tulevaisuudessa.
Kun ongelmia ratkotaan, ei niitä ratkota yksin. Sovelluskehittäjät kommunikoivat jatkuvasti tiimin ja muiden organisaation sisäisten tahojen kanssa. Jottei mökkihöperyys pääse liian pahasti iskemään, niin pääsee myös oman organisaation ulkopuolisten sidosryhmien (asiakkaat, yhteistyötahot yms.) kanssa aivan varmasti jutulle. Sovelluskehittäjät tuntuvat myös rakentavan varsin ahkerasti yhteisöjä oppimisen ja tiedon jakamisen ympärille.
Suurin osa ajasta menee ongelmien ratkaisemiseen, kun ongelma on ratkaistu pitää se vielä kirjoittaa tehokkaaksi ohjeeksi eli hyväksi uudelleenkäytettäväksi koodiksi. Me tehdään Kooderssilla websovelluskehitystä ja verkkosivustoja aika perinteisillä selainpohjaisilla teknologioilla, joten tämä tarkoittaa sitä, että pääsee hyppimään aika monenkin ohjeistuskielen välillä päivän aikana. Jos tätä haluaa verrata johonkin toiseen ammattiin, niin veikkaisin viisikielisessä asiakaspalvelussa olevan tulkin osuvan aika lähelle. Meidän kohdalla ei ratkota erikielisten ihmisten vaan monikielisten koneiden ongelmia, joka onneksi sopii kaltaiselleni introvertille varsin mallikkaasti.
Puhtaan koodaamisen lisäksi, tallainen full-stack (monia työtehtäviä tekevä) ukko tekee myös visuaalisia ilmeitä organisaatioille, tuotteille ja palveluille. Tässä pääsee jeesaamaan taas itseään, kun voi toteuttaa käytettävät graafiset materiaalit valmiiksi optimoituna, eikä tarvitse repiä hiuksia päästä teknisesti huonojen ratkaisujen kanssa. Myös käyttöliittymiin ja käytettävyyteen liittyviin asioihin pääsee vaikuttamaan jo suunnitteluvaiheessa.
Niin ja luet muuten parhaillasi blogia, joten kyllä tämä copywriteeminen (julkisen tekstin tuottaminen) tuo myös vaihtelua siihen tietokoneiden ymmärtämän tekstin luomiseen. Toki vaihtelua arkeen tuo myös podcasteissa itsensä nolaaminen.
Logo on yritysilmeen kulminoituma, siihen pitäisi saada tiivistettyä koko yrityksen brändi ja identiteetti.
Tässä on minun #työpisteeni josta ei löydy ihan hirmuisesti mitään ylimääräistä.
Ongelman ratkaisu alkaa ongelman ymmärtämisestä.