torstai 17. lokakuuta 2019

Koodaus - kansalaistaito?

Koodaus- tai oikeastaan ohjelmointi on jotain uutta ja modernia. Se on digiaikaa, ohjelmat rakentavat tulevaisuuttamme - ja tekevät nykyisyytemme hankalaksi. Pitäisikö meidän tietää jotain ohjelmoinnista? Ainakin kouluihin on haluttu ohjelmoinnin opetusta. Ehkä se saa oppilaat jopa innostumaan koulunkäynnistä. Teollisuus valittaa koodaripulaa (koodari tarkoittaa siis ohjelmoijaa, koodivääntäjää, softanörttiä, koodiapinaa...). Huoli on herännyt. Miten meidän käy tulevaisuudessa? Pitäisikö maahanmuuttajista ja työttömistä metsureista kouluttaa koodareita? 

Hyvä. Aion nyt kertoa tosiasioita ohjelmoinnista. Istukaa tukevasti ja pidelkää hatuistanne.

Minulla on luultavasti riittävästi natsoja sanomaan asiasta jotain. Olen työssäni koodannut vuosien varrella kymmenillä erilaisilla ohjelmointikielillä. Ensimmäisen ohjelmani tein kesällä vuonna 1968, päästyäni juuri opiskelemaan teknilliseen korkeakouluun (nyk Aalto yliopisto, latojan huomautus). Opettelin käsikirjasta ALGOL - nimistä ohjelmointikieltä. Sitten "kirjoitin" ohjelman lävistämällä sen reikäkorteille. Korttinippu kiikutettiin laskentakeskukseen, josta seuraavana päivänä saattoi hakea ohjelman tuottamat tulosteet. Jännityksellä odotetut tulokset saattoivatkin olla vain pari sivua paperia, muutama harva rivi ja pölkkykirjaimilla tuomio: SYNTAX ERROR. Ahaa, ohjelmassa on virhe, pitää korjata. Uudelleen lävistetyt korjatut reikäkortit pakkaan viallisten tilalle, ja nippu uudelleen laskentakeskukseen. Ehkä se nyt toimii - tai sitten ei vieläkään. 

Tämähän on pelkkää teknologianostalgiaa! Tietokoneet ovat kutistuneet satojen kilojen painoisista kaapeista muutaman gramman siruiksi. Ohjelmia ei enää lävistetä pahvikorteille tai paperinauhoille, vaan ne sijaitsevat sähkövarauksien näkymättäminä kuvioina piisirujen pinnalla, tai ne pannaan pilveen (joka on kyllä ihan oikea sähköllä käyvä kone jonkin entisen tehdasrakennuksen konehallissa). Tietokoneiden valtavasta fysikaalisesta metamorfoosista huolimatta tosiasiat eivät ole puolessa vuosisadassa miksikään muuttuneet. Joten voin paljastaa salaisuuden: ohjelmointi on KOVAA TYÖTÄ. 

Oudompaa on, että ulkonaisesta metamorfoosista huolimatta myöskään tietokoneet eivät ole periaatteessa juurikaan muuttuneet. Samat ideat, samat periaatteet, samat arkkitehtuurit. Tietokoneet ovat syvällä sisimmässään edelleen Neumannin koneita, ja kaukaista sukua Turingin koneille*. En nyt mene pidemmälle tähän, etten eksy liikaa aiheesta.

Kun kuuntelee ohjelmoinnista käytävää keskustelua tai juttelee koodareiden kanssa, tulee mieleen, että asiat tehdään nykyään jollain lailla väärin, eri tavalla kun minulle on opetettu. Aletaan heti kirjoittaa koodia sellaisella oletuksella, että kyllä se siitä! Eli uskotaan että ennen pitkää ohjelma alkaa jollain lailla toimia. On olemassa myös toinen filosofia, jonka itse olen havainnut hyväksi. Ei pidä kirjoittaa pätkääkään koodia ennen kuin tietää tarkkaan, millainen ohjelmasta tulee. Ohjelma pitää ensin suunnitella ja analysoida tehokkailla abstrakteilla menetelmillä, ja vasta viimeiseksi rakentaa tarvittava koodi. 

