Subsections


3. Deklaratív nyelvek és oktatásuk a BME-n

Mivel a szakdolgozat témája a deklaratív nyelvek oktatásának támogatása, nem árt, ha az olvasó tisztában van azzal, hogy mit nevezünk deklaratív programozási nyelvnek, mi különbözteti meg őket a hagyományosabbnak tekinthető imperatív nyelvektől, és hogy mely nyelvek tartoznak ebbe a családba. Erről esik szó a fejezet első részében. A folytatásban a BME-n a deklaratív nyelvek oktatása során alkalmazott eszközöket mutatom be, elsősorban a szakdolgozat témájához kapcsolódó kérdésekre koncentrálva.


3.1 Deklaratív programozás

A deklaratív programozást a saját szavaimmal is bemutathatnám, de szerencsére rendelkezésemre áll a fejezet második részében röviden bemutatandó Deklaratív programozás című tárgyhoz készült jegyzet, amely kellő részletességgel megteszi ezt helyettem. Éppen ezért ebben az alfejezetben az említett jegyzet legfrissebb kiadásának megfelelő részéből idézek néhány bekezdést (Hanák, 2001, pp. 10-12), helyenként mondatokat, sorokat kihagyva.3.1

1cm1cm

Az imperatív programozási paradigma

Az imperatív (más néven procedurális) programozási paradigma a legelterjedtebb, a legrégibb; erősen kötődik a Neumann-féle számítógép-architektúrához. Két fő jellemzője a parancs és az állapot. A program állapottere az a sokdimenziós tér, amelyet a program változóinak értelmezési tartománya határoz meg; a program pillanatnyi állapotát változóinak pillanatnyi tartalma írja le. A program állapotát a leggyakoribb paranccsal, az értékadással - azaz a változók frissítésével - változtathatjuk meg.

A deklaratív programozási paradigma

Az imperatív stílussal ellentétben a deklaratív stílusban programozónak - elvileg - csak azt kell megmondania, hogy mit akarunk, az algoritmust az értelmező- vagy fordítóprogram állítja elő. A deklaratív programozás két válfaját szokás megkülönböztetni: a logikai és a funkcionális programozást.

3.1.0.0.1 Logikai programozás

A programozási paradigmák közül, amint a neve is mutatja, a legerősebben kötődik a matematikai logikához. Jellemzői a tények, a szabályok és a következtetőrendszer. A legelterjedtebb logikai programozási nyelv a Prolog (PROgramming in LOGic). Professzionális, gyakorlati feladatok megoldására alkalmas megvalósításai a deklaratív nyelvi elemek mellett imperatív elemeket is tartalmaznak és fejlett programozási eszközöket megvalósító könyvtára van. Természetesen más logikai programozási nyelvek is vannak, pl. az OPS5, a CLP nyelvcsalád, a Mercury. (Az utóbbi a Prologtól átvett logikai programozási elemeket a típusfogalommal és a funkcionális programozást támogató nyelvi elemekkel egészíti ki.)

3.1.0.0.2 Funkcionális programozás

A funkcionális programozás két fő jellemzője az érték és a függvényalkalmazás. (A függvényérték is érték!) A funkcionális programozás nevét a függvények kitüntetett szerepének köszönheti. A tisztán funkcionális programozási nyelvek a matematikában megszokott függvényfogalmat valósítják meg: a függvény egyértelmű leképzés a függvény argumentuma és eredménye között, a függvény alkalmazásának nincs semmilyen más hatása. Tisztán funkcionális programozás esetén tehát nincs állapot, nincs (mellék)hatás, nincs értékadás.

