Tämä kurssi on jo päättynyt.

Luku 1.2: Ohjelmoinnista

Tästä sivusta:

Pääkysymyksiä: Mitä ovat ohjelmat ja ohjelmointi? Mihin ohjelmoija kirjoittaa ohjelmakoodin? Miten laadittu ohjelma käynnistetään? Miten kurssilla palautetaan ohjelmia arvioitaviksi?

Mitä käsitellään? Ohjelmoinnin perusajatus ja yleisiä piirteitä. Ohjelmoijan työvälineitä: ohjelmointikieli, ohjelmakoodi, sovelluskehitin, pakkaukset ja kooditiedostot.

Mitä tehdään? Luetaan sekä kokeillaan ohjelmointityökaluja. Muokataan annettuja sovellusohjelmia.

Suuntaa antava työläysarvio:? Puolitoista tuntia. Enemmänkin voi mennä, jos asennat samalla ohjelmointityökaluja omalle koneellesi.

Pistearvo: A12.

Oheisprojektit: GoodStuff (uusi), O1Library (uusi), Pong (uusi).

../_images/person01.png

Ohjelmien laatiminen ja ajaminen

Perinteikäs ja hyvä tapa kuvailla tietokoneohjelmointia on verrata sitä ruuanlaittoon. Alla tämä vertaus on vuorovaikutteisena esityksenä:

Ohjelman ajaminen

../_images/computer_as_cook.png

Ohjelmoija määrittää, miten tietokoneen halutaan toimivan ohjelmaa ajettaessa. Esimerkiksi kurssi-ilmoittautumisohjelmaa laativa ohjelmoija voi määritellä tietokoneelle ohjeen: "Kun käyttäjä painaa tiettyä nappia, lisää kyseinen käyttäjä kurssille ilmoittautuneiden luetteloon."

Sovellusohjelman käyttäjällä on käytössään kopio ohjelmasta tallennettuna tietokoneeseensa. Kun hän käynnistää ohjelman, ohjelma ajetaan eli suoritetaan (run, execute). Tällöin tietokone noudattaa sille ohjelmassa ennalta määrättyjä käskyjä.

Esimerkki: Käyttäjä antaa kuvaketta näpäyttämällä tietokoneen käyttöjärjestelmälle käskyn käynnistää tekstinkäsittelysovellus. Tällöin tietokone toimii niin kuin kyseinen sovellusohjelma määrää. Kunhan ohjelmoija on tehnyt työnsä hyvin, niin toiminta on käyttäjän kannalta mielekästä: tekstinkäsittelyä varten avautuu uusi ikkuna, joka reagoi käyttäjän toimiin halutulla tavalla.

Onko käyttäjällä sittenkään aina sovellusta itsellään?

Yllä esitetty kuvaus ohjelman ajamisesta tietokoneessa pätee edelleen monissa tilanteissa ja riittää tämän kurssin tarpeisiin. Kuitenkin uudet tietotekniset suuntaukset ovat jo muuttaneet joidenkin ohjelmien luonnetta.

Vapaaehtoinen lisätehtävä: selvitä internetin avulla, mitä ovat web-sovellus (web application), pilvilaskenta (cloud computing) ja Software as a Service.

Ohjelmointikielet

Kukin tietokoneen toimintaa ohjaava prosessori tekee vain tasan sen, mitä käsketään. Se suorittaa käskyjä yksitellen, järjestyksessä. Toisin kuin reseptiä lukeva ja asiansa osaava kokki, prosessori ei ymmärrä mitään käskyjen merkityksestä ohjelmakokonaisuudessa. Se ei osaa päätellä, arvioida eikä soveltaa. Tietokone on siis pohjimmiltaan tyhmä. Se on kuitenkin nopea, tarkka ja hyvämuistinen.

Ohjelmaa kirjoitettaessa täytyy kuvailla yksityiskohtaisesti ja kirjaimellisesti, mitä tietokoneen halutaan tekevän, kun ohjelma ajetaan. Jotta tämä onnistuisi, on käytettävien ilmaisujen oltava täsmällisiä ja yksiselitteisiä. Luonnollinen ihmisten kieli ei ole täsmällistä eikä yksiselitteistä, eikä sovellu ohjelmointiin: "suolaa maun mukaan", "kunnes on kauniin ruskea".

Ohjelmakoodi kirjoitetaan jollakin ohjelmointikielellä (programming language). Ohjelmointikielet ovat formaaleja eli muodollisia, ja niissä on rajattu määrä hyvin määriteltyjä sanoja ja ilmaisutapoja. Kustakin hyväksyttävästä ohjelmointikielen ilmaisusta voidaan tarkasti sanoa, mitä se tarkoittaa. Vertailukohdaksi voi ottaa vaikkapa kemian molekyylikaavat, joita myöskin säätelevät tietyt tarkat säännöt; ne ovat tosin ohjelmointikieliä yksinkertaisempia.

Erilaisia ohjelmointikieliä on vuosikymmenten aikana kehitetty valtava määrä. Esimerkiksi Wikipediasta löytyy nääin pitkä lista eikä sekään ole missään nimessä kaikenkattava.

Jotkut ohjelmointikielet sopivat paremmin toisiin tarkoituksiin, toiset toisiin. Osa on tarkoitettu yleiskäyttöisiksi, toiset nimenomaan tietynlaisiin tarkoituksiin. Osa on jäänyt historian romukoppaan, toiset porskuttavat vuosikymmenestä toiseen. Uusia kieliä syntyy edelleen, samoin uusia versioita vanhoista kielistä.

../_images/ohjelmointikieliä.png

Eräiden ohjelmointikielten nimiä. Käytämme yhtä näistä kielistä.

Scala, eräs ohjelmointikieli

../_images/scala_logo.png

Scala-kielen logo. Portaikko on italiaksi scala.

Tällä kurssilla käytetään modernia ja monipuolista ohjelmointikieltä nimeltä Scala. Samalla kun käytät Scalaa, opit myös yleisemmistä ohjelmoinnin käsitteistä, joita voit soveltaa muillakin kielillä ohjelmoidessasi. Kokenut ohjelmoija voi opetella uusia ohjelmointikieliä suhteellisen nopeasti.

Tässä kolme Scala-kielistä käskyä esimerkkeinä siitä, miltä kieli näyttää. Käskyjen teemana on (yksinkertainen, kuvitteellinen) kirjanpitojärjestelmä, jossa voi käsitellä yrityksen työntekijöiden tietoja.

