Ohjelmoinnin opintiet

Artikkeli on julkaistu alun perin Skrollin numerossa 2014.2.

Koodikoulussa

Moni haluaisi oppia ohjelmoimaan. Oppimistavoista on kuitenkin monenlaisia näkemyksiä.

Teksti: Ville-Matias Heikkilä
Kuvat: Toni Kuokkanen, Susan Pogany/MIT Museum

Tilanne on varmasti monelle tuttu. Ohjelmoinnin oppimisesta kiinnostunut kohtaa kokeneen ohjelmoijan ja pyytää tältä neuvoa alkuun pääsemiseksi. Kokenut ohjelmoija muistelee omaa alkutaivaltaan ja neuvoo aloittelijan samankaltaiselle polulle. Kumpikaan ei ymmärrä, että ohjelmoinnin oppimiseen on monia eri tapoja ja yhden tapa saattaa olla toiselle täysin mahdoton.

Tämän artikkelin tarkoitus on esitellä muutamia mahdollisia reittejä ohjelmoinnin oppimiseen etenkin omatoimisen opiskelun näkökulmasta. Millaisella kielellä kannattaa aloittaa, millaisella filosofialla jatkaa siitä eteenpäin ja millaisessa sosiaalisessa ympäristössä? Vastaukset näihin kysymyksiin ovat hyvin yksilöllisiä.

Lelukielellä alkuun

Ohjelmointikielet ovat usein vaikeita ja pitkäpiimäisiä. Yksinkertaisenkin asian tekeminen voi vaatia sellaisen määrän ympäryskoodia, että aloittelija hätääntyy täysin. Teorian, syntaksin ja rajapintojen kiemurat saavat usein opiskelussa pääosan, ja itse ohjelmointi hukkuu niiden alle. Tämän vuoksi ohjelmointiin voi olla hyvä hakea ensin tuntumaa jonkinlaisella lelukielellä.

Yleinen harhakäsitys on, että ohjelmoinnin osaaminen olisi sama asia kuin jonkin ohjelmointikielen osaaminen. Ohjelmointitaidon perusta on kuitenkin kielistä riippumaton, eräänlainen niksahdus aivoissa. Kun tämä niksahdus on jonkin kielen avustuksella saatu aikaan, ei sitä tarvitse enää tehdä uudestaan myöhempien kielten kohdalla. Tästäkin syystä on hyvä keskittyä aluksi helppoon lelukieleen.

Etenkin nuorimmille oppijoille on luontevaa suhtautua lelukieliin kuin mihin tahansa leluihin: vähät väliä aikuisten teorioista ja ammattikäytännöistä, tärkeintä on päästä kokeilemaan ja tekemään itse. Jälki voi etenkin aluksi olla sottaista, mutta ymmärrys syvenee ja käsiala paranee kokemuksen myötä – ainakin toivottavasti. Harhapoluille eksytään usein, mutta se ei haittaa, kun innostusta riittää. Hyvän lelukielen oleellinen piirre onkin innostuksen ylläpito esimerkiksi helpon grafiikkaohjelmoinnin kautta. Teoreettisempien ja vähemmän leikkimielisten oppijoiden kannattaa kuitenkin suhtautua lelukieliinkin systemaattisemmin.

Ehkä tunnetuin lelukieli on vuonna 1964 Dartmouthin yliopistossa alkunsa saanut Basic (Beginner’s All-purpose Symbolic Instruction Code). Kieli syntyi eräajojen ja reikäkorttien aikana, jolloin harvat pääsivät suoraan vuorovaikutukseen tietokoneen kanssa. Basicin perusajatuksena oli kuitenkin alusta asti vuorovaikutteisuus: opiskelijat istutettiin päätteiden ääreen, ja tietokone vastasi käskyihin ja koodimuutoksiin välittömästi.

Kun ensimmäisiä mikrotietokoneita ruvettiin rakentamaan 1970-luvulla, olivat rakentajat usein saaneet ensikosketuksen ohjelmointiin nimenomaan Basicin kautta. Ei siis ihme, että sisäänrakennetusta Basic-tulkista tuli kotitietokoneissa itsestäänselvyys – niin hyvässä kuin pahassa.

