Perushahmotusta ohjelmointiin 1: tietokone, ohjelmointi, algoritmi

Ohjelmoinnin merkitystä on vaikea tajuta, jos sitä tarkastellaan vain irrallisena teknisenä suorituksena. Ohjelmat hallitsevat nykyään kaikkea tietotekniikkaa samalla, kun tietotekniikka on läsnä kaikessa elämässämme. Siksi on perusteltua rinnastaa ohjelmointi muihin henkisiin perustaitoihin: lukemiseen, kirjoittamiseen ja laskemiseen.  

Tietokoneen isoisäksi on sanottu englantilaista matemaatikkoa Charles Babbagea (1792–1871). Hänen suunnittelemiensa koneiden tehtävänä oli laskeminen. Tehtävä olisi annettu tietokoneelle reikäkorteilla, samalla periaatteella, joka oli ollut käytössä jo aikaisemmin kutomakoneiden ohjaamisessa. Kone olisi näyttänyt tuloksen pyörittämällä rattaansa oikeaan asentoon. Babbage kehitteli suunnitelmiaan kymmenien vuosien ajan, mutta yhtään toimivaa konetta hän ei saanut valmiiksi. 

Seuraavan olennaisen askeleen otti englantilainen matemaatikko ja loogikko Alan Turing (1912–1954) [1]. Hänen suunnittelemansa kone olisi lukenut ohjeet paperinauhalta. Se ei ollut enää pelkkä mekaaninen laskin, vaan sen tehtävänä oli päätellä, onko annettu lause loogisesti tosi vai ei. Kone sinänsä ei ollut älykäs, vaan päättely olisi ollut muutettava laskutoimituksia vastaavaksi algoritmiksi. Turing itse suhtautui asiaan varauksellisesti sanomalla, että ”jos koneen oletetaan olevan erehtymätön, niin se ei voi samalla olla älykäs”. Tietokoneen älykkyyttä mittaava Turingin testi on seurausta näistä pohdiskeluista. Tietokone läpäisee Turingin testin, jos sen kanssa keskusteleva ihminen ei osaa päättää, keskusteleeko hän ihmisen vai koneen kanssa.

Ensimmäinen yleiskäyttöinen elektroninen tietokone ENIAC valmistui Yhdysvalloissa syksyllä 1945. Se koostui yli 17 000 elektroniputkesta ja 1 500 releestä. Konetta ohjelmoitiin mekaanisesti johtimia kytkemällä ja kytkimiä kääntämällä. Data syötettiin reikäkorteilla erillisen lukijan kautta, koska koneessa ei ollut keskusmuistia lainkaan. Tätä sanottiin eräajoksi, koska koko tehtävä oli suoritettava yhdellä kerralla alusta loppuun. Mitään vuorovaikutteisuutta ei vielä ollut. Eräajoa käytetään vielä nykyään suurten yritysten päivä- tai viikkoraporttien kokoamiseen sekä raskaaseen laskentaan ja tiedostojen muokkaamiseen silloin, kun suurkoneiden vuorovaikutteinen suorakäyttö on vähäisempää. 

Magneettisia muisteja alkoi tulla tietokoneisiin 1950-luvulla ja puolijohdemuisteja 1960-luvulla. Ensimmäinen näppäimistö otettiin käyttöön 1956, mutta reikäkortteja ja -nauhoja käytettiin tiedon syöttämiseen ja tulostamiseen vielä pitkään. Tulostuslaitteina alettiin käyttää aakkosnumeerisia rivikirjoittimia. Käyttöliittymistä alettiin puhua vasta tietokoneen vuorovaikutteisen käytön yhteydessä. Yksikertainen yhdistelmä oli näppäimistö tai teletype-pääte, jolla voitiin kirjoittaa yksi komentorivi kerrallaan, ja aakkosnumeerinen näyttö. 

