Ohjelmoinnin MOOC Moodlella? Kokemuksia Moodlen Virtual Programming Lab työympäristöstä ITK2016 Aulanko 14.4.2016 14:45-15:15, Esityssali 21 Antti Salopuro Lahden Ammattikorkeakoulu Liiketalous/Tietojenkäsittely
Äänessä ja kuvassa Antti Salopuro, MSc. (sovellettu matematiikka), Lehtori Lahden Ammattikorkeakoulu, Liiketalouden tietojenkäsittely 2008 - Opettajana useilla eri ohjelmoinnin kursseilla Aiemmin 10 v. työkokemus tuotekehitysinsinöörinä erityisalana ohjelmointi, mittaustekniikka ja tuotekehitysprojektit
Taustaa OHJELMOINTI OPETUS- JA OPISKELUAIHEENA
Ohjelmointi lajina Ohjelmointi on pitkälti taitolaji Opitaan vain itse tekemällä ja toistamalla harjoitteita PALJON Harvoilla on kyky oppia itsenäisesti ilman tukea Ongelman ratkaisua, rinnastuu matematiikkaan monessa mielessä Vaatii loogista ajattelukykyä ja luovuutta Voi käyttää vain eksakteja sääntöjä Ongelma voidaan silti ratkaista monella eri tavalla Kaikki tavat eivät yhtä tehokkaita tai yhtä hyviä
Opiskelija tarvitsee apua Suuret ryhmät opettajalla ei paljoa aikaa lähitunneilla Esimerkeistä malleja Parityöskentely auttaa, kaikilla ei tähän mahdollisuutta Opiskelija ei voi tietää onko ratkaisu oikein täytyy odottaa seuraavaan lähituntiin
Testauksesta apua opiskeluun? Ohjelmatestauksessa ohjelmaa kokeillaan tunnetuissa ja tarkkaan kontrolloiduissa olosuhteissa, jolloin ohjelman toiminta voidaan ennustaa Jos toiminta poikkeaa ennusteesta, ohjelma ei toimi oikein Jos opiskelija voi milloin tahansa ajaa testin omalle ratkaisulleen, hän voi saada välittömästi palautteen ratkaisun oikeellisuudesta Palautteessa voisi olla myös tietoa siitä, mikä ratkaisussa on väärin
Testauksesta apua opettamiseen? Arviointi ja osin myös ohjaus automatisoituu Opettajalle enemmän aikaa henkilökohtaiseen ohjaukseen Helpottaa opintojakson virtualisointia MOOC???
Virtualisointi vaatii paljon HY:n esimerkin mukainen MOOC vaatii paljon resursseja Perustaminen Työkalut Materiaalit Videoinnit Toteuttaminen Jakson ohjaus Arvioinnit
Valmiilla työkaluilla? Pienemmilläkin resursseilla virtualisoitua ohjelmoinin opetusta Alkupanostus huomattavasti pienempi Jos integroitavissa nykyiseen oppimisympäristöön, voidaan ottaa käyttöön pikkuhiljaa resurssien sallimassa vauhdissa
Moodle VPL TYÖKALUN OMINAISUUDET
Virtual Programming Lab Moodle työkalu konsolipohjaisten ohjelmointitehtävien hallinnointiin Julkaistu 2010 Uusin client versio 3.1.2 Uusin execution (jail) server 2.1.1 Vapaasti ladattavissa (GitHub) Vapaasti käytettävissä ( GNU/GPL License) September 11 22, 2016
VPL - Ominaisuuksia Tehtävänanto Palautukset sähköisesti Debuggaus virheen etsintä Automaattinen testaus Automaattinen/manuaalinen arviointi Paljon (27) tuettuja kieliä C/C++, C#, PHP, SQL, Python, HTML,
Lisää ominaisuuksia Opiskelijan ratkaisu kopioitavissa, ladattavissa sekä editoitavissa Ohjelma ajettavissa VPL:n komentoikkunassa selaimen kautta Opiskelija ja opettaja voi suorittaa ja testata Voidaan yhdistellä opettajan ja opiskelijan koodia
Tehtävälle määritetään Tehtävänanto Määräaika Ladattavien tiedostojen max lukumäärä Maksimipistemäärä Opiskelijalle sallitut toiminnot (run/debug/evaluate) Pakolliset tiedostot nimineen Opettajan koodi asetuksineen Testitapaukset Sallitut resurssit (muisti, suoritusaika)
Pakolliset tiedostot Opettaja esimerkiksi nimeää nimiavaruuden jotta opettajan testiohjelma löytää opiskelijan tekemät osat Tässä opettaja on määritellyt myös luokan nimen valmiiksi Opettaja rakentaa templaten, jossa määritellään ne pakolliset osat, jotka opiskelijan on toteutettava
Opettajan koodi: Execution files Opettajan testiohjelma voi kutsua opiskelijan tekemiä metodeja
Testitapaukset: vpl_evaluate.cases Yhteen ohjelmaan voi kohdistaa useita testejä. Testillä on aina nimi (Case), syöte (input) ja odotettu tuloste (output)
Testin syötetiedot Testikuvauksen input kentässä määritellään testattavalle ohjelmalle annettava ulkoinen syöte Ohjelmassa tämä on esimerkiksi käyttäjän näppäimistöltä antama komento Jos ohjelmassa annetaan useita peräkkäisiä syötteitä, nämä kaikki pitää huomioida myös testin määrittelyssä Syötteitä voi olla useita, tällöin ne jaetaan usealle riville
Esimerkkejä Case = test1 input = 23 Case = test2 input = Hello Case = test3 input = 23 3 Jussi Kaikki syötteet kuin näppäimistöltä annettuna eli string tyyppiä. Jos syöte jaettu usealle riville, niin syötteiden välissä tällöin rivinvaihtomerkki (Enter)
Testin odotettu tulos - output Output kentässä määritellään syötettä vastaava ohjelman tulostama arvo Voidaan käyttää regexp sääntöjä (http://www.regular-expressions.info/ ) Huomioitava, että opiskelijan ohjelma voi usein tulostaa ylimääräistä tai jossain eri muodossa kuin opettaja on määritellyt tällöin testi ei mene läpi, vaikka ohjelma muutoin olisikin oikein toteutettu
Esimerkkejä Ohjelman tulostus: match this 234 Testi Pass/Fail Selite match this 234 Pass tarkka kopio 234 Pass testaa vain numeron esiintymisen match this Fail tarkka kopio /this/ Pass teksti esiintyy tulostuksessa /[Mm]atch this 234/ Pass Match ja match, molemmat käy /ma..h/ Pass piste (. ) on mikä tahansa merkki /match Match MATCH/ Pass mikä tahansa sana esiintyy
Esimerkkitehtävä VPL KÄYTÄNNÖSSÄ
VPL palautuslinkkinä Yksinkertaisimmillaan VPL toimii tehtävien palautuslinkkinä Opettaja näkee palautuksen koodina Manuaalinen pisteytys Tarvittaessa voi myös ajaa ohjelman, jos se on ajettavissa Palaute mahdollinen, myös editointi
VPL automaattisella pisteytyksellä Opettaja kirjoittaa tarvittaessa opiskelijan koodia kutsuvat osat ja/tai opiskelijan koodin tarvitsemia osia Opettaja laatii testit Opiskelija palauttaa tehtävän ja ajaa testin, tarvittaessa korjaa automaattisen palautteen mukaan Opettaja vahvistaa pisteytyksen
Esimerkki automaattisesta testauksesta C#/oliot, testaus ilman unix skriptejä Luokan ja metodien testaus Opettaja tekee testiympäristöön pääohjelman, joka huolehtii testaamisesta Opiskelija palauttaa vain tekemänsä luokan Eri testeissä kutsutaan testiohjelmaa antaen testin järjestysnumero parametrina Testiohjelmassa eri testit eriytetty switch case rakenteella DEMO: opettaja: [username: teacher2, passwd: teacher] opiskelija: [username: student2, passwd: student] http://demovpl.dis.ulpgc.es/moodle/mod/vpl/view.php?id=330 September 25 22, 2016
Esimerkkitehtävä, tehtävänanto Suunnittele ja toteuta luokka Word, jolla on String tyyppinen attribuutti word. Luokalla on konstruktori, joka alustaa olion attribuutin word parametrina annettuun arvoon. Metodi Count laskee attribuutin word merkkien määrän. Luokassa on myös metodi SetWord, jolla voi vaihtaa attribuutin arvoa sekä metodi Replace, joka etsii attribuutin word arvosta parametrina annetun yksittäisen kirjainmerkin ensimmäisen ja viimeisen esiintymiskohdan ja korvaa näissä kohdissa merkit toisella merkillä, joka myös annetaan metodille parametrina.
Testattavia asioita Konstruktorin olemassaolo Metodien olemassaolo ja oikea allekirjoitus Metodin Count oikeellisuus Metodin Replace oikeellisuus Metodien SetWord ja ToString oikeellisuus private näkyvyyden attribuuttien olemassaoloa ei oikein voi testata tällä menetelmällä
Testiohjelman rakenne: switch - case using System; namespace Programs { class TestProg { static void Main(string[] args) { //luetaan testistä syöte (testin numero) int input = Convert.ToInt32(Console.ReadLine()); Word myw; //Console.WriteLine("Aloitetaan testit"); switch (input) { case 1://Constructor and ToString myw = new Word("Test string to start"); Console.WriteLine(myW); break; case 2://Count myw = new Word("Test string to start"); Switch-case rakenteella voidaan kukin testi ajaa samalla testiohjelmalla erikseen, testin input arvo luetaan testiohjelmassa ja suoritettava case lohko määräytyy sen mukaan
Case = test1 input = 1 output = // Testisarja: vpl_evaluate.cases Case = test2 input = 2 output = Pass Case = test3 input = 3 output= Pass grade reduction = 20% Case = test4 input = 4 output= Pass Neljä testiä, opettajan testiohjelma tulostaa tekstin Pass, jos testi on läpäisty. Jos tulostus on jotakin muuta, testi on hylätty. Kukin testi läpäistynä tuottaa 1/n maksimipisteistä eli tässä 25%. Grade reduction kuitenkin ylikirjoittaa tämän asetuksen
Testien suoritus 1: ei konstruktoria using System; namespace Programs Opiskelijan toteutus { public class Word { private string word; //Attributes private, methods public! //Methods to add: ToString (override) Count, SetWord, Replace } } Konstruktorin puuttuminen estää kääntämisen virheilmoitus
using System; Testien suoritus 2: konstruktori on namespace Programs { public class Word Opiskelijan toteutus { private string word; //Attributes private, methods public! //Methods to add: ToString (override) Count, SetWord, Replace public Word(string instr) { word = instr; } } } Kun konstruktori löytyi, myös kääntäminen onnistuu
Metodien testaus: testiohjelma case 2://Count myw = new Word("Test string to start"); if(myw.count() == 20) Console.WriteLine("Pass"); else Console.WriteLine("Method Count not correct"); break; case 3://Count myw = new Word("Test string"); if (myw.replace('s', 'k') == "Tekt ktring") Console.WriteLine("Pass"); else Console.WriteLine("Method Replace not correct"); break; Tämä toimintamalli kuitenkin vaatii, että testiohjelma kääntyy ja se tapahtuu vain, jos kaikki metodit on toteutettu vähintään tynkinä, toinen vaihtoehto on C#:n extension methods Testataan kutakin metodia vakiosyötteillä ja verrataan lopputulosta odotettuun Jos testi ei ole läpäisty, niin tulostetaan selväkielinen ilmoitus, joka näkyy opiskelijalle testituloksissa
Kokemuksia MITÄ JÄI KÄTEEN?
Opettajan näkökulma Opettajalle toteutus oli työläs, testien rakentaminen vei aikaa lähes 2x edelliseen vuoteen (160h vs. 90h.) Vaikka testejä yritti tehdä huolella, joskus niihin jäi virheitä ja opiskelijat eivät saaneet palautettua ratkaisujaan Testillä saa kiinni algoritmivirheet, mutta ei testaa koodin selkeyttä tai tyyliä Jää tällöin myös vähemmälle huomiolle
Opettajan näkökulma Toisaalta tehtävien tarkastaminen ja kommentointi sujui nyt nopeammin niiden opiskelijoiden osalta, jotka saivat tehtävät tehtyä oikein Lisäksi nyt testit on kertaalleen tehty ja seuraavan toteutuksen osalta työmäärä on toivottavasti paljon pienempi
Opiskelijoiden näkökulma Opiskelijat pitivät pääosin hyvänä Erityisesti tyytyväisiä oltiin siihen, että kotitehtävistä sai jonkun palautteen jo tehdessään Usein myös virheilmoituksilla oli ohjaava vaikutus ja opiskelija löysi virheensä helpommin Muutamat opettajan virheet testeissä harmittivat kovasti
Sopisiko MOOCin välineeksi? Ei pelkästään, mutta helpottaa kyllä asian kehittelyä Kytkemällä uusien aiheiden ja tehtävien saatavuus edellisen aiheen tehtäväpisteisiin ollaan jo aika pitkällä Testeistä pitäisi saada vielä paremmin opiskelijaa ohjaavia ja monipuolisempia Tarkemmat virheilmoitukset enemmän valmistelutyötä