This is an old revision of the document!
Članek za eno najprestižnejših konferenc na območju osrednje Slovenije. Navodila za oblikovanje članka.
Letos smo na vajah pri predmetu Principi programskih jezikov uporabljali prototipno različico spletne aplikacije za poučevanje prologa. V tem razdelku bomo opisalo splošno delovanje aplikacije, v nadaljevanju pa se bomo posvetili podrobnejšemu pregledu izbranih komponent.
Kot večina računalniških sistemov za poučevanje tudi naš pristop temelji na reševanju problemov. Glavni meni vsebuje seznam nalog, ki so na voljo za reševanje. Za vsakega uporabnika sistem vodi evidenco nalog, ki jih je rešil delno ali v celoti. Uporabnik v glavnem meniju vidi tudi svoj napredek pri posameznih kategorijah nalog; s klikom na nalogo jo začne reševati.
% slika 1 (a = seznam nalog ; b = editor)
Slika 1b prikazuje vmesnik za reševanje nalog. Naloga na sliki zahteva definicijo relacije “X je sestra od Y” z uporabo podatkov o starševstvu in spolu. Družinsko drevo, ki predstavlja te podatke, je na sliki 2. Na isti sliki je tudi grafični prikaz zahtevane relacije.
% slika 2 (a = družinsko drevo ; b = grafični hint za sister/2)
Uporabnikova rešitev na sliki 1b je skoraj pravilna, manjka le še
pogoj, da X
in Y
nista ista oseba (brez tega pogoja bo prolog namreč sklepal, da
je vsaka ženska sestra sama sebi). Na sliki je tudi primer različnih tipov
povratnih informacij, ki jih generira naš sistem.
Trenutna različica spletne aplikacije je dokaj osnovna, a vsebuje vse poglavitne komponente, ki jih imajo podobni sistemi. To so: urejevalnik programske kode, kamor uporabnik piše svojo rešitev; možnost izvajanja poljubnih poizvedb; testiranje pravilnosti programov s pomočjo testnih primerov; in možnost takojšnjih individualiziranih povratnih informacij.
Ob koncu semestra smo opravili neformalno anketo, s katero smo želeli oceniti zadovoljstvo študentov z aplikacijo. Odzivi študentov so bili pretežno pozitivni, predlagali pa so tudi vrsto možnih izboljšav. Rezultate ankete bomo podrobneje predstavili v sledečih razdelkih; tukaj navajamo le nekaj pozitivnih vtisov:
Overall dobra aplikacija. Všeč mi je to, da mi ni bilo potrebno doma nastavljati določenih stvari, nalagati knjižnice, etc ampka je bilo vse na voljo na internetu.
Aplikacija je v splošnem super, saj se z njo dosti lažje učiš kot pa če bi moral programirati in preverjati pravilnost svoje rešitve v programu, kjer tudi nimaš na voljo avtomatskega preverjanja pravilnosti rešitve tako kot ste si jo zamislili.
Najosnovnejša funkcija sistemov za poučevanje je možnost preverjanja rešitev. Pred uvedbo spletne aplikacije so študenti na vsakih vajah poleg novih nalog dobili še “uradne” rešitve za naloge prejšnjega tedna, s katerimi so lahko preverili svoje rešitve. Tak pristop ima dve očitni slabosti: študent lahko nalogo reši na drugačen način, zaradi česar je rešitvi težko primerjati; poleg tega pa lahko med reševanjem naloge in povratno informacijo mine precej časa.
Ker je v splošnem nemogoče samodejno preveriti, ali dan program pravilno opravlja
neko funkcijo, sistemi za poučevanje programiranja ponavadi za preverjanje
rešitev uporabljajo testne primere. Učitelj za vsako nalogo določi množico
testnih vhodov, sistem pa preveri odgovore, ki jih uporabnikov program vrne pri
teh vhodih. Dan program sprejmemo kot pravilno rešitev takrat, ko pravilno reši
vse testne primere. Na ta način pokrijemo vse možne rešitve, ki se lahko
konceptualno precej razlikujejo.
Primer testnega vhoda za nalogo sister/2
iz prejšnjega razdelka je vprašanje
?- sister(vanessa, vanessa).
Pravilen program odgovori “false”, medtem ko napačen program iz slike 1b
odgovori “true”. Glede na kombinacijo pravilno in narobe rešenih testnih
primerov lahko sklepamo o prisotnosti določenih konceptualnih napak v programu.
V zgornjem primeru lahko tako z veliko gotovostjo sklepamo, da v rešitvi manjka
pogoj, da X
in Y
nista ista oseba.
Kljub široki uporabi imajo testni primeri nekaj pomanjkljivosti. Prva je ta, da ne zagotavljajo, da je nek program pravilna rešitev dane naloge, temveč le, da uspešno prestane vse teste. Ta problem rešujemo s premišljeno izbiro testnih primerov, ki jih v primeru napak tudi posodabljamo.
Drug problem je ta, da morajo za uspešno preverjanje vsaj nekateri testni primeri ostati skriti. V nasprotnem primeru bi uporabnik lahko spisal program, ki vrne pravilni odgovor samo za dane vhode, sistem pa bi ga sprejel kot pravilno rešitev naloge. Po drugi strani pa skriti testni primeri lahko predstavljajo problem:
Ni izpisa testnih primerov. Se je zgodilo, da sam nisem mogel najti protiprimera s katerim bi našel napako v programu, testiranje pa ni bilo 100%.
Ta problem smo rešili tako, da smo v sistem dodali funkcijo za generiranje naključnih testnih primerov. Kadar uporabnik pošlje nepravilen program v testiranje, mu sistem poleg števila opravljenih testov izpiše še protiprimer, za katerega uporabnikov program vrne nepravilni odgovor.
Delovanje te funkcije si oglejmo na primeru predikata gcd(A,B,D)
, ki
poišče največji skupni delitelj D
števil A
in B
.
Za vsako nalogo definiramo vzorec, na podlagi katerega sistem
generira naključne kombinacije vhodnih podatkov; za predikat gcd(A,B,D)
je ta vzorec
[int(1,100), int(1,100), out].
To pomeni, da sta prva dva argumenta celi števili med 1 in 100, zadnji argument pa predstavlja izhod programa - v tem primeru največji skupni delitelj izbranih števil. Ko uporabnik pošlje nepravilen program v testiranje, sistem najprej zgenerira nov nabor vhodnih podatkov (v tem primeru dve števili). Na tem vhodu požene pravilno rešitev in uporabnikov program. Če sta rezultata enaka, postopek ponovi, v nasprotnem primeru pa vrne generiran vhod kot protiprimer, na katerem uporabnikov program ne deluje pravilno.
To funkcionalnost smo kot manjši dodatek implementirali šele po začetku semestra, a se je hitro izkazala za eno najuporabnejših orodij v našem sistemu. Protiprimei so v veliko pomoč študentu pri iskanju napak v programu, saj lahko na njih simulira izvajanje programa in tako hitreje odkrije mesto napake.
Iz tehničnih razlogov smo naključne protiprimere zaenkrat implementirali le za določene naloge. Na njihovo uporabnost najbolje kažejo izjave študentov, ki so jih pri drugih nalogah pogrešali:
Izpis protiprimera v VSEH primerih bi bil odličen.
Glavni problem je bil to, da pri veliko nalogah ne izpiše protiprimerov, kar bi zelo olajšalo lovljenje hroščev.
Dodatna prednost uporabe računalniških sistemov za poučevanje je, da nam omogočajo podrobno analizo različnih postopkov reševanja nalog. Naš sistem v ta namen za vsak poskus hrani podrobno sled reševanja. Ta sled vključuje vse spremembe na programski kodi – vstavljanje oziroma brisanje znakov – in ostale interakcije s spletno aplikacijo, kot je izvajanje poizvedb in testiranje rešitve.
V spletno aplikacijo smo vključili metodo za samodejno odpravljanje napak, ki jo razvijamo v našem laboratoriju~\cite{lazar2014data}.
Nazadnje omenimo še en vidik aplikacije, na katerega v začetku nismo pomislili, a se je hitro izkazal za bistveno prednost pred obstoječim načinom dela na vajah. Gre za t.i. “poigritev” (angl. gamification) oziroma uporabo elementov iz računalniških iger v drugih aplikacijah. Tipičen primer takega prijema je podeljevanje značk (angl. badges) uporabnikom za razne dosežke, kot npr. pravilna rešitev v prvem poskusu ali v zelo kratkem času. Poigritve so v osnovi namenjene motivaciji in ohranjanju zanimanja za aplikacijo, saj uporabniku predstavljajo jasen cilj.
Naš sistem ne vsebuje nobenih funkcionalnosti, ki bi bile primarno namenjene poigritvi. Kljub temu pa se je izkazalo, da že uvodni zaslon s seznamom nalog opravlja podobno funkcijo. Študent namreč vidi, koliko nalog je na voljo v vsakem poglavju in koliko jih še mora rešiti.