val palkattuHenkilo = new Tyontekija("Tea Teekkari", 1992, 3200.0)
palkattuHenkilo.tyoaika = 0.5
palkattuHenkilo.korotaPalkkaa(1.2)

Tätä esimerkkiä ei tarvitse (tai voi) tässä vaiheessa kunnolla sisäistää. Alta voit kuitenkin lukea lyhyen yleiskuvauksen siitä. Siirtele hiiren kursoria vihreäpohjaisten selitystekstien päällä, niin esimerkistä korostuu aina kyseiseen tekstiin liittyvä kohta. Kokeile! Voit myös klikata selitystekstiä, jolloin korostus "jää päälle".

Ensimmäinen rivi luo uuden työntekijän tiedot tietokoneen muistiin. Työntekijällä on nimi, syntymävuosi ja kuukausipalkka.
Toinen rivi asettaa työntekijän puolipäiväiseksi: työajaksi asetetaan 0.5 eli 50 prosenttia.
Kolmas rivi kirjaa työntekijälle 20 prosentin palkankorotuksen.
Näissä käskyissä on käytetty suomenkielisiäkin sanoja. Ohjelmoija voi valita monia ohjelmassa käytettäviä käsitteiden nimiä itse; tähän hän voi käyttää vaikkapa englannin tai suomen sanoja.
Eräät ohjelmatekstin sanat ovat osa Scala-kieltä eivätkä ole Scala-kieltä käyttävän ohjelmoijan itsensä valitsemia. Scala-kielen sanat perustuvat englantiin.

Scala-kielestä opit paljon lisää koko kurssin ajan. Silti kaikkia tämän monipuolisen kielen piirteitä ei käydä läpi kurssilla. Scalaa käytetään myös usealla muulla Aallon ohjelmointikurssilla ja toki myös yliopistomaailman ulkopuolella.

Käytämme Scala-kielen versiota 2.12.6.

Ohjelma — siis mikä?

Jo tässä vaiheessa kannattaa huomata, että sanalla "ohjelma" viitataan kahteen eri asiaan:

  1. Ohjelmatekstiin eli ohjelmakoodiin (program code), joka kuvaa sarjan käskyjä tietokoneen suoritettavaksi.
  2. Ohjelman suoritukseen eli niihin asioihin, jotka tapahtuvat tietokoneen suorittaessa ohjelmakoodin käskyt.

Niinpä voit sanoa laatimastasi ohjelmasta esimerkiksi "Mun ohjelmassa on 15000 riviä ohjelmakoodia." mutta myös "Klikkaa tosta napista niin toi mun ohjelma lähettää tulokset printterille."

Ohjelma on siis toisaalta staattinen, passiivinen kirjoitus tietokoneen halutusta toiminnasta. Toisaalta ohjelma on dynaaminen, aktiivinen prosessi, joka toimii tietokoneessa ja voi vuorovaikuttaa käyttäjien kanssa. Vastaava kaksinaisuus esiintyy monessa muussakin ohjelmoinnin käsitteessä, ja tähän teemaan palaamme vielä kurssin mittaan useasti.

Sovellusohjelma sisältä ja ulkoa

../_images/app_components-fi.png

Loppukäyttäjä ja sovellusohjelman osia

Sovellusohjelmassa voidaan nähdä kaksi pääosaa:

  • Käyttöliittymä (user interface eli UI) eli ohjelman ulospäin näkyvä tai muuten havaittava osa, jonka kanssa sovelluksen käyttäjä voi vuorovaikuttaa. Nykyaikaisissa sovelluksissa on usein graafinen käyttöliittymä eli GUI (graphical user interface), joka muodostuu ikkunoista, nappuloista, jne.
  • "Sisuskalut": malli ohjelman aihepiiristä, ohjelman sisäinen toimintalogiikka. Esimerkiksi tekstinkäsittelyohjelmassa on sisäisesti määritelty, miten oikoluku toimii ja miten dokumentit rakentuvat tekstikappaleista, otsikoista, jne.

Sovelluksen käyttäjä tietää yleensä (korkeintaan) sen, miten sovelluksen käyttöliittymää käytetään. Ohjelmoijan on sen sijaan pystyttävä kuvaamaan tietokoneelle sekä ohjelman käyttöliittymän että sisuskalujen toiminta. Toisin kuin käyttäjän, ohjelmoijan on myös voitava tarkastella ja muokata sekä sovelluksen dynaamista toimintaa että sen staattista esitysmuotoa eli ohjelmakoodia.

Luvun jäljellä olevassa osassa tarkastellaan kahta valmiiksi laadittua sovellusohjelmaa "sisältä ja ulkoa". Samalla pääset tarttumaan ohjelmoijan työkalupakkiin.

Ohjelmoijan työkaluista

Ohjelmoijat käyttävät erilaisia apuohjelmia, siis toisten ohjelmoijien jo tekemiä ohjelmia, jotka auttavat uusien ohjelmien laatimisessa. Esimerkiksi:

  • Ohjelmakoodi kirjoitetaan ja tallennetaan tiedostoihin jonkin editorin avulla. (Lisää tästä ihan kohta.)
  • Kääntäjä (compiler) on apuohjelma, jolla voidaan automaattisesti muokata ihmisen laatima ohjelmakoodi tietokoneen suoritettavaksi paremmin sopivaan muotoon. (Lisää luvussa 5.4.)
  • Debuggerin avulla voi tarkkailla ohjelman sisäistä toimintaa samalla kun ohjelmaa ajetaan. Tämä on hyödyllistä erityisesti virheitä (eli bugeja) etsittäessä sekä ohjelmointia opetellessa.
  • Vähitellen kehittyvää ohjelmistoa voi ylläpitää paremmin käyttämällä sopivaa apuohjelmaa versionhallintaan (version control, revision control). (Lisää jatkokursseilla.)
  • Virtuaalikonetta käytetään apuna muun muassa monien Scala-kielellä kirjoitettujen ohjelmien ajamiseksi. (Lisää luvussa 5.4.)

Sovelluskehitin eli IDE

Editori
Kääntäjä
Virtuaalikone
Debuggeri
Versionhallinta
Debuggeri
Kääntäjä
Editori
Versionhallinta
Virtuaalikone

Integroidusti vai erikseen?