Tietokonehiiren periaate esiteltiin 1960-luvulla, mutta se sekä ohjaussauvat ja piirtoalustat alkoivat yleistyä syöttölaitteina vasta 1980-luvulla graafisten käyttöliittymien mukana. Nykyään tietokoneita voidaan ohjata monilla muillakin tavoilla kuten puhe- ja eleohjauksella. Tavallisin käyttöliittymämalli on nykyään WIMP (windows, icons, menus, printing device).  Tulostuslaitteenkaan ei tarvitse olla fyysinen laite, vaan se voi olla virtuaalitulostin, joka tulostaa suoraan tiedostoon.  

Tietokoneiden kehittyminen on ollut vajaan 80 vuoden aikana hyvin nopeaa. Nykyisten supertietokoneiden laskentateho ylittää ENIACin monibiljoonakertaisesti, puhumattakaan tulossa olevista kvanttitietokoneista. Raja tietokoneiden ja muiden laitteiden välillä on häviämässä. Älypuhelimessasi saattaa olla useampikin mikrosiru, joista kunkin laskentateho on monituhatkertainen ENIACiin verrattuna. Monet muutkin laitteet rannekellosta, kodinkoneista ja autoista teollisuuslaitosten tuotantolinjoihin asti pystyvät tekemään automattisesti toimintaansa koskevia ratkaisuja ja pitämään yhteyttä keskenään internetin välityksellä siinä missä tietokoneetkin. Ei turhaan puhuta tekoälystä ja esineiden internetistä [2]

Ohjelmointi

Pohjimmiltaan ohjelmoinnissa on kyse siitä, että ihminen saa tietokoneen tekemään haluamiaan asioita ja kertomaan aikaansaamisistaan ihmisen ymmärtämässä muodossa. Ensimmäiset ohjelmat koostuivat ykkösten ja nollien jonoista, jotka tietokone tulkitsi toimintaohjeiksi. Tätä kutsutaan konekieleksi [3] . Seuraava kehitysvaihe oli symbolinen konekieli, jossa pitkät nolla- ja ykkösjonot oli nimetty lyhyillä kirjainyhdistelmillä. Ohjelmointi edellytti laitteen tarkkaa tuntemista ja oli siksi vain asiantuntijoiden tai erityisharrastajien puuhaa.

Ohjelmoinnin laitesidonnaisuudesta alettiin pyrkiä eroon jo 1950-luvulla ryhtymällä kehittelemään laiteriippumattomia ns. korkean tason ohjelmointikieliä. Ensimmäisenä yleisesti käytettynä korkean tason kielenä pidetään IBM:n vuonna 1957 julkaisemaa kieltä nimeltä Fortran (Formula Translation). Se on edelleen käytössä. Siitä on pitkä kehityskulku nykyisiin ohjelmointikieliin [4] ja ohjelmiin [5], esimerkiksi peleihin tai työvälineohjelmiin, joihin toiminnot on ohjelmoitu valmiiksi. Arviot erilaisten ohjelmointikielten määrästä vaihtelevat 700:sta 9000:een riippuen siitä, mitä pidetään eri kielinä. Niitä voidaan luokitella sekä käyttötarkoituksensa että toimintatapansa perusteella [6].

Ohjelmointi on ihmisen tapa kommunikoida tietokoneen kanssa. Viimeisinä vuosikymmeninä ihmisen ja koneen välistä vuorovaikutusta on tutkittu monesta näkökulmasta [7], [8]. Ohjelmointiosaamisen osalta ammattilaisen ja tavallisen ihmisen tarpeet eroavat toisistaan yhtä paljon kuin auton suunnittelijan ja rakentajan tarpeet eroavat tavallisen autonkäyttäjän tarpeista. Tavallisen kansalaisen ohjelmointitietouden tarve vastaa siten esimerkiksi auton tai sähkölieden hallintalaitteiden tuntemista. 

