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.