Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
JAVA PROGRAMOZÁSI NYELV OKTATÁSA C# ALAPOKON TEACHING OF JAVA PROGRAMMING LANGUAGE ON BASIC LEVEL
Szénási Sándor Budapesti Műszaki Főiskola, Neumann János Informatikai kar Összefoglaló Az informatika karokon mindig jelentős kérdésként merül fel, hogy a hallgatók milyen programozási nyelven ismerjék meg az implementációs gyakorlatot. Mivel nehéz erre egyértelmű választ találni, a legtöbb esetben nem egy, hanem egymást követően (vagy akár egymással párhuzamosan) több különböző, egymást kiegészítő programozási nyelv oktatása jelenti a megoldást. A hagyományosnak tekinthető Pascal és C nyelven történő alapozást egyre gyakrabban váltják fel modern, objektumorientált nyelvek, amelyek ismerete szinte naprakész, a piacon felhasználható tudást ad a hallgatók számára. Jelenleg a két legkurrensebb ilyen programozási nyelv a Sun által kifejlesztett Java és a Microsoft által támogatott C# nyelv. A Budapesti Műszaki Főiskola Neumann János Informatikai Kara két éve az „alapozó nyelv” esetén áttért a C# programozási nyelvre, emellett a hallgatók a későbbi félévekben megismerkedhetnek a Java nyelvvel is. Előadásom vezérfonalát az a felismerés alkotja, hogy e két nyelv felépítése, logikája és szintaxisa egymáshoz nagyon közeli. Ez számos előnyt jelent, hiszen a hallgatóknak nem kell egy egészen új rendszert megismerniük, azonban néhány nehézséget is rejt, mivel két egymáshoz nagyon közeli fogalmi rendszert kell elsajátítaniuk, ami meglehetősen nagy odafigyelést igényel. Az oktatókat is jelentős kihívások elé állítja, hiszen az eddig megszokottaktól (új nyelv oktatása az alapoktól) eltérően, új módszertant kell kidolgozniuk, mivel az új nyelv alapjai sokban megegyeznek a már megismerttel, de az apró különbségek ismerete mégis nélkülözhetetlen az eredményes munkához.
Kulcsszavak C#, Java, Programozás oktatás, BMF
Abstract It’s a difficult problem to choose the best programming language for students in informatics to practice software implementation. Therefore institutions usually support more than one complementary languages sequentially (or side by side) to solve this problem. The traditional Pascal and C language based learning has been replaced by modern objectoriented languages, offering up-to-date knowledge to students. The main programming languages of this kind are Java (developed by Sun) and C# (developed by Microsoft). The John von Neumann Faculty of Informatics of Budapest Tech has done this step two years ago, therefore nowadays the initial language is C# and students learn Java in further semesters. My lecture is about similarity (and difference) between these programming languages, like architecture, base logic and syntax. It is beneficial for the students to learn analogous languages because they don’t have to come to know a new system that makes all the difference. But there is a lot of difficulty in this, because students must learn bewilderingly similar conceptual systems which needs major attention. Likewise it’s a big challenge for teachers because they need a new method to teach a new programming language from the begining but based on a well-known similar language.
Keywords C#, Java, Teaching programming, BMF
1
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
1. Programozás tárgyakat érintő változások a BMF-NIK-en A Budapesti Műszaki Főiskola Neumann János Informatikai Karán 2006 őszében került bevezetésre egy merőben új koncepció a programozás tárgyak oktatását illetően. Ez volt az első jelentős változtatás az elődintézmények összevonása óta kialakult rendszerben, amelynek alapja a Delphi programozási nyelv oktatása volt 3 féléven keresztül, emellett a 2. és 3. félévben a hallgatók kötelezően választhattak két másik, a C# és a Java nyelv megismerése közül. A módosítás egyik fő oka az objektumorientált programozás (Sergyán et al., 2003) előtérbe helyezése volt, emellett azonban felmerült egy esetleges változtatás lehetősége a programozási nyelveket illetően is. Bár a Delphi (fejlesztési céljának megfelelően) tökéletesen alkalmas volt a kezdő programozók első lépéseinek megtételére, a későbbiekben használata gyakran nehézségekbe ütközött a haladó témakörök környékén. Bár ezzel a nyelvvel is megoldható a szükséges feladatok többsége (web alapú alkalmazások fejlesztése, elosztott rendszerek készítése, többszálú programok megvalósítása stb.), úgy találtuk, hogy mindkét másik nyelv ezekre kifinomultabb és gyakran könnyebben tanítható megoldásokat nyújt. A fenti nyelvek további előnye, hogy mindkét választás esetén a hallgató sokkal könnyebben tud megtanulni egyéb C alapú programozási nyelveket, amelyek sok mérnöki szakterületen nélkülözhetetlenek a továbblépéshez, példaként említve akár a karunkon tradicionális mobil eszközök, illetve a szintén népszerű robotok programozását (Vámossy, 2007). A két nyelv közötti döntés már jóval nehezebb kérdés volt, végül a különböző (akkor elérhető) fejlesztőeszközök lehetőségeinek áttekintése, és a hallgatók számára lényeges funkciók (az informatikus hallgatók jellemzően Windows alapú „desktop” alkalmazások fejlesztését tanulják) összehasonlítását követően a C# lett a választott alapnyelv. Az új tematika alapján tehát ezen nyelv segítségével sajátíthatják el az objektumorientált programozási alapokat az első félévben, a vizuális eseményvezérelt programok és az adatszerkezetek használatát a második félévben, illetve további haladó programozási technikákat a harmadik félévben. Az alapnyelv kiválasztását követően merült fel a kérdés, hogy szükség van-e emellett további programozási nyelvek megismerésére, és ha igen, melyik legyen az (vagy akár melyek legyenek azok?). Mivel szerettük volna, hogy a hallgatók lehetőség szerint minél átfogóbb képet kapjanak a jelenleg elérhető eszközökről, illetve szerettük volna azt is elkerülni, hogy a végzett informatikus hallgatók számára a programozás csak és egyértelműen a Visual Studio keretrendszert, illetve azon belül a C# nyelv használatát jelentse, a két különböző nyelv oktatása mellett döntöttünk. A második nyelv kiválasztása egyszerűnek tűnt, a Delphi további oktatását ugyanis a fent vázolt problémák miatt nem szerettük volna folytatni a törzsanyag részeként (esetleg fakultatív tárgyként jelenhet meg a későbbiekben). Választásunk emiatt a már eddig is oktatott Java nyelvre esett, ami a hallgatók számára egy alapelveiben hasonló, de számos területen mégis egy más szemléletmód megismerését jelentheti. Bár a C# nyelv látványos elterjedése némileg visszaszorította a Java nyelvű fejlesztések arányát, azért még így is bátran állítható (két év távlatából is), hogy a másodiknak választott nyelv is kurrens, értékelhető tudást jelent a végzett hallgatók számára a piacon. Mindkét esetben kiforrott, a gyakorlatban már bizonyított eszközről van szó, ennek köszönhetően a hallgatók számára fontos irodalom (tankönyvek, referencia könyvek, internetes anyagok) is megfelelő számban és minőségben rendelkezésre állnak. Köztük a kar 2
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
oktatói által írt könyvek is megtalálhatók, amelyek jelentős részben lefedik az oktatott tananyagot a fent említett nyelvek használatával (Kotsis et al., 2007). 2. C# és Java nyelv hasonlósága A két választott nyelv között meglehetősen sok hasonlóságot lehet észrevenni, ezt bizonyítja az interneten található számtalan, a tapasztalható különbségeket és azonosságokat taglaló oldal. De ezen túlmenően szakkönyvekben is gyakran kerül közös tárgyalásra a két nyelv, illetve gyakran találkozhatunk az egyik ismeretét feltételező, a másik nyelvet ennek segítségével bemutató írásokat is (Jones, Freeman, 2002). Mindezek puszta léte is azt mutatja, hogy az oktatás során sem célszerű ezeket egymástól függetlenül kezelni, hanem az egyik megismerése után praktikus a meglévő ismeretekre és a felmerülő hasonlóságokra alapozni. Ha egy pillanatra túllépünk a nyelveken, akkor jól látható, hogy ez a hasonlóság már a „mögöttük álló” futtatókörnyezetekben is felismerhető. Bár megvalósításuk részleteiben számos különbség jelenik meg, fontos hasonlóság, hogy az általunk használt fejlesztőeszközök segítségével egyik nyelven írt programból sem lesz natív kód a fordítás végeredménye. A Java esetén a fordító a forrásállományokból egy úgynevezett Java bájtkódot állít elő, amit a későbbiekben a JVM segítségével tudunk futtatni. A C# esetében ez annyiban különbözik, hogy a fordító egy köztes nyelvű forrást állít elő, ami futásidőben a gazda gép architektúrájának megfelelően kerül fordításra, majd az így létrejött natív kód indul el automatikusan. Bár a két technika megvalósítását tekintve sokban különbözik egymástól, a hallgatók számára azonban mégis sokkal lényegesebbek az ebből adódó hasonlóságok, amik általában előnyöket takarnak. Mivel az általuk írt kód csak egy futtatókörnyezeten keresztül kerül végrehajtásra, így ennek számos szolgáltatását egyszerűen kihasználhatják (pl. a szemétgyűjtő mechanizmusnak köszönhetően nincs szükség a lefoglalt memóriaterületek kézi felszabadítására, ami a hagyományos nyelveknél számos problémát okozott). public class MaximumKereso { int[] A; int N; public MaximumKereso(int N) { this.N = N; A = new int[N]; } public int MaximalisElem() { if (N == 0) throw new SajatKivetel("Nincs elem"); int max = 0; for (int i = 1; i < N; i++) { if (A[i] > A[max]) max = i; } return max; } } 1.
ábra – egyszerű osztály, amely mindkét nyelv alatt helyes
A programozás első lépéseit tekintve (saját osztály definiálása) a legszembetűnőbb a két nyelv hasonlósága. Az alap gondolatmenet, a megvalósítandó lépések, de még a nyelvi kulcsszavak is szinte teljes egészében megegyeznek. Példaként látható, hogy az 1. ábrán megvalósított osztály tartalmaz tömböt, metódusokat, ciklust, elágazást, saját kivétel dobást, de mindezek kezelése javarészt azonos mindkét nyelv esetén.
3
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
Ez természetesen nem meglepő, hiszen mindkét nyelv nem titkoltan a C és C++ nyelvek alapjaira építkezik, illetve ezen túlmenően egymás fejlődését figyelemmel kísérve láthatóan a másik által megvalósított, és bevált eszközöket is próbálják adaptálni. Természetesen nem helyezhetünk egyenlőségjelent a két programozási nyelv közé, számos apró (pl. protected kulcsszó különbsége stb.), illetve néhány szembetűnő (pl. tulajdonságok megléte vagy hiánya, eseménykezelési módszerek stb.) különbség található. Ezek megismerését követően azonban elmondható, hogy a C# nyelvet már magabiztosan kezelő hallgató meglehetősen egyszerűen el tudja sajátítani a Java nyelv használatát. Mindez persze nem kérdőjelezi meg a két nyelv létjogosultságát, megismerésük során számos, a szintaktikai jelöléseken messze túlmutató, architektúrális különbséggel találkozunk (pl. Enterprise JavaBeans stb.). Ezek oktatása azonban jelenleg nem tartozik a képzés törzsanyagához, így a hallgatóknak a két párhuzamos környezet közül főképpen csak a kiinduló, a fentiek alapján láthatóan hasonló részterületeket kell megismerniük. A gyakorlati munka során szintén sok hasonlóságot fedezhetünk fel, ugyanis mindkét nyelv esetén egy meglehetősen kiterjedt beépített osztálykönyvtárral dolgozhatunk. Ezek a hagyományos nyelvekben megismert alapvető funkciókon túl (pl. állományok kezelése, konverziók stb.) számos jóval összetettebb műveletet is támogatnak (pl. gyűjtemények, tömörítés, különböző segédosztályok stb.). A két osztálykönyvtár felépítésében, illetve az egyes osztályok, metódusok neveiben természetesen eltér egymástól, de a két rendszer által használt alapkoncepció megértését követően egyszerűen megtalálhatók a szükséges elemek. Az osztálykönyvtár mélyére nézve természetesen számos különbségre derül fény, a hallgatók számára lényeges funkciók azonban néhány apróságtól eltekintve könnyen elérhetők és általában hasonló gondolatmenetet követnek. 3. A tananyag kidolgozása során felmerülő kérdések A fent említett hasonlóságok természetesen alapvetően előnyként jelennek meg a nyelveket elsajátítani szándékozók számára, az oktatás során azonban egészen érdekes problémákat vetnek fel. Minderre már a 3. félévben induló Java tárgy előtt fény derült a szükséges anyagok részletes kidolgozása során, amikor el kellett dönteni, hogy milyen mértékben és milyen formában tudunk építkezni az előző két félévben tanult (és az előkövetelmények alapján a hallgató által sikeresen teljesített) C# alapú tárgyak anyagára. A helyzet talán a nyelvoktatásból lehet ismerős, amikor két, egymáshoz meglehetősen hasonló nyelvet kell tanítani. Talán csak annyi a különbség, hogy a hasonlóság itt (a hallgatók számára szükséges szinten) már zavarbaejtően nagy, az apró különbségek azonban mind kritikusak, hiszen a fordítóprogramok csak a saját nyelvük által definiált pontos szabályok szerint képesek működni, nincsenek félmegoldások. Az új tematika során felmerülő igények között természetesen első helyen a szakszerűség állt. A felsőoktatásban nélkülözhetetlennek tartjuk azt, hogy a hallgatók ne csak a gyakorlati megoldásokat tudják kivitelezni, hanem pontosan tisztában legyenek az általuk használt eszközök működésével. Ennek az alapelvnek megfelelve az elkészített anyagok tartalmaznak utalásokat minden, a két nyelv között felmerülő különbségre, mégha ezek jelentős részét a hallgató mindennapi munkája közben észre sem venné (pl. a protected kulcsszó jelentése hasonló, de nem teljesen azonos a két nyelvben, még ha ez a rövid iskolai feladatok elkészítése során nem is okoz problémát). Legalább ennyire fontos szempont a hallgatók motivációjának fenntartása. Bár sok szempontból a legegyszerűbb és legprecízebb a Java teljesen alapoktól való indítása lett 4
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
volna, valószínűleg csak teljes érdektelenséget tudtunk volna ezzel elérni. Az érintett hallgatók már készségszinten kezelik a C# nyelv alapjait, magabiztosan használják az ott megismert osztálykönyvtárat és különböző eszközöket. Számukra egy szinte teljesen azonos alapokon nyugvó nyelv kezdetektől való oktatása valószínűleg minimális kihívást jelentene (talán nem túlzó hasonlat, ha arra gondolunk, hogy több év „brit angol” tanulás után a személyes névmásoktól kellene elkezdenünk „amerikai angol” nyelvet tanulni). Szintén ez ellen szól az is, hogy a Java nyelv oktatására meglehetősen kevés időt tudunk csak szánni, egy félév alatt a fenti módszerrel csak olyan témaköröket tudnánk érinteni, amit a másik nyelvből, szinte teljesen azonos módon már ismernek. A hangsúlyt tehát mindenképpen a két nyelv közötti különbség kiemelésére kell fektetni, mindezt azonban a didaktikai alapelvek figyelembevételével kell megoldani. Bár a különböző szakmai oldalakon található összehasonlító referenciák a szakértők számára nagyon röviden, pontosan és jól érthetően feltárják a nyelvek közötti különbségeket, a gyakorlati oktatás során ez a módszer valószínűleg nem válna be. Ez ugyanis a tananyag jelentős részét leegyszerűsítené egymást követő táblázatokra, ahol az egyik oldalon a C# nyelven megismert tudáselem található, a másik oldalon pedig ennek Java megfelelője. Ennek következtében nem csak az órák lennének meglehetősen unalmasak, de a tananyag megtanulhatósága is erősen kétségbevonható lenne (azt nem is említve, hogy mivel a programozás egy alapvetően gyakorlati tárgy, ezeket az elméleti információmorzsákat a zárthelyik során egy komplett program megíratásával szeretnénk ellenőrizni). 4. Felmerülő ötletek a tematika kidolgozása során A cél tehát a fenti kritériumoknak megfelelő tematika kidolgozása, vagy talán pontosabb, ha a megfelelő arányok megkereséséről beszélünk a fenti, gyakran egymásnak ellentmondó követelmények teljesítése között. Első körben a tárgyalni kívánt anyagrész határait kellett kitűzni, itt szerencsére sikerült egy előnyös döntést hozni a többi tárgy figyelembevételével. Mivel az alapnyelvben megismertektől csak apró technikai különbségekkel rendelkező anyagrészek oktatása meglehetősen problémás a fent említett okok miatt, illetve ezek megtanulása is valószínűleg csak nehézkesen sikerülne a hallgatók számára, hiszen nem rendelkeznek még olyan szintű magabiztos tudással egyik nyelv esetében sem, hogy ne keverjék néha a szintakszist. Az alapkoncepció tehát az lett, hogy a nyelv alapjainak ismertetése után nem a első nyelv segítségével már egyszer bejárt utat követjük, hanem azonnal egy másik irányba kanyarodunk, jelen esetben a szerver oldali/web programozás irányába. Egy tudatos döntés eredményeként ezeket a témaköröket a C# nyelv esetében csak érintőlegesen tárgyaljuk, ami egyrészt segít elkerülni a fent vázolt problémát, másrészt lehetőséget ad további, az idő hiányában egyébként elmaradó területek feldolgozásához. Mivel azonban szeretnénk elkerülni, hogy a hallgatók valódi megértés nélkül, csak látott gyakorlati minták alapján dolgozzanak, hangsúlyt fektettünk a félév első néhány órájában a nyelv alapjainak megismerésére. Az itt kidolgozott anyagrész meglehetősen „száraz”, főleg technikai összehasonlításokat tartalmaz, a célunk azonban az volt, hogy a hallgatók minél előbb megismerjék a szükséges nyelvi alapokat a továbblépéshez (a második szakasz előtt ezt egy zárthelyivel is próbáltuk biztosítani). Mivel a tárgy hangsúlyos anyaga a szerver oldali programozás, emiatt a szükséges alapismereteket is lehetőség szerint ez alapján válogattuk, próbáltunk egy stabil, de mégis 5
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
lehetőleg rövid útvonalat kiépíteni ehhez a témakörhöz (emiatt például a grafikus felület tervezése csak marginálisan jelent meg). Néhol az idő hiányában kénytelenek voltunk néhány érdekes, bár nélkülözhető lépést kihagyni, az érdeklődő hallgatók számára azonban az elkészített tananyag ezeket is részletesen tartalmazza egy egyszerű megkülönböztetéssel (pl. webes programok készítéséhez nem szükséges pontosan ismerni a webszerver részletes működési paramétereit, de ez a kiegészítő anyag ezeket is részletesen taglalta). Ezekre az órán csak utalásokat tudunk tenni, a hallgatókra bíztuk, hogy ezekkel otthon, szabadidejükben részletesebben foglalkozzanak (2. ábra).
2. ábra – törzsanyag és kiegészítő anyag, színekkel megkülönböztetve
A nyelv ismertetése során az egyszerű nyelvi elemek összehasonlításán túl nagy hangsúlyt fektettünk a különböző tipikus hibák bemutatására is. Ezek közül sok már eddigi oktatási tapasztalatainkból is ismert volt (pl. a String osztály kezelése során felmerülő gyakran elkövetett problémák), néhány azonban csak menet közben jelentkezett (pl. C# névtér és Java csomag fogalom közötti különbségek miatt), ez utóbbiakat is próbáltuk beépíteni az anyagokba. Bár meglehetősen kevés gyakorlati feladatmegoldásra maradt idő, a zárthelyi tapasztalatok alapján így is meglehetősen gyorsan sikerült a szükséges alapismereteket megszerezni, amelyekre már néhány alkalommal később (valószínűleg már nem sokkal a motiváció teljes elveszítése előtt) elkezdhettük építeni a kitűzött web alapú programozás témakört. Ez már meglehetősen hálás témának bizonyult, a hallgatók azonnal vissza is nyerték ideiglenesen elveszített lelkesedésüket. Ennél a témakörnél pedig már visszatérhettünk az eddig ismeretlen anyagrészeknél megszokott oktatási módszerekhez is. 5. Tapasztalatok összegzése A fent vázolt tanterv szerint eddig két félévben tartottunk órákat, a nyári hónapokra tervezzük az eddigi tapasztalatok összegyűjtését, ezek alapján az esetleges módosítások végrehajtását. A hallgatók láthatóan nem kedvelik az első néhány óra nagyon intenzív Java
6
Informatika a felsőoktatásban 2008
Debrecen, 2008. augusztus 27-29.
alapismereteket feldolgozó témakört, azonban a teljes tematikát ismerve megértik ennek fontosságát, a félév második felében megjelenő webes alkalmazásfejlesztés témakörhöz érve pedig már kimondottan motiváltak. Rövid, nem reprezentatív felmérésünk alapján is egyértelműen úgy tűnik, hogy ezt utólag is helyesnek találják (kérdésünkre, miszerint jobbnak látnák-e, ha alaposabb, gyakorlatorientáltabb lenne az első szakasz, viszont ennek következményeként rövidebb a második, mindenki nemmel válaszolt). Kisebb módosítások természetesen még szükségesek az elkészült anyagokban, főleg a kötelezően megtanulandó és a kiegészítő anyagok közötti átmozgatásokkal, azonban jelenleg úgy tűnik, hogy hosszabb távon is kivitelezhető lesz ez a koncepció. [1]
A. Jones, A. Freeman (2002) C# for Java developers, Microsoft Press, ISBN 9780-7356-1779-7
[2]
Kovács D. L., Nyékyné G. J., Sergyán Sz. (2003) Objektum orientált programozás. In: Programozási nyelvek (ed.: Nyékyné G. J.), Kiskapu Kiadó, Budapest, ISBN 963-9301-47-7
[3]
Kotsis D., Légrádi G., Nagy G., Szénási S. (2007) Többnyelvű programozástechnika, Panem Könyvkiadó, Budapest, ISBN 978-9-635454-72-3
[4]
Vámossy, Z. (2007) Map Building and Localization of a Robot Using Omnidirectional Image Sequences, Acta Polytechnica Hungarica, Vol. 4/3, Budapest Tech, pp. 103–112, ISSN 1785-8860
7