Ohjelmoija voi käyttää erillistä apuohjelmaa — editoria, debuggeria, jne. — kuhunkin eri tarpeeseen. Toinen tapa on käyttää sovelluskehitintä, apuohjelmaa joka kokoaa yhteen ohjelmien kehitystyössä käytettäviä työkaluja. Sovelluskehittimistä käytetään suomeksikin usein nimitystä IDE (eli integrated development environment).

Sovelluskehittimen avulla voi myös kätevästi jakaa tuotetun ohjelmakoodin haluamallaan tavalla erillisiin projekteihin. Tämä helpottaa lukuisten kooditiedostojen käsittelemistä.

Sovelluskehittimen käyttöä suositellaan tällä kurssilla, ja tämä materiaali on muotoiltu sen oletuksen pohjalta, että käytät erästä sovelluskehitintä.

Eclipse ja Scala IDE

../_images/eclipse_logo.png

Eclipsen logo.

Kurssin virallisena ohjelmointityökaluna käytetään Eclipse-nimistä sovelluskehitintä.

Kokonaisuutena Eclipse IDE on monipuolinen ja monimutkainen kuten monet muutkin IDE:t. Tällä kurssilla käytämme vain pientä osaa sen toiminnoista. Eclipseen on myös saatavilla mitä erilaisimpia lisäosia (plugin), joilla sen toiminnallisuutta voi laajentaa.

Perus-Eclipseä voi käyttää sellaisenaan Java-kielisten ohjelmien laatimiseen. Koska tällä kurssilla ohjelmoimme Scala-kielellä, tarvitsemme lisäosan. Käytämme kurssilla Eclipsen lisäosaa nimeltä Scala IDE.

Käytämme kurssilla Eclipsen versiota 4.7 Oxygen ja Scala IDE:n versiota 4.7.

Sekä Eclipse että Scala IDE ovat ilmaisia.

Saa tehdä toisinkin

Joillakin kurssin osallistujilla on entuudestaan suosikkityökaluja, joita he ovat käyttäneet aiemmin ohjelmoidessaan. Vaikka kurssilla virallisesti käytetäänkin Eclipse-sovelluskehitintä, on sallittua käyttää sen sijaan muuta työkalustoa. Moinen tapahtuu kuitenkin täysin opiskelijan omalla vastuulla, eikä kurssihenkilökunta osaa neuvoa kaikkien muiden työkalujen käytössä.

Aallon opiskelijat voivat käyttää Eclipseä Aalto IT:n Linux-työasemilla; niiltä löytyy valmiina Eclipsen kurssille sopiva versio.

Eclipse Aallossa

Eclipsen kurssille sopiva versio tarvittavine lisäosineen löytyy ainakin useimmilta Aalto IT:n Linux-työasemilta. Yliopiston tarjoama Linux-ympäristö on kurssin virallinen ohjelmointiympäristö. Voit ohjelmoida näillä koneilla ilman ylimääräisiä etukäteisvalmisteluja.

Huomaa, että esimerkiksi Aallon Windows-koneilla ei ainakaan pääsääntöisesti ole tarvittavia ohjelmia asennettuna.

Eclipse omalle koneelle

Jos haluat ohjelmoida esimerkiksi omalla kotikoneellasi, sinun täytyy itse asentaa Eclipse ja Scala IDE. Tästä on ohjeita erillisellä sivulla. Kun poimit työkaluston tuon ohjesivumme linkkien kautta, niin saat varmasti juuri oikeat version itsellesi.

Tästä eteenpäin tällä sivulla oletetaan, että olet koneella, jossa sinulla on Scala IDE:llä täydennetty Eclipse käytettävissäsi. Muutenkin kurssimateriaalia on tarkoitus jatkossa lukea siten, että sinulla on pääsy Eclipseen ja voit kokeilla asioita itse lukiessasi.

Jos käytät Eclipseä omalla koneellasi ja olet juuri asentanut sen ohjeemme mukaisesti, voit ohittaa seuraavan kohdan ja siirtyä suoraan kohtaan Valmiina annetut ohjelmat tällä kurssilla hieman alempana.

Ensimmäinen Eclipsen käynnistyskerta

Valmisteluja ennen käynnistämistä

Aluksi on hyvä luoda kansio (eli hakemisto), johon voit tallentaa kurssiin liittyviä tiedostoja:

  1. Päätä jokin nimi kansiolle, esim. harkat tai ScalainenKansio.
  2. Luo tuonniminen kansio johonkin haluamaasi paikkaan. Voit tehdä sen vaikkapa suoraan oman kotihakemistosi alle.
  3. Mikäli työskentelet monen käyttäjän ympäristössä kuten Aallon Linuxeissa, varmista, että käyttöoikeudet on asetettu niin, etteivät muut opiskelijat pääse käsiksi tehtävätiedostoihisi. Näin vältät tahattomat plagiointitilanteet yms. mielipahat.

Jos työskentelet Linux-komentorivillä, voit tehdä mainitut toimet tähän tapaan:

dodo ~ 51 % mkdir harkat
dodo ~ 52 % chmod go-rwx harkat
dodo ~ 53 %

Tässä siis luotiin kotihakemiston alle harkat-niminen "kurssikansio" ja otettiin chmodilla muilta käyttäjiltä kaikki luku-, kirjoitus- ja suoritusoikeudet pois kurssikansiosta.

Eclipse käyntiin ja Scala-näkymään