Monien Basic-suvun kielten ympärillä on edelleen aktiivisia yhteisöjä. Etenkin peliohjelmointi on aina ollut suosittua Basic-harrastajien keskuudessa. Peli- ja grafiikkakeskeiseen aloitteluun sopivat basicien lisäksi esimerkiksi lapsille tarkoitetut Scratch ja Etoys, mediataiteilijoiden suosima Processing ja pelinteko-ohjelma Game Maker GML-kielineen.

Hahmon liikutusta Scratch-kielellä.

Kotisivujen teko HTML-kielellä on toiminut monille porttina ohjelmointiin, vaikkei pelkkä HTML vielä ohjelmointikielen määritelmää täytäkään. Www-selain on nykyisin kaikenlaisten koneiden vakiovaruste ja siten myös eräänlainen Basic-tulkin manttelinperijä. Selaimen kaveriksi tarvitaan vain tekstieditori.

Moniin sovellusohjelmiin kuuluu jonkinlainen skripti- tai makrokieli. Mikäli siis esimerkiksi Excelin kanssa tulee vietettyä paljon aikaa, voi sen makrokielellä leikkiminen olla luontevin ja hyödyllisin tapa saada ensikosketus ohjelmointiin.

Varo aivojen murjoutumista

Kun Basic yleistyi yliopistoissa, se herätti myös vastustusta. Havaittiin, että kieli opetti monet opiskelijat huonoille tavoille, joista he eivät päässeet irti. Ohjausrakenteiden alkeellisuus johti helposti ns. spagettikoodiin, jossa pahamaineisella goto-käskyllä hypittiin listauksen osasta toiseen. Tietojenkäsittelytieteilijä Edsger Dijkstra totesikin jo 1970-luvun alussa, että Basic ”murjoo aivot korjauskelvottomiksi”.

Monen ensikosketus ohjelmointiin näytti tältä. Pahamaineinen GOTO opittiin siis jo heti toisena käskynä!

Monet korkeakoulut ottivat Dijkstran näkemyksen tosissaan ja alkoivat kiinnittää erityistä huomiota ensimmäisen kielen ”puhtauteen”. Akateemiseen puhtauskäsitykseen sopivat erityisen hyvin Lisp-tyyliset funktionaaliset kielet, joita otettiinkin käyttöön alkeiskieliksi. Moni on törmännyt korkeakoulujen peruskursseilla esimerkiksi Scheme-kieleen.

Logo on monelle tuttu yksinkertaisena ”kilpikonnakielenä”, jossa tuotetaan kuvioita antamalla liikkumiskäskyjä kilpikonnahahmolle. Kieli ei kuitenkaan ole vain hauska lelu, sillä se kehitettiin johdatukseksi Lisp-ohjelmoinnin käsitemaailmaan. Kilpikonnan toi mukaan vuonna 1969 Seymour Papert, joka tunnetaan konstruktionismiksi kutsutun oppimisteorian kehittäjänä. Konstruktionismin perusajatuksena on, että oppija rakentaa sisäisiä malleja ympäröivästä maailmasta, esimerkiksi Logon kilpikonnan toiminnasta. Logo on ollut suosittu etenkin lasten ohjelmointikursseilla, mutta harvemmin kuulee edistyneempien ohjelmoijien antavan paljoakaan painoarvoa lapsuutensa Logo-kokeiluille.

Seymour Papert ja Logo-robotti vuonna 1973. Kuva: Susan Pogany, MIT Museum.

Kokeneet ohjelmoijat ajattelevat usein, ettei aloituskielellä ole niin väliä. Huonojenkin lelujen kierouksista pystyy oppimaan irti, ja kykyä oppia uusia ajattelutapoja pidetään muutenkin hyvän ohjelmoijan ominaisuutena. On kuitenkin muistettava, että vain harvoilla on lahjoja tulla hyväksi ohjelmoijaksi, joten Dijkstran näkemystä ei kannata ohittaa aivan pelkällä olankohautuksella.

