Geautomatiseerde feedback/quotering voor programmeeroefeningen

Projecttitel:Geautomatiseerde feedback en quotering voor oplossingen van programmeeropgaven met bijzondere aandacht voor meertaligheid en programmeerstijl
Vakgroep/Dienst: Vakgroep Toegepaste Wiskunde en Informatica (WE02)
Promotor: Prof. Peter Dawyndt
Projectmedewerkers: dr. Veerle Ledoux, Niels Neirynck, Annick Van Daele, Dieter Mourisse

Korte beschrijving van het onderwijsinnovatieproject

Project Pythia: what’s in a name?

pythia.jpgPythia is de naam van de orakelpriesteres in het heiligdom van Apollo Pythios te Delphi (dat in oeroude tijden nog Pytho heette). De bronnen over de Pythia zijn eerder schaars, en laten enkel toe vast te stellen dat zij voor het leven werd gekozen, of door loting aangewezen, uit een aantal kandidaten die geschikt leken om als gewillig medium op te treden voor de openbaringen van de godheid. Na haar uitverkiezing verbleef de Pythia in een speciaal voor haar ingerichte "ambtswoning" binnen het heiligdom. Zij fungeerde dan als "doorgeefluik" van de goddelijke raadgevingen. Als interactieve leeromgeving voor de evaluatie van programmeeroefeningen, zoeken we met project Pythia naar een geautomatiseerde manier om feedback te geven aan studenten die leren programmeren. Waar verondersteld wordt dat het orakel Pythia uit de klassieke oudheid in een autosuggestieve trance ging, waardoor ze onsamenhangende klanken begon uit te stoten waar niemand iets van begreep, maar waarvan men aannam dat de boodschap van de goden kwam, zoeken we met project Pythia eerder naar direct bruikbare feedback die het proces om computerprogramma’s te leren schrijven moet helpen ondersteunen. Al blijft leren programmeren natuurlijk een proces waarin men met vallen en opstaan (ook wel de trial-and-error methode genoemd) leert om te durven denken.

Samenvatting

Tijdens het academiejaar 2011-2012 werd de Sphere Online Judge (SPOJ, Gdansk University of Technology, Gdansk, Polen) voor het eerst ingezet binnen twee opleidingsonderdelen aan de UGent als online leeromgeving voor de automatische evaluatie van programmeeroefeningen. De SPOJ omgeving werd initieel ontwikkeld voor het organiseren van programmeerwedstrijden. Omwille van zijn kwaliteiten ter verbetering van programmeervaardigheden wordt de omgeving internationaal ook steeds vaker ingezet binnen de lesomgeving. Een eerste fase van project Pythia (onderwijsinnovatieproject 2012) was voornamelijk gericht op het ontwikkelen van tal van uitbreidingen en technische verbeteringen aan SPOJ met het oog op een betere inzetbaarheid voor onderwijsdoeleinden door het verbeteren van de feedback aan de studenten op de door hen ingediende oplossingen en het globaal analyseren van alle ingediende oplossingen door de lesgevers. Een tweede fase van project Pythia (onderwijsvernieuwingsproject 2013) had als belangrijkste doelstellingen het uitwerken van ondersteuning voor het gradueel scoren van ingediende oplossingen en ondersteuning voor programmeeropdrachten in meerdere natuurlijke talen, naast enkele andere bijkomende voorzieningen waarvoor we verwijzen naar het verslag van deze fase van het project.

