A rekurzió kedvéért
Czirkos Zoltánnal, a méltán népszerű Programozás alapjai 1 tárgy oktatójával beszélgettünk. Mesélt nekünk a tapasztalatairól a szakmával és a tanítással kapcsolatban, valamint feltettük neki a Ti kérdéseiteket is! Ha kíváncsi vagy, hogy miért beszél nyakkendőben a rekurzióról, bátran olvasd el Czirkos Zoltánnal, a méltán népszerű Programozás alapjai 1 tárgy oktatójával készített interjút!
Mikor kezdtél el a szakma iránt érdeklődni?
Kiskoromban, már ovi végén érdekelni kezdtek az elemek és az izzók. Otthon sorba kötöttem őket, de nem tetszett, hogy halványabban világítanak. Ezután apám megmutatta a párhuzamos kapcsolást, amivel egyformán fényesek lesznek, csak hamarabb lemerül az elem. Aztán általános másodikban kaptam Commodore64-et karácsonyra, és onnantól már egyértelmű volt a jövőm.
Végül miért fordultál az informatika felé?
Programozni mindig is nagyon szerettem, de világ életemben érdekelt a villamosmérnökség is. Az első önlab témám ledekkel kapcsolatos volt, de közben rájöttem, hogy azok annyira nem érdekesek számomra. Emiatt másodjára inkább egy hálózatos-szoftveres témát választottam. A konzulensem javaslatára TDK-t készítettem belőle, és végül a diplomamunkám során is emellett maradtam. A sok határterületen lavírozásból újra elindultam az informatika irányába – nem bántam meg, hogy ennél maradtam.
Mesélj az InfoC-ről!
Akkor kezdtem ennek az elődjét csinálni, amikor azt a feladatot kaptam a tanszéktől, hogy a gyakorlatokat koordináljam, találjak ki feladatokat. Evidens volt, hogy ehhez kell egy honlap. Egyszerűen e-mailben szétküldöm a linket, és akkor látják a gyakorlatvezetők, hogy mik a feladatok. Időnként előtört belőlem a grafománia, ekkor készültek az első extrák is, mint például a labirintustervező algoritmus és a generikus lista.
Amikor átvettük a Prog1-et, egyértelmű volt, hogy egy nagyobb honlapra van szükség, ahol megtalálható a tananyag, valamint egy adminisztrációs portálra, ahova feltölthetőek a házik és az eredmények. Ekkor kezdtem el a honlap mostani változatát fejlesztgetni. Találtam egy weboldalt, ahol a HTML5-öt mutatták be egy diasor formájában – ami szintén HTML5-ben volt megírva. Minimális CSS-sel meg lehet úgy formázni az oldalt, hogy a képernyő méreteihez igazodjon. Gondoltam, előadást is lehetne tartani a böngészővel: sokkal jobb lenne, ha HTML kóddal írnám a diasort, mert a PowerPoint szerintem gyakorlatilag alkalmatlan komolyabb feladatra.
Amikor kódpéldákat futtatsz, akkor tényleg lefut egy C fordító?
Igen, amikor nyomok egy F5-öt, akkor egy JavaScript kódrészlet elküldi a szervernek, ahol a PHP szkript megkapja, elindítja a fordítót, és ha lefordul a kód, akkor elindítja a programot is. A kapott eredményt visszaküldi, amit a JavaScript beilleszt az oldalba. Előadáson a webszerver is a notebookomon található, nem távoli gépen fut, különben internet nélkül nem tudnék előadást tartani.
Az InfoC-n lévő animációk (pl.: rendező algoritmus) is hasonlóan készültek?
Igen, azokat is JavaScriptben írtam. A rendező algoritmus animációját HTML-ben formáztam direkt úgy, hogy le legyen kerekítve a cserék során az útvonal, és színessel legyen kijelölve az éppen lényeges elem. Az összes ehhez hasonló algoritmus is mind JavaScriptben készült.
A bagoly logó történetéről mesélnél?
Amikor még csak a gyakorlatok honlapját szerkesztettem, egyik éjjel találtam vicces állatfigurákat a képkeresőben. Ezeket elkezdtem a weboldalon található különböző dobozokhoz társítani, amelyekben érdekességek, forráskódok voltak. Ekkor találtam ezt a baglyot is, teljesen véletlenül. Nem tudom, hogy ki rajzolta vagy honnan van, random bukkantam rá a neten.
A rekurzióról miért nyakkendőben beszélsz?
Tavaly kitaláltam, hogy bemegyek úgy előadásra, hogy a szünet után fölveszek egy nyakkendőt a vicc kedvéért. A rekurzió kedvéért. Merthogy mégiscsak olyan dologról van szó, amiről kellő tisztelettel kell beszélni. Azóta másodjára is így csináltam, mert tetszett mindenkinek.
A rekurzió mindenre jó. Ezt ott el is szoktam mondani, hogy azzal lehet megfogni a végtelen bonyolultságot. Ez mondjuk nehéz felvezetés, mert amíg nem tudja valaki, hogy mi az, nem fogja érteni, hogy miért mondom ezt – de a nyakkendő miatt vicces.
Ha más tárgyat fogsz tanítani, abban is lesz ilyen nyakkendős téma?
A C++11-ben lehetne például a template metaprogramozás, amelyik a tizenegyedik hét környékén van. Arról is sok száz oldalnyi könyvet írtak, és az is nagyon nyakatekert. Idén az első óra elején felrajzoltam egy grafikont a táblára, hogy milyen a WTF-idő diagramja a tárgynak. Vízszintesen a hetek egytől tizennégyig, és a függőleges tengelyen, hogy mennyire lesz WTF az előadás. Van benne két nagy pukli, az egyik a template data programozás, a másik a harmadik héten egy reflektivitással foglalkozó rész. Az utóbbi durva is volt, azt lehet, hogy máshogy kellett volna előadnom.
Prog1-nél látszik, ha valaki csak át akar menni a tárgyból, de tudást nem akar szerezni?
Nagyon nehéz lemérni egy zh-ból, hogy mennyi időt szánt valaki a készülésre. Tehát van érzéke hozzá, és egy percet se tanult, vagy nagyon sokat tanult, csak még mindig nem rázódott bele, és azért nem lett neki jó. Így ezt sokszor a számonkéréseken nem lehet eldönteni.
Előadást, gyakot vagy labort szeretsz jobban tartani? Az alsóbb vagy a felsőbb éveseket szereted jobban tanítani? Mi a különbség köztük?
Mindegyik fajta órát szeretem, de legszívesebben talán előadást tartok.
A hallgatókkal kapcsolatos részt nehéz megválaszolni, mert akiket tanítok felsőbb évesek közül, azokat tanítottam gólyaként is. Akik a C++11 választhatón vannak, nagyrészt nálam voltak Prog1-ből is, már korábbról ismerem őket.
A különbség az alsóbb és a felsőbb évesek között inkább a motivációban szokott megjelenni. De ez nem is az évfolyamtól függ, hanem a tárgytól - hogy kötelező, vagy választható tárgyról van szó. Ha nem is az egyes hallgatók motivációját nézem, hanem azt, hogy átlagban mennyire motivált a csoport, akkor a C++11 esetén látszik, hogy azért jöttek oda, mert kifejezetten ez érdekli őket. Sokak hozzáállásán a Prog1-nél lehet érezni, hogy ez nekik csak egy tárgy a sok közül, ezt kell csinálni, hogy megkapják a papírt.
A C++11 mióta létezik? Villanyosok is felveszik?
Tavaly ősszel indult először, most megy másodjára. Néhányan fel szokták venni villanyosok közül is, valamint van egy matematikus hallgató is, de alapvetően infósok vannak a tárgyon. Elvileg csak nekik szerepel az ajánlott kategóriában, mert a villanyos szakon van egy másik haladó C++ tárgy is.
Mennyire látszik a különbség a C++11 hallgatói között, hogy ki melyik szakról jött?
Nem nagyon, mert aki bevállalja, hogy felvesz egy haladó C++ tárgyat, annak szerintem nem baj, hogy egy-két előadásnyi dolgot külön meg kell tanulnia. Régen a villanyon alacsonyabb volt a C++ óraszám, nem tanították például az iterátorokat, és a sablonok témakörébe sem mélyedtek bele. De aki ezeket még megtanulja, annak érthető lesz ez a tárgy is.
Hány szorgalmi szokott lenni a Prog1-en? Hogy találod ki őket?
Tizenöt-tizennyolc feladat, hetente egy vagy kettő. Egy részét én találom ki, másik része pedig az internetről, könyvekből származik. Amikor találkozom egy feladattal a neten, ami adaptálható egy adott hét tananyagához, akkor azt felhasználom. Az órás feladat gondolata egyébként a saját programozás tanulási tapasztalatomból jött. Én sok grafikus programmal kezdtem, mert az látványos volt, láttam megjelenni az algoritmusok eredményét.
Mi a véleményed arról, hogy sokan itt szembesülnek először a programozás kihívásaival?
Jó lenne, ha már előbb találkoznának vele, de megtanulható itt is. Ha valakinek van egy kis absztrakciós készsége, akkor elsajátítható teljesen nulláról. Sok olyan embert ismerek, akik itt kezdték a kódolást, és maximum pontos, megajánlott ötössel végezték el elsőre a tárgyat. Nem baj, ha valaki úgy jött, hogy még nem programozott, de a készségek szükségesek, azokat nem tudjuk fél év alatt kialakítani.
Tehát kötelezővé tennéd középiskolában a programozás oktatását?
Nem is a programozást tenném kötelezővé, inkább valami algoritmikus gondolkodást segítő, kialakító tárgyat, akár a matekba beépítve, de inkább külön. Azt mondják, hogy nem középiskolában, hanem általánosban vagy oviban kéne elkezdeni. Nyilván nem C-ben kódolnának az ovisok, de olyan feladatokat kapnának, amik ezt a fajta gondolkodást segítik elő. De azt szem előtt kell tartani, hogy ez más, mint a matek, mert ehhez teljesen máshogy kell gondolkozni. Engem például általános iskolában zavart, hogy adtak olyan matekfeladványokat, amiket valahogy ki lehetett logikázni. Mint a send+more=money, ahol minden betű egy másik számjegyet jelöl. Én mindig arra gondoltam, hogy körülbelül öt sorból lehetne egy olyan programot írni, ami végigpróbálja a lehetőségeket. Viszont ez egy teljesen más gondolkodásmódot jelent, és lehet, hogy valakinek a logikázás nagyon könnyen megy, de a programozásra nem áll rá az agya.
Lenne értelme a C nyelvet és az algoritmusokat külön tanítani? Előbbi esetben számítógépes, utóbbiban papíros számonkéréssel?
Szerintem ezek elválaszthatatlanok, mert nagyon nehéz lenne megtanulni az algoritmusokat úgy, hogy nem lehet őket kipróbálni. Ilyen szempontból a programozóknak sokkal könnyebb, mint egy másik szakma művelőinek. Vegyünk példának egy építészt, aki ha rajzol valamit, nem biztos, hogy azt valaha is megépítik. Egy villamosmérnöknek már jobb, ott a kezében a páka, amit 5000 Ft-ért vett, és azzal tud dolgozni. Egy infós letölti ingyen a fejlesztő környezetet, és bármit kipróbálhat. Megvan annak is a maga haszna meg szerepe, ha mindezt papíron csinálja, lerajzol egy algoritmust piktogramokkal. De úgy sokkal egyszerűbben meg lehet tanulni, hogy ki is lehet próbálni, és lehet kísérletezni a kód módosításával. Sokkal jobb, hogy egyszerre tanítjuk a kettőt.
A számonkérést egy ekkora évfolyamnál nem tudjuk megoldani, hogy az összes kis- és nagyzh gépen legyen. Valamint rossz is a tapasztalatunk vele. Korábban kipróbáltuk, és azt láttuk, hogy a vizsgázók nem a megoldandó feladattal foglalkoznak, hanem szépítgetik a kódjukat, például hogy hova rakjanak szóközt. Közben nem figyelnek arra, hogy van egy időkeret, amin belül működő kódot, vagy legalább valami kódnak kinéző dolgot kellene leadniuk. Tehát jobb a papír.
A papíron programozással lehetőséget kapunk arra, hogy a szintaktika mögé nézzünk. Néhány apróbb szintaktikai hiba esetén (például lemaradt zárójel, pontosvessző) is láthatjuk, ha egyébként működő kód lenne. Ez gépen nem így működik.
Gondolkodtál már valaha azon, hogy diszlex vagy diszgráf diákokat taníts? Egy hasonló problémákkal küzdő hallgató tette fel a kérdést.
A magyarázatokba az évek során belejöttem. Nagyjából tudok egyszerre magyarul beszélni és C kódot írni. Ahogy gépelek, eleve úgy kanyarítom a magyarázatot, amilyen sorrendben az utasítások követik egymást. Lehet, hogy ez segít, de nem tudom megítélni, mivel teljesen ismeretlen számomra a téma.
Igyekszem úgy tanítani a programozást, hogy azt mutatom közben, hogyan lehet olvasható kódot írni. A programozók nem szeretik a meglepetéseket. Ezt érthetjük az egész kódnak a felépítésére, és egyetlen egy kódsor, egyetlen pici kis kifejezés leírására is. Tehát, ha a maximumot keresem, akkor a nagyobb jelet használom a kódban, ha minimumot, akkor a kisebb jelet. Nem fordítom meg a relációt, úgy írom, ahogy azt ki kell olvasni. Lehet, a diszlexiásoknak segít, ha mindig így írom ezeket.
Készült már felvétel az előadásaidról? Zavarna, ha készülne?
Nem tudok róla, hogy ilyen felvétel létezne. Lehet, hogy zavarna, ha készülne. Nem tartom hasznosnak azt, hogy otthonról videón nézzék az emberek az előadást ahelyett, hogy bejönnének. Valószínűleg feszélyezne is a kamera. Biztosan megszoknám, de az elején zavarna.
Zavar, amikor a hallgatók, esznek, isznak, laptopoznak az órádon?
Attól függ, hogy melyik. Az evés, ivás, laptopzás nem, de ha olyan hangosan beszélnek, hogy az hozzám is eljut, az már idegesít. A későknél nem engem zavar, hogy később jönnek, hanem a többieket. Beesik valaki tíz perccel az óra kezdete után, nagy nehezen bebotorkál a helyére, közben átesik három-négy emberen… Ugyanez szokott lenni kiszh-n is. Van húsz perc megírni, és kellemetlen, ha közben arra kell figyelnie valakinek, hogy a késők lökdösik a székét, be szeretnének mászni a mögötte lévő helyre, csak mert éppen akkor értek be. Ezt sosem nézem jó szemmel.
Volt már példa arra, hogy kiküldtél valakit az órádról?
Kiküldeni még nem kellett. Elég volt szólni, hogy kiküldöm. Ilyenkor inkább azt mondom, hogy a jelenléti ív aláírása után el lehet menni. Volt is már példa erre. Mindenkinek jobb így. Neki nem feltétlen, de aki figyelni szeretne, annak mindenképp.
Mennyi időt foglalkozol a kérdések megválaszolásával, a megoldások értékelésével?
Ez főként az őszi félévben sok idő, amikor a Prog1 fut. Napi egy-két órát töltök azzal, hogy házikat nézek át, e-mailekre válaszolok. Nem szokott annyira sok lenni, legalábbis én nem érzem úgy, hogy egyfolytában házit javítanék.
Ami igazán számottevő, az az egyéb munka a tárggyal: összerakni egy zh sort, kipróbálni, megoldani, pontozást kitalálni, odaadni a többieknek, akik szintén átnézik, stb. Ez rengeteg idő.
Kaptatok már zh-kon nagyon meglepő, egyébként jó megoldást, amire ti nem gondoltatok?
Igen, kaptam már ilyet. Például egyszer egy függvényt kellett írni, ami egy számról eldönti, hogy prímszám-e. Megoldásként egy rekurzív, Eratoszthenész szitájához hasonló kódot kaptam. Nem nézte végig ész nélkül 1-től n-ig az osztókat, hanem minden számra ellenőrizte, hogy prím-e, és csak a szűrőn átjutott esetekkel dolgozott tovább.
Előfordult már, hogy olyan megoldást kaptál, amit nem értettél meg, de működött?
Igen. A legtöbb esetben, ha nem értjük a kódot, akkor ott valami gond van, de előfordul az, hogy elnézünk valamit javítás közben. Ezért is jó az ajándék +2 pontos rendszerünk, ennek a kompenzálására.
A legális C puska mióta létezik?
A HIT tanszéken Szandi Lajos csinálta, és amióta itt vagyok progon, mindig is lehetett használni. Már középiskolás koromban a kezembe került papíron. Tehát 1999-2000 környékén már eljutott hozzám az a puska, csak akkor még nem volt fent mindenhol pdf-ben, hanem fénymásolva járt kézről kézre.
Kellett már rajta módosítani valamit, mert valami olyan le volt benne írva, amit tudniuk kellett volna a hallgatóknak maguktól?
Nem, tudtommal mindig is így nézett ki. De a puska csak egy referencia, nem lehet csak erre támaszkodva megoldani a feladatokat. Szoktam is mondani a hallgatóknak, hogy felejtsék el a puskát. Sokszor a fejükbe veszik, hogy bizonyos részfeladatokra megoldást fognak találni benne. Például, hogy van egy olyan C függvény, amelyik megszámolja a magánhangzókat egy sztringben. Nincs ilyen C függvény, hiába is keresik. Olyan sem lesz, amelyik megcserél két szót egy sztringben. Elmegy tíz perc azzal, hogy végignézik mind az ötven függvénynek a leírását, ami a lapon szerepel. Szerintem ez inkább akadályoz, mint segít.
Milyen csalásokkal szoktak próbálkozni a hallgatók?
Nemcsak Prog1-nél, hanem más tárgyaknál is szoktam zh-t felügyelni. Általában szimpla puskázás. De olyan is megesett már, hogy valakivel a megtekintésen beszéltem, nem kapta meg a pontot, és aztán azt hazudta a másik oktatónak, hogy én megadtam neki. Utána persze lebukott, amikor a másik előadó mondta, hogy kijavította a srác pontszámát. Én meg értetlenkedve visszakérdeztem, így fény derült a csalásra.
Egy bites válaszok
A PHP a programozási nyelvek Comic Sans-e? | 1 |
Bor? | 1 |
Kutya vagy macska? | Macska |
Mivel ízesíted a teát? | [ ] |
Milyen nyelveken beszélsz? | C++, JavaScript :D |
Puskáztál valaha? | 1 |
Sör? | 1 |
Tab vagy szóköz? | Szóköz |
Ez az interjú eredetileg az Impulzus XLII. évfolyam 5. számában jelent meg, melyet letölthetsz az archívumból. A második részt elolvashatod az A C++ Sensei c. cikkben.
Fotók – Gál Efraim