Ensimmäinen Eclipsen käynnistyskerta hoituu näin:

  1. Aallon IT-palvelukeskuksen Linux-koneilla Eclipse löytyy valikosta nimellä Eclipse Scala IDE 4.7.1. Pidä huoli, että valitset tarjolla olevista Eclipseistä oikean.

    Muussa ympäristössä voit käynnistää Eclipsen esimerkiksi näpäyttämällä asennushakemistosta löytyvää komentotiedostoa (eclipse.exe tai vastaava).

  2. Eclipse kysyy käynnistyessään, minkä työtilan (workspace) haluat sen lataavan esiin. Valitse työtilaksi kurssikansio, jonka loit edellä.

  3. Pienen odottelun jälkeen esiin läpsähtää näkymä, jossa Eclipse esittää työtilasi sisällön. Sisältöä ei tosin vielä varsinaisesti ole.

    • Joissakin Eclipse-asennuksissa näet ensin Welcome-sivun, jolla on Eclipseen liittyviä uutisia ja sensellaista. Voit sulkea tuon sivun klikkaamalla rastia sen yläkulmassa.
  4. Eclipsessä voi valita käyttöön erilaisia näkymiä eli perspektiivejä, jotka soveltuvat eri tarkoituksiin. On esimerkiksi Java-kielellä ohjelmointiin sopiva perspektiivi ja toinen Scala-kieliseen ohjelmointiin. Riippuen siitä, miten Eclipse lisäosineen on käyttämällesi koneelle asnnettu, ensimmäisellä käynnistyskerralla on aluksi esillä joko Java- tai Scala-perspektiivi. Tällä kurssilla tulet työskentelemään Scala-perspektiivissä, joten varmista, että olet siinä: tarkista, että Eclipsen oikeassa yläkulmassa on valittuna S-kirjaimellinen kuvake scala_perspective_icon.

    • Mikäli tuo kuvake näkyy muttei ole "painettuna alas", paina se alas. Mikäli kuvaketta ei näy lainkaan, valitse yläreunan valikosta Window ‣ Open Perspective ‣ Other ‣ Scala.

Jos kaikki on mennyt oikein, edessäsi on nyt suunnilleen tällainen näkymä:

../_images/eclipse_first.png

Kurssin asetustiedosto

Ota nyt ensimmäisen käynnistyskerran yhteydessä käyttöön kurssin oma asetustiedosto (preferences file). Näin saat tehtyä muutamia muutoksia Eclipsen oletusasetuksiin, ja Eclipse toimii paremmin kurssimme tarpeitten mukaisesti:

  1. Nouda asetustiedosto o1_2019.epf ja tallenna se työpöydälle tai johonkin muuhun kansioon.
  2. Valitse Eclipsessä File ‣ Import... ‣ General ‣ Preferences ja paina Next.
  3. Valitse kohtaan From preference file tallentamasi tiedosto o1_2019.epf.
  4. Varmista, että valittuna on Import all.
  5. Paina lopuksi Finish-nappia.

Nyt kaikki on vihdoin valmista Eclipsen käyttöä varten.

Valmiina annetut ohjelmat tällä kurssilla

Kurssimateriaalissa ja sen sisältämissä tehtävissä varsin usein otetaan jokin enemmän tai vähemmän valmis ohjelmakokonaisuus, jota tutkitaan tai jota sinun tulee jatkokehittää tai muuten muokata. Paitsi että pääset näin oppimaan esimerkkien kautta, niin tämä on tyypillinen tilanne myös ammattiohjelmoijalle. Ohjelmoija ei läheskään aina aloita puhtaalta pöydältä vaan muokkaa jotakin olemassa olevaa järjestelmää tai käyttää olemassa olevaa ohjelmakoodia osana uutta ohjelmaa.

GoodStuff-projektista

Haetaan nyt tarkasteltavaksi GoodStuff-muistikirjaohjelma. GoodStuff on tätä kurssia varten laadittu esimerkkisovellus, johon käyttäjä voi kirjata kokemuksiaan ja niille antamiaan arvosanoja. Kokemukset voivat olla vaikkapa hotelleja, joissa käyttäjä on asunut.

GoodStuff on annetussa muodossa varsin alkeellinen ja puutteellinenkin. Se on kuitenkin kehityskelpoinen, ja ennen kaikkea se sopii monen ohjelmoinnin käsitteen esittelemiseen. Tähän sovellukseen palataankin vielä useita kertoja tulevissa luvuissa.

Vaikka nyt kurssin alussa ei vielä olekaan riittävästi tietoa ohjelmoinnista GoodStuff-sovelluksen ohjelmakoodin ymmärtämiseksi, voimme jo hieman tutkia sitä. Näin saat kokonaiskuvan siitä, miltä ohjelma Eclipsessä näyttää ja miten sitä voi käsitellä. Tässä luvussa tehdään seuraavaksi näin:

  1. Noudetaan GoodStuff-sovellus Eclipseen.
  2. Katsotaan hyvin yleisellä tasolla, millaisiin osioihin sovellus on jaettu.
  3. Ajetaan sovellus Eclipsestä käsin ja kokeillaan, mitä sovelluksella voi tehdä.
  4. Kurkistetaan hieman sovelluksen ohjelmakoodiin ja korjataan siitä pienen pieni virhe.

Ohjelma Eclipsessä

Olemassa olevan projektin noutaminen Eclipseen

  1. Nouda GoodStuff.zip verkkokansiosta ja tallenna se esimerkiksi työpöydällesi.
  2. Valitse Eclipsen valikosta File ‣ Import... ‣ General ‣ Existing Projects into Workspace ja paina Next.
  3. Valitse kohta Select archive file ja etsi siihen tallentamasi GoodStuff.zip-tiedosto.
    • Poikkeus: Jotkin selaimet (ainakin jotkin Safarin versiot) purkavat ladatun zip-tiedoston automaattisesti, jolloin alkuperäinen zip-paketti ei jää lainkaan talteen. Tällöin valitse Eclipsessä Select root directory ja etsi kansio, johon selaimesi tallentaa lataamasi tiedostot. Tarkista lisäksi, että valinta Copy projects into workspace on käytössä.
  4. Alemmaksi samaiseen ikkunaan ilmestyy maininta kahdesta projektista: GoodStuff ja O1Library. Varmista, että molempien viereinen ruutu on rastitettuna ja paina sitten Finish. Tämä toimenpide tuo GoodStuff-sovellukseen liittyvät tiedostot zip-tiedostosta kurssihakemistoosi.
  5. Jos haluat, voit nyt poistaa GoodStuff.zip-tiedoston. Sen sisältö on jo kopioitu Eclipse-työtilaasi.

Projektit ja pakkaukset

../_images/eclipse_imported.png

Kaksi projektia Package Explorerissa.

Eclipsessä ohjelmat sijoittuvat projekteihin. Projekti ei ole varsinaisesti ohjelmointitermi, vaan se on vain Eclipsen tapa antaa käyttäjän muodostaa yhteen kuuluvista tiedostoista ja asetuksista kokonaisuuksia. Tällä kurssilla kukin vähänkään suurempi ohjelma on sijoitettu eri projektiin. Esimerkiksi juuri hakemasi GoodStuff näkyy projektina Package Explorer-välilehdellä Eclipsen käyttöliittymän vasemmassa laidassa.