Eén van de UGent opleidingsonderdelen waarin SPOJ gebruikt wordt (http://www.pythia.ugent.be), betreft een opleidingsonderdeel waarin basisvaardigheden programmeren aangeleerd worden aan de hand van de programmeertaal Python (ECTS fiche). Voor dit opleidingsonderdeel werden tot op heden 319 programmeeropgaven met uitgewerkte feedback aan SPOJ toegevoegd. Hiervan werden per semester 54 basisoefeningen en 16 evaluatieoefeningen (niveau examen) verplicht aan de studenten opgelegd. Het opleidingsonderdeel werd tijdens het academiejaar 2012-2013 gevolgd door 288 studenten (opleidingen BA1 biochemie en biotechnologie, BA1 chemie, BA2 geologie en BA1 geografie), die in totaal 80.261 oplossingen (92.950.216 regels programmacode) indienden die automatisch werden beoordeeld en van feedback voorzien door SPOJ. Het spreekt voor zich dat een dergelijke snelheid en omvang van feedback nooit op een klassieke manier had kunnen geboden worden.

Op basis van de ervaringen uit vorige twee academiejaren, plannen we om in een derde fase de mogelijkheden van SPOJ nog verder te ontwikkelen op het vlak van gradueel scoren van ingediende oplossingen op basis van geautomatiseerde regelgebaseerde procedures samen met probleem-specifieke code-analyse in combinatie met het aanleveren van feedback naar de student toe, optimalisering van het beheer van (ondertussen 300+) programmeeropgaven via GitHub, en het aanbieden van alle opgaven in het Engels (naast het Nederlands). Dit laatste met het oog op het hergebruik van de databank van uitgewerkte programmeeropgaven in Engelstalige opleidingsonderdelen (reeds geïnitieerd vanaf academiejaar 2013-2014), ook buiten de Universiteit Gent. Daarnaast blijft team Pythia zich ook inspannen voor de vorming van een interinstitutionele werkgroep van lesgevers die ervaringen willen uitwisselen over het gebruik van SPOJ in een lesomgeving, willen we een klein deel van het budget voorbehouden voor het uitbesteden van uitbreidingen die door het SPOJ team moeten gebeuren op basis van extra behoeften die vanuit project Pythia voortkomen, blijven we verder videohandleidingen ontwikkelen die we ter beschikking stellen aan studenten en waarin een aantal programmeervaardigheden en meer algemene ICT vaardigheden gedemonstreerd worden en investeren we verder om de SPOJ omgeving nog beter te integreren met Minerva en Indianio.

Figuur 1: Aantal inzendingen (y-as) per maand (x-as) met oplossingen voor programmeeropgaven van het opleidingsonderdeel Programmeren tijdens het academiejaar 2012-2013. Dit opleidingsonderdeel werd gedoceerd aan de opleidingen chemie, geologie, biochemie & biotechnologie (eerste semester; ~240 studenten) en geografie (tweede semester; ~40 studenten) uit de faculteit Wetenschappen. Alle oplossingen werden automatisch geëvalueerd en van feedback voorzien door de SPOJ omgeving, uitgebreid met voorzieningen ontwikkeld binnen het kader van project Pythia.

Doelstellingen van het project + tijdsbesteding

Onder de naam project Pythia werd tijdens de zomer van 2011 een pilootproject opgestart om de Sphere Online Judge (SPOJ) omgeving vanaf academiejaar 2011-2012 te kunnen inzetten binnen het opleidingsonderdeel Programmeren (BA1 chemie, BA1 biochemie en biotechnologie, BA1 geografie, BA2 geologie). Tijdens de academiejaren 2011-2012 en 2012-2013 werden reeds twee onderwijsvernieuwingsprojecten uitgevoerd om verschillende uitbreidingen toe te voegen aan de SPOJ omgeving en wordt de SPOJ ook steeds meer ingezet in bijkomende opleidingsonderdelen.

De nadruk lag tijdens de eerste fase voornamelijk op het verbeteren van de technische onderbouw van SPOJ voor gebruik in een lesomgeving, en in de tweede fase op het verbeteren van de feedback naar de studenten toe en het verder automatiseren van het evaluatieproces, alsook het uitbreiden van het ecosysteem aan activiteiten rondom het gebruik van de SPOJ omgeving. Voortbouwend op deze ontwikkelingen beogen we in een derde fase voornamelijk het intelligenter maken van de automatische feedback en beoordeling, en het internationaliseren van de omgeving door de databank van 320+ programmeerproblemen ook aan te bieden in het Engels en de ondersteunende code voor het evalueren van de oplossingen publiek beschikbaar te stellen. De doelstellingen en daaraan gekoppelde taken van de derde fase van project Pythia worden hieronder opgedeeld in zes werkpakketten.

WP1. basisanalyse van de kwaliteit van de ingediende broncode

Wanneer studenten hun broncode voor een programmeeropdracht indienen via SPOJ, wordt een globale evaluatie gemaakt van de correctheid van hun code. De mogelijke uitkomsten zijn: correct antwoord, foutief antwoord (logische fout), tijdslimiet overschreden (als de oplossing niet binnen een vooropgestelde tijd werd bekomen), geheugenlimiet overschreden (als de oplossing meer geheugen nodig had dan wat werd vooropgesteld), fout tijdens het uitvoeren of compileerfout. Een eerste belangrijke uitbreiding van project Pythia bestond er tijdens een eerste fase in om de student bij elk van deze mogelijke uitkomsten de nodige feedback te leveren die moet helpen om de oorzaak van eventuele fouten op te sporen en te remediëren. Tijdens de tweede fase van project Pythia werd dit uitgebreid met het berekenen van een automatische score op basis van het aantal geslaagde testgevallen en een basisanalyse van de ingediende broncode gebruik makende van de Python module pylint.

Om te beoordelen of de broncode die door de studenten werd ingediend correct is, wordt de broncode momenteel aan een aantal testen onderworpen. Voor elk van deze testen wordt de broncode uitgevoerd met een gegeven invoer, en wordt nagegaan of de uitvoer die door het programma gegenereerd wordt overeenkomt met een vooropgestelde uitvoer. Binnen het kader van project Pythia werd een generiek kader uitgewerkt om de verwachte uitvoer te vergelijken met de gegenereerde uitvoer, wat in sommige gevallen allesbehalve evident is (bijvoorbeeld bij systemen met een stochastisch gedrag). Momenteel wordt SPOJ zo gebruikt, dat een ingediende oplossing als correct beoordeeld wordt, als de broncode correcte uitvoer genereert voor elk van de vooropgestelde testen. Anders wordt de ingediende oplossing als foutief beoordeeld (als niet een van de andere fouten ontdekt werd bij het uitvoeren van de broncode). In plaats van deze zwart-wit beoordeling, streven we ernaar om een graduele score te laten toekennen voor de correctheid van de ingediende broncode, als een gewogen som/gemiddelde van de correctheid van de individuele testgevallen. Dit werd reeds volledig geïmplementeerd tijdens de tweede fase van project Pythia.

Correctheid is echter niet het enige criterium op basis waarvan een ingediende oplossing van een programmeeroefening kan beoordeeld worden. Bij uitbreiding zullen bij het automatisch quoteren van een ingediende oplossing ook de volgende criteria in rekening genomen worden: i) programmeerstijl, ii) gebruik van best practice programmeerconstructies, iii) snelheid van uitvoeren en iv) geheugengebruik. Voor het beoordelen van de programmeerstijl kan voor de programmeertaal Python gebruik gemaakt worden van de pylint module. Deze module laat toe om een score toe te kennen aan een broncodebestand, op basis van een reeks formeel gedefinieerde stijlregels. Guido van Rossum, de originele auteur van de programmeertaal Python (binnen de Python gemeenschap uitgeroepen tot "Benevolent Dictator For Life") heeft bijvoorbeeld een Python Style Guide (PEP8) geschreven die als de vaste programmeerstijl gebruikt wordt voor het schrijven van de Standard Python Library. De pylint module kan bijvoorbeeld een score berekenen op basis van PEP8 of een aangepaste reeks stijlregels, die in het kader van dit onderwijsvernieuwingsproject zullen ontwikkeld worden. Deze stijlregels kijken bijvoorbeeld na of de broncode van voldoende commentaar is voorzien, of de naamgeving van de verschillende componenten van het programma op een geijkte manier gebeurt, en of functies en methodes niet te lang zijn (verdeel-en-heers principe). Tijdens de tweede fase van project Pythia werd de pylint module reeds geïntegreerd met de aangepaste evaluatiepipeline van SPOJ. Tijdens de derde fase van project Pythia zal gezocht worden naar de meest geschikte instellingen van de pylint regels, om een automatische beoordeling en feedback te verzorgen die kadert binnen het gebruik in een lesomgeving waarin programmeervaardigheden aangeleerd worden. Dit vereist onderzoek naar de relevantie van de pylint-regels voor gebruik binnen een educatieve context, naar de aangewezen parameterinstellingen voor de weerhouden regels en naar het berekenen van een representatieve score op basis van de gekozen regels. Hiervoor zullen we als benchmark gebruik maken van de 120.000+ oplossingen die de studenten tijdens de afgelopen twee academiejaren hebben ingediend voor de verschillende programmeeropgaven, waarbij gestreefd wordt naar een goede correlatie tussen de quotering die manueel gegeven werd aan de oplossingen die tijdens examens werden ingediend en scores die automatisch worden berekend. Daarenboven moet voor elke (stijl)regel feedback opgesteld worden die de regel in eenvoudige termen uitlegt (uitleg die door pylint gegeven wordt is vaak zeer technisch van aard) en waarin wordt aangegeven wat het nut is van die (stijl)regel.

