Általános szoftver ismeretek

A tananyag használatáról


Mielőtt arról szólnánk, hogyan is lehet ezt az anyagot használni, először is tisztázzuk, hogy ez az egész itt mi nem:

Ez nem egy

Nem tankönyv abban az értelemben, ahogy például egy Java nyelvbe bevezető könyv az: El lehet kezdeni olvasni az elején és végig lehet szép sorban haladni rajta.

Ez inkább különböző témákról szóló cikkek gyűjteményének tekinthető. Ha például az Olvasó a Java kivételkezelésével szeretne ismerkedni, akkor (a szerző szándéka és reménye szerint) itt sok hasznos ismeretre lelhet, méghozzá eléggé struktúrált formában: Külön helyen találja meg a szintaktikai szabályokat, külön a működés leírását, és így tovább.


Nos, akkor most lássuk egy kicsit részletesebben, milyen módon próbáljuk az eligazodást segíteni. Ha módszeresen akarunk elsajátítani egy nagy tananyagot, nyilván tervszerűen kell haladnunk. Egyrészt először a legfontosabb dolgokat kell megtanulni és csak később a kevésbé lényegeseket, másrészt a nehéz részekre eleve több időt kell szánnunk, mint a könnyűekre.

Több módon is igyekszünk támogatni az Olvasót az eligazodásban.

Ez feleslegesnek tűnhet, mondván, hogy úgyis látni fogja magától is - ám a tapasztalat szerint az élet ennél bonyolultabb. Vannak ugyanis látszólag egyszerű, valójában nehezen elsajátítható, 'alattomos' témák is. Minden oktató rémtörténeteket tud regélni makacs témakörökről, melyekről csak évek alatt derült ki, hogy látszólagos egyszerűségük megtévesztő, kivétel nélkül mindig minden évfolyam minden diákja szenved velük.

Először azokat a dolgokat ismertetjük, melyekre a többi rész épül és/vagy a leggyakrabban kerülnek elő a gyakorlatban, majd csak ezután a ráépülő és/vagy ritkábban szükséges részeket.

Természetesen úgy, hogy könnyű legyen megtalálni az összetartozó dolgokat.



Szintaktika, szemantika, pragmatika

Ezzel próbáljuk elkerülni, hogy az Olvasó ne lássa a fától az erdőt. (Vagy az egyik erdőtől a másikat?) A programozás tanulása (mint sok más szakmáé, játéké) azért is nehéz, mert legalább háromféle síkon kell nézni a tananyagot:

  1. Egyrészt bonyolult formai (szintaktikai) szabályokat kell készség szinten elsajátítanunk ahhoz, hogy a programunk egyáltalán leforduljon. (Ne pedig velünk történjen ugyanez egy idő után a szék vonatkozásában.)


  2. Másrészt tudnunk kell, hogy a futó program minden egyes részlete mit fog csinálni, hogyan fog működni (szemantika).


  3. Harmadrészt meg kell tanulnunk, mi mire való és mire nem való. Pragmatikus (gyakorlati) szabályok, vagy talán inkább tapasztalatok és tanácsok sorát kell a mesterré válás rögös útján elsajátítani.


Tudatosan törekedni kell mindegyik terület fejlesztésére.



Gondoljunk csak bele, mi mindenben kell kiképeznünk magunkat ahhoz, hogy jól tudjunk használni valamilyen gépezetet:

Gyakran a formai szabályok és a működés elemi részleteinek megtanulása lefoglalja teljes energiánkat és nem figyelünk már arra, hogy mit hogyan célszerű csinálni és miért.


Van olyan vélemény, hogy a célszerű használat fortélyaival csak akkor érdemes foglalkozni, amikor az alapismeretek már a helyükre kerültek. Jelen sorok írójának más a véleménye: A pragmatikus szabályok között is vannak alapszintűek és magasabb szintűek. Az alapszintű alkalmazási szabályok korai bemutatása erősen motiválhatja a tanulót a 'szükséges rossz', a formai tudnivalók elsajátítására és tartós megjegyzésére; a mesterfogásokkal persze tényleg nem szabad összezavarni a zöldfülű kezdőt.