A legelső funkcionális nyelv az 1960-as évek elején kidolgozott LISP (LISt Processing) volt. A sokféle változat közül a professzionális célokra alkalmazható Common LISP a legismertebb. A LISP-dialektusok és modernebb utódjuk, a Scheme is típus nélküli nyelvek. Az első típusos funkcionális nyelv az ML (Meta Language) egyik korai változata volt a 70-es évek közepén. A HOPE-pal és más funkcionális nyelvekkel szerzett tapasztalatok alapján dolgozták ki a Standard ML (SML) nyelvet a 80-as évek közepétől kezdve. Az SML után kifejlesztett funkcionális nyelv a Miranda, a Haskell és a Clean is.

Az SML - akárcsak a körülményes szintaxisú, típus nélküli Common LISP - gyakorlati programozási feladatok megoldására készült, ezért nemcsak a tisztán funkcionális, hanem az imperatív stílusú programozáshoz szükséges nyelvi elemek is megtalálhatók benne: frissíthető változók, tömbök, mellékhatással járó függvények stb., továbbá a nagybani programozást segítő fejlett modulrendszere van.


3.2 Deklaratív nyelvek oktatásának eszközei a BME-n

A BME másodéves műszaki informatika szakos hallgatói két deklaratív programozási nyelvet: a SICStus Prologot3.2 és az MOSML-t3.3 ismerhetik meg a Deklaratív programozás című tárgy keretében. Az előadótermi oktatást kivetített fóliák és interaktív számítógépes demonstrációk színesítik, a hallgatókat az előadások anyaga alapján összeállított - ám annál valamivel több témát tárgyaló - jegyzet segíti. Az előadásokat a két oktató - Hanák Péter és Szeredi Péter - kisebb blokkokban, felváltva tartja, a rövid bemutatókon az utóbbi időben demonstrátorok működnek közre. Az előadáshoz - sajnos - számítógépes laboratóriumi gyakorlat nem tartozik. Ugyanakkor nyilvánvaló, hogy a megszokottól ennyire eltérő programozási nyelveket és gondolkodást nem lehetséges gyakorlás nélkül elsajátítani, még a vizsgakövetelmény teljesítéséhez elegendő elemző és konstrukciós készség szintjén sem. (A laboratóriumi gyakorlatokkal kapcsolatos személyes tapasztalataim azt mutatják, hogy gyakran még ezek az alkalmak sem bizonyulnak elegendőnek a tananyag elsajátításához.) Ezért az elméleti ismereteket különböző gyakorló feladatok és félévközi zárthelyi dolgozat segítségével erősítik a tárgy oktatói. Az otthoni programozáshoz ingyenes SML- és licenszköteles Prolog-fordítóprogramok - az adott szemeszterre érvényes ingyenes licensszel - állnak a hallgatók rendelkezésére.

Most tekintsük át, hogy a számonkérés milyen formáit alkalmazzák az oktatók. Amint látni lehet majd, egyes számonkérés-fajták a tárgy történetének kezdetétől jelen vannak, mások csak a legutóbbi időben jelentek meg. Az évek során többször változott az is, hogy melyek kötelezőek és melyek nem. A cél mindig az volt, hogy a hallgatók minél nagyobb bizonyossággal sajátítsák el a két nyelvet, miközben leterhelésük nem halad meg egy bizonyos megengedhető szintet.

3.2.1 Zárthelyi dolgozat (ZH)

A félév során a hallgatóknak egy ZH-t kell (ill. lehet, attól függően, hogy kötelező-e vagy sem) írniuk, amely ellenőrzi a tudásukat a félévben addig elhangzott tananyagból. A dolgozat a korábbi években nyolc feladatból állt, négy-négy feladat jutott mind az SML-, mind a Prolog-rész ellenőrzésére, a 2001-es tavaszi félévben ez a szám tízre emelkedett, miközben a feladatok egyszerűbbé, könnyebben javíthatóvá váltak. Ezek között vannak alapvető nyelvi elemeket firtató, egy-egy egyszerű program (eljárás, függvény) megértését elváró, és természetesen konstrukciós, azaz program írását megkövetelő feladatok.

