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
Seuraavat perustaidot tulisi olla jokaisella kurssin käyneellä opiskelijalla.
Ymmärrät tietokoneohjelmoinnin keskeintä käsitteistöä varsinkin imperatiivisen olio-ohjelmoinnin näkökulmasta: ohjelmakoodi, muuttuja, luokka, olio, metodi, viittaus, tietotyyppi, parametri, paluuarvo, 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 niin, 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: IDE:tä eli 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 niin, 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, hakurakenteet, laiskalistat). 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!
Materiaalin luvut tehtävineen ja viikkokoosteineen on laatinut Juha Sorva.
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, Kaisa Ek, Joonatan Honkamaa, Antti Immonen, Jaakko Kantojärvi, Niklas Kröger, Kalle Laitinen, Teemu Lehtinen, Mikael Lenander, Ilona Ma, Jaakko Nakaza, Strasdosky Otewa, Timi Seppälä, Teemu Sirkiä, Anna Valldeoriola Cardó ja Aleksi Vartiainen.
Lukujen alkuja koristavat kuvat ja muut vastaavat kuvituskuvat on piirtänyt Christina Lassheikki.
Yksityiskohtaiset animaatiot Scala-ohjelmien suorituksen vaiheista suunnittelivat Juha Sorva ja Teemu Sirkiä. Teemu Sirkiä ja Riku Autio toteuttivat ne apunaan Teemun aiemmin rakentamat työkalut Jsvee ja Kelmu.
Muut diagrammit ja materiaaliin upotetut vuorovaikutteiset esitykset laati Juha Sorva.
O1Library-ohjelmakirjaston ovat kehittäneet Aleksi Lukkarinen ja Juha Sorva. Useat sen keskeisistä osista tukeutuvat Aleksin SMCL-kirjastoon.
Tapa, jolla 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+ luotiin alun perin Aallon LeTech-tutkimusryhmässä pitkälti opiskelijavoimin. Nykyään tätä avoimen lähdekoodin projektia kehittää Tietotekniikan laitoksen opetusteknologiatiimi ja tarjoaa palveluna laitoksen IT-tuki. Pääkehittäjänä on nyt Markku Riekkinen, jonka lisäksi A+:aa ovat kehittäneet kymmenet Aallon opiskelijat ja muut.
A+ Courses -lisäosa, joka tukee A+:aa ja O1-kurssia IntelliJ-ohjelmointiympäristössä, on toinen avoin projekti. Sen suunnitteluun ja toteutukseen on osallistunut useita opiskelijoita yhteistyössä O1-kurssin opettajien kanssa.
Kurssin tämänhetkinen henkilökunta löytyy luvusta 1.1.
Joidenkin lukujen lopuissa on lukukohtaisia lisäyksiä tähän tekijäluetteloon.