Suoraviivaista koodista lähtevää ohjelman rakentamista sanotaan joskus ketteräksi ohjelmoinniksi. Myönnän ja tiedän, että menetelmällä on hyviä puolia. Mutta tuntuu myös siltä, että työyhteisö on joutunut karkean taylorismin** uhriksi. Henkistä työtä on erittäin vaikeaa mitata, mutta ohjelmointia mitataankin koodiriveillä. Joten niitä sitten tehtaillaan. Vanha normi on, että ohjelmoijan tulee tuottaa 20 koodiriviä päivässä. Ei tunnu paljolta, mutta lisään, että sillä tarkoitetaan dokumentoitua ja testattua koodia. Ei enää niin helppoa. En tiedä nykyistä normia, jos sitä onkaan. Tehokkuus riippuu ratkaisevasti ohjelman koosta ja mutkikkuudesta, ja myös työkaluista: käytössä on eri tasoisia kieliä, alustoja ja "koodigeneraattoreita". Kontekstianalyysi, tietovuoanalyysi tai tilasimulointi ei kumminkaan tunnu olevan järkevää työtä, koska se ei synnytä mitattavia koodirivejä vaan ainoastaan ymmärrystä!

Vuosikymmeniä olen odottanut, että teknologia kehittyisi ja ohjelmien tekeminen tulisi tehokkaammaksi. Oikeastaan pitäisi päästä niin korkealle abstraktiotasolle, että ohjelmoinnista sen perinteisessä merkityksessä ei edes puhuttaisi. Jostain syystä tämä visio ei ole toteutunut. Merkittävien ohjelmistojen kehitys, kuten sellaisten jotka helpottaisivat vaikka terveydenhuollon ammattilaisten työtä, on suunnattoman kallista, ja tulosten laatu on huono. Ulkoa katsoen, sillä en ole vähään aikaan koodannut, ison ohjelman tekeminen muistuttaa ensimmäisen maailmansodan sodankäyntiä. Yhä uusia pataljoonia koodareita marssitetaan uppoamaan mutaisiin juoksuhautoihin.

Minua kovemmat teknologiagurut ovat miettineet päänsä puhki, miten tämä asia pitäisi korjata. Joten ohjelmoinnin tuottavuus- ja laatuongelman täytyy olla hyvin vaikea. En minäkään osaa ehdottaa ratkaisua, jätän sen viisaammille. Jotain olen asiasta kyllä kirjoittanut, katso teksti Ohjelmointi - suurenmoista ja raivostuttavaa. Mutta yleisen ymmärryksen takia voisi asiasta jotain sanoa. Ohjelmoinnissa käytetään edelleen yleisesti ohjelmointikieliä, ja ne ovat matalan abstraktiotason työvälineitä. Suuren järjestelmän rakentaminen ohjelmointikielen lauseista on kuin rakentaisi pilvenpiirtäjää pulteista, muttereista ja kulmaraudoista, ja nekin olisivat osittain itse suunniteltuja. Kokonaisuuden hahmottaminen pienten osien tasolta on vaikeaa, ja koska osia on paljon, myös virheitä on paljon ja ne on vaikea löytää. Toinen ongelma on ohjelmistoteollisuuden suuri koko. Laajalle levinneet huonot työkäytännöt ovat muuttuneet kulttuuriksi, niitä on vaikea ruotia pois.

