Kurssin viimeisimmän version löydät täältä: O1: 2024
Oppimistavoitteista
Kurssilla perehdytään ohjelmointiin käyttäen. Kurssin käytyäsi voit toivottavasti lausahtaa näin:
- Tietokoneohjelmointi on fiksua ja hauskaa hommaa.
- Osaan ohjelmoinnin perusteita.
Tarkoitus olisi, että kurssin lopuksi osaat kirjoittaa pieniä omia sovellusohjelmia Osaat myös lukea ja muokata muiden kirjoittamia vähän isompiakin ohjelmia. Lisäksi sinulla on sellaiset pohjatiedot ohjelmoinnin peruskäsitteistä, että pystyt laajentamaan ohjelmointitietojasi ja -taitojasi jatkokurssien tai omatoimisen opiskelun avulla.
Työkaluna käytämme Scala-ohjelmointikieltä, mutta opitut asiat ovat sovellettavissa muillakin kielillä ohjelmoidessa.
Kurssin arviointi (ks. luku 1.1) on pyritty suunnittelemaan niin, että kurssiarvosana yksi kertoo vähimmäistavoitteiden saavuttamisesta, arvosana kolme vastaa jotakuinkin Aallon jatkokursseille riittävää vähimmäisosaamistasoa ja arvosana viisi vielä parempaa osaamista.
Vähimmäistavoitteet
Nämä perustaidot tulisi olla jokaisella kurssin käyneellä opiskelijalla.
- Ymmärrät tietokoneohjelmoinnin keskeintä käsitteistöä
erityisesti imperatiivisen
olio-ohjelmoinnin näkökulmasta:
ohjelmakoodi, muuttuja, luokka, olio, metodi,
viittaus, tietotyyppi, parametri, palautusarvo,
lauseke, alkiokokoelmat (esim. puskuri tai
vektori) ja perusmetodit niiden käsittelyyn (kuten
map
jafilter
), valintakäskyt (kutenif
), toistokäskyt (kutenfor
),null
jaOption
, jne. - Kun sinulle annetaan ohjelmointiin liittyvää materiaalia, jossa nämä käsitteet esiintyvät, kykenet lukemaan sitä ja pystyt oppimaan lisää sen perusteella.
- Osaat soveltaa tuntemiasi käsitteitä, kun luet ja kirjoitat
ohjelmia. Siis:
- Osaat lukea (Scala-kielellä kirjoitettuja) ohjelmia, jotka koostuvat useista yhteen toimivista luokista, ja tehdä päätelmiä niiden toiminnasta ainakin, kun ohjelmat ovat korkeintaan sata koodiriviä pitkiä eivätkä sisällä eksoottisia kielen piirteitä tai mutkikkaita algoritmeja.
- Osaat toteuttaa luokkia (Scala-ohjelmointikielellä), kun annettu spesifikaatio määrittelee toteutettavien luokkien julkiset rajapinnat. Toisin sanoen: osaat toteuttaa määritellyille luokille ilmentymämuuttujia ja metodeita. Osaat sekä kirjoittaa luokkia "tyhjästä" että muokata valmiina annettua ohjelmakokonaisuutta siten, että se täyttää spesifikaation.
- Ohjelmakoodin laatimiseen liittyvät työvaiheet kuten spesifikaation lukeminen, koodin kirjoittaminen ja testaus ovat sinulle tuttuja. Osaat myös käyttää ohjelmoijan aputyökaluja (erityisesti: sovelluskehitintä) tällaisten työvaiheiden suorittamiseen.
- Ymmärrät ainakin auttavasti, miten tietokone toimii suorittaessaan ohjelman. Ymmärrät auttavasti, miten olioita luodaan ja alustetaan tietokoneen muistiin. Tiedät, miten kutsupino toimii ohjelman tilan säilyttämiseksi tietokoneen muistissa.
- Tiedät, mitä ovat ohjelmakirjastot (esim. Scala API). Osaat lukea annettua dokumentaatiota ja sen perusteella käyttää valmiina annettuja luokkia omissa ohjelmissasi.
- Ymmärrät, että hyvä ohjelmointityyli on tärkeää. Osaat muotoilla ohjelmakoodin siten, että se on ihmislukijalle ymmärrettävää ja selkeää.
- Sinulla on ainakin auttava käsitys siitä, miten graafinen käyttöliittymä toimii yhteen muun ohjelman kanssa. Olet laatinut yksinkertaisia graafisia käyttöliittymiä apukirjastoa käyttäen.
Jatkokursseille riittävä osaaminen
Pelkät vähimmäistavoitteet eivät riitä ohjelmoinnista enemmän kiinnostuneille eivätkä niille, jotka jatkavat ohjelmoinnin opiskelua myöhemmillä kursseilla. Esimerkiksi keväisillä jatkokursseilla Ohjelmointi 2 ja Ohjelmointistudio 2 edellytetään Ohjelmointi 1:n vähimmäistavoitteita laajempaa osaamista.
Ohjelmoinnin parissa jatkaville ainakin seuraavat oppimistavoitteet ovat keskeisiä:
- Tiedät, mitä ovat kääntäjä, tavukoodi, virtuaalikone ja konekieli.
- Tunnet eräitä funktionaaliseen ohjelmointiparadigmaan liittyviä
ohjelmointitekniikoita, joiden perusteella voit tutustua tähän
ohjelmointitapaan syvällisemmin. Erityisesti:
- Ymmärrät, millainen on muuttumaton alkiokokoelma tai muu olio (immutable).
- Olet treenannut kokoelmien käsittelyä
yleisillä korkeamman asteen funktioilla
kuten
map
jafilter
käyttäen apuna myös nimettömiä funktioita.
- Ymmärrät, mitä ovat periytyminen (inheritance) ja piirreluokat (traits). Osaat soveltaa näitäkin tekniikoita lukiessasi ohjelmia ja toteuttaessani luokkia annetun spesifikaation mukaisesti.
- Tunnet useita erilaisia tapoja varastoida lukuisia data-alkioita (esim. vektorit, puskurit, virrat, hakurakenteet). Osaat yksinkertaisissa tapauksissa valita, mikä tapa on tiettyyn ohjelmaan kätevin.
- Olet harjoitellut hahmottamaan ja muokkaamaan myös hieman isompia ohjelmakokonaisuuksia, jotka ovat kooltaan satoja rivejä tai noin kymmenen luokkaa, ja hieman monimutkaisempia algoritmeja.
- Sinulla on ainakin auttava käsitys siitä, että ohjelmakoodin laadun määrittävät muutkin seikat kuin sen toimivuus. Tiedät esimerkiksi, että ohjelmoijan tekemät ratkaisut vaikuttavat ohjelman muokattavuuteen ja tehokkuuteen, ja olet nähnyt tästä esimerkkejä. (Et silti välttämättä itse osaa vielä laatia ohjelmista erityisen muokattavia tai tehokkaita.) Tiedät, mitä on refaktorointi.
Mitä vielä on tarjolla?
Kurssilla voi oppia myös muista ohjelmoinnin perusteisiin liittyviä aiheista. Alla on esimerkkejä aiheista, joiden sisällyttäminen omiin oppimistavoitteisiin on suositeltavaa ja hyödyllistä (ja voi parantaa arvosanaa), mutta ei ole pakollista.
- Olet kokeillut suunnitella itse pienehköjä ohjelmia tai ohjelmien osia ilman, että sinulle on ollut tarjolla spesifikaatiota, joka määrittää ennalta ohjelman rakenteen (luokat ja metodit). Olet toteuttanut ohjelman oman suunnittelutyösi perusteella.
- Osaat tunnistaa, edustaako annettu ohjelma (tai ohjelman osa) imperatiivista vai funktionaalista ohjelmointitapaa. Tunnet eräitä näiden ohjelmointiparadigmojen hyviä puolia.
- Ymmärrät rekursion käsitteen ja olet nähnyt esimerkkejä rekursiivisesta tiedosta ja rekursiivisista metoditoteutuksista. Osaat toteuttaa yksinkertaisen rekursiivisen luokan tai metodin.
- Osaat käyttää debuggeria virheiden etsimiseen ohjelmista.
- Osaat käyttää ohjelmakirjastoa apuna laatiaksesi ohjelman, joka lukee ja kirjoittaa (teksti)tiedostoja.
- Sinulla on ainakin auttava käsitys siitä, että ohjelma voi käsitellä toisia ohjelmia ja ohjelmointikielellä voi toteuttaa toisen ohjelmointikielen.
Oppikirjan vapaaehtoisissa osiossa on paljon muutakin.
Palaute
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 Riku Autio, Jaakko Kantojärvi, Teemu Lehtinen, 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.