Ohjelmoinnillista ajattelua [9] voidaan harjoitella jo ennen varsinaista ohjelmointia ja ilman tietokonettakin. Siihen kuuluu tehtävien jakaminen pienempiin osavaiheisiin, näiden tarkka kuvaaminen ja laittaminen oikeaan suoritusjärjestykseen. Tällainen toimintaohje voi olla esimerkiksi koulumatkan kuvaus, päivän lukujärjestys tai ruoan valmistusresepti. Ohjelmoinnin perusidea on siis hyvin yksinkertainen. 

Ensimmäinen vaihe on ohjelman suunnittelu. Pitää kuvata, mitä ohjelman on saatava aikaan. Tämä voi tapahtua tavallisella arkikielellä. Halutut toiminnat luetellaan ja pannaan oikeaan järjestykseen. Toinen vaihe on ohjelman kirjoittaminen tietokoneen ymmärtämään muotoon eli koodaus. Kolmas vaihe on ohjelman testaaminen ja virheiden korjaaminen. 

Joissakin ohjelmointiympäristöissä nämä vaiheet voivat yhdistyä limittäin tehtäviksi. Niin ainakin silloin, kun ympäristö (ohjelmointikieli) on tulkitseva, jolloin ohjelmaa voidaan kokeilla jo suunnitteluvaiheessa komento kerrallaan. Tämä perustuu siihen, että komentotulkiksi kutsuttu ohjelma tulkitsee koodia tietokoneen ymmärtämään muotoon pala palalta toteutuksen aikana. Tällaisia ohjelmointikieliä ovat esimerkiksi Logo ja Python. Lähestymistavasta käytetään nimitystä ”alhaalta ylös” (bottom up). 

Esimerkiksi C-kielessä ohjelma kirjoitetaan ensin valmiiksi kokonaan, käännetään sitten tietokoneen ymmärtämään muotoon ja tallennetaan lopuksi toteutettavaksi eli ajettavaksi ohjelmaksi. Kääntävässä kielessä on siis kaksi teknistä vaihetta enemmän kuin tulkitsevassa kielessä. Tällaisesta ohjelmankirjoittamisjärjestyksestä käytetään nimitystä ”ylhäältä alas” (top down).