Figuur 2: Prototype voor het beoordelen van en feedback geven op de kwaliteit van broncode die door een student werd ingediend voor een programmeeropgave. Deze ingediende oplossing (examen september 2013) werd op basis van een reeks uitgevoerde testen als 100% correct aanzien, maar de programmeerstijl van de broncode werd door pylint slechts op 4,4/10 gescoord op basis van de PEP8 stijlregels (standaardregels voor de Python Standard Library). Door te klikken op de icoontjes in de linker marge van de code, krijgt de student ook feedback over welke stijlregels hij/zij met de voeten getreden heeft, samen met bijkomende uitleg waarom deze stijlregels nuttig zijn.

WP2. probleem-specifieke analyse van de kwaliteit van de ingediende broncode

De standaardimplementatie van pylint geeft ondersteuning voor het aftoetsen van een reeks stijlregels die generiek kunnen ingezet worden voor het beoordelen van de kwaliteit van de ingediende broncode. Een stuk experimenteler wordt het wanneer we willen nagaan of ingediende broncode gebruik maakt van best practice programmeerconstructies, en of het de voorwaarden volgt die zijn opgelegd in de omschrijving van een specifieke programmeeropgave. Hiervoor moeten meer geavanceerde patronen herkend worden, hetzij rechtstreeks op de broncode, hetzij op de syntactische boomvoorstelling van de broncode, of moeten specifieke tijds- en geheugenmetingen uitgevoerd worden. Opsporen of in de broncode niet onnodig gebruik gemaakt wordt van knip-en-plakwerk is hiervan een voorbeeld. Finaal kunnen ook nog de snelheid van uitvoering, de geheugenvereisten en andere criteria zoals de lengte van de broncode in rekening gebracht worden bij het bepalen van een score voor de ingediende oplossing. De ondersteuning hiervoor vraagt een uitbreiding op de basisimplementatie van de pylint module. De pylint module voorziet hiervoor de nodige hooks om dergelijke uitbreidingen te implementeren.

