Automaattestimisest programmeerimisülesannete hindamisel ehk kuidas programmeerida programmeerijat

Edulugu

Programmeerimise õppimine käib katsetuste ja eksimuste abil. Kust leida kannatlikku abimeest, kes juhiks tähelepanu tehtud vigadele ning väsimatult innustaks programmi täiustama niikaua, kuni see vastab teatud kvaliteedinõuetele? Kuidas objektiivselt hinnata programmeerimisülesannete lahendusi? Sedalaadi probleemidega on tegeldud programmeerimise õpetamise algusaegadest saadik. On välja töötatud näiteks olümpiaadiülesannete testimootoreid, mis kontrollivad programmi sisendit ja väljundit ning tööaja otstarbekust etteantud testide hulgal (vt näiteks http://uva.onlinejudge.org või http://prog.offline.ee). Tarkvaraturul on koodianalüüsi- ning profileerimisvahendeid, mis püüavad hinnata programmeerija stiili (see ei ole alati otseselt testidega mõõdetav). Levinud e-õppekeskkondades käsitletakse programmeerimisülesannet seni tihti kui esseed, mida õppejõud peab n-ö käsitsi hindama.

Kuni testitavate ülesannete hulk on väike või on tegemist ühekordse aktsiooniga (nagu olümpiaad) saab abi leida olemasolevate vahendite kohandamisest. Hoopis teistsugused nõuded tekivad juhul, kui vajame automaattestimist igapäevase massiõppe jaoks.

Esiteks peab lahendus olema käideldav

Näiteks kontrolltöödes osaleb korraga üle 50 õppuri, kes peavad tagasisidet saama reaalajas. Nagu näitas selle aasta ACMi programmeerimisolümpiaadi Baltikumi eelvoor, millel osales umbes 40 võistkonda, ei suutnud kasutatud server teste teha piisavalt kiiresti ning moodustus suur järjekord testimist ootavatest lahendustest – õnneks said lõpuks ikkagi kõik programmid kenasti testitud, aga ooteaeg venis tunnini. Koormusega toimetulekuks peab testiserver olema piisava jõudlusega ning lähedal (võrgukiiruse mõttes).

Teine aspekt on kasutajamugavus

Kui õppuriga suhtleb ja ülesandeid jagab e-õppekeskkond, siis oleks loogiline ka lahendused (programmi tekst) esitada selle keskkonna kaudu ning saada kohe adekvaatset tagasisidet testimise tulemuste kohta. Algajalt ei saa eeldada lisatöö tegemist programmi üleslaadimiseks ning testiserveriga suhtlemiseks. Ka tulemuste haldamisel oleks hea kasutada e-õppekeskkonna soorituste päevikut, mitte tekitada eraldi arvepidamist testiserveris. Kuna testimine on ressursinõudlik ning potentsiaalselt ohtlik, siis ei saa seda jätta e-õppekeskkonda käitavale serverile – algajate programmid võivad olla nii leidlikult vigased, et tekib oht testimootori töö halvamiseks. Seega peaks kogu lahendus olema hajus – testiserver on eraldi üksus, mis suhtleb tihedalt e-õppekeskkonnaga.

Kolmandaks ei saa alahinnata õppejõu osa

Süsteem peab võimaldama uusi ülesandeid ja teste ning tagasisidesõnumeid lisada, muuta, eemaldada ja e-õppekeskkonna kontrolltöödega siduda. Kuna mahud on suured, siis ei saa seda tööd teha süsteemi autor või haldaja (nagu see on korraldatud olümpiaadiülesannete puhul). Testide kirjeldamiseks oleks mõistlik kasutada mingit üldaktsepteeritud süsteemi, mis oleks kasutatav ka iseseisvalt. Näiteks Java programmeerimiskeele puhul on hetkel sobivaks vahendiks JUnit moodultestimise raamistik (vt http://www.junit.org).

Eesti Infotehnoloogia Kolledžis on välja töötatud ning juba teist aastat pilootkasutuses automaattestimise süsteem, mis on integreeritud Moodle’i keskkonnaga. Õpilase seisukohalt vaadates on Moodle’i tavavahenditele lisandunud uus küsimusetüüp, mis võimaldab vastusena esitada programmi teksti ning saada tagasisidet selle programmi testimise tulemuste kohta testiserveris. Peale ülesandepüstituse saab õppur ette programmitooriku, mida tuleb nõutud viisil täiendada.

Õppejõu tööks on välja töötada JUnit-testid lahenduste testimiseks ning tagasiside andmiseks. Iga ülesande korral peab õppejõud testiserverisse lisama järgmised failid:

  1. Ülesandepüstitus – tekst, mis kuvatakse õppurile. Oleme kogenud, et ülesande kirjeldus on kasulik anda nii eesti kui ka inglise keeles, kuid see ei ole süsteemi nõue. Ülesandepüstitusena sobib suvaline xhtml-vormingus tekst.
  2. Näidislahendus testide testimiseks (see kunagi õppurini ei jõua). Ühtlasi tõestab see, et ülesanne on lahendatav (näidislahendus peab läbima kõik testid veatult).
  3. Programmitoorik, mis antakse õppurile koos ülesandepüstitusega. Tooriku mõte on välistada süntaksivead, mis tulenevad näiteks testitavate ühikute nimede valesti sisestamisest, samuti on õppuril hea alustada millestki olemasolevast, mitte puhtalt lehelt. Õppejõud otsustab ülesandepõhiselt, kui palju ta soovib õppurile ette ära teha.
  4. JUnit-testid. See on kõige tehnilisem osa ning vajab pisut eriettevalmistust. Samas ei ole üleliigne, kui programmeerimise õppejõud valdab ka testimise raamistikku. Ka teste endid tuleb testida väga põhjalikult, sest viga testis võimendub sajakordseks küsimuseks reaalses kontrolltöösituatsioonis.

Automaattestimise plussid:

  1. Õppuritel on võimalik iseseisvalt sooritada programmeerimisülesandeid ja saada nendele automaatselt sisukat tagasisidet.
  2. Kontrolltöid ja eksameid hinnatakse automaatselt kõigest sekundite jooksul ning tudengid saavad kohest tagasisidet oma edukuse kohta. Varasemalt võttis ühe kontrolltöö (umbes sada õppurit) programmeerimisülesannete kontrollimine õppejõududel aega kuni ühe nädala.
  3. Hindamine on objektiivne. Lahendus kas täidab ülesande nõudeid või ei tee seda.
  4. Õppur saab kogu oma õppetöö läbida ühes õpihaldussüsteemis (Moodle) ega pea automaattestimise jaoks eraldiseisvasse süsteemi sisse logima.
  5. Automaatselt on võimalik testida kõiki enamlevinud programmeerimiskeeltes tehtud ülesandeid.

Automaattestimise miinused:

  1. Ülesannete valik peab olema suur ja muutuv, sest tudengid on leidlikud lahenduste talletajad.
  2. Stiili ning mitteformaalsete aspektide hindamine jääb õppejõu hooleks (näiteks olümpiaadidel seda aspekti üldse ei hinnata).
  3. Plagiaadi tuvastamine jääb praegu veel õppejõu hooleks.
  4. Ei saa anda suuremahulisi (Java puhul mitme klassi koostamist eeldavaid) ülesandeid.

Viimased kaks leiavad tõenäoliselt testimismootori edasistes arenguetappides lahenduse, esimesed on aga põhimõttelist laadi ja siin oleks vaja juba õppejõudu asendavat tehisintellekti.

Automaattestimise kohta võid julgelt lisainfot küsida:

Antti Andreimann (antti.andreimann@eesti.ee) – Eesti Infotehnoloogia Kolledži lepinguline õppejõud. Antti on programmeerinud käesolevas artiklis kirjeldatud automaattestimise süsteemi ning kasutab seda nii veebiprogrammeerimise (HTML, CSS, PHP, MySQL) kui ka Java programmeerimiskeele iseseisvate tööde kontrollimiseks ning tagasisidestamiseks.

Jaanus Pöial (jaanus.poial@itcollege.ee) – Eesti Infotehnoloogia Kolledži tarkvaraõppe juhtivõppejõud. Jaanus on viimase aasta jooksul väga edukalt rakendanud automaattestimise süsteemi IT Kolledžis õppeainete “Programmeerimise algkursus Java baasil” ja “Algoritmid ja andmestruktuurid” iseseisvate tööde hindamiseks ning tagasisidestamiseks.

Tags:

Autorist