Fontos elkülöníteni a pragmatikus szabályokat a többitől azért is, mert ezek szükségszerűen többé-kevésbé szubjektívek. (Minél magasabb szintű szabályról van szó, annál inkább.) Érdemes itt külön kiemelni egy paradoxont:


A kategorikus kijelentések paradoxona

A pragmatikus szabályokkal kapcsolatban egyetlen dolgot lehet kategorikusan kijelenteni:

Azt, hogy kategorikus kijelentéseknek helye nincs.

Ezt kivéve.


Azt tudjuk ugyebár, hogy a szintaktikai és szemantikai szabályoknak nincs szükségük arra, hogy kategorikusan kijelentsék őket. Egyszerűen csak igazak és kész.

Nincs ez másképp manapság a többi szakma és tudomány területén sem, bár nem mindig volt így – ld. például Galilei esetét, amikor ő a Föld mozgásának tételét állította, míg szakmai vitapartnere, a katolikus egyház viszont magát a Földet próbálta (meg) állítani.

Nagyon határozottan és ellentmondást nem tűrően csak azt (és az ellenkezőjét) szokás kinyilatkoztatni, ami nem biztos, hogy igaz. Nagytekintélyű történészprofesszorok és mesterszakácsok mennek ölre a szerintük egyedül helyes módszer védelmében (bár meg kell jegyezni, hogy a szakácsok azért tipikusan toleránsabbak és árnyaltabb gondolkodásúak).

A lényeg: Pragmatikus szabályok terén célszerű mindig inkább beszélni, mintsem egyedül üdvözítő módszereket tétel-szerűen kihirdetni. Ebben a tananyagban ezt a módszert fogjuk követni, márcsak azért is, mert az ellenkező megoldást veszélyesnek tartjuk. Bármikor felbukkanhat egy Galilei nevű, tekintélyt szemtelen módon nem tisztelő programozó...

Az Olvasónak pedig azt tanácsoljuk, hogy ne keseredjen el, ha az ilyen jellegű anyagrészeket bonyolultnak találja első olvasásra. Tipikusan tényleg azok. Valószínűleg később érdemes lesz újraolvasni az illető részt, amikor az apró technikai részletekkel már tisztában vagyunk és jobban tudunk koncentrálni az összefüggésekre.



A feladatok szintje és a témák szintje: Két külön dolog!

Azért, hogy az Olvasó választani tudjon könnyű és nehéz példák között és hogy fogalma legyen arról, meddig jutott el.

Megkülönböztetjük tehát a feladatban visszakérdezett téma szintjét a feladat nehézségi szintjétől - és ezt a különbségtételt nagyon fontosnak érezzük.

Bevezető szintű ismeretekről is lehet nehéz kérdést feltenni (ld.: kör négyszögesítése) és összetett témával kapcsolatban is lehet egyszerű, 'szájbarágós' feladatot adni.

Gondoljunk csak általános iskolai élményeinkre: Lehet, hogy mindössze a százalékszámítást kellett egy példa megoldásánál alkalmazni, de maga a feladat egy nehéz szöveges példa volt! (Mindazoknak, akik azt állítják magukról, hogy a 'szöveges példa' karaktersorozat hatására nem futott végig a hátukon a hideg, ezt ajánljuk a figyelmébe.)

Ez persze nem mindig tehető meg, de azért igyekszünk segíteni abban a példa-megoldókat, hogy azt is tudják, miért lesz nehezebb (várhatólag) a feladat.

Most pedig tekintsük át röviden, hogy mi minden növeli a feladatok megoldásának nehézségét.



A feladatok fajtái, avagy mitől nehéz egy példa?

Nemcsak tanároknak, hanem a diákoknak is érdemes tudatosítani magukban, hogy mi minden tehet nehézzé egy példát, mert ez nagyban segítheti a tanulás célirányosságát és elkerülhetővé teszi a felesleges elkeseredést.

  • Minél bonyolultabb szabály ismerete szükséges a megoldáshoz, annál nehezebb a feladat.