Onko ohjelmointi tai "koodaus" tulevaisuuden kansalaistaito, ja pitäisikö se saada kouluihin jo ala-asteelle? Ammatillisessa mielessä se ei sitä ole, koska oikeastaan ohjelmoinnista pitäisi päästä eroon. Mutta toisaalta ohjelmointi on vaativaa ja myös mukaansa tempaavaa toimintaa. Se on yleissivistävä aine, samalla lailla kun historia ja matematiikka. Joten tarkemmin ajatellen olen kuitenkin toista mieltä. Ohjelmointi pitäisi saada jossain muodossa kouluihin matematiikan rinnalle. Ohjelmointi opettaa keskittymään työhön, se on kiinnostavaa, ja se osoittaa konkreettisesti, kuinka helposti voi saada aikaan jännittäviä asioita.

Mistä koodaamisessa on sitten oikein kysymys, millaista työtä se on? Koetan selvittää sitä yleistajuisesti, siis ei-nörteille.

Koodauksessa laaditaan kirjoitusta muistuttavaa tekstiä, jonka tietokone pystyy lukemaan. Siis vaikkapa tietokoneeseen kytketyllä näppäimistöllä. Tämä on nykyään aika tuttua hommaa. Tekstin sisältö, koodi koostuu yksinkertaisista operaatioista eli käskyistä. Niiden avulla voidaan käsitellä symboleja, kuten kirjaimia, laskea, ja tutkia ja muuttaa muistipaikkojen arvoja. Esimerkiksi käsky SUB (A,B) voisi tarkoittaa, että muuttujan A arvosta vähennetään muuttujan B arvo. Käsky SET (A, 7) asettaa muuttujalle A arvon 7. Käskyjen kirjoittamiseen on tietyt säännöt, ja näitä sääntöjä sanotaan ohjelmointikieleksi. Kieliä on keksitty paljon, yleisiäkin on kymmeniä. Edellä mainitut SUB- ja SET- käskyt voidaan jossain toisessa kielessä kirjoittaa yksinkertaisemmin, vaikka (A-B) ja A=7.

Ohjelmakielessä käsitellyt muuttujat voivat tarkoittaa erilaisia asioita. Ne voivat olla dataa, niinkuin laskennassa tai käsiteltäessä tekstiä. Tai ne voivat tarkoittaa kuvaruudun tai tulostusalustan kuvapisteitä, jos käsitellään kuvia tai tehdään tietokonegrafiikkaa. Tai muuttujat voivat kytkeytyä sähkömekaanisiin komponentteihin, moottoreihin ja releisiin, jos tietokoneella haluaan ohjata robottia. 

Ohjelma on jono peräkkäisiä käskyjä, ja kun ohjelma käynnistetään, tietokone käy niitä läpi järjestyksessä. Erityisen tehokkaita käskyjä ovat loogiset operaatiot eli ehdolliset käskyt. Niiden avulla tietokone osaa tehdä yksinkertaisia päätelmiä ja valintoja. Esimerkki: käsky IF (A>B) tutkii, onko muuttujan A arvo suurempi kuin muuttujan B. Jos ei ole, ei asiasta välitetä, mutta jos on, tietokone siirtyy uuteen paikkaan käskyjonossa. Jossain kielessä tämä voidaan ilmaista käskyllä JUMP (A>B, 275), missä 275 on uusi paikka käskyjonossa.

Erityisen tehokas ohjelmoinnin niksi on nimeltään aliohjelma. Usein tietokone joutuu tekemään toistuvasti samoja asioita. Niitä ei tarvitse kuitenkaan ohjelmoida joka kerta erikseen, vaan voidaan tehdä ohjelma, johon tietokone voi hypätä aina tarvittaessa. Esimerkiksi laskemaan keskiarvon joukosta lukuja. Voidaan tehdä pieni ohjelma jolle annetaan helposti muistettava nimi, kuten KARVO. Tai ohjelma jonka saa robotin ojentamaan käsivarttaan, OJENNA. Niinpä käsky KARVO(A,1300, 4750) voisi laskea keskiarvon 1300 luvusta, lukujono alkaa muistipakasta 4750, ja tulos sijoitetaan muuttujan A arvoksi. Käsky OJENNA(380) saa robotin ojentamaan käsivarttaan eteenpäin 380 mm. Käsky CIRCLE (340, 120, 45) piirtää kuvaruudulle ympyrän, jonka keksipisteen koordinaatit ovat 340,120 ja säde on 45. 