Lisäksi työtilaan on tuotu projekti O1Library. Säilytä se työtilassasi kurssin aikana. O1Library sisältää eräitä sellaisia ohjelmointityökaluja, joita useat kurssilla käytetyt ohjelmat (mm. GoodStuff) tarvitsevat toimiakseen. Voit jättää sen muuten huomiotta tässä vaiheessa.

../_images/eclipse_project.png

GoodStuff-sovelluksen ohjelmakoodi on neljässä .scala-tiedostossa.

Selaile GoodStuff-projektin sisältämiä tiedostoja Package Explorerissa. Scala-ohjelmille tyypilliseen tapaan Goodstuff koostuu osista, jotka on määritelty .scala-päätteisissä tiedostoissa. Nämä osat jaotellaan pakkauksiin (package). Pakkausten voi ajatella olevan Scala-kielen vastine tiedostokansioille. Ne kätevöittävät varsinkin isompien ohjelmaprojektien jäsentämistä ja toisiinsa liittyvien osien ryhmittelyä kokonaisuuksiksi. Pakkauksilla voidaan esimerkiksi ryhmitellä käyttöliittymä ja aihealueen malli omiksi kokonaisuuksikseen.

GoodStuff-ohjelmassa on neljä osaa: Category, Experience, GoodStuff ja CategoryDisplayWindow. Kaksi ensimmäistä kuvaavat ohjelman "sisuskaluja" eli muistikirjaan kirjattavia kokemuksia ja niiden kategorioita. Ne ovat pakkauksessa o1.goodstuff. Kaksi jälkimmäistä liittyvät ohjelman käyttöliittymän toteutukseen ja ovat pakkauksessa o1.goodstuff.gui.

o1-alkuiset pakkaukset sisältävät siis GoodStuff-ohjelman varsinaisen toteutuksen: ohjelmakoodin. Tällä kurssilla projektien sisältä löytyy näiden pakkausten lisäksi doc-alkuisia kansioita, joissa on ohjelmia kuvaavia dokumentteja. Palataan näihin dokumentteihin myöhemmin (luku 3.2).

Käynnistetään nyt se vihdoinkin

Scala-sovelluksessa on aina jokin tiedosto, joka toimii sen ns. käynnistystiedostona. GoodStuff-projektissa kyseessä on pakkauksen o1.goodstuff.gui sisältämä GoodStuff.scala. Valitse tämä tiedosto Package Explorerissa ja valitse sitten valikosta Run ‣ Run As ‣ Scala Application. GoodStuff-ohjelman käyttöliittymä käynnistyy erilliseen ikkunaan ja näyttää tältä:

../_images/godstuff.png

Koska tämä esimerkkisovellus on tulevissa luvuissa toistuvasti esillä, niin siihen on nyt hyvä hieman tutustua ihan käyttäjänkin näkökulmasta. Kokeile GoodStuff-ohjelman käyttöä hetken ajan: käytä Add new hotel -nappulaa ja syötä parin, kolmen hotellin tiedot (jotka voit vetää hatusta). Huomaa ainakin seuraavat asiat sovelluksen toiminnassa:

  • Tässä yksinkertaisessa sovelluksessa on vain yksi kokemuskategoria: hotellimajoitukset.
  • Sovellus laskee kullekin syötetylle kokemukselle hinta–laatu-suhteen jakamalla arvosanan hinnalla.
  • Sovellus irvistää käyttäjän suosikkikokemuksen ikkunan vasempaan laitaan. Suosikkikokemukseksi katsotaan se, jolla on korkein arvosana.

Sulje lopuksi GoodStuff-ikkuna.

Vinkki: vaihtoehtoisia käynnistystapoja

Eclipsen yläreunavalikon lisäksi samainen käynnistyskomento löytyy myös ns. kontekstivalikosta, jonka saa auki klikkaamalla tiedoston GoodStuff.scala-nimeä oikealla hiiren napilla. Kolmas tapa on play-kuvake työkalupalkissa yläreunavalikon alla, ja neljäs on näppäinyhdistelmä Shift+F11.

Tulet kurssin mittaan käynnistämään ohjelmia toistuvasti. Käytä mielestäsi luontevinta tapaa.

Ensin mainituissa käynnistystavoissa pitää aluksi valita käynnistystiedosto. Vaihtoehtoisesti voit painaa Ctrl+F11, jolloin ajettavaksi valiutuu automaattisesti se ohjelma, jonka viimeksikin ajoit. Tämä on usein kätevää.

Kurkistus ohjelmakoodiin

Tuplaklikkamalla kooditiedostojen nimiä saat tiedostojen sisällön näkyviin Eclipsen editoriin. Kokeile!

Kommentit

Yksi silmiinpistävimmistä asioista GoodStuffin ohjelmakoodissa on se, että koodiin sisältyy varsinaisten Scala-kielisten käskyjen lisäksi myös paljon Eclipsen vihreäksi värittämää tekstiä, joka ei ole Scalaa vaan englantia.

Kooditiedostoihin hyvin yleisesti kirjoitetaan mukaan kommentteja (comment) eli selitystekstiä. Kommenteilla voidaan esimerkiksi avata ohjelman osien merkitystä ja käyttötapoja toisille ohjelmoijille. Kommentin kirjoittanut ohjelmoija itsekin hyötyy siitä, kun hän palaa työstämään osin jo unohtunutta ohjelmakoodiaan.

Ohjelmakoodia ei kirjoiteta vain tietokonetta varten!

Kommentit ovat ensimmäinen kohtaamamme osoitus siitä, että vaikka ohjelmat laaditaankin tietokoneiden suoritettaviksi, on tärkeää huomioida myös ihmislukijat. Fiksusti käytettyinä kommentit voivat olla hyvän ohjelmointityylin kulmakivi.

Kommenttimerkinnät Scalassa

Scala-kielessä merkintöjen /* ja */ välissä oleva teksti tulkitaan kommentiksi eikä vaikuta ohjelman toimintaan. Tästä on esimerkkejä pitkin GoodStuffin ohjelmakoodia.

Kaksi kauttaviivaa eli // puolestaan aloittaa kommentin, joka jatkuu rivin loppuun. Eclipsen Scala-editori osaa monien muiden ohjelmointityökalujen tapaan automaattisesti värittää kommentit, jotta ne erottuvat muusta koodista.