Ez annyira természetes, hogy talán nem is igényel további részletezést.


  • Minél több szabály ismerete szükséges a megoldáshoz, annál nehezebb a feladat.
Lehet, hogy mindegyik szabály egyszerű önmagában, de ha többen vannak, az megnehezíti a dolgunkat. Kicsit hasonlít ez az autóvezetésre: külön-külön elég könnyű dolog figyelni a közlekedési táblákra, a gázpedálra, a forgalomra, stb. - együttesen mégsem megy elsőre és könnyedén. Sőt, néha még a legnagyobb profiknak is
gondot okoz.

Nevezhetjük ezt a szabályok keveredésének: Ahhoz, hogy megfejtsük egy program működését, felváltva hol az egyik szabályra kell visszaemlékeznünk, hol a másikra, hol egy harmadikra... Az egyik programsor megértéséhez például egy komplikált szintaktikai szabály ismeretére van szükség, a következőnél pedig egy működési (szemantikai) törvényszerűségnek kell eszünkbe jutnia.

A tapasztalat azt mutatja, hogy a szabály-keverés akkor is nagyságrenddel nehezebb példát eredményez, ha Fontos dolog ezzel tisztában lennünk! Ellenkező esetben elkeseredhetünk, mondván, hogy 'tegnap már tudtam ezt a szabályt, ma megint nem megy, soha nem fogom én ezt megérteni...' Vegyük észre ilyenkor, hogy semmi baja a memóriánknak, csak több kisebb-nagyobb szabály támadott meg minket egyszerre. Márpedig köztudomásúlag falkában ezek is sokkal veszélyesebbek, más ragadozókhoz hasonlóan.


További nagy nehézségi ugrást jelent a szabályok keveredéséhez képest a szabályok kombinációja, egymásra hatása, tehát amikor nem sorban, egyenként kell elővennünk a szabályokat, hanem egyszerre. Az autóvezetéshez visszatérve: a kuplung, a gázpedál és a sebességváltó használatának elsajátítása ilyen okból nehéz.

Sajnos léteznek eleve nehéz témakörök (ilyen például a polimorfizmus vagy a kivételkezelés, különösen a Java nyelvben), melyeknek a lényegéhez tartozik, hogy több, egymással összefüggő szabállyal lehet csak leírni őket.

Amikor a szabályok kombinálódnak, nemcsak, hogy falkában támadnak, de ráadásul ügyesen együttműködő falkában. Így persze még vérengzőbbek!


Kisgyermek és művelt, képzett felnőtt tanulását sok hasonló törvényszerűség jellemzi, akár hisszük, akár nem. Ha megmutatunk egy asztalon lévő piros almát egy kisgyereknek, akkor hamarosan fel fogja ismerni a piros almákat, melyek asztalon vannak. A más színűeket és más környezetben lévőeket csak hosszabb idő alatt tanulja meg felismerni.

Programozást tanulóknak, tanítóknak egyaránt nagy meglepetés átélni azt, hogy mennyire hasonlóan működik az agyunk felnőtt korban is. Sok év sok tapasztalata mutatja, hogy amint egy kicsit megváltozik a bemutatotthoz képest a környezet (akár csak más változóneveket használunk), máris előfordul, hogy újként csodálkozunk rá arra, amit teljesen ismertnek hittünk. Nem veszünk észre dolgokat, amelyek pedig ott vannak az orrunk előtt, vagy éppen önkényesen beleképzelünk a látottakba olyasmit, ami valójában nincs ott.

Fontos, hogy ettől se keseredjünk el. Természetes dolog - csak egy kicsit meglepő.

És fontos azt is tudnunk: az esetek jelentős részében azért is követünk el puszta figyelmetlenségnek tűnő hibákat, mert még felületes a tudásunk. Ne legyintsünk rá könnyedén, mondván: 'Tulajdonképpen tudom én ezt, csak elfigyelmetlenkedtem. Nem a koncentrálókészség a lényeg, hanem a tudás!'