Useimmat nykyisin suositut opetuskäyttöön tarkoitetut kielet lienevät (basiceja lukuun ottamatta) melko turvallisia, vaikka monet niistä ovatkin akateemisen kuivakoita. Jos aivojen murjoutuminen pelottaa erityisen paljon, kannattanee pitäytyä vaikkapa vain Lisp- ja Smalltalk-pohjaisissa kielissä. Smalltalk perustuu varsin vahvasti Papertin oppimisteorioihin, ja esimerkiksi aiemmin mainitut lastenkielet Scratch ja Etoys ovat Smalltalk-pohjaisia.

Perinteinen tie: alhaalta ylös

Kun ohjelmointiin on saatu jonkinlainen tuntuma lelukielen avulla, on suurin vaikeus jo voitettu. Mutta kuinka päästä siitä eteenpäin?

1980-luvun kotitietokonemaailmassa teknisesti luontevin etenemistapa oli sukeltaa niin matalalle tasolle kuin mahdollista ja edetä siitä vähitellen korkeamman tason kieliin. Basicin jälkeen harrastaja tarttui assemblerin tai konekielimonitorin, jolla hän valjasti koneensa joka ikisen bitinliikkeen. Myöhemmin konekapasiteetin lisääntyessä siirryttiin C:n ja Pascalin kaltaisiin rakenteisempiin kieliin, joilla isommat projektit pysyivät paremmin hanskassa. Näistä jatkettiin myöhemmin olio-ohjelmointiin esimerkiksi C++:lla. Korkeamman tason rakenteita oppii ymmärtämään ja arvostamaan, kun on ensin joutunut toteuttamaan niiden tekemät asiat itse. Näin ne eivät jää pelkiksi muotoseikoiksi.

Tämä polku ei ole enää kovinkaan suosittu. Nykyaikaiset laitteet ovat huomattavasti monimutkaisempia kuin vanhat kotimikrot ja usein myös hautaavat bittinsä käyttäjän ulottumattomiin. Vanhankoulun polusta kiinnostuneen kannattaakin suosia nypläysvaiheessa yksinkertaisia alustoja, esimerkiksi klassisia kotimikroja, Arduinon kaltaisia mikrokontrollerilankkuja tai vaikkapa PC:n DOS-käyttöjärjestelmiä. Emulaattorit korvaavat aidot laitteet hyvin, mikäli mukaan ei haluta liittää esimerkiksi rakenteluprojekteja.

Alhaalta ylös -polku sopii tee-se-itse-henkisille ihmisille, jotka haluavat ymmärtää järjestelmien toimintaa perusteellisesti ruohonjuuritasolta alkaen. Se tuppaa antamaan ohjelmointiin vahvasti konekeskeisen tuntuman, jossa koodin taloudellisuus menee inhimillisempien seikkojen ohi. Polkua kulkenut saattaa ahdistua hallitsemattoman monimutkaisista järjestelmistä ja haluta sellaisiin paneutumisen sijaan tehdä kaiken tarvitsemansa itse. Isojen kokonaisuuksien hallintaa saattaa joutua opettelemaan erikseen.

Kannattaa myös muistaa, että tämä polku on sellaisenaan monille melkoisen raskas. Mikäli konekieli ei kiinnosta heti lelukielen jälkeen, siihen ehtii kyllä syventyä myöhemminkin.

Toiset etenevät ylhäältä alas

Siinä missä jotkut haluavat rakentaa kokonaisuuksia alkeispalikoista, toisille on luontevampaa ottaa valmis kokonaisuus ja hajottaa se osiin. Ohjelmointitaitoa kehitetään paneutumalla valmiiden ohjelmien lähdekoodeihin ja muokkaamalla niitä. Taitojen ja ymmärryksen karttuessa pystytään tekemään itse aina vain monimutkaisempia palikoita ja ennen pitkää kokonaisia sovelluksia. Tämä polku lienee helpointa aloittaa esimerkiksi muokkaamalla HTML-sivuja tai skriptikielellä toteutettuja pikkuohjelmia.

Ylhäältä alas -lähestymistapa sopii etenkin käytännönläheisille ihmisille, jotka ovat uteliaita ohjelmien toiminnan ja rakenteen suhteen mutta joita kiinnostavat enemmän suuret kokonaisuudet kuin pienet nippelit. Polun kulkija saa hyvän käsityksen mahdollisista ohjelmien arkkitehtuureista, mutta edistyneempi algoritmiikka saattaa jäädä hänelle pimentoon.