Mivel a hallgatók létszáma évről évre nő, a konstrukciós feladatokra adott megoldások pedig gyakran erősen túlburjánzóak és így csak fáradságosan ellenőrizhetőek, az elmúlt szemeszterben az oktatókban felmerült az igény egy a megoldásokra mennyiségi korlátot szabó, egyszerűbben és gyorsabban javítható, tesztszerű ZH-sor kidolgozására. A jelenlegi félévben felhasznált ZH-sorok közeledtek ehhez az elképzeléshez, javításuk egyszerűsödött a kötöttebb forma miatt, de tesztszerűnek még nem nevezhetőek. Az a kérdés, hogy érdemes-e ennél is jobban megszabni a válaszok formáját, egyelőre is megválaszolatlan.

3.2.2 Nagy házi feladat (NHF)

1995-ben a tárgy oktatói úgy döntöttek, hogy a gyakorlást szorgalmazandó minden félévben kiadnak egy, a félév során otthon megoldandó nagyfeladatot. Ezt a feladatot a hallgatóknak mindkét nyelven meg kell oldaniuk, és egy közös, a nyelvtől független algoritmust ismertető dokumentációval együtt be kell adniuk. Az azóta gyűjtött tapasztalatok azt mutatják, hogy azoknak a hallgatóknak, akik sikerrel vették ezt az akadályt, nem jelentett komoly problémát a félévvégi vizsga sem, azon egyszerű oknál fogva, hogy alaposabban megismerték a két nyelvet.

Az elektronikus levélben beadott házi feladatokat kezdettől fogva számítógépes program fogadja és ellenőrzi, igaz, ez a program az évek során sokat fejlődött, sőt majdnem teljesen kicserélődött. A jelenleg használt programról egy későbbi fejezetben részletesen is szó esik.

3.2.2.0.1 A feladatokról

Az első házi feladatok párbeszédes jellegűek voltak, mint például a englishMaster Mind nevű közismert játék. Az ilyen feladatokhoz a hallgatóknak az algoritmuson túl egy pontosan specifikált kommunikációs protokollt is meg kellett valósítaniuk, hogy a programjuk együtt tudjon működni a szerveren található keretprogrammal. Ráadásul az is elvárás volt, hogy a beadott programok mindkét félt (az aktív játékost, azaz a kérdezőt és a passzív játékost, azaz a válaszadót is) meg tudják személyesíteni. Noha ezek a feladatok esetenként nagyon izgalmasak voltak, számos hátrányuk is volt. Lássuk, melyek voltak ezek!

  1. A protokoll megvalósítása mechanikus, de sok időt igénylő munka, ráadásul nem is olyan feladat, amely kihasználná a deklaratív nyelvek sajátosságait, azaz - noha általánosságban hasznos - nem kapcsolódik szorosan a tárgy témájához.
  2. A hallgatók otthon, programozás közben csak nehézkesen tudták tesztelni a programjukat, mert vagy saját magával ,,eresztették össze'' (miután a protokoll mindkét felét megvalósították), vagy ők maguk ,,beszélgettek'' a programmal, amely viszont lassúsága folytán nem tette lehetővé a tesztelést kellően összetett és - a program számára is - időigényes feladványok esetén.
  3. Az ily módon otthon tesztelt programoknál sokszor csak a beadás után derült ki, ha a hallgató - és így a programja - valahol eltévesztette a protokollt. Az ilyen hibák miatt viszont leggyakrabban egyetlen tesztesetre sem adott megfelelő eredményt a program, noha az algoritmus megvalósítása adott esetben hibátlan is lehetett.