Tényleg a tudás a lényeg - de a kezdőre nagyon jellemző, hogy rosszul ítéli meg a saját tudásszintjét, összekeveri a felületes ismeretet az alapossal, nem veszi komolyan az intő jeleket, pillanatnyi figyelmetlenségnek tulajdonít olyan hibákat, melyek oka máshol keresendő. Pillanatnyi képességeink téves felmérése, a feladat alábecsülése mindig nagy hiba!


  • Minél több helyes utasítás között van eldugva a megtalálandó hibás, annál nehezebb a feladat.
Ez eléggé magától értetődik: szénakazalban nyilván nehezebb megtalálni egy tűt, mint egy marék szénában.

Ennek ellenére ne higyjük, hogy az ilyen 'elrejtős' feladatok csak a koncentrációkészséget és az éles látást mérik. Nem. Nagyon jól mérik azt is, hogy mennyire biztos a tudásunk!


  • Minél kevésbé lehet 'lineárisan' haladni egy megfejtendő programban, annál nehezebb azt átlátni.
Kezdők számára nem csekély feladat annak megtalálása, hogy milyen sorrendben hajtódnak végre a program utasításai, amikor nem csak sorban, felülről lefelé kell olvasni a forráskódot. Függvényhívásoknál és főleg kivételek dobásánál valahol máshol kell tovább olvasni - és a hely megtalálása már önmagában nehéz egy kezdőnek. Nem is beszélve a
visszatalálásról, amikor például egy return utasítás után meg kell keresnünk, honnan is ugrottunk a függvénybe.

Két dolog teszi nehézzé az eligazodást: Itt is azt látjuk tehát, hogy 'sok kicsi sokra megy' (vagy az idegeinkre): Ha egynél több feltétele van a probléma megfejtésének, exponenciálisan növekszenek a nehézségek.


  • A 'visszakövetkeztetős', inverz feladatok mindig nehezebbek a 'direkt' feladatoknál.
'Direkt feladatnak' itt a hagyományos jellegű példákat nevezzük, melyeknek ez a sémája: Inverznek hívjuk azt, amikor így szól a kérdés: Vagy éppen így: Nem nagy csoda, hogy az ilyen kérdések nehezebbek; tudjuk, hogy könnyebb végignézni egy betörést és megmondani, mi lesz a hatása, mint pusztán a nyomokból felderíteni, mi történt.

Fontos: Az inverz típusú feladatok talán a leghatékonyabbak az összes létező fajta közül annak felderítésében, hogy valóban alaposan értjük-e az anyagot. Nagyon melegen ajánljuk az Olvasó figyelmébe az ilyen feladatokat!

Megjegyzés: Az inverz feladatokat e sorok írója elnevezte UFF® feladatoknak. A névnek az indiánokhoz nincs köze, helyes etimológiája
itt található.


Vannak olyan alapfogalmak, mint például a pointerek (C, C++, Pascal) vagy a kivételkezelés, melyekkel És ezzel a kör bezárult.

Legnehezebbek a nehéz alapfogalmak, természetesen, ezt mindenki tudja. Nyilván Robinsonnak is egy szombat lehetett pedagógiai értelemben a legkeservesebb napja. Viszont ezzel kapcsolatban érdemes emlékeztetni arra, hogy a programozás hatékony tanulásának elengedhetetlen kelléke a kísérletezés:
  1. Megpróbáljuk kitalálni, hogy mit fog csinálni egy program, aztán
  2. lefuttatjuk, majd
  3. (általában) megmagyarázzuk magunknak, hogy miért történt egészen más, mint amit vártunk és így
  4. rájövünk, hogy még a visszamenőleges jóslás sem olyan könnyű foglalkozás.
A nehéz alapfogalmaknál tudatosan törekedni kell arra, hogy eljussunk a kísérletezés szintjére!


  • Nehezek általában a hibajavítós típusú feladatok
Nehezek szoktak lenni az olyan fajta feladatok, melyekben egy hibás programot mutatunk be és meg kell találni a hibákat. A hiba lehet A szemantikai hibákat tipikusan nehezebb megtalálni, mert nem elég végigvizsgálni a program kinézetét, hanem fejben végig kell követni a működését.