Ohjelmointia opetettiin joissakin suomalaisissa kouluissa jo 1970-luvulla atk-kerhoissa ja useimmissa yläluokkien kouluissa ja lukioissa 1980-luvulta lähtien, ei kaikille oppilaille, vaan valinnaisaineissa ja koulukohtaisissa kursseissa. Se oli osa tietotekniikan opettamista ja ensisijaisena päämääränä työelämän tarpeet. Aluksi kielenä oli Basic ja sitten usein C-kieli (myöhemmin C+, C++ tai C#) ja joissakin kouluissa Prolog.  

Myös Logoa käytettiin monen koulun opetuksessa, mutta sen opettamisen päämääränä ei ollut niinkään opettaa ohjelmointia kuin edistää yleisesti ajattelun taitoja ja erityisesti matematiikan oppimista MIT:n matematiikan ja kasvatustieteen professorin Seymour Papertin luonnehtimassa hengessä [10]. Yleisenä päämääränä oli antaa lapsille käsitys siitä, miten tietokonetta hallitaan. Pedagogisista syistä Logon osaksi oli luotu ns. kilpikonnagrafiikka, joka otettiin myöhemmin osaksi monia muita ohjelmointiympäristöjä.

Algoritmi

Ohjelmointitaito ei ole ehkä vieläkään keskeinen päämäärä kaikkien oppilaiden osalta yleissivistävässä koulussa, vaan peruskäsitys ohjelmoinnista. Se on kaikille tarpeellinen osa maailmankuvaamme yhä teknistyvämmän ympäristömme ymmärtämisen vuoksi. Ohjelmoinnin tuloksilla eli ohjelmilla on nimittäin keskeinen asema kaikkialla pienestä mp3-soittimesta tai älypuhelimesta kaupan kassapäätteisiin ja pankkiautomaatteihin sekä avaruuslentoihin ja maailmanlaajuisiin tietoverkkoihin. 

Omaa ohjelmistolajiaan edustavat hakukoneiden ja sosiaalisen median algoritmit, jotka arvioivat, millaisia olemme, ja päättävät puolestamme, mistä meidän tulisi olla kiinnostuneita. Joskus ne tuovat ulottuvillemme asioita, joita emme osaa etsiäkään, mutta ehkä vielä useammin rakentavat ympärillemme tieto- ja mainoskuplia, joilla pyritään vaikuttamaan kaupalliseen tai yhteiskunnalliseen käyttäytymiseemme.

Halusimme tai emme, olemme internetissä jatkuvasti algoritmien seurannan kohteina [11]. Meitä koskevat tiedot ovat taloudellisesti tuottavaa riistaa. Tietojen kerääminen on nykyään laajaa kaupallista toimintaa. Onpa siihen erikoistuneita yrityksiäkin, jotka eivät tee muuta kuin keräävät tietoja ihmisistä ja myyvät niitä eteenpäin. Eikä kyse ole vakoiluohjelmista tai muusta rikollisesta toiminnasta. Suuret somejätit, kuten esimerkiksi Facebook, Google ja Twitter, keräävät tietoja yksityishenkilöistä osana normaalia toimintaansa. Tietojen kerääminen on automatisoitu ja siitä vastaavat algoritmit. Monet verkon käyttäjät antavat vieläpä luvan tähän joko huomaamattaan tai varomattomuuttaan.

Mikä algoritmi sitten on? Kielitoimiston verkkosanakirjan [12] määritelmä on ”sarja täsmällisesti määriteltyjä käskyjä tai toimenpiteitä jonkin tehtävän suorittamiseksi”. Jotkin muut määritelmät saattavat korostaa algoritmin matemaattista luonnetta. Paperilla laskettavien peruslaskutoimitusten laskuasetelmiakin nimitetään algoritmeiksi. Tietoja keräävät, mainoksia kohdentavat, hakukoneiden tuottamia tietoja näyttävät tai terveydenhoitojärjestelmää ylläpitävät algoritmit ovat laajoja ja huolellisesti suunniteltuja ohjelmistoja. Tai sitten eivät.

Hannah Fry kertoo [11, s. 31–32] Idahon osavaltiossa Yhdysvalloissa vuonna 2012 tehdystä vammaisavustuspäätösten tekemisen antamisesta tietokoneen vastuulle. Yhtäkkiä tuli paljon suuriakin muutoksia, joista osa vaikutti mielivaltaisilta. Kyseessä ei ollut poliittinen päätös, vaan käyttöön otettu tietokoneohjelma, joka laski automaattisesti, millainen tukitaso kullekin henkilölle kuului. Kun päätösten perusteluja perättiin, niin järjestelmän toimittanut yritys kieltäytyi tietojen antamisesta vedoten siihen, että tietokoneohjelma oli liikesalaisuus. Asia selvisi vasta neljä vuotta, 4 000 henkilön ryhmäkannetta ja yhtä oikeudenkäyntiä myöhemmin. Järjestelmän takana ei ollut mitään tekoälyä, vaan ”algoritmi” oli vain Excel-taulukko. Kun asiaa tutkittiin tarkemmin, havaittiin datassa paljon bugeja ja ”perustavanlaatuisia tilastollisia virheitä tavassa, jolla matemaattinen kaava oli muodostettu”.  

Esimerkki saattaa tuntua kaukaa haetulta, mutta siinä näkyy useita tärkeitä asioita. Ensinnäkin elämäämme vaikuttavien algoritmien tulisi olla läpinäkyviä siinä mielessä, että tiedettäisiin, mihin päätökset perustuvat. Toiseksi varsinkin julkiseen vallankäyttöön osallistuvien tai ihmisten yksityisasioita käsittelevien algoritmien toiminta ei voi olla liikesalaisuus. Kolmanneksi ja ehkä tärkeimpänä on algoritmien laatu. Esimerkiksi shakkiohjelmat ja lääketieteellisiä näytteitä tutkivat algoritmit päihittävät nykyään jo parhaankin inhimillisen asiantuntijan. Ne edustavat kuitenkin rajatulla alueella toimivaa ns. kapeaa tekoälyä

Mitään yleistä laaja-alaista tekoälyä ei vielä ole.  Uuden näkökulman tekoälyn kehittymiseen ovat tuoneet kone- ja syväoppiminen. Ne tuottavat jo itseään opettavia algoritmeja, joiden päättelyn tuloksista eivät edes algoritmien suunnittelijat pysty aina sanomaan, millä perusteella algoritmi päätöksensä tekee. Niille toimintaperiaatteita ei nimittäin anneta sääntöinä, vaan ne muodostavat sääntönsä itse tutkimalla suurta määrää – jopa miljoonia – inhimillisten asiantuntijoiden tekemiä ratkaisuja tai jopa muodostavat suurista aineistoista ihan uusia päättelysääntöjä. 

*****

Yleissivistävän koulun kaikille oppilaille tarkoitetussa opetuksessa ei ole mahdollista päästä kovin syvälle algoritmien maailmaan, vaikka pienikin tietokoneohjelma voidaan nähdä algoritmina ja siten askeleena nykyisen digimaailman syövereihin. Tärkeämpää onkin päästä alkuun algoritmisessa ajattelussa ja ohjelmoinnin perusrakenteissa. Näitä asioita yritetään valottaa sarjan seuraavissa osissa.

Lähteitä ja lisää luettavaa

[1] Korhonen, Hannu: Sata vuotta Alan Turingin syntymästä. Dimensio 5/2012, s. 56–58.

[2] Savolainen, Jani: Tietokoneen esi-isä mullisti maailman 70 vuotta sitten osoitteessa https://www.mtvuutiset.fi/artikkeli/tietokoneen-esi-isa-mullisti-maailman-70-vuotta-sitten-teki-sadan-vuoden-tyot-kahdessa-viikossa/5733368

[3] Wikipedia-artikkeli Konekieli osoitteessa https://fi.wikipedia.org/wiki/Konekieli

[4] Wikipedia-artikkeli Ohjelmointikieli osoitteessa https://fi.wikipedia.org/wiki/Ohjelmointikieli

[5] Wikipedia-artikkeli Tietokoneohjelma osoitteessa https://fi.wikipedia.org/wiki/Tietokoneohjelma

[6] Helsingin yliopiston kurssimateriaali Ohjelmointikielet osoitteessa http://www.ling.helsinki.fi/kit/kurssit/verkkokurssit/korpuskurssi/ohjelmointikieli.shtml

[7] Parkkila, Leena: Ihminen-ihminen ja ihminen-tietokone vuorovaikutus. Kemi–Tornion ammattikorkeakoulu, sarja B, raportit ja selvitykset 17/2013 osoitteessa https://www.theseus.fi/bitstream/handle/10024/68783/Parkkila_B_17_2013.pdf?sequence=1&isAllowed=y

[8] Oulasvirta, Antti (toim.): Ihmisen ja tietokoneen vuorovaikutus. Gaudeamus, 2011.

[9] Esimerkiksi Ohjelmoinnillinen ajattelu osoitteessa https://peda.net/p/tivikohanke/oa

[10] Papert, Seymour: Lapset, tietokoneet ja ajattelemisen taito. Kirjayhtymä, 1985.

[11] Fry, Hannah: Hello World. Kuinka selviytyä algoritmien aikakaudella. Bazar Kustannus, 2019.

[12] Kielitoimiston sanakirja osoitteessa https://www.kielitoimistonsanakirja.fi/#/algoritmi

Kirjoittaja