tutaj - EduAkcja. Magazyn Edukacji Elektronicznej

Transkrypt

tutaj - EduAkcja. Magazyn Edukacji Elektronicznej
EduAkcja. Magazyn edukacji elektronicznej
nr 2 (12)/2016, str. 101—113
Skrypty w systemie automatycznej oceny rozwiązań zadań
programistycznych.
Część I. Kontekst i motywacje
Krzysztof Barteczko
Polsko-Japońska Akademia Technik Komputerowych
[email protected]
Streszczenie: System Doskonalenia Kwalifikacji Programistycznych (SDKP), wdrożony w Polsko-Japońskiej Akademii Technik Komputerowych umożliwia nauczycielom tworzenie skryptów, wspomagających ocenę rozwiązań
zadań programistycznych. Specyfikując zadania do wykonania i sprawdzając później ich rozwiązania, nauczyciel
może nie tylko korzystać z rozlicznych wbudowanych w system narzędzi weryfikacji (jak w tradycyjnych systemach
automatycznej oceny), ale również dostarczyć skrypty testujące poprawność wyników oraz jakość kodu. W skryptach można używać bogatych środków przetwarzania informacji, w tym środków statycznej i dynamicznej analizy
kodów programów. Dla nauczycieli przedmiotów programistycznych tworzenie skryptów nie powinno sprawiać
trudności, a przy tym może znacząco poprawiać jakość analizy rozwiązań. W pierwszej części artykułu przedstawiono krótką informację o SDKP na tle innych systemów automatycznej oceny rozwiązań zadań programistycznych oraz główne motywy i założenia użycia skryptów w systemie.
Słowa kluczowe: nauczanie programowania, automatyczna ocena rozwiązań, statyczna analiza kodu, dynamiczna
analiza kodu, testowanie oprogramowania, skrypty, Java, Groovy, metaprogramowanie, analiza AST, refleksja
1. Wprowadzenie. O systemach automatycznej oceny rozwiązań zadań programistycznych
Automatyczna ocena rozwiązań zadań programistycznych jest coraz częściej stosowana w procesie dydaktycznym. Jej początki sięgają lat 60. ubiegłego wieku (Forsythe i Wirth, 1965), a po
2000 r. zaobserwować można znaczący rozwój stosowanych w tym zakresie podejść i narzędzi
(Caiza i Del Alamo, 2013; Douce, Livingstone i Orwell, 2005; Gupta i Dubey, 2012; Ihantola,
Ahoniemi, Karavirta i Seppälä, 2010).
Zapewne pierwszoplanowym motywem budowy i stosowania narzędzi automatycznej oceny
było i nadal jest ułatwienie pracy nauczycieli. Istotnie, manualna ocena poprawności i jakości
dużej liczby programów jest niezwykle pracochłonna. Wsparcie ze strony automatycznych narzędzi (oczywiście, niezastępujące finalnej oceny rozwiązania przez nauczyciela) może tu być
bardzo pomocne.
Jednak wcale nie to powinno być główną zaletą stosowania systemów automatycznej oceny
rozwiązań (SAO). Oprócz ułatwienia oceny, systemy te powinny czynić proces oceny:
• wieloaspektowym (uwzględniającym poprawność, jakość, efektywność oraz elastyczność rozwiązania, a przy tym wykluczającym plagiaty),
• bardziej precyzyjnym (umożliwiając wykrywanie większej liczby błędów i niedociągnięć, niż
ma to miejsce przy ocenie manualnej),
• otwartym (czyli pozwalającym na modyfikowanie i dodawanie procedur automatycznej oceny zgodnie z potrzebami nauczycieli),
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
• rejestrowalnym, odtwarzalnym i powtarzalnym (co jest ważne dla doskonalenia mechanizmów oceny oraz zapewnienia porównywalności wyników ich zastosowania),
• przejrzystym i zrozumiałym dla studentów.
W konsekwencji powinna poprawiać się jakość kształcenia: studenci będę lepiej rozumieć
swoje niedociągnięcia i ich przyczyny, dydaktycy – lepiej dostrajać proces dydaktyczny do konkretnych warunków.
Rozwój systemów automatycznej oceny doprowadził do tego, iż znane współczesne SAO –
takie jak np. BOSS (Joy, Griffiths i Boyatt, 2005), Web-Cat (Edwards i Perez-Quinones, 2008),
CourseMarker (Higgins, Gray, Symeonidis i Tsintsifas, 2005), VirtualLab (Rodríguez-del-Pino,
Rubio-Royo i Hernández-Figueroa, 2012), FLOP (Ljana, Martin i Pareja-Flores, 2012), Style++
(Ala-Mutka, Uimonen i Jarvinen, 2004), Petcha (Queirós i Leal, 2012), bottlenose (Sherman,
Bassil, Lipman, Tuck i Martin, 2013), JACK (Striewe, Goedicke i Balz, 2008), AutoLEP (Tiantian, Xiaohong, Peijun, Yuying i Kuanquan, 2009) – w dużym stopniu spełniają wyżej wymienione wymagania.
W dużym stopniu, ale nie do końca. O każdym z nich można powiedzieć, że charakteryzuje
się co najmniej jedną z niekorzystnych cech:
• niekompleksowością – czyli weryfikacją tylko niektórych aspektów rozwiązań (np. tylko poprawności lub tylko stylu albo pominięcie identyfikacji plagiatów),
• zamkniętością – brakiem możliwości uzupełniania przez nauczycieli zestawu reguł testowania/oceny,
• nieadekwatnością – zbyt uproszczonymi sposobami testowania rozwiązań, co uniemożliwia
zastosowanie automatycznej weryfikacji dla szerszego zakresu zadań,
• trudnością użycia – zbyt skomplikowanymi sposobami definiowania przez nauczycieli reguł
testowania.
Omawianie istniejących systemów automatycznej oceny rozwiązań, ani tym bardziej ich analiza porównawcza, nie stanowią przedmiotu artykułu. Dla zilustrowania postawionej wyżej tezy
warto jednak pokrótce przedstawić ich główne cechy, a także słabości w zakresie automatycznego testowania (zob. Tablica 1).
Tablica 1. Główne cechy i słabości popularnych SAO. Uwaga: dane podane w tabeli opierają się na ogólnie dostępnych informacjach, w szczególności z wcześniej przytoczonych artykułów
Nazwa SAO
Główne cechy
(w zakresie testowania)
Słabości
BOSS
Testowanie poprawności rozwiązań za
pomocą porównania faktycznych wyników
z oczekiwanym oraz z użyciem testów jednostkowych (JUnit).
Testowanie stylu rozwiązań za pomocą predefiniowanego zestawu metryk z możliwością
ich uzupełniania przez dodatkowe komponenty programistyczne, opracowywane przez
developerów systemu.
Testy antyplagiatowe.
Ograniczony zakres metryk stosowanych przy
testowaniu stylu.
Wtłoczenie dynamicznej analizy kodu
wyłącznie w (zbyt sztywny) schemat testów
jednostkowych.
Zwykły nauczyciel-użytkownik ma ograniczone możliwości łatwego definiowania
testów (praktycznie tylko w zakresie definiowania wejść i wyjść w testach typu „czarna
skrzynka”).
Testowanie poprawności za pomocą weryfikacji wyników działania programu,
Testowanie stosowania określonych konstrukcji w rozwiązaniach,
Testowanie stylu za pomocą predefiniowanego zestawu metryk.
Ograniczone możliwości konfigurowania
testów poprawności rozwiązań oraz weryfikacji stosowania konstrukcji programistycznych
(tylko na podstawie regularnych wyrażeń, co
znacznie ogranicza zakres ocenianych zadań).
Publicznie dostępne informacje na temat tego
systemu pochodzą sprzed więcej niż 10 lat, co
może oznaczać, że nie jest on dalej rozwijany.
CourseMarker
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 103
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
Nazwa SAO
Główne cechy
(w zakresie testowania)
Web-Cat
Opiera się głównie na założeniu, że studenci
sami mają testować swoje programy, a system
sprawdza jakość tego testowania i stopień pokrycia rozwiązania testami; nauczyciele mogą
używać własnych testów, ale tylko w zakresie
testów jednostkowych.
Testowanie stylu/wymagań za pomocą
Checkstyle i PMD.
Mała różnorodność rodzajów testów i sposobów testowania, brak możliwości definiowania testów stylu przez nauczycieli – „zwykłych” użytkowników.
Brak możliwości definiowania testów poprawności na podstawie weryfikacji wyników
działania programu.
Testowanie poprawności rozwiązań głównie
za pomocą weryfikacji wyników działania
programu z dodatkową możliwością użycia
testów jednostkowych (JUnit).
Testowanie stylu rozwiązań za pomocą predefiniowanego zestawu metryk.
Definiowanie bardziej zaawansowanych
testów wymaga od nauczycieli-użytkowników
dostarczania wielu plików w tym skryptów
systemowych, zarządzających technicznymi
szczegółami kompilacji i wykonania testów.
Zdefiniowanie takiego testu jest więc trudne
i pracochłonne.
Virtual Programming Lab
for Moodle 3
FLOP
PETCHA
Style++
Słabości
Testy poprawności rozwiązań za pomocą we- Zbyt mała różnorodność testów.
ryfikacji wyników (praktycznie jest to typowy Zbyt mała elastyczność definiowania dostępprosty system do zastosowania w konkursach nych rodzajów testów.
programistycznych).
Testy poprawności rozwiązań na podstawie
przypadków testowych („black-box”).
Użycie dialektu XML PExIL do definiowania
testów.
Możliwości testowania ograniczone do porównywania wyników z przypadkami testowymi (brak testów wymagań na konstrukcje
programistyczne, testów stylu itp.).
Język PExil – jako dialekt XML – jest niewygodny w użyciu.
Testy stylu predefiniowane w systemie.
Zbyt mała różnorodność rodzajów testów
Nauczyciel ma możliwość wyboru testów oraz (tylko testy stylu).
określenia punktacji.
Brak możliwości definiowania własnych
testów przez nauczycieli.
JACK
Testowanie poprawności za pomocą dynamicznej analizy działania programu.
Testowanie stylu i wymagań za pomocą przetwarzaniu abstrakcyjnych grafów składni.
Sposób specyfikacji przez nauczycieli reguł
dla testów stylu jest uciążliwy i nieintuicyjny.
Brak wbudowanego modułu antyplagiatowego.
AutoLEP
Testowanie poprawności rozwiązań za pomocą przypadków testowych.
Testowanie stylu i spełniania wymagań
poprzez porównanie z rozwiązaniem modelowym.
Testowanie stylu za pomocą porównania
z rozwiązanie modelowym ogranicza różnorodność i złożoność zlecanych studentom
zadań.
Brak wbudowanego modułu antyplagiatowego.
Bardzo elastyczne testowanie wielu aspektów
rozwiązań.
Definiowanie testów wymaga dostosowania
do formatu TAP („test anything protocol”),
co dla niektórych języków (np. Java) oznacza
konieczność poznania odpowiednich bibliotek i dużą pracochłonność tworzenia testów.
bottlenose
Tworząc System Doskonalenia Kwalifikacji Programistycznych PJATK starano się uniknąć
każdej z wcześniej wymienionych słabości.
2. System Doskonalenia Kwalifikacji Programistycznych jako SAO
System Doskonalenia Kwalifikacji Programistycznych (SDKP) zrealizowany został w Polsko-Japońskiej Akademii Technik Komputerowych w ramach projektu PO KL Informatyk – wszechstronny specjalista.
Podstawowym celem SDKP było stworzenie modelu analizy i oceny postępów studentów,
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 104
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
a także zrozumiałego, wspomagającego proces uczenia się, przedstawiania im wyników tej oceny (Barteczko, 2013).
Realizacja tego zamierzenia opierała się w głównej mierze na specjalnie przygotowanych narzędziach weryfikacji rozwiązań zadań programistycznych w języku Java (wybór był podyktowany dominacją tego języka w nauczaniu programowania).
SDKP jako SAO wyróżnia się wśród znanych rozwiązań charakterystykami podanymi w Tablicy 2.
Tablica 2. Wyróżniające cechy SDKP
KOMPLEKSOWOŚĆ
Wykrywanie plagiatów, testowanie poprawności rozwiązań, weryfikacja spełniania postawionych w zadaniu
wymagań, weryfikacja umiejętności stosowania właściwych konstrukcji językowych i bibliotek, sprawdzanie
jakości, stylu, uniwersalności, elastyczności, skalowalności i efektywności kodu.
OTWARTOŚĆ, RÓŻNORODNOŚĆ I ADEKWATNOŚĆ
Możliwość definiowania przez nauczycieli własnych procedur testowania w wyżej wymienionych zakresach,
w bardzo różnorodny sposób, dostosowany do ich wiedzy, umiejętności, upodobań oraz adekwatny do oceny
przygotowanych przez nich zadań.
PROSTOTA UŻYCIA
Łatwość definiowania procedur weryfikacyjnych, nawet dla najbardziej skomplikowanych przypadków niewymagająca od nauczycieli nabywania jakichś nowych umiejętności.
•
•
•
•
Konstrukcja SDKP zawiera następujące moduły weryfikacji-testowania rozwiązań:
PlagTest – moduł antyplagiatowy, wykrywający powielone fragmenty kodów (mechanizmy,
leżące u podstaw działania tego modułu są szczegółowo opisane u (Barteczko, 2012)),
RunTest – moduł, używany do:
–– weryfikacji poprawności działania programu na podstawie porównania jego wyników
z oczekiwanymi; w procesie weryfikacji mogą być stosowane wyrażenia regularne, predefiniowane transformacje faktycznych i oczekiwanych wyników programu oraz zdefiniowane w systemie i/lub tworzone przez nauczycieli skrypty, działające na faktycznych
i oczekiwanych wynikach; jest to główne zastosowanie tego modułu,
–– weryfikacji poprawności programu na podstawie dynamicznego wywołania jego fragmentów (tworzenia obiektów, wywołania metod), a także dynamicznej analizy kodu metodami
tak zwanej. refleksji (Java Reflection API, b.d.), co może być wykorzystywane w ocenie
spełniania wymagań oraz jakości kodu; tutaj stosowane są już wyłącznie skrypty.
BehaviorTest – używany do:
–– weryfikacji poprawności rozwiązań zgodnie ze specyfikacją odnośnie do zachowania programu i jego części (klas, metod); tu stosowane są scanariusze behawioralne zdefiniowane
(w systemie i/lub przez nauczycieli) w postaci skryptów uruchamianych w środowisku
easyb,
–– weryfikacji spełniania wymagań i jakości rozwiązań; tu stosowane są skrypty dynamicznej
analizy kodów środkami refleksji, również uruchamiane w środowisku easyb.
ReqTest – służy do testowania dowolnych wymagań postawionych wobec kodu rozwiązania
zleconego zadania. Przy definiowaniu takich wymagań dydaktycy mogą posługiwać się zarówno bardzo prostymi i łatwymi w użyciu środkami (wyrażenia regularne), jak i bardziej zaawansowanymi sposobami analizy składniowej przy użyciu skryptów, działających na kodach
źródłowych. W skryptach tych stosowane mogą być dowolne narzędzia programistyczne, od
prostych działań na napisach, poprzez wyrażenia regularne, po przetwarzanie drzew składniowych (ang. Abstract Syntax Tree, AST) programów.
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 105
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
• StyleTest – służy do testowanie stylu i koncentruje się na zastosowaniu predefiniowanych
reguł i metryk, sprawdzających wybrane elementy właściwego stylu programowania. W tym
celu z SDKP zintegrowany został znany system statycznej analizy kodu – PMD, przy czym
integracja ta charakteryzuje się ułatwieniami specyfikacji testów, znacząco obniżającymi pracochłonność ich przygotowania przez nauczycieli. Dodatkowo moduł ten umożliwia nauczycielom łatwe dostosowanie istniejących reguł do swoich potrzeb, a także łatwe tworzenie nowych reguł w konwencji PMD; więcej na ten temat zob. w artykule autora (Barteczko, 2015).
• EffTest – służy do testowania efektywności działania programów; wykorzystuje mechanizmy
modułu RunTest dla porównania czasu wykonania programu z czasem wzorcowym i/lub dopuszczalnym.
• UESTest – służy do testowania uniwersalności, elastyczności, skalowalności rozwiązań, integrując wyniki odpowiednio zdefiniowanych testów modułów RunTest, BehaviorTest, ReqTest
i StyleTest.
Sposoby weryfikacji rozwiązań w SDKP podsumowuje Tablica 3.
Tablica 3. Sposoby weryfikacji rozwiązań w SDKP
Zakres weryfikacji 
Sposób weryfikacji 
Kombinacje
predefiniowanych
reguł
Wyrażenia regularne
Skrypty
(w tym scenariusze
behawioralne)
Poprawność
Spełnianie wymagań oraz jakość i styl kodu
analiza źródeł programów i/lub ich AST
analiza wyników programu
z uwzględnieniem różnych
danych wejściowych
analiza źródeł programów
analiza źródeł programów i/lub ich AST
dynamiczna (w fazie wykonania) analiza zachowania
programów
dynamiczna analiza programów środkami refleksji
Weryfikacja efektywności, uniwersalności, elastyczności i skalowalności programów dokonywana jest za pomocą kombinacji narzędzi dynamicznej i statycznej analizy z modułów RuntTest, BehaviorTest, ReqTest i StyleTest.
Weryfikacja rozwiązań studentów wymaga przygotowania odpowiednich definicji zadań.
Składają się na nią między innymi:
• wymagania na strukturę katalogową, nazewnictwo i ewentualnie częściową zawartość plikow
rozwiązania,
• definicje scenariuszy behawioralnych,
• definicje run-testów,
• definicje testów wymagań,
• definicje testów stylu.
Wymagania na strukturę katalogową, nazewnictwo plików, a nawet ich (częściową) obowiązkową zawartość mogą wspomagać wykonywanie testów, choć nie zawsze będzie to konieczne.
Przykładowo, w testach poprawności, wymagających uruchomienia programu studenta, trzeba
sprecyzować, od której klasy rozpoczyna się wykonanie programu, a zatem taka klasa winna
znaleźć się w strukturze rozwiązania.
W SDKP występują dwa rodzaje definicji zadań: systemowe i nauczycieli. Przygotowany w ramach realizacji projektu zestaw definicji systemowych obejmuje ok. 100 zadań, które są gotowe
do wykorzystania w procesie dydaktycznym. Dodatkowo, każdy z nauczycieli może łatwo tworzyć własne definicje, dostosowane do jego potrzeb dydaktycznych. Definicje zadań zapisywaEduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 106
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
ne są w języku YAML (Portal języka YAML, b.d.), który – jako nadzbiór notacji JSON – jest
od dawna utrwalonym standardem, chętnie używanym przez profesjonalnych developerów ze
względu na jego obrazowość, prostotę i zarazem zwięzłość.
Wybrane elementy postaci definicji zadania w formacie YAML przedstawia Listing 1.
Listing 1. Wybrane elementy schematu definicji zadania
Przykładowo, dla zadania, które na podstawie informacji, podanej jako argumenty wywołania programu, ma wykonać jakieś obliczenia i wypisać na konsoli ich wynik w postaci ciągu
liczb oraz ich sumy, definicja zadania może wyglądać tak jak na Listingu 2.
Listing 2. Przykładowa definicja testu wykonania
Występują tu dwa przypadki testowe zdefiniowane w sekcji data dla testu wykonania (RunTest): dla podanych argumentów A wynikiem ma być ciąg liczb 1, 2, 3, 6, a dla argumentów B
– ciąg liczb 11, 12, 13, 36. Testowanie odbywa się za pomocą wyrażenia regularnego, podanego
w outEquals, które określa, co ma stanowić wynik programu (podane liczby rozdzielone dowolną liczbą białych znaków, ewentualnie poprzedzone i zakończone białymi znakami). Etykiety
caseMsg podają zmniejszenie punktacji w przypadku wystąpienia błędu oraz jego opis. Przy
definiowaniu testu oprócz outEquals dostępne są też opcje outContains i outNotContains, z następującymi po nich listami wyrażeń regularnych, sprawdzające czy wyjście programu zawiera
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 107
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
(nie zawiera) tekstów, pasujących do wyrażeń regularnych z listy.
Jest to przykład zastosowania bardzo prostych środków testowania (regularnych wyrażeń).
Innym prostym narzędziem testowania poprawności wykonania programów są predefiniowane
reguły (inaczej zwane transformacjami) – zob. Listing 3.
Listing 3. Przykład zastosowania predefiniowanych transformacji
Na Listingu 3 jako exp podano oczekiwany wynik. Dla każdego przypadku testowego faktyczny i oczekiwany wynik podlega transformacji podanej pod kluczem transform: definicji testu.
Tu transformacja o nazwie alljoinspaces, polega na połączeniu wszystkich symboli (czyli ciągów
znaków nie zawierających białych znaków) za pomocą spacji. Niezależnie więc od tego ilu odstępów (spacji, znaków nowego wiersza itp.) użył student przy wypisywaniu wyniku, porównywane będą zestawy liczb rozdzielone jedną spacją. Jeśli tak przetworzone wyjście programu nie
będzie takie samo jak (w ten sam sposób przetworzony) oczekiwany wynik, zgłoszony zostanie
błąd opisany w caseMsg. W systemie zdefiniowano kilkanaście predefiniowanych transformacji
dla testów wykonania.
Takie proste środki weryfikacji (wyrażenia regularne i transformacje) często jednak nie są
wystarczające. Ograniczenie się do nich oznaczałoby nadmierne zawężenie rodzajów zadań
poddawanych testowaniu (nie wszystko daje się sprawdzić regularnymi wyrażeniami). Również
z punktu widzenia oceny pracy studenta i informowania go o rodzaju błędów, które popełnił,
są to narzędzia niewystarczające. W szczególności, w przykładzie z wypisywaniem liczb student
może wykonać zadanie częściowo poprawnie (np. nie dostosować się do wymaganego formatu
wyjścia, ale podać prawidłowe liczby). Weryfikacje z Listingu 2 nie uwzględniają tego – student
uzyska 0 punktów i żadnej informacji o tym, co naprawdę było złego w jego rozwiązaniu. Dlatego ważną rolę w SDKP odgrywają skrypty testujące.
3. Skrypty w SDKP – założenia i motywacje
Skrypty w SDKP – to niewielkie programy, które mogą:
• uzyskiwać i przetwarzać wyniki programów studentów, w szczególności porównywać je
z oczekiwanymi wynikami,
• dynamicznie uruchamiać programy studentów, wywoływać różne metody z klas tych programów, analizować dostępność i charakterystyki różnych elementów programów (klas, metod,
pól),
• działać na kodach źródłowych programów lub ich drzewach składniowych (AST) w celu analizy i oceny jakości oraz stylu rozwiązania.
W wielu zadaniach systemowych (gotowych do wykorzystania) zdefiniowano odpowiednie skrypty. Ale również dydaktycy, tworząc własne definicje zadań, mogą dostarczać dla nich
skryptów testujących.
Skrypty zapisywane są w języku Groovy, którego składnia i semantyka zawiera elementy
znacząco ułatwiające programowanie (Platforma Groovy, b.d.). Język Groovy pozwala również
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 108
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
na bezpośrednie stosowanie składni języka Java, co oznacza, że nauczyciel może „z miejsca”
programować skrypty testujące, ewentualnie stopniowo, w miarę poznawania języka Groovy,
wprowadzając w nich upraszczające program elementy składniowe. W tym kontekście należy
podkreślić, że decyzja projektowa, polegająca na wprowadzeniu otwartych dla nauczycieli bogatych środków testowania skryptowego, powinna realnie podnosić jakość automatycznej oceny.
Faktycznie, przecież każdy nauczyciel musi świetnie znać język programowania Java, zatem pisanie skryptów nie sprawi kłopotu i umożliwi istotne poszerzenie zakresu zadań poddawanych
automatycznej ocenie oraz wzbogacenie informacji o błędach popełnianych przez studentów.
Skrypty mogą być stosowane praktycznie we wszystkich modułach systemu, w ocenie wszystkich aspektów rozwiązań zadań programistycznych. Zanim – w drugiej części artykułu – przyjrzymy się przykładom, dotyczącym definiowania i wykonywania skryptów w różnych modułach systemu, warto rozważyć prosty przypadek użyteczności skryptów.
Przykładowe zadanie, podobne do tego z poprzedniego punktu, polega na wykonaniu skomplikowanych obliczeń na podstawie jakichś danych wejściowych (np. przekazanych jako argumenty programu). W wyniku obliczeń ma być wyprowadzony ciąg liczb oraz ich suma.
Co może zrobić student:
1. Uzyskać ciąg niewłaściwych liczb i źle policzyć ich sumę.
2. Uzyskać ciąg niewłaściwych liczb, ale dobrze policzyć ich sumę.
3. Uzyskać ciąg niewłaściwych liczb lub nie wypisać ciągu liczb, ale podać sumę właściwych
liczb (np. wyliczoną inną metodą niż proste sumowanie uzyskanych liczb).
4. Uzyskać ciąg właściwych liczb, ale podać złą ich sumę.
5. Wyprowadzać liczby w dowolnej (innej od oczekiwanej) kolejności.
6. Podać sumę na początku lub na końcu ciągu wyprowadzonych liczb.
7. Wyprowadzać liczby i sumę jako wartości całkowite lub rzeczywiste, a w tym ostatnim
przypadku stosować jako separator miejsc dziesiętnych kropkę lub przecinek albo nawet
notację naukową.
8. Oprócz liczb wyprowadzić jakąś tekstową informację, np. 1+2=3.
Obniżać punktację chcemy tylko w przypadkach 1–4, przy czym w zróżnicowany w zależności od popełnionego błędu sposób. Oczywiście, ani regularne wyrażenia ani proste transformacje nie znajdą tu zastosowania. Na pomoc przychodzą skrypty, które możemy zapisywać pod
kluczem script w definicji testu (zob. Listing 5).
Listing 5. Umiejscowienie kodu skryptu w definicji zadania
System uruchamia program studenta, a po jego zakończeniu kod skryptu, który w zmiennej
out uzyskuje wyniki programu, w zmiennej exp – oczekiwane wyjście, a w zmiennej caseMsg
listę: [ obniżenie punktacji, ogólny opis błędu] spod klucza caseMsg definicji testu. Skrypt zwraca listę opisów wykrytych błędów w formacie : [ [zmniejszpunkt1, opis1], [zmniejszpunkt1,
opis2] ]. Błędy te są zapisywane w bazie danych wyników testów. Kod skryptu dla omawianego
zadania przedstawia Listing 6.
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 109
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
Listing 6. Przykładowy skrypt elastycznego testowania wyniku programu
Komentarze w kodzie skryptu wyjaśniają znaczenie poszczególnych instrukcji. Skrypt korzysta z dobrodziejstw składni języka Groovy, ale dydaktycy nieznający tej platformy mogą to samo
napisać w języku Java.
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 110
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
Warto podkreślić, że dzięki zastosowaniu skryptów, w których szczegółowo i elastycznie można analizować wyniki programów, uzyskujemy kilka pozytywnych efektów:
• specyfikacje zadań do wykonania nie muszą być bardzo rygorystyczne, silnie ograniczające
sposoby rozwiązania i prezentacji wyników; w omawianym przykładzie treść zadania może
być bardzo ogólna, nie stawiająca konkretnych wymagań, co do sposobu prezentacji wyniku,
np. „wypisz na konsoli liczby pierwsze, zawarte pomiędzy dwoma liczbami, podanymi jako
argumenty programu. Wypisz też sumę wynikowych liczb”.
• nawet gdy specyfikacja wymaga określonej prezentacji wyników, to studenci, którzy uzyskali
dobry wynik, ale popełnili błędy w formatowaniu wyjścia, nie będą czuli się pokrzywdzeni (przy
testowaniu wyniku za pomocą wyrażeń regularnych uzyskaliby 0 punktów, użycie skryptu pozwala na przyznanie im pozytywnej oceny za dobry wynik, być może nieco tylko pomniejszonej
z uwagi na niespełnienie wymagań co do formatowania). Dla przykładu, skrypt z Listingu 5 pozwala właściwie ocenić rozwiązanie niezależnie od formatu i kolejności wyprowadzanych liczb,
a także w sytuacji, gdy student uznał za stosowne dodać do wypisywanych liczb jakieś napisy,
• można przyznawać punkty nawet za drobne pozytywne elementy rozwiązania; w omawianym
przykładzie studenci, którzy nie uzyskali właściwych wyników, ale przynajmniej dobrze zsumowali (wadliwe) liczby, uzyskają 2 punkty na możliwych 10; takie podejście pozwala uhonorować starania i pracę studenta (uzyskuje symboliczną pozytywną ocenę, a nie 0 punktów
tak jak osoby, które w ogóle nic nie zrobiły),
• studenci uzyskują więcej informacji o tym, jakie konkretnie błędy popełnili, a nie tylko zdawkowy komunikat o tym, że wynik jest zły.
Oczywiście, wyniki testów (nie tylko tych wykonywanych z użyciem skryptów) są prezentowane studentom i nauczycielom w odpowiedniej, zrozumiałej formie (zob. Rys. 1).
Rysunek 1. Przykładowa prezentacja wyników testów
Więcej informacji na temat możliwości użycia skryptów w SDKP znajdzie Czytelnik w drugiej części artykułu.
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 111
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
4. Bibliografia
1. Ala-Mutka, K., Uimonen, T., Jarvinen, H. M. (2004). Supporting students in C++ programming courses
with automatic program style assessment. Journal of Information Technology Education, 3.
2. Barteczko, K. (2012). Plagiaty rozwiązań zadań programistycznych w zdalnym nauczaniu. Magazyn Edukacji Elektronicznej EduAkcja, 2(4).
3. Barteczko, K. (2013). Założenia Systemu Doskonalenia Kwalifikacji Programistycznych w ramach zdalnego
nauczania. W: L. Banachowski (Red.), Postępy e-edukacji. Warszawa: Wydawnictwo PJWSTK.
4. Barteczko, K. (2015). Weryfikacja stylu programowania w rozwiązaniach zadań programistycznych. Magazyn Edukacji Elektronicznej EduAkcja, 2(10).
5. Caiza, J. C., Del Alamo, J. M. (2013). Programming assignments automatic grading: Review of tools and
implementations. Inted 2013 Proceedings.
6. Douce, C., Livingstone, D., Orwell, J. (2005). Automatic test-based assessment of programming: A review.
ACM Journal of Educational Resources in Computing, 5(3).
7. Edwards, S. H., Perez-Quinones, M. A. (2008). Web-CAT: Automatically Grading Programming Assignments. ACM SIGCSE Bulletin, 40.
8. Forsythe, G. E., Wirth, N. (1965). Automatic Grading Programs. Communications ACM, 8.
9. Gupta, S., Dubey, K. S. (2012). Automatic assessment of programming assignment. Computer Science &
Engineering: An International Journal (CSEIJ), 2(1).
10. Higgins, C., Gray, G., Symeonidis, P., Tsintsifas, A. (2005). Automated assessment and experiences of teaching programming. ACM Journal on Educational Resources in Computing, 5(3).
11. Ihantola, P., Ahoniemi, T., Karavirta, V., Seppälä, O. (2010). Review of recent systems for automatic assessment of programming assignments. Proceedings of the 10th Koli Calling International Conference on
Computing Education Research. ACM: New York, USA.
12. Java Reflection API (b.d.). Pobrano z: https://docs.oracle.com/javase/tutorial/reflect, dokumentacja pakietu
java.lang.reflect
13. Joy, M. S., Griffiths, N., Boyatt, R. C. (2005). The BOSS Online Submission and Assessment System. ACM
Journal on Educational Resources in Computing, 5(3).
14. Ljana, L., Martin, M., Pareja-Flores, F. (2012). FLOP, a free laboratory of programming. Proceedings of the
12th Koli Calling International Conference on Computing Education Research.
15. Queirós, R. A. P., Leal, J. P. (2012). PETCHA: A Programming Exercises Teaching Assistant. Proceedings of
the 17th ACM Annual Conference on Innovation and Technology in Computer Science Education.
16. Sherman, M., Bassil, S., Lipman, D., Tuck, N., Martin, F. (2013). Impact of Auto-Grading on an Introductory
Computing Course. Journal of Computing Sciences in Colleges, 28(6).
17. Rodríguez-del-Pino, J. C., Rubio-Royo E., Hernández-Figueroa, Z. (2012). A Virtual Programming Lab
for Moodle with automatic assessment and anti-plagiarism features. Proceedings of the 2012 International
Conference on e-Learning, e-Business, Enterprise Information Systems, & e-Government.
18. Striewe, M., Goedicke, M., Balz, M. (2008). Computer Aided Assessments and Programming Exercises with
JACK. Technical Report 28, ICB, University of Duisburg-Essen.
19. Tiantian, W., Xiaohong, S., Peijun, M., Yuying, W., Kuanquan, W. (2009). Autolep: An automated learning
and examination system for programming and its application in programming course. Education Technology and Computer Science, 1.
20. Platforma Groovy (b.d.). Pobrano z: http://groovy-lang.org
21. Portal języka YAML (b.d.). Pobrano z: http://yaml.org
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 112
Krzysztof Barteczko, Skrypty w systemie automatycznej oceny rozwiązań zadań...
Scripts in Automatic Assessment of Programming
Assignments. Part I. Background and Motivations
Summary
Keywords: teaching programming, automatic assessment of programming assignments, static code analysis, dynamic code analysis, software testing, scripts, Java, Groovy, metaprogramming, AST, reflection
In the Programming Skills Development System (PSDS), created and implemented in the Polish-Japanese Academy of Information Technology, teachers can define scripts for automatic assessment of programming exercises.
Advanced tools for static and dynamic code analysis are available for scripts definition. Writing any script is easy
for teachers of programming languages, yet using it in process of automatic assessment could improve the quality
of solutions analysis. The first part of the article contains short information about PSDS and some background and
main motivations for introducing scripts in the system.
EduAkcja. Magazyn edukacji elektronicznej, nr 2 (12)/2016 , str. 113