Az oktatók néhány ilyen év tapasztalatain okulva később áttértek az olyan feladatok kiadására, amelyek egyszer, a programok futása elején igényelnek bemeneti adatokat, és végeredményként egy másik adatsorral szolgálnak. Ilyen volt például a Füles rejtvény-magazinból is ismert téglalap-kirakó játék, amelyben egy téglalapot egy kisebb téglalapokból álló készletből kell fedésmentesen összerakni. A hallgatók ráadásul készen megkapják a program azon részeit, amelyek a beolvassa a bemeneti adatokat és kiírja az eredményeket, tehát az adatkonverzióval sem kell bajlódniuk, így teljes egészében az algoritmusuk megvalósítására tudnak koncentrálni. A megoldandó feladatok így némiképp egyszerűsödtek, de egyúttal az ellenőrzésük is könnyebb lett.

3.2.2.0.2 A beadásról

A programok beadásának körülményei is változtak az évek során. Eleinte a kiírás része volt, hogy a hallgatóknak az elkészített programokat hogyan kell összecsomagolniuk és egy elektronikus levélbe beágyazniuk, hogy azt a fogadóprogram ki tudja bontani. A tapasztalatok azonban azt mutatták, hogy minden évben számos olyan hallgató volt, aki nem olvasta el figyelmesen a tájékoztatót, és valamelyik előírást nem tartotta be, például más nevet adott az állományainak, vagy az uuencode program használata helyett egyszerűen csatolta a programját a levelezőprogramja segítségével. Ebben az időszakban ráadásul a hallgatók még nem kaptak automatikus értesítést arról, hogy a programjuk rendben megérkezett-e, így a figyelmetlenebbek a beküldés után napokig abban a hitben éltek, hogy beadták a programjukat, és sokan csak későn eszméltek rá, hogy ez koránt sincs így. Emiatt jutottak az oktatók arra az elhatározásra, hogy a beadáshoz egy letölthető Unix szkriptet kelljen használni, így garantálható, hogy minden hallgató a specifikációnak megfelelően küldje be a programját. Sajnos még így is van, aki nem ezt a programot használja, de ők egy válaszlevélben értesülnek a helyes használatról.

3.2.3 Kis házi feladat (KHF)

A félév közepén íratott zárthelyi dolgozatok eredményeiből világosan kiderült, hogy a félév végén beadandó nagy házi feladat nem kényszeríti rá a hallgatókat kellő időben a gyakorlásra, mivel a program elkészítését a nagy többség a határidőt megelőző egy-két hétre hagyja. Ugyanakkor a beadási határidőt nem lehetett előbbre hozni, mert a házi feladat megírásához szükséges tárgyi tudás korábban még nem áll teljes egészében rendelkezésre. Természetesen adódott az ötlet, hogy a deklaratív nyelvekre jellemző sajátosságok megértését és begyakoroltatását sokkal kisebb lélegzetvételű, könnyen megoldható, de ezzel együtt gondolkodtató kis házi feladatok kiadásával segítsük elő. Az ilyen feladatok algoritmikailag nem jelentenek kihívást, de nem is ez a lényegük. Rajtuk keresztül a hallgatók megérthetik a nyelvek szintaktikáját és belső logikáját, az interpreterek működését, általában a deklaratív programok írásának mikéntjét. Ebből adódóan ezek a feladatok nem közösek a két nyelvben, hanem célzottan az SML-hez vagy a Prologhoz kapcsolódnak. A beadott házi feladatok - mintegy buzdításként - a vizsgajegybe beszámító ponttal jutalmazzák.

3.2.4 Gyakorló feladatok

Az idei tanévben először - a kis- és nagyfeladatok megoldása mellett - a hallgatóknak megismerkedhetnek néhány, a tananyag egy-egy részéhez kapcsolódó tesztkérdéssel is. A kérdések egy weblapon keresztül érhetők el, és a válaszok is közvetlenül itt adhatók meg, amelyeket a rendszer azonnal kiértékel és az eredményről tájékoztatja a hallgatót. A feladatok többsége tesztszerűen megválaszolandó, azaz több lehetőség közül kell kiválasztani a jó megoldást, mások egy-egy pársoros rutin megírását igénylik.