Tällä kurssilla ei yleisesti ottaen ole pakollista, että itse kirjoitat kommentteja ohjelmakoodiisi (ellei erikseen mainita). Hyvä idea se voi silti olla. Joka tapauksessa tulet lukemaan paljon valmista koodia, jossa on kommentteja.

Silmäile vähän

Käytä muutama minuutti GoodStuff-ohjelman koodin tutkailuun. Vaikka suurin osa ei olekaan opetetun perusteella ymmärrettävissä — kommenteissakin kun esiintyy tuntematonta ohjelmoinnin termistöä — niin saat käsitystä siitä, miltä Scala-koodi näyttää. Ohjelmassa voi myös hyvinkin olla kohtia, joissa ohjelmakoodi näyttää järkeenkäyvältä tai joiden toiminnan pystyt arvaamaan. Jos kaikki näyttää täysin käsittämättömältä, niin sekään ei tässä vaiheessa haittaa.

Seuraavassa luvussa 1.3 ryhdymme käsittelemään ohjelmakoodiin liittyviä käsitteitä ja Scala-kielisiä käskyjä pieni palanen kerrallaan. Aikanaan pystyt ymmärtämään esimerkiksi GoodStuff-ohjelman koodin ja monimutkaisempiakin ohjelmia, sekä laatimaan omia ohjelmia.

Kokeillaan koodin muokkaamista ja ratkaisun lähettämistä

Huomasitko muuten kirjoitusvirheen GoodStuff-käyttöliittymäikkunan otsikossa? Siinähän lukee GodStuff!

Tämän korjaamiseen ei vielä kummempia ohjelmointitaitoja tarvita. Korjataan virhe ja kokeillaan samalla ohjelman palauttamista automaattista tarkastusta varten.

Ikkunan otsikko on määritelty GoodStuff-käyttöliittymän ohjelmakoodissa, tarkemmin ottaen tiedoston CategoryDisplayWindow.scala rivillä 35.

Toimi seuravaasti:

  1. Lisää mainitulle riville yksi o-kirjain asiaankuuluvaan paikkaan.

  2. Tallenna tiedosto File-valikosta tai painamalla Ctrl+S (Macilla Cmd+S).

    Muista tallentaa!

    Kokemus menneiltä vuosilta kertoo, että opiskelijat välillä unohtavat tallentaa ohjelmiaan ja palauttavat siksi vanhempia ja puutteellisia versioita koodista arvosteltavaksi päätyen itkuun ja hammasten kiristykseen. Muista siis Ctrl+S!

  3. Kokeile, toimiko: käynnistä ohjelma uudelleen esimerkiksi Run-valikosta. Ikkunan otsikon pitäisi nyt olla kunnossa.

  4. Lähetä muutettu tiedosto (CategoryDisplayWindow.scala) tarkastettavaksi alla olevalla lomakkeella.

    • Monissa selaimissa onnistuu myös tiedoston vetäminen ja pudottaminen suoraan Eclipsestä alla olevaan kenttään, mikä on tällöin kätevin tapa. (Jos vetäminen ei onnistu, paina alla olevaa nappulaa ja etsi tiedosto aiemmin työtilaksesi luomasi kansion sisältä.)
    • A+ antaa sinulle automaattisesti palautetta ja tehtäväpisteitä.

Palauttaminen

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.

Toinen muokkaustehtävä: Pong-peli

Pohjustus

Tutustu vielä toiseen sovellukseen, versioon mailapeliklassikosta Pong.

Scala-kielinen ohjelma löytyy Pong-nimisestä oheisprojektista. Ota projekti käyttöön samaan tapaan kuin GoodStuff äsken ja kokeile peliä. Lyhyesti sanottuna siis näin:

  1. Poimi zip-paketti koneellesi käyttäen linkkiä, joka löytyy luvun alun kohdasta Oheisprojektit.
  2. File ‣ Import...
  3. Existing Projects into Workspace ja Next.
  4. Select archive file ja valitse kyseinen zip-tiedosto.
  5. Varmista, että Pong on valittuna ja paina Finish.
  6. Aja ohjelma: valitse pakkauksesta o1.pong.gui tiedosto PongApp.scala ja käynnistä se (esimerkiksi play-kuvakkeella tai painamalla Shift+F11).
  7. Vasemmanpuoleista mailaa liikutetaan W- ja S-näppäimillä, oikeanpuoleista nuolinäppäimillä.

Tehtävänanto, osa 1/2

Pakkauksen o1.pong tiedostossa package.scala on määritelty mm. eräitä lukuarvoja, jotka vaikuttavat Pong-pelin ulkomuotoon ja toimintaan. Avaa sen sisältämä ohjelmakoodi editoriin.

Eräällä tiedoston alkupään riveistä määritellään BallRadius. Vaihda tuolta riviltä luku 10 luvuksi 50.

Tallenna (Ctrl+S). Käynnistä peli uudelleen. Huomaat muutoksen pallossa.

Tehtävänanto, osa 2/2

Pakkauksen o1.pong tiedostossa Ball.scala on määritelty säännöt, joita Pong-pelin pallo noudattaa liikkuessaan. Eräällä riveistä lukee:

this.velocity = this.velocity.switchY

Tämä käsky saa pallon vaihtamaan suuntaa sen kimmotessa kentän ylä- tai alareunasta. Kommentoi rivi ulos, kuten sanotaan. Siis: kirjoita rivin alkuun kaksi /-merkkiä, jolloin se muuttuu kommentiksi eikä ole enää osa suoritettavaa ohjelmaa.

Tallenna. Käynnistä peli uudelleen.

Onko pelissämme nyt bugi (bug) eli toimintavirhe? No, mehän halusimme muokata siitä tuollaisen, joten kyseessä ei ole bugi vaan ominaisuus (feature).

Palauttaminen

Palauta muokkaamasi tiedostot seuraavalla lomakkeella.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.

Lisää Pong-leikkejä

Jos haluat, voit kokeilla tehdä muitakin muutoksia annettuun Pong-ohjelmaan. Esimerkiksi:

  • Mitä tapahtuu, jos muutat package.scalasta vaikkapa Sizen ja Thicknessin toisiin lukuarvoihin?
  • Löydätkö package.scalasta kohdan, joka määrittelee, kuinka nopeasti mailat liikkuvat?
  • Löydätkö koodista osia, jotka määräävät piirtämisessä käytettyjä värejä? Onnistutko vaihtamaan niitä?
  • Osaatko vaihtaa näppäimiä, joilla PongApp.scala määrittelee mailoja ohjattavan?
  • Mitä jos PongApp.scala:ssa lukisikin push(Right) eikä push(Up)?