Ezen a csoporton belül csak azok a példák viszonylag könnyűek, melyekben egyetlen és eléggé feltűnő szintaktikai hibát kell megtalálni.

Annál nehezebb az ilyen jellegű feladat, minél nagyobb a bizonytalanság.

A legkönnyebb fajta, amikor tudjuk hogy pontosan egy hiba van, esetleg még azt is, hogy milyen esetben működik rosszul a program. A legnehezebb, amikor több hiba van és ráadásul azt sem tudjuk, hogy hány darab.

Az inverz,
visszakövetkeztetős típusú feladatokhoz hasonlóan a hibakeresősek is rendkívül hasznosak, nagyon pontosan felfedik a tudás felületességét.

És most beszéljünk egy olyan feladat-típusról, mely alapvetően nehéznek tűnik, pedig inkább csak kíméletlen abban az értelemben, hogy pontosan felfedi a gondolati hibáinkat.


  • Minél többször rákérdeznek egy példasorban ugyanarra a fogalomra, annál biztosabban kiderül a tudás felületessége.
Ha egy mintaprogramban sokszor előfordul olyan részlet, amely ugyanazon ismeret birtokában fejthető meg, akkor nagy valószínűséggel kiderül, hogy valóban értjük-e a dolgot.

Ilyen értelemben talán nehezebbnek tűnnek a 'többször rákérdezős' feladatok, valójában nem nehezebbek, hanem precízebben mérik a tudást. Ha csak egyszer kérdezünk rá valamire, nagyon nagy szerepe van a szerencsének bizonytalan, éretlen tudás esetén abban, hogy helyes lesz-e a válasz. És a válaszoló sem jön általában tisztába azzal, hogy pontosan hol is tart.

Ha viszont sokszor, sok formában felbukkan az illető anyagra utaló részlet és mondjuk 50%-ban jó, 50%-ban rossz választ adunk a kérdésre, akkor azt kell mondanunk, hogy nagyon bizonytalan még a tudásunk! Nem, nem 50%-os a tudásunk ilyenkor! Hiszen csak olyan biztonsággal találtuk el a választ, mintha pénzfeldobással döntöttük volna el!!!

És ez is egy természetes dolog. Mármint, hogy egy ideig van is tudásunk, meg nincs is.

Gondoljunk megint a fentebb felhozott hasonlatra a kisgyerekkel és az
almával. Mi sem magától értetődőbb, mint hogy kezdetben a gyerek néha felismeri a különféle színű és különböző környezetben mutatott almákat, néha nem; ráadásul egy ideig ingadozik is a tudása. Ma nem ismeri fel, amit tegnap már sikerült azonosítania és fordítva; és általában hosszú idő telik el az első sikeres próbálkozástól, mire stabillá és alapossá válik az ismerete. Mindenesetre egy biztos: Ha minden második alkalommal találja el a gyermek, hogy amit lát, az egy alma-e, akkor erre nem fogjuk azt mondani, hogy rendben van, ez a kérdés nála el van intézve.

Miért kell ezt ennyire hangsúlyozni? Nos, amint már említettük, felnőtt korban sem működik másként a tanulás, csak akkor már gyakran nem szánjuk rá a kellő időt és fáradságot. Úgy képzeljük magunkról, hogy ha egyszer nagyjából megértettünk valamit, akkor az már Márpedig rendszerint nem így van.

Ne essünk tehát abba a hibába, hogy a 'többször rákérdezős' feladatok eredményét tévesen értékeljük, azt gondoljuk magunkról, hogy 'tudom én ezt, csak kapkodtam egy kicsit.' Rendszerint nem a kapkodás a domináns ok.

Ha tehát egy könnyű kérdésre az esetek felében adunk jó választ, akkor rendszerint nem az a helyzet, hogy találkoztunk egy nehéz feladattal és azt közepesen megoldottuk, hanem úgy áll a dolog, hogy az illető könnyű kérdésre csak nagyon bizonytalanul ismerjük a választ.