Vaikka ”alhaalta ylös” ja ”ylhäältä alas” kuvataankin tässä erillisinä polkuina, ne kannattaa ajatella pikemminkin toistensa täydentäjinä kuin vaihtoehtoina. Kovapäisimmällekin tee-se-itse-henkilölle on hyödyksi oppia lukemaan ja sietämään myös muiden koodia, ja innokkaimmankin modaajan kannattaa välillä tehdä jotain myös täysin puhtaalta pöydältä.

Äkkiä suoraan ammattilaiseksi?

Jos aloittelija on erityisen tarkka päämääristään, hän saattaa päätyä pitämään alkeiskieliä ajanhukkana ja sivuuttaa ne. Hän on ehkä kuullut, että esimerkiksi C++ on tosiosaajien käyttämä kieli ja haluaa opetella suoraan sen. Jotkut ovat onnistuneet tässäkin, mutta lähestymistavassa on omat ongelmansa. Kielet ja ympäristöt, jotka ovat tehokkaita ja käytännöllisiä ammattilaisille, ovat usein jopa katastrofaalisia ohjelmoinnin opettelijoille.

Niille ihmisille, jotka haluavat päästä suorinta tietä päämäärään, on usein tärkeää vain saada ongelma ratkaistua eikä välttämättä edes ymmärtää ratkaisua. Nykymaailmassa tämä asenne johtaa herkästi hakukoneilla löytyneiden koodinpätkien käyttöön omien aivojen sijaan. Hakkerien Jargon-sanakirja käyttää tämäntyyppisestä ohjelmointitavasta halveksuvaa nimitystä ”cargo cult programming”.

Valmiiden ratkaisujen kopiointi on usein nopeaa, mutta entäpä kun vastaan tulee ongelma, johon ei ole valmista ratkaisua? Jos ohjelmoija ei ole harjoittanut omaa ongelmanratkaisukykyään vaan on valinnut aina helpoimman reitin, hän saattaa juuttua sormi suussa ihmettelemään yksinkertaisiakin pulmia.

Hakkerin kielivalinnat

Oppimispolun valinta on usein tasapainottelua käytännöllisyyden, opettavaisuuden ja ajankäytön välillä. Eric S. Raymondin opas ”How to Become a Hacker” esittää hyvän kompromissin, jossa jokainen kieli on paitsi oppimisen kannalta tarkoituksenmukainen, myös käytännön tehtävissä ja hakkerikulttuurissa hyödyllinen.

Lelukieleksi Raymond suosittelee HTML:ää, joka ei ole ohjelmointikieli mutta antaa tuntumaa yleisempään tietokonekielten vaatimaan ajattelutapaan. HTML on myös nykymaailmassa äärimmäisen keskeinen kieli, jota on hyvä osata joka tapauksessa. Ensimmäiseksi ohjelmointikieleksi suositellaan Pythonia, joka on suhteellisen puhdas ja helppokäyttöinen mutta sopii myös laajempiin projekteihin. Pythonin jälkeen voidaan siirtyä opiskelemaan keskeisiä hakkerikulttuurin kieliä, joita ovat tehokkaan koodin mahdollistava C/C++, käytännöllinen Perl ja tärkeän valaistumiskokemuksen tarjoava Lisp.

Raymondin opas on tarkoitettu vapaan lähdekoodin hakkerikulttuuriin sisään haluaville, ja kielivalinnat ovat sen mukaisia. Hieman räätälöimällä ohjetta voinee kuitenkin soveltaa moniin muihinkin kulttuuriympäristöihin.

Yksin vai ryhmässä?

Ohjelmointia on perinteisesti opiskeltu joko koulukursseilla tai itsenäisesti, mutta nämä eivät suinkaan ole ainoat vaihtoehdot sosiaalisiksi puitteiksi. Joku oppii parhaiten yksityisopetuksessa, ja joku toinen saattaa kaivata ympärilleen pienryhmää. Monet ovat tykästyneet vuorovaikutteisiin opetusohjelmiin, jollaisena esimerkiksi Codecademy-sivustoa voidaan pitää. Puitteiden valinnassa kannattaa muistella omia kokemuksiaan erilaisten oppimistapojen toimivuudesta.

