A magasszintű programozási nyelvek megjelenése után nem sokkal megkezdődött a programozási nyelvek tanítása. Először inkább művészetként, később azonban egyre tudatosabban, módszeresebben történt. Meg kell azonban állapítani, hogy a programozási nyelvek, mint nyelvek tanításának módszerei kidolgozottságban, melységben és sajnos hatásosságban meg sem közelítik a természetes nyelvek tanításának módszereit.
Az alábbiakban a legelterjedtebb programozási nyelv tanítási módszereket tekintjük át:
Az utasításorientált módszer a programozási nyelvet, mint utasítások halmazát definiálja [AD]. A nyelv megtanítását, mint a halmaz elemeinek megtanítását képzeli el. (Legrosszabb esetben ráadásul ábécé sorrendben.) A halmazként elképzelés arra is utal, hogy a halmaz összes elemét, azaz a nyelv összes utasítását meg kell tanítani (ami egy közismert informatika oktatási téveszméhez vezet). Mindemellett könnyen megjósolható a nyelv elsajátításának mélysége: az utasítások egymással és a felhasználás mikéntjével való kapcsolat híján csupán lexikális ismeretek halmaza.
Ez az elképzelés programozási nyelvekről szóló könyvek alapján alakult ki. A programozási nyelvkönyvek ugyanis még nem érték el azt a fejlettségi fokot, amit a természetes nyelveknél megszokott. Itt legtöbbször ugyanaz a könyv szolgál a nyelv hivatkozási kézikönyveként (ez célszerűen ábécésorrendű), nyelvtankönyvként, szótárként, ...
Ez az elképzelés abban sem segít, hogy mely elemek fontosak és melyek nem, nem garantált az sem, hogy a megtanult elemeket a későbbiekben újra fel fogjuk használni valamire.
Ha így képzeljük el a nyelvet, akkor azt is állítjuk, hogy a nyelv elemek strukturálatlan egysége, az elemekből való programépítéshez nincs szükség semmi újabb ismeretre, az majd magától kialakul.
Sok olyan programozás tanítási módszer van, ahol a kódolás többé-kevésbé automatizált tevékenység, kódolási szabályok, kódolási konvenciók segítségével végezhető. Ebben az esetben a programozási nyelv, mint a kódolási folyamat végeredménye jelenik meg. Mindig csak annyira van szükség belőle, mint amennyire az algoritmusaink kódolásához feltétlenül szükségünk van [SzPZsLTT1].
Nézzünk erre néhány példát (Pascal kódolási szabályok):
Algoritmikus utasítás (magyar kulcsszavakkal) | Pascal kódmegfelelő |
---|---|
Be: változók [feltételek] | Repeat |
Ha feltétel akkor | If feltétel then begin |
Ciklus amíg feltétel | While feltétel do begin |
Ennél a módszernél garantált, hogy a megtanult nyelvi elemeket használni is fogjuk. Mivel a programozási ismeretekben a struktúrák, algoritmikus elemek, adattípusok rendszeresen ismétlődnek, ezért még azt is elmondhatjuk, hogy a megtanult elemeket gyakran kell használni.
Temesvári Tibor ezen az elven építi fel az objektumorientált programozást és annak megvalósítását Pascal és C++ programozási nyelven. Elsőként áttekinti az objektumorientált programozást általában (1. OOP jellemzői, 1.1. Osztályok és objektumok, 1.2. Egységbe zárás – Encapsulation, 1.3. Öröklés – Inheritance, 1.4. Az öröklés megvalósítása, 1.5. Az öröklés haszna, 1.6. Többszörös öröklés, 1.7. Típuskompatibilitás, 1.8. Többalakúság – Polimorfizmus, 1.9. Dinamikus kötés – Dinamic Binding, 1.10. Virtuális metódus, 1.11. Metódusok végrehajtása, 1.12. Objektum-orientált programozási nyelvek), amiben nem tér ki konkrét programozási nyelvi ismeretekre, hanem csak az objektumorientált technológiával foglalkozik.
Ezt követi a második fejezetben a megvalósítási lehetőségek, azaz a programozási nyelvi ismeretek tanítása (2. OOP Pascalban, 2.1. Tervezés, 2.2. Osztály definiálása, 2.3. Interface rész, 2.4. Implementációs rész, 2.5. Self, 2.6. Objektumok deklarálása, 2.7. Objektumok használata, 2.8. Öröklés, 2.9. Az ősben definiált eljárások hívása, 2.10. Újradefiniált metódusok, 2.11. Virtuális metódustábla – VMT, 2.12. Konstruktor eljárások, 2.13. Dinamikus metódusok, 2.14. Dinamikus metódustábla (DMT), 2.15. Típuskompatibilitás, 2.16. Dinamikus objektumok, 2.17. Dinamikus objektumok felszabadítása, destruktor eljárás). [SzPZsLTT2]
Hasonlóan valamely szoftvertechnológia (az OOP-t, az adatbázis-kezelést, a COM-, és a web-programozást) jelenti a Delphi nyelv feldolgozás vezérfonalát Marco Cantů könyvében: [MC]. A web-fejlesztés témakörben láthatunk erre jó példát Kris Jamsa és társai művében [JKLSWS]. Olyan új paradigmák is hathatnak a programozási nyelvoktatásra, mint az aspektus-orientált és a generikus programozás. [PZKTZsV]
Ebben az esetben a programozási nyelv elemeit azért vezetjük be, mert a feladatmegoldás során szükségünk van rá. Az egyes elemek nem azért kerülnek elő, mert valamilyen oktatási cél vezérel minket, hanem azért, mert nélkülük a soron következő feladat nem oldható meg. [TSzMZsL]
Az alábbi feladatsor egy általunk kidolgozott PROLOG bevezető óráról származik (Turbo PROLOG rendszerre építve, de magyar nyelvű pszeudokódot használva):
1. lépés: tények
apja(apa,gyerek).
anyja(anya,gyerek).
2. lépés: szabályok
szülője(X,Y) ha anyja(X,Y).
szülője(X,Y) ha apja(X,Y).
3. lépés: vagy művelet a szabályokban
szülője(X,Y) ha anyja(X,Y) vagy apja(X,Y).
4. lépés: és művelet a szabályokban
nagyszülője(X,Y) ha szülője(X,Z) és szülője(Z,Y).
5. lépés: rekurzió a szabályokban
őse(X,Y) ha szülője(X,Y) vagy szülője(X,Z) és őse(Z,Y).
6. lépés: akármi érték a paraméterek helyén
szülő(X) ha szülője(X,_).
7. lépés: nem művelet, azaz tagadás a szabályokban
nemszülő(X) ha szülője(_,X) és nem(szülője(X,_)).
8. lépés: vágás művelet a szabályokban
egyszülő(X) ha szülő(X) és !.
9. lépés: kiírás, valamint azonosan hamis formula a szabályokban
összesszülő ha szülő(X) és write(X) és fail or nl.
10. lépés: egyenlőségvizsgálat a szabályokban
kétgyerekes(X) ha szülője(X,Y) és szülője(X,Z) és nem(Y=Z).
11. lépés: új programozási ismeret, újabb nyelvi elem nélkül
egygyerekes(X) ha szülője(X,_) és nem(kétgyerekes(X)).
Hasonló példákat találhatunk az ELTE-n kidolgozott Logo programozási nyelv tanításáról szóló tananyagban, melynek témái (és mögöttük zárójelben a megtanulandó új nyelvi elemek):
Fontos fejlődés a programozási nyelvek tanításában, hogy az utasításorientált módszert sokszor összeolvasztják ezzel a módszerrel [VCsJI], hiszen az előbbi elképzelés elvont, programozási problémáktól mentes, vegytiszta ismeretei kiegészülnek az utasítások valós helyzetbeli előfordulás tapasztalataival. Így érik el, hogy a nyelvtanítás színvonala jelentősen emelkedjen!
A nyelvorientált változat a nyelvet, mint strukturált egységet tekinti. Megvizsgálja a nyelvhez tartozó számítási modellt [HE] (a közoktatásban jelenleg Neumann-elvű, automataelvű, funkcionális, valamint logikai nyelvek fordulhatnak elő). Ezután áttekinti a programok felépítésének fő vázát, pl. a Pascal nyelv esetén:
Pascal példa |
---|
ForráskódProgram név; deklarációk Begin utasítások End. |
Deklarációk:
A programok felépítéséhez szorosan hozzátartozik a programozási nyelvben használt alapfogalmak megismerése, azok megvalósulási lehetőségei az adott nyelvben (pl. fordítási egység, programegység, blokkstruktúra, memóriakezelés, deklarációkiértékelés, változókkal kapcsolatos fogalmak, típussal kapcsolatos fogalmak, paraméterátadás, ...) [SzPZsLTT2].
Következő lépés lehet, hogy megvizsgáljuk a nyelv egyes elemeit, megadjuk, hogy a programozási struktúrák hogyan valósulnak meg az adott nyelven. Például Pascal esetén a feltételes ciklusokról a következőt mondhatjuk (a konkrét szintaktikai szabályok megadása előtt):
A Pascal nyelv feltételes ciklusai lehetnek elöl-, illetve hátultesztelősek. Az elöltesztelős ciklusnál a bent maradás, a hátultesztelősnél pedig a kilépés feltételét kell megmondani. Az elöltesztelős ciklus magja egyetlen utasítás lehet, ha ennél több utasításra lenne szükség, akkor azokat utasítás-zárójelbe kell fogni. A hátultesztelős ciklus magja ezzel szemben akárhány utasítást tartalmazhat.
Végül csak ezek után következhet az egyes utasítások szintaktikájának és szemantikájának megadása. A felsőoktatással szemben a közoktatásban erre általában nem formális módszert, hanem példákon keresztüli bemutatást használnak. A szintaxis megadására csak az utasítás formátumát adják meg (pl. While feltétel do utasítás), a szemantikához pedig kisebb programokat használnak, amelyeken keresztül az adott utasítás működése megérthető (a következő fejezetben leírt módszerrel).
Fontos megjegyeznünk, hogy a felsőoktatásban egyre jobban terjed ez a módszer programozási nyelvek lehetséges elemeinek bemutatására, párhuzamosan többféle nyelvből véve a példákat [NyGJ,SzPZsLTT2]. Ilyen felépítésű például az ELTE Informatikai Karán a programtervező informatikus alapszakon Horváth Zoltán által tanított Funkcionális nyelvek tantárgy. Természetesen itt a cél és a feltételezett alapismeret is más, mint a közoktatásban.
Itt az elsődleges szempont az, hogy megértsük az utasítások működését, azaz el tudjuk képzelni, hogy mi történik a végrehajtásuk alatt. A legegyszerűbb esetben megadjuk a nyelv utasításait más, ismert nyelven, esetleg assembly nyelven.
Egy klasszikus FORTRAN tankönyvből származik az alábbi, a DO utasítást magyarázó példa [LGyVJ]:
Ciklus GOTO-val | Ciklus DO utasítással |
---|---|
Forráskód K=1 17 T=0.0 J=1 18 T=T+A(I,J)*B(J,K) J=J+1 IF(J-N)18,18,20 20 C(I,K)=T K=K+1 IF(K-N)17,17,21 21 | Forráskód DO 20 K=1,N T=0.0 J=1 18 T=T+A(I,J)*B(J,K) J=J+1 IF(J-N)18,18,20 20 C(I,K)=T 21 |
Egy C# könyvben például az alábbi magyarázat olvasható a ++ operátorról [IZ]:
C# példa |
---|
Forráskóda = ++b;// hatása: b=b+1; a=b; a = b++;// hatása: a=b; b=b+1; |
A fenti példákból kitűnik, hogy az egyes utasítások működésének leírásához nem kell feltétlenül egy másik nyelvre visszavezetni, hanem megadható az ugyanazon nyelv más elemeinek segítségével is.
Bizonyos értelemben ide tartozó megoldás az is, amikor az új programozási nyelvi elemek szemantikáját a jól ismert algoritmikus nyelv elemeivel definiálják. Ez azzal a többlet oktatási haszonnal jár, hogy miközben a nyelv elemeit bemutatjuk, az algoritmikus nyelven történő programozást is gyakoroltatjuk.
Ez az elképzelés azt állítja, hogy ha a tanuló elég sok példát lát, akkor jól meg tud tanulni egy programozási nyelvet [MZs]. Idézet a Márkusz Zsuzsanna: PROLOG-ban programozni könnyű című könyvéből:
A PROLOG oktatási gyakorlatom alapján meggyőződtem arról, hogy példaprogramokon keresztül lehet a legkönnyebben programozni tanulni. Ezért a könyv minden tudományos bevezetés (jelölések, definíciók, tételek) helyett közöl tizenkét példaprogramot, amelyeket részletesen elmagyaráz.
Van némi hasonlósága a feladattípus-orientált módszerrel, azonban alapgondolatában különbözik tőle. Ott az volt a lényeg, hogy a feladatsor teszi szükségessé az új nyelvi elemek bevezetését. Ennél a módszernél ez fordítva van: adottak a nyelvi elemek a példákban, ezek felépítése a nyelv elemeit követi. Emiatt nem biztos, hogy a megtanult nyelvi elemek használatára a későbbiekben is szükség lesz, s a gyakorlás hiányában elfelejthető.
Úgy gondoljuk, hogy az utasításorientált módszer alkalmatlan a programozási nyelvek megismertetésére, mert a programozási nyelvek nem utasítások halmazai. Egy programozási nyelv mögött mindig felfedezhető egy gondolatvilág, a programozási nyelv jó alkalmazásához ennek megismerése nélkülözhetetlen.
Épp e gondolatvilág felfedezhetőségének ára minősíti magát a nyelvet. Ennek ezért van különleges jelentősége az oktatásban. [SzP2]
A programozási nyelvek nyelvi alapfogalmakat használnak (pl. típusosság, blokkstruktúra, paraméterátadás, ...), melyek nyelvtípusonként, sőt nyelvenként különbözőek lehetnek, s ezek ismerete elsősorban nem utasításhoz, hanem nyelvhez kötött. Minden programozási nyelven van a programnak valamilyen struktúrája, felépítési szabálya.
A segédeszközként alkalmazás az, amelyre a programozás algoritmus-, illetve adatorientált tanításában szükség van, így ez a módszer a fenti programozás tanítási módszerekkel párhuzamosan használható, azaz informatikai pályára készülő középiskolásoknál.
A szoftvertechnológia-orientált módszer tulajdonképpen az előző (segédeszközként alkalmazás) továbbfejlesztése a felsőoktatás, az informatikus szakemberképzés számára, így ott nagyon erőteljes módszer lehet. A közoktatásban viszont legfeljebb az informatikai szakképzésben kaphat szerepet.
A feladattípus-orientált módszer az, amelyet egyetlenként szabad alkalmazni a közoktatás minden olyan szintjén (általános és középiskolák), ahol elsősorban az algoritmusok megvalósítása, kipróbálása a fontos, és nem a programozási nyelv teljes megismerése (idézet a Nemzeti Alaptanterv indoklásából: egy programozási nyelvből csak annyit kell megtanítani, amennyi az algoritmusok megvalósításához, kipróbálásához szükséges, s a nyelv nem központi része az informatika tantervnek [ZsL1]).
A nyelvorientált elképzelés kiváló lehet a nyelv tanulásának lezárásaként, a nyelv elemeinek összefoglalására. Informatikus pályára készülőknél elképzelhető még egy új, a korábban ismertekhez nagyon hasonló nyelv bevezetésére is. (Például Pascal után így tanítható a Delphi, a C++; vagy a C++ után a C#, ...) Ekkor ugyanis hatékonyan fel lehet használni a korábbi nyelvi ismereteket.
A működésalapú elképzelés nagyban hasonlít az utasításorientált változatra, hiszen szintén utasításokat tanít, de itt az utasítások specifikáció szintje (ti. hogy mit kell tennie) helyett az utasítások működés szintjén fogalmaz (azaz hogy hogyan működik). Kezdők számára kizárólagosan alkalmazni sikerrel nem lehet.
A mintapélda alapján tanítás egy középkori gondolat, így a programozás művészeit lehet képezni, tudatos művelőit nem.
A nyelvek tanítási módszerei bemutatása némileg veszélyes a programozási nyelvekről szóló könyvek alapján. Ennek oka, hogy a programozási nyelvekről szóló könyvek módszertani háttere ma még jóval szűkebb, mint a természetes nyelvekről szólóké. Emiatt ugyanaz a könyv többféle módon, többféle szempontból is szól a nyelvről. Legtöbbször ugyanaz a könyv használható a programozási nyelv hivatkozási kézikönyveként, nyelvtankönyvként, sőt sokszor még programozási ismereteket is tartalmaz. Vessük össze ezt a természetes nyelvekkel, ott találhatunk egynyelvű szótárt, kétnyelvű szótárt, nyelvtankönyvet, munkafüzetet, társalgási nyelvkönyvet, ...
![]() ![]() |
![]() |
![]() |
A tananyag az ELTESCORM keretrendszerrel készült