A tervek szerint a közeljövőben félévente nyelvenként két-három gyakorló feladat csoport megoldása kötelező lesz, ám egyelőre - az éppen fejlesztés alatt álló rendszer bejáratlansága miatt - még opcionális, a diákok önszorgalomból gyakorolhatnak.

3.2.5 Vizsga

A legjelentősebb számonkérés-fajta természetesen a vizsga, amely mindenki számára kötelező. A vizsga alkalmával a hallgatónak bizonyítania kell, hogy mindkét nyelvben járatos az elvárt mértékben, és hogy rendelkezik értelmezési, elemzési és konstrukciós készséggel. A korábbi években a vizsga a ZH-hoz nagyon hasonló, írásbeli számonkérés volt, az utóbbi két évben azonban (az oktatók vizsgaidőn kívüli terhelését csökkentendő, valamint a csalások, puskázások megengedhetetlen túlburjánzása miatt) áttértek a szóbeli vizsgáztatásra - ennek feladatai sokban hasonlítanak a korábbi írásbeli feladatokhoz.

Az elmúlt néhány szemeszter során többször változott az oktatók véleménye abban a kérdésben, hogy az egyes számonkérések kötelezőek legyenek-e vagy sem. Amikor egyik vagy másik számonkérési forma nem volt kötelező, az ösztönző erő az maradt, hogy eredménye bizonyos százalékban továbbra is beleszámított a vizsgajegybe. Kötelezővé tételük azért ésszerű, mert rákényszeríti a hallgatókat a félévközi gyakorlásra, ugyanakkor nagyobb munkát jelent az ellenőrizendő vagy kijavítandó feladatok mennyisége. A 2001-es tavaszi félév során csak a ZH volt kötelező: a nagy és kis házi feladatok beadása, valamint a gyakorló rendszer használata opcionális maradt.

A feladatok kötelezővé tétele felvet bizonyos morális problémákat is. A jogtalan másolás, puskázás, a csalások egyéb módozatai persze akkor is felbukkannak, amikor pusztán előnyt jelent egyik-másik feladat megoldása, de ha egyenesen előírás a teljesítésük, óhatatlanul megugrik azon hallgatók száma, akik ilyen eszközökkel élnek. A nagy házi feladat például jellegéből adódóan igényli, hogy a hallgató ne csak a beadási határidőt megelőző utolsó napokban foglalkozzon vele, hanem huzamosabb időn keresztül. Azok a diákok, akik egyéb elfoglaltságaik miatt mégsem így tesznek, a határidő közeledtével gyakran úgy döntenek, hogy nem adnak be megoldást. Azokban az években viszont, amikor kötelező volt, ez a lehetőség nem állt fenn, és így maradt a többiek megoldásának lemásolása.


3.2.6 Számítógépes támogatás

El lehet képzelni, hogy mennyi munkát jelenthetne a két oktatónak, ha mindezt saját maguk akarnák üzemeltetni, fenntartani. Biztosra vehető, hogy nem is lehetne ennyiféle gyakorlási lehetőséget biztosítani megfelelő segéderő igénybe vétele nélkül.3.4 Ezt természetesen az oktatók is rögtön átlátták, és a kezdetektől fogva eleve számítógéppel oldották meg, amit csak lehetett. Ahogy a feladatok köre bővült, úgy szaporodtak a különböző programok, amelyek az újabb és újabb feladatokat voltak hivatottak ellátni. Ezeket a programokat cha:most. fejezetben ismertetem. Az alábbiakban igyekszem áttekinteni, hogy az egyes számonkérés típusok milyen jól számítógépesíthető feladatokat rejtenek.

ZH, vizsga:
Kézenfekvő feladat az eredmények adminisztrálása, a pontok összesítése, a minimál-követelmények teljesítésének ellenőrzése, az osztályzatok megállapítása, egyszóval a pontszámokkal minden kapcsolatos tennivaló. Az összesített pontszámok megjelennek egy ún. kísérőlapon, amely a szóbeli vizsgáztatáskor segíti a vizsgáztató munkáját. Ezek a feladatok a ZH, ill. vizsga fajtájától, szerkezetétől, sőt kellően parametrizálható rendszer esetén még a tárgykövetelményektől is függetlenek.