Vaikka varsinainen oppiminen tapahtuisikin itsenäisesti, voi sopiva yhteisö tai skene tarjota hyviä kannustimia opiskeluun. Kun sosiaalisessa ympäristössä on ohjelmoijia, myös oma kiinnostus ohjelmointia kohtaan säilyy. Jotkin yhteisöt järjestävät ohjelmointiin liittyviä kilpailuja, joihin osallistuminen voi motivoida aloittelijoitakin. On myös yksittäisten peli- tai ohjelmistoprojektien ympärille muodostuneita yhteisöjä, joihin liittyneistä ei-koodaajista tulee ennen pitkää projektin innostamana myös koodaajia.

Valitse polkusi!

Ohjelmoimaan voi oppia monilla eri tavoilla. Jollekulle toimii heti ensimmäinen ehdotettu tapa, kun taas joku toinen voi joutua yrittämään ja erehtymään montakin kertaa ennen kuin sopiva polku löytyy. Hyvä itsetuntemus saattaa helpottaa polun löytämistä – tai sitten ei.

Kaikista ei tietenkään tule ammattiohjelmoijia tai edes kotitarveohjelmoijia, mutta jonkinlainen ohjelmointitaito auttaa joka tapauksessa käsittämään digitaalista maailmaa. Vaikkei pää tuntuisikaan taipuvan ohjelmointiin, kannattaa kuitenkin sinnikkäästi yrittää!


Oppivatko kaikki ohjelmoimaan?

Me Skrollissa haluaisimme uskoa, että kaikilla on edellytykset oppia ohjelmoimaan, kunhan sopiva menetelmä löytyy. Yliopistoissa ollaan asian suhteen kuitenkin skeptisempiä. Kokemus on nimittäin osoittanut, että huomattava osa esimerkiksi tietojenkäsittelytieteen maistereista ei osaa ohjelmoida, vaikka onkin läpäissyt pakolliset kurssit. Myös monet itseopiskelijat ovat huomanneet, ettei ohjelmointi yksinkertaisesti asetu päähän, vaikka sitä kuinka yrittäisi sovitella.

Sitä, kenellä on edellytykset ohjelmoinnin oppimiseen, on ollut yllättävän vaikeaa päätellä mistään etukäteen. Edellytysten olemassaolo ei nimittäin tunnu korreloivan esimerkiksi älykkyysosamäärän tai matemaattisen tai kielellisen lahjakkuuden kanssa. Tutkijat Saeed Dehnadi ja Richard Bornat löysivät kuitenkin vuonna 2006 jokseenkin toimivan tavan erottaa vuohet lampaista.

Dehnadi ja Bornat antoivat ohjelmoinnin alkeiskurssin opiskelijoille ennen kurssin alkua tehtäväpaperin, joka sisälsi ohjelmointikieleen liittyviä tehtäviä: ”Mitkä ovat muuttujien a ja b arvot seuraavan koodin suorittamisen jälkeen?” Koska kurssilaiset eivät olleet ennen ohjelmoineet, he joutuivat arvaamaan vastaukset. Osoittautui, että parhaiten kurssilla menestyivät ne, joiden arvaukset noudattivat yhtenäistä logiikkaa – eli ne, jotka muodostivat ohjelmointikielen toiminnasta selkeän mielenmallin, oli se sitten kuinka virheellinen hyvänsä.

Tutkimuksen perusteella ohjelmoinnin oppimisen edellytyksenä olisi siis jonkinlainen kyky tai taipumus muodostaa mielessä proseduraalisia malleja erilaisista järjestelmistä. Voisiko tätä ominaisuutta jotenkin harjoituttaa ennen ohjelmoinnin oppimista? Mikäli useimmille ”vuohille” on mahdollista löytää tähän sopiva menetelmä, ei mikään ole enää esteenä todelliselle koko kansan tietokonelukutaidolle.