Yllä käytin havainnollisuuden takia keksittyjä käskyjä, niin sanottua pseudokoodia. Mutta niitä vastaavat toiminnat löytyvät kaikista ohjelmointikielistä. 

Tällaista on ohjelmointi pähkinänkuoressa. Pitää suunnitella ja kirjoittaa käskyjonoja, jotka saavat tietokoneen tekemään haluttuja asioita. Ohjelmointi vaatii kurinalaisuutta ja keskittymistä. Tärkeintä on opetella tuntemaan ne säännöt joilla ohjelmaa tehdään, eli ohjelmointikieli. Mielestäni edellä kuvatuista esimerkeistä huomaa vahvan yhteyden matematiikan opetukseen. Ohjelmointi on abstraktia, siinä käsitellään numeroita, kirjaimia ja symboleja tiettyjen sääntöjen mukaan, ja se mitä siitä syntyy, tarkoittaa jotain. Tämä on tärkeä oivallus.

Koululaisille ehkä sopivin aloittelijan ohjelmointikieli lienee edelleen vuosikymmeniä vanha BASIC, jokin sen monista versioista. On olemassa myös graafisia lapsille suunnattuja ohjelmointialustoja, ne tekevät ohjelmoinnista vielä helpompaa. 

Toinen yleinen ohjelmoinnin muoto on nettisivujen tekeminen. Siinä perusmenetelmänä on HTML- niminen ohjelmointikieli. Sen avulla voidaan määritellä, miten tekstejä, kuvia ja multimediaa sisältävä tiedosto näkyy ja toimii tietokoneen ruudulla. Sivuja voi tuottaa myös sivueditoreilla, jotka piilottavat varsinaisen HTML- koodin. Koodia tarvitaan vain yksityiskohtien hienosäädössä.

Lapsetkin pääsevät helposti ohjelmoinnin makuun, sillä käskyt ovat varsin yksinkertaisia, ja kymmenkunta peruskäskyä riittä jo pitkälle. Ammattimainen ohjelmointi on toki paljon vaikeampaa. Siinä joutuu perehtymään johonkin tekniseen alakulttuuriin: konealustaan, tietorakenteisiin, ohjelmointikieliin ja ohjelmoinnin työkaluihin. Ja tietenkin ennen kaikkea ohjelmoinnin sovelluskohteen rakenteeseen ja toimintaan. Tästä kaikesta syntyy tiheä erikoistermien, käsitteiden ja lyhennysten viidakko. Siitä selviäminen on merkittävästi vaikeampaa kuin jonkun ohjelmointikielen käsikirjaan perehtyminen. 

Helposti ajatellaan, että ohjelmointi on jotain uutta, tietoyhteiskunnan ilmiöitä. Mutta sillä on pitkät juuret. Ohjelman ideana ja mallina on ajassa etenevä prosessi. Ja musiikkiesitys on juuri sellainen prosessi. Musiikin tekijät alkoivat jo yli tuhat vuotta sitten vuosia sitten merkitä sävellyksiä muistiin pergamentille ja paperille. 1600- luvulla oli jo kehittynyt nykyisen kaltainen merkintätapa. Tarkastelin jokin aika sitten aivan uutta nykymusiikkipartituuria, eli siis nuotinnettua sävellystä. Nuotinnus on edelleen laajassa käytössä, vaikka musiikki koostuisi laulajista, instrumenteilla soitetuista jaksoista, koneilla tuotetuista äänistä ja nauhaleikkeistä.

Insinöörin silmin tällainen partituuri edustaa modernia ja haastavaa reaaliaikaohjelmointia (se on tekniikka, jolla ohjelmoidaan esimerkiksi monimutkaisia koneita ja robotteja). Siinä erottaa heti rinnakkaiset prosessit, ajoituksen kontrolliin tarkoitetut merkinnät ja erilaiset synkronoinnit. Muusikot ovat olleet ohjelmoijina satoja vuosia insinöörejä edellä.