Tehtävän päätteeksi

Jos nautit Pongin vääntelystä ja vääntelyn tulosten ihmettelystä, saatat nauttia myös seuraavasta lainauksesta (joka sisältää myös syvemmän viestin ohjelmien staattisesta ja dynaamisesta olomuodosta):

Yksi fysiikan alkeiskursseilla ensimmäisinä käsiteltävistä asioista on potentiaalienergian ja kineettisen energian välinen ero. Potentiaalienergian voi mieltää energiaksi, joka on varastoituneena vaikkapa akkuun tai mäen huipulle asetettuun kiveen. Kineettinen energia on energiaa, joka on parhaillaan muutostilassa kuten akkuun varastoituneen sähkön liikuttaessa moottoria tai kiven pyöriessä alas mäenrinnettä.


Vastaavasti kun ihminen suunnittelee ohjelman, syntyy potentiaali laskennalle, joka pääsee valloilleen kun ohjelma suoritetaan tietokoneessa. Laskennan voi tuolloin mieltää kineettiseksi, liikkuvaksi.


Aivan kuin papattia kokeileva lapsi voi yllättyä erosta potentiaalisen ja kineettisen energian välillä, myös tietokoneohjelmoijat usein yllättyvät (jopa iloisesti) erosta potentiaalisen ja kineettisen laskennan välillä.


—Gary Flake (käännetty ote kirjasta The Computational Beauty of Nature)

Ohjelmointi aktiviteettina

Päätetään luku pohtimalla, millaista touhua ohjelmointi on.

Ohjelmointi ongelmien ratkaisemisena

Ohjelmoijan työ lähtee tyypillisesti liikkeelle ongelmasta tai tarpeesta, johon etsitään ratkaisua. Alla on muutama esimerkki ongelmista, joita voidaan ratkoa tietokoneen avulla.

  • Halutaan puhua puhelimella internetin yli toiselle puolelle maapalloa.
  • On saatava yritykselle uudenlainen laskutussovellus.
  • Tarvitaan paras reitti kohteeseen autolle. Tai avaruusalukselle.
  • Halutaan laatia malli, joka kuvaa tai ennustaa ihmisten käyttäytymistä sosiaalisessa verkossa, tautien leviämistä, ilmantonmuutosta tai eri sanojen käyttöä menneinä vuosikymmeninä.
  • Halutaan tarjota käyttäjälle mahdollisimman hyviä muita ostossuosituksia, kun hän ostaa tietyn tuotteen verkkokaupasta.
  • Tarvitaan työkalu, jolla voidaan muokata mittausdataa sopivaan muotoon jatkokäsittelyä varten.
  • Halutaan simuloida alkeishiukkasten liikettä ilmiöiden ennustamiseksi.
  • Halutaan simuloida tunteikkaiden siivekkäiden liikettä painovoimakentässä kohti sorkkaeläimiä.
  • Ja niin edelleen. Ja niin edelleen.

Uusia kiinnostavia ongelmia luodaan koko ajan sekä ohjelmoijien itsensä toimesta että muiden. Tuttuihinkin ongelmiin voi etsiä aina aiempaa parempia ratkaisuja.

Algoritmit

Ohjelmoijat puhuvat usein algoritmeista (algorithm). Lyhyesti kuvailtuna algoritmi tarkoittaa vaiheittaista ratkaisumenetelmää jollekin tietylle ongelmalle. Leivonnankin puolella on algoritmeja, vaikka termiä ei siellä käytetäkään: esimerkissämme mestarileipurin idea siitä, miten kakku pitäisi tehdä, on hänen keksimänsä algoritmi. Hän kirjoitti tämän ajatuksensa muistiin reseptitekstiksi. Vastaavasti ohjelmoija toteuttaa algoritmeja — ongelmien ratkaisuja — ohjelmakoodiin.

Osaongelmien ratkaisuiksi voidaan käyttää eri algoritmeja. Esimerkiksi tekstinkäsittelyohjelmassa voidaan käyttää yhtä algoritmia oikolukuun ja toista etsimistoiminnon toteuttamiseen. Ohjelmoijana voit keksiä osan käyttämistäsi algoritmeista itse ja soveltaa muiden kehittämiä algoritmeja joihinkin osaongelmiin. Ainakin on keksittävä se, miten osaongelmia ratkovat algoritmit toteutetaan ja yhdistellään tietyssä ohjelmassa.

Minitehtävä: algoritmit ja ohjelmat

Mikä seuraavista pitää parhaiten paikkansa? Huomaa, että saat palautetta oikeista ja vääristä vastauksista. Tehtävistä saatu palaute on osa tämän vuorovaikutteisen oppikirjan tekstiä ja syytä lukea.

Ohjelmoinnin piirteitä

Ohjelmointi on siis eräs ongelmien ratkomisen muoto. Ohjelmoijan tehtäviin kuuluu miettiä, millainen algoritmi (osa-algoritmeineen) sopii annetun ongelman ratkaisuksi ja miten algoritmi kuvataan tietokoneelle ohjelmana. Vastauksia ei käytännössä koskaan ole yhtä ainoaa. Ohjelmoijan onkin vertailtava erilaisia mahdollisuuksia ja pohdittava, miten ohjelmasta saadaan mahdollisimman laadukas: esimerkiksi nopeasti toimiva, käyttäjäystävällinen, turvallinen tai helposti jatkokehitettävä.

Ohjelmointi edellyttää järjestelmällistä ajattelua, luovuutta ja huolellisuutta. Monen mielestä se on hauskaa aivojumppaa, ja lähes kaikkien mielestä ohjelmoimalla voidaan luoda hyödyllisiä työkaluja ja tuotteita.

Toisin kuin usein kuvitellaan, ohjelmien laatimiseen liittyy myös paljon ihmislähtöisiä piirteitä. Vaikkapa ohjelmakoodin jatkokehityskelpoisuutta ja helppokäyttöisyyttä on arvioitava inhimillisistä lähtökohdista. Ja tietysti ohjelmia laaditaan ihmisten tarpeita varten.

