Muuttujien roolit ohjelmoinnin opettamisessa Jorma Sajaniemi Joensuun yliopisto Tietojenkäsittelytiede Jorma.Sajaniemi@Joensuu.Fi Johdanto Roolikäsite Roolit ja opiskelijat Roolit ja ammattilaisohjelmoijat Roolit alkeisohjelmoinnin opettamisessa Roolit muussa opettamisessa Rekursio ja roolit Yhteenveto Viitteet Johdanto Ohjelmoinnin oppiminen on monille opiskelijoille todella vaikeaa uusi abstrakti maailma uusia käsitteitä, joiden väliset suhteet eivät aukea Muuttujien roolit muuttujien stereotyyppisiä käyttötapoja, jotka toistuvat ohjelmissa yhä uudelleen hyvin pieni joukko riittää kattamaan lähes kaikki muuttujat eksperttiohjelmoijien hiljaista tietoa, joka voidaan tuoda esiin aloittelijoille helposti omaksuttavassa muodossa havaittu parantavan oppimistuloksia merkittävästi Roolikäsite Muuttujien roolit: (Sajaniemi, 2002; Sajaniemi ym., 2006) laskuri, tmp: entuudestaan tuttuja muuttujien käyttötapoja (käyttäytymistapoja!) roolit: edellisten yleistys; täysi kattavuus Laskuri i:=0... i:=i+1 yleistys askeltaja Juokseva summa rainsum:=0... rainsum:=rainsum+rain yleistys kokooja
11 roolia kattaa 99 % noviisitason ohjelmien muuttujista sanasto ohjelmista puhumiseen; mentaalinen apuväline ohjelmien suunnitteluun ohjelmointitietämystä (vrt. ohjelmointikielitietämys tai ohjelmatietämys) jota voidaan opettaa eksplisiittisesti opiskelijoille Noviisitason ohjelmissa esiintyvät roolit: Rooli Esimerkki Kattavuus Kiintoarvo Askeltaja Tuoreimman säilyttäjä Sopivimman säilyttäjä Kokooja Seuraaja Yksisuuntainen lippu Tilapäissäilö Järjestelijä Säiliö Kulkija maxstringlength count inputdata maximum sum prev errorsoccurred temp sortarray processqueue currnode 99 % Muu tabpos 1 % Kattaa olio-ohjelmoinnin, proseduraalisen ohjelmoinnin ja funktionaalisen ohjelmoinnin Esimerkki: program doubles; var data, count, value: integer; begin end. repeat write('enter count: '); readln(data) until data > 0; count := data; while count > 0 do begin write('enter value: '); readln(value); writeln('two times ', value, ' is ', 2*value); count := count - 1 end data count value tuoreimman säilyttäjä askeltaja tuoreimman säilyttäjä Olio-ohjelmointi: rooleja annetaan muuttujille, parametreille, attribuuteille ja olioille, jotka kapseloivat yhden käsitteellisen attribuutin
public class Dog { String name; // Kiintoarvo: koiran nimi int age; // Askeltaja: nykyinen ikä vuosissa public Dog (String n) { name = n; age = 0; public void birthday () { age++; name age n kiintoarvo askeltaja kiintoarvo Funktionaalinen ohjelmointi: roolit kuvaavat parametrien ja palautusarvojen käyttäytymistä rekursiossa fun max(a, nil) = a max(a, (h::t)) = if h>a then max(h,t) else max(a,t) a sopivimman säilyttäjä h tuoreimman säilyttäjä t kulkija max:in palautusarvo kiintoarvo (rekursiosta lisää myöhemmin) Roolimuutokset: repeat write('enter count: '); readln(count) until count > 0; while count > 0 do begin... count := count - 1 end tuoreimman säilyttäjä askeltaja
Roolit ovat kognitiivinen (eikä tekninen) käsite: Fibonacci-sarja (1, 1, 2, 3, 5, 8, 13,...): kokooja vaiko askeltaja? keskustelut muuttujan mahdollisista rooleista selventävät ohjelman toimintaa ja syventävät ymmärrystä! roolit ovat ohjelmien suunnittelun ja ymmärtämisen mentaalinen apuväline roolit antavat terminologian ohjelmista keskustelemiseen Roolit ja opiskelijat (Sajaniemi ja Kuittinen, 2005; Byckling ja Sajaniemi, 2005, 2006) 91 opiskelijaa Pascal-kielen alkeiskurssilla kolme opetustapaa: Ryhmä Luennot Animointi harjoituksissa Traditional Ei rooleja Roles Roolit käytössä Ei rooleja (Turbo Pascal debugger) Ei rooleja (Turbo Pascal debugger) Animation Roolit käytössä Roolit käytössä (PlanAni) Ohjelmien mentaaliset esitykset (loppukoe):
(p=0.0046) Pariohjelmointi: ei-triviaali ohjelmointitehtävä kuvan ja puheen tallennus videolle 3-4 opiskelijaparia kussakin ryhmässä Ohjelmointitietämys:
Ohjelmointitietämyksen soveltaminen: Roolinimien käyttö loppukokeessa:
35 % opiskelijoista sekä rooliryhmässä että animointiryhmässä käytti roolinimiä vastauksissaan roolinimet yleensä oikein; virheitä teki kaksi rooliryhmän opiskelijaa Roolit ja ammattilaisohjelmoijat (Sajaniemi ja Navarro Prieto, 2005) Empiirinen tutkimus, jossa selvitettiin eksperttiohjelmoijien muuttujiin liittyvää tietämystä. Viisi ohjelmaa, joissa 30 muuttujaa. Tehtävänä perehtyä ohjelmiin ja tehdä kuhunkin yksinkertainen muutos, jonka jälkeen korttien ryhmittely haastattelu Osallistujat: 13 ohjelmoinnin ammattilaista (mediaani 15 vuotta ohjelmointikokemusta) Ryhmittelyperusteet (käytetty tai mainittu):
Hierarkkinen klusterianalyysi:
Roolit ovat kognitiivinen käsite --- ihmisten välisillä eroilla kaksi lähdettä: mikä käyttäytyminen aistitaan mitä käyttäytymisiä pidetään samanlaisina on OK olla eri mieltä! Roolit alkeisohjelmoinnin opettamisessa (Kuittinen ja Sajaniemi, 2004) Roolien väliset suhteet: Roolitietämyksen luonti tuo roolit esiin yksi kerrallaan sitä mukaa kuin ne esiintyvät ohjelmissa selitä roolin tärkeimmät ominaisuudet (ts. käyttäytyminen = rooli) kuvaa roolin tyypillisiä hyödyntämistapoja (ts. käyttö) selitä olennaiset erot aiemmin opittuihin rooleihin (tiedon konstruktiivinen rakentuminen) anna tiivis yhteenvetopaketti (linkki)
=> luentoihin tarvittavat muutokset ovat minimaalisia! tai: perusta ohjelmien käsittely kokonaan rooleille (linkki) (Tedre, 2006) Roolitietämyksen vahvistaminen roolien käyttö mielekkäällä tavalla: kehoitetaan oppilaita ajattelemaan rooleja aktiivisesti omia ohjelmiaan tehdessään roolinimet mielekkäissä yhteyksissä: #include <stdio.h> int data, /* tuoreimman säilyttäjä: kierrosten lukumäärä */ count, /* askeltaja: silmukkalaskuri */ value; /* tuoreimman säilyttäjä: kaksinkertaistettava luku */ mielekkäät keskustelut opiskelijoiden kanssa yksittäisten muuttujien rooleista roolikuvat mielekkäinä metaforina roolipohjainen ohjelmien animointi (Sajaniemi ja Kuittinen, 2004), roolien näytteleminen (Timcenko, 2006),... Roolitietämyksen käyttö ohjelmointistrategioiden opettamisessa Roolipohjainen ohjelmien suunnittelu: Poimi tehtäväksiannosta: mitä rooleja (ja siis attributteja) tarvitaan olioiden mallintamiseen mitä rooleja (ja siis muuttujia) tarvitaan toimintojen tekemiseen mitä parametreja tarvitaan ulkopuolelta tulevien tietojen vastaanottamiseen Kirjoita ohjelman runko (luokkamäärittely / ohjelman vakio-osat) ja sijoita siihen edelläsaatujen attribuuttien ja muuttujien esittelyt Hahmottele toiminnot (muodostaja, metodit, pääohjelma) roolien tyypillisten käyttötapojen avulla Täydennä puuttuvat yksityiskohdat (Esimerkki seuraavalla kalvolla) Huom: Roolipohjaisuus ei auta ohjelman moduulirakenteen (luokat, metodit, proseduurit) suunnittelussa! Roolipohjainen sunnittelu on tarkoitettu ohjelmoinnin alkeiden opiskelun yhteyteen! Esim: Laadi valuuttalaskuri, jolle voidaan ilmoittaa uusi vaihtokurssi milloin tahansa ja joka tietää kaksi viimeisintä kurssitasoa. Laskurin tulee kertoa kulloinkin annettavan dollarisumman hinta euroina korkeamman kurssitason mukaisesti. Tehtäväksiannosta löytyy: nykyinen kurssitaso: olion tiedettävä => attribuutti, tuoreimman säilyttäjä edellinen kurssitaso: olion tiedettävä => attribuutti, seuraaja korkeampi kurssitaso: selvitetään paluuarvoa varten => muuttuja, sopivimman säilyttäjä hinta euroina: lasketaan paluuarvoa varten => muuttuja, tilapäissäilö
uusi vaihtokurssi: ulkopuolelta tuleva tieto => parametri annettava dollarisumma: ulkopuolelta tuleva tieto => parametri Runko ja toiminnot: public class Valuuttalaskuri {?näkyvyys??tyyppi? nykykurssi; // tuoreimman säilyttäjä: nykyinen kurssitaso?näkyvyys??tyyppi? edelkurssi; // seuraaja: edellinen kurssitaso public Valuuttalaskuri (?) { nykykurssi =?; edelkurssi =?; public asetakurssi (?tyyppi? uusikurssi) { edelkurssi = nykykurssi; nykykurssi = uusikurssi; public muunna (?tyyppi? dollarit) {?tyyppi? kurssi; // sopivimman säilyttäjä: korkeampi kurssi?tyyppi? eurot; // tilapäissäilö: summa euroina kurssi = nykykurssi; if (edelkurssi > kurssi) kurssi = edelkurssi; eurot =?laskenta? return eurot; Roolit muussa opettamisessa Roolien merkitseminen UML-kaavioihin: (Byckling ym., 2006)
: Muuttujapohjainen ohjelmointi "etydinä" (Sorva, 2007) etydi: ohjelmointitekniikan sisäistäminen viemällä sen käyttö äärimmäisyyksiin (Bergin, 2005) Esim: Kirjoita jokin oma ohjelmasi täysin ilman if/switch-rakenteita käyttämällä niiden tilalla polymorfismia Muuttujapohjainen ohjelmointi: (Sorva, 2007) Follower prev: inits to: 0 follows: curr Kehittää opettajan ohjelmointitaitoa Rekursio ja roolit Parametrien rooli useimmiten kiintoarvo. Rekursiossa rooli voidaan antaa
parametrin käyttäytymiselle yli rekursiivisten kutsujen palautusarvon käyttäytymiselle yli rekursiivisten kutsujen int sum (node n) { if (n == NULL) return 0; else return n->data + sum(n->next); n kulkija sum:in palautusarvo kokooja int factorial (int n) { if (n==0) return 1; else return n*factorial(n-1); n askeltaja factorial:in palautusarvo kokooja int factorial_2 (int m) { return fact_calc(m,1); int fact_calc (int n, int x) { if (n==0) return x; else return fact_calc(n-1, n*x); n askeltaja x kokooja fact_calc:in palautusarvo kiintoarvo Yhteenveto Roolit ja opiskelijat? Roolit ja ammattilaisohjelmoijat? Roolien käyttö opettamisessa! Lisää tietoa: www.cs.joensuu.fi/~saja/var_roles PlanAni ladattavissa ilmaiseksi samasta osoitteesta!
Viitteet Bergin J. (2005) Variations on a polymorphic theme: An Etude for Computer Programming. http://www.cs.umu.se/~jubo/meetings/ecoop05/submissions/bergin-full.pdf Byckling P., Gerdt P., Kuzniarz L., Sajaniemi J. (2006) Increasing Comprehensibility of Object Models: Making the Roles of Attributes Explicit in UML Diagrams. Nordic Journal of Computing 13(3), 149-161. Byckling P., Sajaniemi J. (2005) Using Roles of Variables in Teaching: Effects on Program Construction. P. Romero, J. Good, S. Bryant, E. A. Chaparro (eds.) Proceedings of the 17th Annual Workshop of the Psychology of Programming Interest Group (PPIG 2005). University of Sussex, U.K., 278-303. Byckling P., Sajaniemi J. (2006) Roles of Variables and Programming Skills Improvement. Proceedings of the 37th SIGCSE Tehnical Symposium on Computer Science Education (SIGCSE 2006), Houston, USA, March 2006, Association for Computing Machinery, 413-417. Kuittinen M., Sajaniemi J. (2004) Teaching Roles of Variables in Elementary Programming Courses. ITiCSE 2004, Proceedings of the 9th Annual Conference on Innovation and Technology in Computer Science Education, Leeds, UK, June 2004. Association for Computing Machinery, 57-61. Pennington N. (1987) Comprehension Strategies in Programming. G. M. Olson, S. Sheppard, E. Soloway (eds.) Empirical Studies of Programmers: Second Workshop. Ablex Publishing Company, 100-113. Rist R. S. (1989) Schema Creation in Programming. Cognitive Science 13, 389-414. Sajaniemi J. (2002) An Empirical Analysis of Roles of Variables in Novice-Level Procedural Programs. Proceedings of IEEE 2002 Symposia on Human Centric Computing Languages and Environments (HCC'02), Arlington, VA, September 2002. IEEE Computer Society, 37-39. Sajaniemi J., Ben-Ari M., Byckling P., Gerdt P., Kulikova Y. (2006) Roles of Variables in Three Programming Paradigms. Computer Science Education 16(4), 261-279. Sajaniemi J., Kuittinen M. (2004) Visualizing Roles of Variables in Program Animation. Information Visualization 3(3), 137-153. Sajaniemi J., Kuittinen M. (2005) An Experiment on Using Roles of Variables in Teaching Introductory Programming. Computer Science Education, 15(1), 59-82. Sajaniemi J., Navarro Prieto R. (2005) Roles of Variables in Experts' Programming Knowledge. P. Romero, J. Good, S. Bryant, E. A. Chaparro (eds.) Proceedings of the 17th Annual Workshop of the Psychology of Programming Interest Group (PPIG 2005). University of Sussex, U.K., 145-159. Sorva J. (2007) A Roles-Based Approach to Variable-Oriented Programming. Accepted to the 19th Annual Workshop of the Psychology of Programming Interest Group (PPIG07), July 2007, Joensuu, Finland. Tedre M. (2006) Johdatus ohjelmointiin. Luentomoniste, Joensuun yliopisto, Tietojenkäsittelytieteen ja tilastotieteen laitos. Timcenko O. (2006) Example of Using Narratives in Teaching Programming: Roles of Variables. 2nd Kaleidoscope Narrative SIG Workshop, Palermo, June 2006. Available at http://gaips.inesc-id.pt/kw-nle06/. Jorma.Sajaniemi@Joensuu.Fi