Varsinainen tekninen ohjelmointi on myös ikivanhaa. Ennen teollista aikaa automaatio ei ollut tuotantokäytössä, työvoimaa ja orjia kun on ollut helposti saatavissa. Sen sijaan insinöörit rakensivat erilaisia koneita ja laitteita huvittaakseen ja pelotellakseen ihmisiä. Renessanssinero Leonardo da Vinci rakensi muun muassa mekaanisen leijonan ja ritarin. Ohjelmalaitteena hän käytti erityisellä tavalla muotoiltuja kiekkoja, jotka pyöriessään liikuttivat hänen robottiensa ohjausvipuja.

Tärkeä ohjelmoitava kohde on ollut myös soittorasiat, musiikkiautomaatit ja jopa kokonaiset mekaaniset yhtyeet. Nyt otettiin käyttöön myös vaihdettavat ohjelmat. Ne oli valmistettu metallikiekoille, rummuille, paperinauhoille ja pahvikorteille. Nykyajan ihminen huomaa heti ainakin pinnallisen yhteyden tietokoneiden kanssa. Rumpuja, levyjä ja nauhoja on käytetty myös tietokoneiden ulkoisina muisteina. 
 
Ohjelmointi astui teollisuuden palvelukseen 1700-luvulla. Toisiinsa liitetyille pahvikorteille lävistetyillä rei'illä alettiin ohjata kutomakoneen loimien vaihtoja. Joseph Jacquardin keksimällä koneella alettiin valmistaa taidokkaita kuvakudoksia eli gobeliineja. Ne olivat aikanaan hyvin suosittuja ja arvokkaita, ohjelmointi oli nyt löytänyt taloudellisesti merkittävän sovelluksen. Jacquardin kone teki voimakkaan vaikutuksen aikalaisiin. Englantilainen matemaatikko Charles Babbage (1791–1871) oivalsi, että samaa periaatetta voisi käyttää laskukoneen ohjaukseen. Hänen analyyttinen koneensa oli nykyaikaisen tietokoneen suora edeltäjä. Babbage ei koskaan saanut konettaan valmiiksi. Se oli aivan liian monimutkainen mekaanisena laitteena rakennettavaksi. Olen kertonut tästä merkittävästä yrityksestä kirjoituksessani Joseph Jacquardin muotokuva
 
Ohjelmoinnin periaate oli nyt kypsynyt tietoa käsittelevien koneiden keskeiseksi tekniseksi ideaksi. Koska tietokoneet ovat hyvin joustavia, ohjelmoimalla voidaan nykyään tehdä niitä kaikkia asioita, joihin tätä periaatetta on yritetty vuosisatojen aikana käyttää. Tietokoneet ohjelmat ohjaavat androideja, robotteja ja teollisuuden koneita, ne laskevat, tuottavat kuvia ja tuottavat musiikkia. 

Nämä esimerkit paljastavat uuden kuvion. Ohjelmointi ei ole tietoyhteiskunnan kansalaistaito, vaan jotain sitä enemmän. Se on yleinen ja laaja-alainen abstraktin ajattelun muoto, jonka sovellukset vaihtelevat suunnattomasti. 
 
--
*) Nykyaikaisen tietokoneen isiä ovat unkarilainen matemaatikko John von Neumann (1903–1957) ja brittiläinen matemaatikko Alan Turing (1912–1954). Pioneereihin pitää vielä lukea informaatioteorian keksijä, amerikkalainen matemaatikko Claude Shannon (1916–2001). Hän oivalsi, että laskeva kone voi perustua Boolen logiikkaan ja elektronisiin loogisiin piireihin.

**) taylorismi tarkoittaa Frederic Taylorin kehittämää työnjohto-oppia sen karkeassa muodossa.