Az elmúlt évek során az előadók jelentős ZH- és vizsgafeladat-bázist gyűjtöttek össze, ez segítette elő többek között a szóbeli vizsgáztatás bevezetését is (ahol természetesen a vizsgázók más-más feladatot kapnak). A már említett tesztszerű ZH ötletével együtt jött az az ötlet is, hogy a ZH-sorokat is lehetne automatikusan, névre szólóan generálni ebből a feladattárból. A hatása olyasmi lenne, mintha nem egy `A' és egy `B' csoport lenne - ahogy sok dolgozat esetében -, hanem akár annyi, ahány hallgató. Az ilyen automatikus generálással kapcsolatban több tennivaló is akad, a ZH-sorok előállításától kezdve a javítókulcs előállításáig vagy akár az automatikus javításig bezárólag.

NHF, KHF:
Az ismertetett számonkérési formák közül a legjobban talán a házi feladatok ellenőrzése automatizálható. A hallgatók programjainak természetesen pontos specifikációnak kell megfelelniük, így semmi akadálya nincs annak, hogy egy számítógépes program fogadja, ellenőrizze és értékelje őket. Az eredményekről ugyancsak automatikusan értesítést kaphat mind a hallgató, mind az oktatók, emellett a pontszámok egy könnyen kezelhető adatbázisba is bekerülhetnek. A konkrét feladvány természetesen évről évre változó, így a rendszernek biztosan van olyan része, amely a feladvánnyal együtt változik, de a legtöbb tennivaló független a feladványtól, sőt a nyelvtől is.

Régóta problémát jelent az, hogy egyes hallgatók évfolyamtársaik programjának másolatát adják be, a legtöbb esetben némileg módosítva. Ez természetesen nem megengedett, de a helyesen megoldott házi feladatért járó jutalom nagyon csábító tud lenni. Az ilyen másolások leleplezése nem könnyű feladat, de megfelelő számítógépes eszközzel hatékonyan segíthető.

Gyakorló feladatok:
Ez a számonkérés-típus jellegénél fogva eleve automatizált. A webes hozzáférés szerver oldali megvalósítása olyan CGI szkripteket igényel, amelyek nemcsak hogy önállóan értékelik a hallgató válaszait, hanem magukat a feladatokat is automatikusan választják ki egy adott halmazból. Az eredmények - amellett, hogy természetesen azonnal megjelennek a weblapon - itt is adatbázisba kerülhetnek, hogy később az oktatók pontosan megállapíthassák, ki mit teljesített.

Adminisztratív feladatok:
Ide tartozik a jegyzetrendelés, valamint a ZH és pótZH jelentkezések nyilvántartása. Ez előbbire azért van szükség, mert a tárgyhoz biztosított jegyzet - egyelőre - nem kapható a Műegyetemi Könyvesboltban, hanem közvetlenül az oktatóktól szerezhető be. Ennek többek között az az oka, hogy a jegyzet az elmúlt évek során folyamatosan bővült, változott, majdnem minden évben újabb kiadást élt meg, és csak közvetlen terjesztéssel volt megoldható, hogy a hallgatók mindig a legfrissebb kiadáshoz jussanak hozzá. Ehhez viszont az oktatóknak minden félévben fel kell mérnie, hogy hány hallgatónak van szüksége jegyzetre, hogy a lehető legalacsonyabb szinten tartsák a feleslegesen sokszorosított példányok számát. A ZH és pótZH jelentkezésre azért van szükség, hogy a minimalizálni lehessen a feleslegesen sokszorosított ZH-sorok számát is.

Hanák Dávid <dhanak@inf.bme.hu>