WP1 en WP2 kaderen in de langetermijn-doelstelling van project Pythia om te evolueren naar een systeem dat toelaat om ingediende oplossingen van programmeeropdrachten volledig automatisch te quoteren, zowel voor verplichte basis- en evaluatieoefeningen, als voor examenopdrachten. Eén belangrijk voordeel van de methode voor het quoteren zoals die hierboven beschreven wordt, is dat dit transparant gebeurt op basis van een aantal formeel beschreven regels. Deze regels kunnen duidelijk aan de student gecommuniceerd worden, en bovendien kunnen inbreuken op de regels ook als feedback meegegeven worden aan de student (hetzij bij het maken van de oefening of bijvoorbeeld in een feedbackmoment na het examen). Bovendien laat deze automatische manier van quoteren ook toe om af te stappen van de huidige evaluatievorm voor de niet-periode-gebonden evaluatie, waarbij elke student tweemaal per semester mondeling geëvalueerd wordt op basis van een willekeurig geselecteerde evaluatie-oefening. Hierdoor kunnen tijdens twee van de twaalf lesweken van een semester geen werkcolleges georganiseerd worden, die zouden kunnen gerecupereerd worden indien de beoordeling volledig automatische gebeurt op basis van alle basis- en evaluatie-oefeningen. Na de evaluaties wordt een voorbeeldoplossing van elk van de basis- en evaluatie-oefeningen beschikbaar gesteld aan de studenten, wat dan zou kunnen aangevuld worden met een vraag-en-antwoordsessie waarbij gericht bijkomende uitleg kan gegeven worden aan die studenten die het nodig hebben.

WP3. programmeeropdrachten in meerdere natuurlijke talen

Een programmeeropgave in SPOJ bestaat enerzijds uit een omschrijving van het op te lossen probleem, aangevuld met een reeks instellingen voor de beoordeling van de ingediende oplossingen (inclusief uitbreidingen die binnen het kader van project Pythia werden uitgevoerd). Tijdens de tweede fase van project Pythia werd ondersteuning voorzien voor meertaligheid bij het beoordelen van ingezonden oplossingen. Via taalherkenning op de ingezonden oplossing kan daardoor gezorgd worden dat eenzelfde opgave bijvoorbeeld zowel voor een Nederlandstalig als Engelstalig opleidingsonderdeel kan gebruikt worden. Hiervoor volstaat het om enkel de omschrijving van het op te lossen probleem te vertalen, zonder dat de achterliggende beoordelingscode moet ontdubbeld worden.