Az egyetlen hátránya a sokszor rákérdezős példafajtának, hogy viszonylag hosszú koncentrációt igényel. Nyilván jó dolog, ha a koncentrálókészségünk is fejlődik, de az ellenőrző feladatoknak alapvetően nem ez a céljuk, hanem az, hogy a tudást mérjék a lehető legpontosabban.

Ha már szóbakerült a mérés precizitása, tegyünk ebben az irányban is egy kis kitérőt!



A tudás mérésének pontossága, avagy
a könnyű feladatok kelepcéi

Amikor ismerkedni kezdünk egy témakörrel, először persze könnyű feladatokkal érdemes próbálkoznunk. Aki vezetni tanul, először inkább dodzsembe üljön, ne versenyautóba; hogy miért, az nyilván mindenkinek
világos.

Na jó, de vajon hol tartunk, amikor a legegyszerűbb, 'legszájbarágósabb' példákat már meg tudjuk oldani? Mennyire érezhetjük biztonságban magunkat egy fenyegetően közelgő vizsga előtt?

Sajnos azt kell mondanunk, hogy tipikusan nagyon bizonytalan az elért tudásszint megítélése a legkönnyebb feladatok megoldása után. Akkor is, ha hibátlanul megoldottuk őket. A kezdő vezető nemcsak Ugyanis a könnyű példa épp azért könnyű, mert nagyon hasonlít a szabály leírására, melyre rákérdez. Az alma piros is és asztalon is van... Még nem tudhatjuk, hogy zöld és kosárban lévő almát fel fogunk-e ismerni? Ez csak akkor derül ki, amikor megpróbáljuk.

A következtetés az, hogy meg kell oldani legalább közepes szintű feladatokat is ahhoz, hogy a tudásunk elégséges szintjében bízhassunk!

És persze vannak ennél magasabb szintek is - amelyeknek a határai egyre elmosódottabbak. Az Olvasó biztosan felismeri az almákat, de vajon a női arcokat és a szaxofonosokat mindig azonnal meg tudja különböztetni? Pedig elég egyszerűnek hangzik a feladat...

Jelen sorok írója azért szentelt külön kis alfejezetet ennek a gondolatnak, mert

nagyon sokszor

tapasztalta, hogy elsősorban nem a lustaság, hanem leggyakrabban egyfajta elbizakodottság, a saját tudás túlértékelése okozza a kudarcot a tanulóknak. És a tudás pontatlan felmérése néha abból a hibás feltételezésből származik, hogy 'kettes szintű feladatokat megoldottam, tehát legalább kettesre tudom az anyagot'. Sajnos nem így van. Lehet, hogy egészen kicsit más szögből mutatják ugyanazt az almát és nem fogjuk felismerni...



A feladatok nehézségi szintjei

Természetesen nagyon egyéni, hogy bármely adott példát valaki mennyire érez nehéznek, mégis megpróbáltuk a tapasztalataink alapján egy becsült nehézségi fokkal ellátni a feladatokat. A fentiekben eléggé részletesen foglalkoztunk azzal, hogy mi minden fokozza a feladatok
nehézségét és arról is szó volt, hogy a legkönnyebb szintnél megállni miért csalóka dolog, itt csak röviden fogunk utalni ezekre a gondolatokra.

1-es (legkönnyebb) szint:

Egyszerű szabály + 'visszakérdezős' típus. Egy az egyben kell alkalmazni az ismertetett formában a szabályt.

2-es szint:

Bonyolultabb szabály + 'visszakérdezős' típus,

vagy

egyszerű szabály + a leírásra már kevésbé hasonlító környezet.

3-as szint:

Több egyszerű szabály együttes ismerete szükséges, és/vagy hosszasabb koncentráció a program végigkövetéséhez,

vagy

egyszerűbb szemantikai hibakeresős típusú a feladat.

4-es szint:

Bonyolultabb szabályok kombinációja,

vagy

egyszerűbb visszakövetkeztetős típusú kérdés,

vagy

több hibát tartalmazó hibakeresős fajtájú feladat. Satöbbi....


Általános szoftver ismeretek