Ohjelmia on hyvin erikokoisia ja niin on ohjelmankehitysporukoitakin: ohjelmia tehdään niin yksittäisten ihmisten kuin suurten kansainvälisten tiimien voimin. Käytännön ohjelmointityössä ihmisten välinen viestintä on usein huomattavassa roolissa.

Osa ohjelmointia ammattinsa yhteydessä harjoittavista ihmisistä on päätoimisia ohjelmoijia, jotka pyrkivät luomaan laadukkaita ohjelmia kaupallisiin tai muihin tarkoituksiin. Vielä suuremman ryhmän muodostavat muiden alojen ammattilaiset, joille ohjelmointi on työkalu oman alan ongelmien ratkomiseen: talousanalyytikot, sosiaalitieteilijät, lääke- ja geenitutkijat, fyysikot, graafikot, kielitieteilijät, ilmastotutkijat, insinöörit jne. Jotkut valjastavat ohjelmoinnin taiteen välineeksi.

Ohjelmoimalla voi laatia työkaluja, jotka helpottavat arjen rutiineja ja tehostavat omaa sovellusten — vaikkapa taulukkolaskennan tai jonkin pelin — käyttöä. Voidaan jopa sanoa, että ohjelmointi on kasvavassa määrin sivistyneen ihmisen perustaito, joka auttaa hyödyntämään tietotekniikan mahdollisuuksia ja ymmärtämään ympärillämme olevia tietotekniikkaan nojaavia järjestelmiä.

Keksitkö itse jonkin ohjelman, jollaisen haluaisit olevan olemassa? Jollaisen haluaisit itse luoda? Millainen ohjelma tekisi maailmasta paremman?

Yhteenvetoa

  • Tietokoneen ajaessa eli suorittaessa ohjelman se seuraa ohjelmoijan laatimaa ohjeistusta vaihe vaiheelta pilkulleen.
  • Ohjelmointi on luovaa ratkaisujen etsimistä ihmisiä kiinnostaviin ongelmiin.
  • Ohjelmat kirjoitetaan jollakin ohjelmointikielellä, tämän kurssin tapauksessa Scalalla.
  • Kurssilla käytetään Eclipse-nimistä sovelluskehitintä ja sen Scala IDE -lisäosaa. Sovelluskehitin kokoaa yhteen useita ohjelmoijan tarvitsemia työkaluja.
    • Eclipsessä voi muun muassa muokata ohjelmakoodia sekä ajaa ohjelman tutkiakseen, miten muutokset vaikuttivat sen toimintaan.
    • Scala-ohjelman osat voidaan ryhmitellä pakkauksiin. Pakkaus voi sisältää useita ohjelman osia omissa tiedostoissaan.
    • Eclipsessä eri ohjelmat ryhmitellään usein projekteiksi. Projekti voi sisältää useita pakkauksia.
    • Moniin kurssimateriaalin lukuihin liittyy valmiina tai osittain valmiina annettuja ohjelmia, jotka tarjotaan käyttöösi Eclipse-projekteina.
  • Ohjelmakoodi ei ole tarkoitettu vain tietokoneen luettavaksi. Kommentit selventävät ohjelmakoodin merkitystä ihmiselle.
  • Lukuun liittyviä termejä sanastosivulla: ohjelmointi, ohjelma; sovellusohjelma, käyttöliittymä; algoritmi; dynaaminen, staattinen; ohjelmakoodi, ohjelmointikieli, Scala; kommentti; sovelluskehitin eli IDE.

Palaute

Huomaathan, että tämä on henkilökohtainen osio! Vaikka olisit tehnyt lukuun liittyvät tehtävät parin kanssa, täytä palautelomake itse.

Tekijät

Tämän oppimateriaalin kehitystyössä on käytetty apuna tuhansilta opiskelijoilta kerättyä palautetta. Kiitos!

Kierrokset 1–13 ja niihin liittyvät tehtävät ja viikkokoosteet on laatinut Juha Sorva.

Kierrokset 14–20 on laatinut Otto Seppälä. Ne eivät ole julki syksyllä, mutta julkaistaan ennen kuin määräajat lähestyvät.

Liitesivut (sanasto, Scala-kooste, usein kysytyt kysymykset jne.) on kirjoittanut Juha Sorva sikäli kuin sivulla ei ole toisin mainittu.

Tehtävien automaattisen arvioinnin ovat toteuttaneet: (aakkosjärjestyksessä) Riku Autio, Nikolas Drosdek, Joonatan Honkamaa, Jaakko Kantojärvi, Niklas Kröger, Teemu Lehtinen, Strasdosky Otewa, Timi Seppälä, Teemu Sirkiä ja Aleksi Vartiainen.

Lukujen alkuja koristavat kuvat ja muut vastaavat kuvituskuvat on piirtänyt Christina Lassheikki.

Yksityiskohtaiset animaatiot Scala-ohjelmien suorituksen vaiheista ovat suunnitelleet Juha Sorva ja Teemu Sirkiä. Niiden teknisen toteutuksen ovat tehneet Teemu Sirkiä ja Riku Autio käyttäen Teemun toteuttamia Jsvee- ja Kelmu-työkaluja.

Muut diagrammit ja materiaaliin upotetut vuorovaikutteiset esitykset on laatinut Juha Sorva.

O1Library-ohjelmakirjaston ovat kehittäneet Aleksi Lukkarinen ja Juha Sorva. Useat sen keskeisistä osista tukeutuvat Aleksin SMCL-kirjastoon.

Opetustapa, jossa käytämme O1Libraryn työkaluja (kuten Pic) yksinkertaiseen graafiseen ohjelmointiin on saanut vaikutteita tekijöiden Flatt, Felleisen, Findler ja Krishnamurthi oppikirjasta How to Design Programs sekä Stephen Blochin oppikirjasta Picturing Programs.

Oppimisalusta A+ on luotu Aallon LeTech-tutkimusryhmässä pitkälti opiskelijavoimin. Pääkehittäjänä toimii tällä hetkellä Jaakko Kantojärvi, jonka lisäksi järjestelmää kehittävät useat tietotekniikan ja informaatioverkostojen opiskelijat.

Kurssin tämänhetkinen henkilökunta on kerrottu luvussa 1.1.

Joidenkin lukujen lopuissa on lukukohtaisia lisäyksiä tähän tekijäluetteloon.

a drop of ink
Palautusta lähetetään...