Deze ondersteuning voor meertaligheid wordt vanaf academiejaar 2013-2014 reeds ingezet binnen twee Engelstalige opleidingsonderdelen. Nieuw ingebrachte opgaven worden vanaf nu dan ook tegelijkertijd van een Nederlandstalige en Engelstalige probleemomschrijving voorzien. Binnen de derde fase van project Pythia willen we één van de jobstudenten inzetten voor het vertalen (vanuit het Nederlands naar het Engels) van de 300+ opgaven die reeds aan SPOJ werden toegevoegd. Daarbovenop moet ook de feedback-documentatie die voor WP1 en WP2 moet opgemaakt worden zowel in het Nederlands als het Engels voorzien worden. Op die manier kunnen de ontwikkelingen binnen dit onderwijsvernieuwingsproject ook internationaal ingezet worden, wat verder aansluit bij de doelstellingen van WP4.

 

Figuur 3: Voorbeeld van een opgave waarvan de probleemomschrijving zowel aangeboden wordt in het Nederlands als in het Engels. De taal van de probleemomschrijving staat hierbij los van de taalinstelling van de cursus (die bijvoorbeeld bepaalt welke taal er gebruikt wordt voor de titel en het menu), en gebruikers kunnen dynamisch schakelen tussen de verschillende talen waarin de probleemomschrijving wordt aangeboden.

WP4. vrij beschikbaar maken van de Project Pythia broncode

Alle broncode die binnen het kader van project Pythia ontwikkeld wordt, wordt beheerd op de GitHub Enterprise omgeving van de Universiteit Gent (http://github.ugent.be/pdawyndt/pythia). Voorlopig is deze broncode nog gesloten voor personen extern aan het project, maar het doel is om deze broncode publiek beschikbaar te stellen. Hiervoor is het noodzakelijk dat de broncode opgeschoond wordt, en dat de documentatie die reeds werd opgemaakt tijdens de afgelopen fasen van project Pythia afgewerkt wordt voor publicatie. Hierdoor worden de ontwikkelingen binnen project Pythia ook beschikbaar gesteld voor andere onderwijsinstellingen die er gebruik willen van maken of bijkomende uitbreidingen wensen te ontwikkelen. Als sluitstuk van dit werkpakket zal een onderzoeksartikel ingestuurd worden naar een gespecialiseerd internationaal tijdschrift, waarin de ontwikkelingen binnen project Pythia wereldkundig gemaakt worden.

WP5. opgavebeheer via GitHub

Momenteel gebeurt de configuratie van programmeeropgaven volledig extern binnen de SPOJ omgeving, en wordt op gezette tijdstippen een lokale back-up gemaakt op een UGent server. We zouden deze werkwijze willen omkeren, waarbij de configuratie lokaal gebeurt op de GitHub Enterprise omgeving van de Universiteit Gent, die dan geldt als de centrale repository. Op die manier houden we volledige controle over de programmeeropgaven, voor het geval de SPOJ omgeving ooit ontoegankelijk zou worden, en wordt het een heel stuk eenvoudiger om met verschillende personen (lesgevers en begeleiders van verschillende opleidingsonderdelen) programmeeropgaven te delen en bij te werken. GitHub ondersteunt een mechanisme van webhooks, dat kan gebruikt worden om wijzigingen aan de lokale configuratie van een programmeeropgave onmiddellijk en volautomatisch te laten resulteren in een bijwerking van de configuratie van de programmeeropgave op SPOJ. Hierdoor kan een “dubbele boekhouding” vermeden worden.

WP6. uitbesteding aan team Sphere Online Judge

Omdat de SPOJ omgeving initieel werd ontworpen voor het ondersteunen van programmeerwedstrijden, ontbreken in het ontwerp enkele specifieke mogelijkheden die van toepassing zijn voor het inzetten in een onderwijsomgeving. De ontwikkelingen binnen project Pythia vragen hierdoor vaak bijkomende features die aan de SPOJ omgeving moeten toegevoegd worden. Om hierin te voorzien, vragen we om een klein deel van het budget te voorzien voor uitbesteding aan het SPOJ team.