Zde je již třetí díl seriálu o programování. V minulém díle jsem se zabývali především tím, proč a kdy s výukou u dětí začít. Tentokrát se dotkneme konkrétních pedagogických zásad, které by měla dobrá učebnice a také vyučující respektovat.
Nevýhody klasického přístupu
Svůj první program jsem napsal v roce 1975. Učebnice, které mne tehdy uváděly do tajuplného světa programování, začínaly všechny skoro úplně stejně. Pominemeli úvodní kapitoly o historii daného programovacího jazyka, historii počítačů, základních principech překladu apod., začínali jejich autoři většinou výkladem jednotlivých datových typů a možných způsobů zápisu literálů, pokračovali výkladem vlastností proměnných, aby se po následném výkladu programových konstrukcí vítězně probojovali k výkladu procedur a funkcí, který pasáž o základních vlastnostech jazyka uzavíral. Vzhledem k použitému postupu výkladu měly tyto učebnice několik nevýhod:
- Student se musel dlouho prokousávat vstupními pasážemi, než se toho dozvěděl dostatek k tomu, by mohl vytvořit fungující program a mohl přímo na počítači ověřit získané poznatky.
- Ukázkové příklady řešily pouze triviální, nezajímavé problémy, které pro studenty nebyly nijakou výzvou.
- Neumožňoval vštěpovat studentům od samého začátku zásady strukturovaného a modulárního programování, protože základní kameny tohoto přístupu, procedury a funkce, byly probírány až na závěr úvodního bloku (ostatně tehdy se o strukturovaném a modulárním v programování v učebnicích mnoho nehovořilo).
První učebnice, která tento přístup alespoň částečně změnila (přesněji první z učebnic, s nimiž jsem se setkal), byla kniha Programovací jazyk C, kterou napsali Brian W. Kernighan a Dennis M. Ritchie. Ta začínala prográmkem Hello World, který se stal rychle „povinným“ úvodním programem učebnic libovolného programovacího jazyka.
Tato drobná změna sice umožnila, aby si student mohl hned od počátku všechny vysvětlované konstrukce vyzkoušet, ale další dvě uvedené výhody nijak neřešila. Nemám jí to za zlé, protože byla určena především těm, kdo již o programování něco věděli a chtěli se seznámit s programovacím jazykem C. Nicméně pro vstup do světa programování nepovažuji tento přístup za optimální.
V nedávné době jsem se setkal s několika převážně americkými učebnicemi, jejichž autoři zvolili trochu odlišný přístup. Začínali většinou klasickým Hello World, avšak nepokračovali systematickým výkladem jazyka, ale místo toho se snažili předkládat k řešení různé příklady a v průběhu jejich řešení vysvětlovat ty rysy jazyka, které bylo možno při řešení dané úlohy využít.
Na tomto způsobu výkladu je krásné, že autor vše vysvětluje na praktických příkladech. Když si však některou z těchto učebnic prohlédnete pozorněji, zjistíte, že tento přístup je v řadě směrů nakonec ještě méně vhodný než přístupy, o nichž jsem hovořil na počátku. Nejen že neřeší druhou a třetí nevýhodu, ale navíc je výklad často zmatený a student při něm nikdy neví, zda je již výklad daného rysu jazyka vyčerpán, anebo zda bude ještě v budoucnu doplněn. A to již vůbec nemluvím o tom, že se v takovéto knize velice špatně hledá výklad vlastnosti, jejíž některé rysy si potřebuji osvěžit.
Kromě toho mi nesedí postup, při němž před žáky předložím problém, který nemohou vyřešit, a pak tahám z klobouku rysy jazyka, s jejichž pomocí problém řeším, ale které žáci doposud neznají. Spíš zastávám opačný přístup: nejprve vysvětlím nový rys a pak si ukážeme, kde jej můžeme s výhodou využít.
Zásady, které bychom měli při výuce programování dodržovat
Dosti ale již o tom, jak si myslím, že výuka programování probíhat nemá. Podívejme se nyní na to, jak by bylo možné vyučovat programování tak, abychom se s žádnou z uvedených nevýhod nesetkali.
Než vám předložím k posouzení postup, který používám ve svých kurzech, nastíním hlavní zásady, z nichž jsem při jeho sestavování vycházel. Jsem přesvědčen o tom, že i vám budou tyto zásady připadat naprosto zřejmé; nejspíše dokonce natolik zřejmé, že budete považovat za zbytečné se o nich vůbec zmiňovat. Nicméně podíváteli se do učebnic programování, zjistíte, že je jejich autoři většinou příliš nedodržují. Určitě s nimi souhlasí, ale neumějí uspořádat výklad tak, aby v něm byly tyto zásady opravdu dodrženy.
Proberme si pro proto nejprve tyto zdánlivě samozřejmé zásady a naznačme si, proč je autoři učebnic většinou nedodržují.
- Co nejdříve umožnit tvorbu programů
Aby se žák mohl něco doopravdy naučit, nestačí mu, když se dozví základní pravdy, ale musí si vše sám „osahat“. Dokud vykládanou konstrukci několikrát sám nepoužije, za chvíli vše zapomene (přesnější by bylo říci: zapomene ji daleko rychleji).
Tuto zásadu se naštěstí většina současných učebnic snaží dodržovat. Jejich úvodní programy se však většinou ani nepokoušejí vyhovět zásadám, o nichž budu hovořit vzápětí. - Nepředbíhat, tj. nepoužívat prvky jazyka, které ještě nebyly vyloženy
S touto zásadou budou asi všichni po prvním přečtení souhlasit. Jakmile ji však budeme chtít aplikovat do důsledků, řada vyučujících se začne bránit. Typickým příkladem takovéhoto předbíhání je většina učebnic začínajících tvorbou onoho výše zmíněného „povinného“ programu Hello World. V tomto programu se totiž používá operace výstupu, která dosud nebyla vysvětlena. Studenti proto neznají její možnosti, a nemusí být proto vždy schopni detekovat a odstranit případnou chybu.
Mnozí to řeší tak, že na počátek knihy vloží kapitolu, v níž stručně popíší nejzákladnější rysy použitého jazyka a vývojového prostředí. Je to jeden ze způsobů, jak se z výše popsaného problému vylhat. Vede ale bohužel k tomu, že žáci pak používají řadu prvků, jejichž skutečný význam se dozví až mnohem později. Přiznám se, že já jsem zastánce uspořádaného výkladu, při němž je každá vlastnost jazyka vysvětlena až ve chvíli, kdy je ji možné vyložit v dostatečné šíři a hloubce. - Informace je třeba předávat po malých soustech
Všichni se jistě shodneme i na tom, že čím méně nových poznatků svým žákům předložíme, tím větší je naděje na to, že si je studenti zapamatují a naučí používat. Dohadovat se možná začneme ve chvíli, kdy se začne rozhodovat o tom, co budeme rozumět oním soustem zmíněným v nadpisu. Zde bych použil svůj oblíbený příměr: přirovnáme-li výklad ke schodišti, pak jedním soustem nebude jeden schod, ale skupina schodů mezi jednotlivými odpočívadly. Jinými slovy – soustem bude látka probraná mezi dvěma zastávkami, sloužícími k důkladnému procvičení.
Jak jsem již řekl, se zásadou prakticky všichni souhlasí. Málokdo si však uvědomí, že její důsledné dodržení nedovoluje začít výklad představením dat a práce s nimi. Abychom totiž mohli procvičovat práci s daty, musíme nejprve vysvětlit konstrukci programu a navíc potřebujeme používat i procedury a funkce sloužící pro výstup dat.
Dalším problémem je to, že pokud nejsou vyloženy základní programové konstrukce, těžko se nám podaří vymyslet nějaké příklady, které by studentům připadaly zajímavé. Drilové úlohy, kterými bývá počáteční výklad základních datových typů většinou provázen, proto žáci řeší většinou mechanicky bez dostatečné motivace si vše zapamatovat. - Doprovodné příklady musí vyžadovat aktivní použití nových poznatků
V učebnicích se setkáváme se třemi druhy příkladů:- s drilovými příklady procvičujícími syntaxi;
- s příklady z rodu „Hele, ono to funguje!“, jejichž jediným cílem je demonstrovat vyložený rys jazyka;
- s příklady, které se snaží ukázat použití konstrukce v programu, který řeší nějaký praktický problém. Z jejich zadání způsob použití vysvětlovaného rysu neodkapává. Studenti musí při jejich řešení teprve zjistit, že k úspěšnému vyřešení je nutné aplikovat vysvětlovaný rys.
Pokud bych měl uvést příklady, tak bychom do první skupiny zařadili např. příklady vyžadující označit správně a špatně zapsané literály, správně a špatně zapsané příkazy apod.
Do druhé skupiny by pak patřil známý program „Hello World“ nebo příklady typu: „Napište program, který zjistí, zda zadané číslo je menší než číslo 5!“ (Divili byste se, kolik učebnic s podobnými příklady vystačí – jejich krystalickým příkladem jsou např. bestsellerové učebnice Thinking in C++ a Thinking in Java).
Z příkladů, které bychom mohli zařadit do třetí skupiny, se v učebnicích většinou objevují „příklady ze života“ typu „Naprogramujte řešení kvadratické rovnice!“ nebo „Naprogramujte výpočet určitého integrálu Simpsonovou metodou!“ Bohužel, příklady tohoto druhu velice často nevyhovují následujícím dvěma zásadám. - Příklady musí být zajímavé
Přiznejme si, že většinu studentů programování nezajímá jak se řeší kvadratická rovnice či jak se vypočítává integrál Simpsonovou metodou. Moje zkušenost ukazuje, že nejlepšími příklady jsou takové příklady, kdy student jasně ví, jak by problém řešil on, a potřebuje jej formalizovat tak, aby jeho řešení zvládl i počítač. Z dob mých studií sem např. patřily úlohy, při nichž jsme měli řešit nějaké jednoduché šachové problémy. Jsem rád, že sem patřil i můj první programátorský úkol, který mi byl zadán po dvou týdnech výuky a v němž dostal za úkol napsat převodník z římských čísel na arabské. (Na FJFI se s námi nepárali.) - Řešení nesmí být příliš zašuměná
Jinými slovy: část programu, řešící zadanou úlohu a tím i procvičující probíraný rys jazyka, se nesmí utápět mezi záplavou příkazů vstupu a výstupu a různými pomocnými operacemi. - Od samotného začátku je třeba vštěpovat zásady moderního programování
Aby se zásady moderního programování vryly studentům hluboko pod kůži, je třeba je používat od samého počátku výuky. Většina autorů sice studentům vysvětluje, že složitější problémy je třeba řešit tak, že se nejprve dekomponují na několik problémů jednodušších. Bohužel jim to však říká až v samém závěru svých učebnic, kdy již není žádný prostor pro důkladné procvičení. Když studenti po celou dobu kurzu řešili problémy vytvořením hlavního programu a výjimečně ještě jedné procedury či funkce, budou obdobným způsobem začínat řešit programy i po ukončení kurzu.
Chceme-li své žáky opravdu naučit řešit i složité problémy, je třeba základy tohoto přístupu vysvětlit již na samém počátku výuky, aby jej pak mohli na příkladech procvičovat v průběhu celého kurzu. Na konci kurzu pak bude tento způsob řešení problémů studentům vlastní.- Studenti se musí naučit programy nejen vytvářet, ale také ladit
Značná část učebnic programování vůbec nepředpokládá, že by v programech mohla být chyba a nijak své čtenáře na tuto skutečnost nepřipravuje. Jen velmi málo učebnic se snaží naučit budoucí programátory programy nejen vytvořit, ale také v nich najít a odstranit případné chyby. - Studenti se musí naučit programy nejen vytvářet, ale také ladit
- Předkládat řešení netriviálních problémů
Největší slabinou školních dětí není to, že by si nedokázaly osvojit abstraktní programovací konstrukce, ale to, že nedokáží řešit složitější úlohy. Jak jsem se již mnohokrát přesvědčil, řada učitelů podlehne pokušení naučit své žáky co nejvíce nejrůznějších konstrukcí, obratů a triků, a zapomíná přitom na to nejdůležitější: praktické programy jsou většinou mnohem složitější než ty, které s dětmi řešíme. Navíc se domnívám, že právě schopnost řešení složitých úloh je tou nejcennější dovedností, kterou se děti mohou při výuce programování naučit.
Měli bychom prakticky od začátku výuky soustředit na to, abychom děti učili řešit složitější problémy a dekomponovat je na problémy jednodušší. Největší problém nám přitom většinou dělá vlastní neschopnost vymyslet dostatečný počet dostatečně zajímavých příkladů, které bychom mohli s dětmi řešit i při jejich malých počátečních znalostech. A zde opět vstupuje do hry důležitost zvoleného programovacího nástroje a prostředí. Vhodný nástroj nám totiž práci s vymýšlením úloh výrazně zjednoduší..
Rudolf Pecinovský
0 komentářů:
Okomentovat