Možnosti výuky programování v době distančního vzdělávání

V daném příspěvku uvádím možnosti výuky programování v době distančního vzdělávání. Uvedu zde i nějaké náměty od českých autorů, kteří se zabývají výukou/metodikou výuky programování.  V programování a dostupné literatuře se uživatel může setkat s různými vymezeními a základními pojmy, které mohou být nazvány jiným způsobem, ale jedná se pouze o jiné označení stejných pojmů. Proto může čtenář v tomto příspěvku znát uvedený pojem pod jiným názvem. Příspěvek si neklade za cíl doporučovat pro výuku programování konkrétní paradigma nebo vývojové prostředí s programovacím jazykem. Tato problematika je velice složitá a není na ní jednoznačný pohled. Budu se snažit o různé náměty a doporučení nebo zamyšlení, se kterými jsem se setkal, mohou podle mě být zajímavá a přínosná, ale bez vymezení některých základních pojmů to úplně také nejde, proto se je budu snažit stručně vymezit. Předpoklad tohoto textu je programování ve vyšším a textovém programovacím jazyku (nemyslím programování v konzolové aplikaci, pro žáky musí být příklady interaktivní i graficky zajímavé, proto se mi programování v textovém režimu nelíbí, i když odpadá nutnost se učit základní ovládání IDE) určený především pro žáky ze středních škol.  

1.1    Vymezení základních pojmů

Při výuce programování, resp. v různých příspěvcích z této oblasti, se používají různé pojmy. Čtenáři se s největší pravděpodobností již někdy setkali s pojmy jako (seřazeny abecedně): koncepce vzdělávání, metodika vyučování, paradigma programování, přístup k výuce programování, strategie vyučování, styl programování nebo vyučovací metoda aj. Některé z těchto pojmů představují především interakci mezi žákem a vyučujícím, tj. i možné způsoby práce žáka, aby pro něj daná problematika byla zajímavá. Toto není úplně předmětem příspěvku, i když v distančním vzdělávání se i toto dá určitě aplikovat. Pokud by čtenář měl zájem o náměty i příklady výukových metod, tak ho odkáži na projekt Mgr. Roberta Čapka Ph.D. Líný učitel nebo na literaturu [1]. Dle mého názoru právě v IT a jeho odborných předmětech může být problém s aplikací nebo používáním různorodých výukových metod. Pokud se ale čtenář setká s příklady a aplikací výukových metod např. v předmětu matematika, tak právě matematika má velice blízko k programování, takže tyto výukové metody se v určité podobě jistě dají aplikovat z matematiky i na výuku programování. Protože matematika se jistě nevyučuje tak, že by si žáci jen četli příklady, ale musí si je sami vyzkoušet a spočítat, aby se naučili správné návyky a dovednosti. Toto se dá samozřejmě aplikovat i u výuky programování. V tomto příspěvku se především zaměřím na ukázku možného přístupu k programování a typy příkladů, které se mohou žákům ve formě distanční výuky zadávat. Zaměřím se i na možný typ výuky a výukové materiály. I v konkrétním paradigmatu programování může být posloupnost probíraných tematických okruhů rozdílná, proto slovní spojení „různé pořadí probíraných témat“ označím jako „koncepci výuky programování“. Aby si čtenář udělal nějaký obrázek, tak se může v různých příspěvcích setkat např. s těmito koncepcemi výuky programování: Design Patterns First nebo Architecture First od předního českého experta na výuku programování Ing. Rudolfa Pecinovského, CSc., případně objects-first (zde si nejsem úplně jistý, jestli tento název vytvořil již zmíněný přední český expert nebo např. Michael KÖLLING nebo někdo jiný). Nebo společnosti ACM a IEEE-CS v roce 2001 definovaly celkem 6 koncepcí, např. imperative-first nebo již uvedenou koncepci objects-first a jiné. Jak je patrné, daná problematika opravdu není úplně jednoduchá ani jednoznačná, i když se postupně vyvíjí a co platilo dříve, nemusí platit dnes.

1.2    Struktura výukových materiálů

Na internetu se dají nalézt různá skripta a učební materiály, které jsou určeny pro žáky. Obvykle jsou učební materiály/skripta členěna tak, že

  • V úvodu kapitol je uvedeno, co by žáci po prostudování dané látky měli umět, tj. jsou uvedeny cíle dané kapitoly.
  • Dále mohou být vyjmenovány dovednosti a znalosti, které by po prostudování dané kapitoly měli žáci získat.
  • V řadě výukových materiálů jsou také uvedena klíčová slova.
  • Poté již jsou vysvětlovány základní teoretické pojmy s příklady, které ale nemusí být vysvětleny nebo jsou uvedeny případně s příklady na procvičení s řešením, případně bez řešení.
  • Na závěr kapitoly bývá uvedeno shrnutí dané kapitoly, otázky na procvičení a případně literatura, ze které autoři čerpali.

Takto vytvořené materiály jsou dle mého názoru vhodné pro distanční výuku programování, ale samozřejmě záleží, pro jakou skupinu žáků jsou určené. Ať se již budeme ale bavit o základní nebo spíše střední škole, tak je určitě potřeba dostatečné množství zajímavých příkladů, které žáky zaujmou.

1.3    Co je pro žáky důležité, aby se naučili programovat?

Zásad je samozřejmě hodně a dají se členit podle různých kritérií. Já uvedu základní zásady především pro tvorbu programů.

Obecně je určitě důležité, aby se žáci od začátku programování snažili vytvářet programy podle určitých pravidel, aby měli dobré návyky a ty se nemuseli v průběhu času přeučovat. Dle mého názoru je důležité, aby při vytváření programů žáci:

  • Definovali identifikátory (proměnné, třídy, metody…) nejlépe v anglickém jazyce, i když samozřejmě výjimky být mohou
  • Názvy identifikátorů volili podle funkce, ne náhodně nebo nepřehledně
  • Dodržovali jmenné konvence (velikosti písmen proměnných, metod, struktur, tříd atd.)
  • Správně odsazovali a členili kód

Pokud již od začátku budou žáci nuceni dbát výše uvedených pravidel, tak se potom ve svých kódech i kódech jiných osob vyznají daleko lépe.

1.4    Jak je to s teorií?

Teorie je samozřejmě důležitá, protože žáci by měli být schopni správně popsat daný problém. Záleží ovšem, jestli je předpoklad, že se žáci budou programováním živit, tj. studují na odborné střední škole nebo jestli mají předmět programování pouze jako okrajový. A jak je to s používáním odborných názvů?  Nikdo nikdy neví, co ho bude ve skutečnosti živit, protože toto bývá mnohdy velice nevyzpytatelné, proto se domnívám, že odborné názvy v souvislosti s programováním by se měly používat na všech typech škol.

Teorie by měla být vysvětlována zároveň na konkrétním praktickém příkladu a při hodinách by se žáci měli zaměřit především na praktickou aplikaci a základní pojmy by se jim „do krve“ měly dostávat postupně. Pokud žáci pochopí prakticky danou problematiku, tak potom je pro ně daleko snazší daný pojem definovat a vysvětlit. Pokud bychom zvolili opačnou možnost, tak se budou programování učit jako básničku nazpaměť a tím se programovat samozřejmě nenaučí.

Za mojí osobu teorie ano, ale v rozumné míře a s aplikací.

1.5    Jaké by měly být typy příkladů?

Aplikace by pro žáky měly být především zajímavé s nějakým vstupem a s výstupem, tj. měla by být v aplikacích interaktivita. Pokud budou žáci něco zadávat nebo ovládat, tak to pro ně určitě bude daleko zajímavější. Aplikace/příklady se dají naprogramovat/zadávat různými způsoby. Žáci se obvykle mohou setkat s následujícími možnostmi tvorby aplikací/učení základům programování.

  1. Naprogramování celé aplikace od začátku.
  2. Doprogramování aplikace.
  3. Odladění celé aplikace, tj. nalezením a opravou chyb (syntaktických/logických).
  4. Zjištění hodnot proměnných po určitém algoritmu/kódu
  5. Test na doplnění základních pojmů

Např. body 2 a 4 jsou velice pěkně demonstrovány v učebnici [2], která se zabývá algoritmy, ale uvedené možnosti zadání algoritmu lze využít i v programování. Ne z každého bude programátor, proto je určitě dobré, žákům podle jejich schopností a možností zadávat různé příklady z výše uvedených možných zadání.

1.6    Zajímavé výukové materiály/učebnice/skripta

Zde uvedu zajímavé náměty na literaturu, která se dá jistě využít v distančním vzdělávání. Případně z ní zájemci mohou čerpat inspirace pro svojí přípravu na hodiny. U jednotlivých autorů se mi i líbí koncepce výuky programování, která má logickou posloupnost a jednotlivé tematické celky na sebe navazují.

1.6.1    Základy programování v jazyce Python pro střední školy

Na stránce https://www.imysleni.cz/ucebnice/zaklady-programovani-v-jazyce-python-pro-stredni-skoly jsou pro zájemce k dispozici vzdělávací materiály od týmu autorů. Jak je zde uvedeno, tak v těchto materiálech „žáci samostatně objevují základy programování v textovém zápise programů řešením připravené gradované posloupnosti zadání“.  Je zde celkem velké množství zajímavých příkladů i metodologie pro učitele, což je velice přínosné. Metodologicky jsou tato skripta opravdu perfektně zpracována, jsou zde úpravy příkladů, podněty na diskuzi, žák si příkazy sám zkouší a objevuje nové věci z programování. Nechybí ani upozornění na chyby, testování programu, úprava programu. Příklady jsou hodně zaměřené na přemýšlení. Materiály jsou velice vhodné především pro začátečníky. Příklady se dají aplikovat i na jiný programovací jazyk nebo i paradigma programování. Protože například třeba pokročilejším zájemcům nemusí úplně vyhovovat. Posloupnost jednotlivých tematických celků je pro určitý druh programování logická a zcela jasná.

1.6.2    Moderní programování

Na stránkách Mgr. Radka Vystavěla, Ph.D. http://www.moderniprogramovani.cz/ mohou zájemci nalézt sadu knih s ukázkou programů i sbírkou příkladů k daným ukázkám. Jedná se o skutečně velice rozpracované a skvělé náměty se spoustou příkladů. Tematicky jsou knihy opravdu velice kvalitně a pochopitelně zpracovány. Příklady jsou tematicky rozděleny do zajímavých základních úloh, aplikovaných úloh nebo technických úloh. Jsou zde i otázky na zamyšlení. Pokud by si zájemce chtěl pořídit danou literaturu, tak dle mého názoru neprohloupí a minimálně dostane spoustu příkladů, které mu mohou sloužit jako podnět. Co bych těmto skvělým učebnicím vytknul je psaní kódu do událostí, což potom může při přechodu na objektově orientované programování činit řadě žáků problémy. Někoho nemusí zaujmout ani psaní příkladů v češtině. Ale tyto drobné nedostatky jsou ale jinak skvělým zpracováním výukových materiálů/knih plně dostatečně vynahrazeny.

1.6.3    Výuka programování podle Ing. Rudolfa Pecinovského, CSc.

Na stránkách Ing. Rudolfa Pecinovského, CSc. http://rudolf.pecinovsky.cz/, předního českého autora na metodiku a výuku programování, můžete nalézt seznam celé řady zajímavých knih, které se zabývají problematikou výuky objektově orientovaného programování i spoustu příspěvků autora z různých konferencí, které jistě stojí za přečtení. Dle mého názoru má tento autor velice pěkně propracovanou metodiku výuky objektově orientovaného programování. Toto programování má řadu výhod a ze své praxe vím, že žáci mají problémy, hlavně s pochopením základních konstrukcí, což má tento autor výborně vysvětlováno. Autor postupně vyvinul již uvedené přístupy ve výuce objektově orientovaného programování (dále uváděno jako OOP) Design Patterns First nebo Architecture First, základem ve výuce programování objektově orientovaného programování byla koncepce výuky programování objects-first, která je vysvětlována i s velice zajímavými příklady na doplnění kódu do již předprogramované aplikace v literatuře [3]. Všichni autoři zde uvedení vycházejí z příkladů, které se neprogramují úplně od začátku, ale část je již naprogramovaná, což je velice důležitý návyk pro absolventy škol do praxe.

1.7    Moje doporučení k distanční výuce programování

V této části příspěvku bych uvedl, co se mi celkem osvědčilo a jak přistupuji k distanční výuce programování sám. Především se snažím, aby na různou problematiku měli žáci dostatek praktických úloh na programování s tím, že podle svých dovedností a schopností mohou naprogramovat libovolný počet úloh, ale nějakou minimální hranici pro úspěch je potřeba mít nastavenou. Z každého žáka programátor zcela jistě nebude a ne všichni pro to mají předpoklady. Populární jsou samozřejmě výuková videa, ale já osobně mám raději psané texty, kde se mi lépe a rychleji hledá a pokud potřebuji, tak nemusím video intuitivně posouvat v dané problematice.

1.7.1    Výuková prezentace

Osvědčilo se mi, podobně jak to má Mgr. Radek Vystavěl, Ph.D., vytvořit pro žáky výukovou prezentaci, kde jsou ukázány základní konstrukce dané problematiky. Je také důležité, aby byl příklad vysvětlován postupně krok po kroku, jak by se standardně naprogramoval. Nestačí dát pouze výpis kódu, ale je nutné vše postupně vysvětlovat. Z tohoto postupu žák může získat správné návyky při tvorbě programů, ujasnit si jednotlivou návaznost kroků a nad uvedeným postupem i přemýšlet, případně navrhovat svůj vlastní. Pokud si žák podle návodu jednotlivé postupy sám zkusí napsat/naprogramovat, tak to je úvodní předpoklad k tomu, aby se postupně zdokonaloval při tvorbě dalších programů. Dalším krokem je, aby si danou problematiku procvičil na řadě příkladů. Příklady by měly být zajímavé, měly by mít nějakou logickou posloupnost a neměly by být pro žáky tolik náročné, i když určitá diference náročnosti je potřeba, aby příklady pro nadanější žáky nebyly zase úplně triviální. Ale to souvisí především s dostatkem příkladů.

1.7.2    Příklady k procvičování

Co mám zkušenosti např. ze soutěže v programování, tak může být pro některé žáky obtížné pochopit ze zadání, co se po nich chce, tj. nedokáží přesně zadání interpretovat. I z tohoto důvodu je potřebné, aby žáci měli zadání v textové podobě a naučili se ze zadání i odvodit, jaké konstrukce na jeho vyřešení budou potřebovat. Někdy ale také může být kratší zadání přínosné v tom, že žáci musí více promýšlet, jak zadaný problém vyřešit. Níže uvádím příklad na využití časovače ve výuce.

Př.:  Naprogramujte aplikaci, po jejíž spuštění se zobrazí semafor a nastaví se na něm postupně všechny barvy ve správném pořadí.

Ke každému zadání je dle mého názoru potřebné, aby žáci věděli, co je cílem dané úlohy, tj. co by se měli naučit a procvičit. I to jim může dát určitý návod k vyřešení dané úlohy. K danému zadání a koncepci výuky, kterou preferuji, uvedu možné příklady cílů úlohy. V cílech uvádím základní konstrukce OOP (jeví se celkem jako obecné), protože žáci mají problémy s jejich aplikací a kód píší např. do událostí ovládacích prvků, protože se např. přiučují z různých stránek na internetu.

Cíl úlohy:

  • Vytvoření více tříd.
  • Zadefinování atributů z analýzy zadání.
  • Inicializace atributů.
  • Parametry konstruktoru.
  • Parametry metody.
  • Vytvoření instance třídy a volání metody se správnými parametry.
  • Vykreslení 2D grafiky a přidání na výstup.
  • Nastavení příslušných barev.
  • Nastavit správnou sekvenci změny barev.
  • Nastavení události časovače a další vlastnosti.

Protože se v hodinách programování (nyní beru příklad spíše pro začínající programátory, kteří již nějaké znalosti a zkušenosti mají) věnuji koncepci výuky programování objects-first, tak i velice jednoduché příklady se snažíme naprogramovat podle zásad OOP, především kvůli tomu, aby se žáci s tímto typem programování dostatečně sžili. Proto k tomuto zadání provádím jednoduchou analýzu, eliminaci podmětů a předmětů pro kandidáty tříd a sloves pro kandidáty metod. Je to jedna z možností návrhu OO (objektově orientovaného) programu. Snažím se i o jednoduché UML diagramy. Z odborného hlediska jsem si ještě návrh OOP trochu upravil/zjednodušil, pro návrh atributů apod.

Př. analýzy v textu:

Naprogramujte aplikaci, po jejíž spuštění se zobrazí semafor a nastaví se na něm postupně všechny barvy ve správném pořadí.

Jednoduchá analýza návrhu (píši hodně zjednodušeně a někteří by mohli namítnout, že analýza by se dala udělat terminologicky odborněji – ano, ale protože se jedná o začínající programátory, tak se snažím opravdu o zjednodušení s tím, že postupně návrhy programů budou náročnější a tomu bude odpovídat i analýza): Kandidát třídy bude podstatné jméno semafor, který se skládá z více částí: jednotlivé kruhy (ukazatele) s příslušnou reprezentací barev a nějaký podklad semaforu, např. obdélník. Mám tedy 2 třídy, např. Elipse a Rect (Rectangle). Ostatní kandidáti na třídy jsou pro splnění zadání irelevantní. Jednotlivé části semaforu ve třídách budou kandidáti soukromých atributů a je potřeba je vykreslit. Podklad semaforu se pouze vykreslí, není potřeba definovat metodu. U třídy Elipse se postupně budou nastavovat barvy (barvy se budou měnit), tak metodou bude např. ChangeColor, kde pomocí parametru nastavím atributu příslušnou barvu.  

Ze zadání je zřejmé, že je potřeba vykreslit dané obrazce ve 2D grafice. To již žáci znají z předcházejících příkladů.

Na základě analýzy je možný návrh jednoduchého class diagramu.

 Na základě těchto informací by žáci mohli být schopni navrhnout třídy, instance a zavolat správné metody v konkrétní události. Jak se pracuje s časovačem, jak se přidá 2D grafika např. na plátno nebo do mřížky již umějí.

Je mi jasné, že příprava takových typů úloh může být pro vyučující velice časově náročná, i např. při složitějších úlohách. Samozřejmě, programovat se dá i pomocí různých Frameworků a voláním příslušných konstrukcí, kterou danou úlohu vyřeší. Toto s žáky také řešíme, ale až ve vyšším ročníku.

Na základě zpracování úlohy žáky jim dám výpis kódu s komentáři, kde to je potřeba, tj. nedám jim celý kód, protože chci, aby si danou úlohu zkusili sami přepsat a potom je možnost pomocí zvoleného informačního kanálu s nimi o možnostech řešení diskutovat. Ti, co mají zájem a je jim třeba nějaká konstrukce nejasná, tak se obvykle ptají a je předpoklad, že by se z nich mohli stát programátoři. Ostatní, kteří třeba o programování nejeví takový zájem, se alespoň něco dozvědí a využijí třeba později, když budou postupně dospívat a začnou je bavit třeba odbornější předměty. Co se mi ještě osvědčilo, žákům dám např. 6 – 10 příkladů na procvičení, kde nemají uvedenu obtížnost a některý obtížnější příklad může být i na začátku. To je dobré k tomu, že žáci si nejprve všechny úlohy projdou, zkusí se nad nimi zamyslet, co by mohlo být jednodušeji naprogramovatelné a sami si udělají diferencializaci obtížnosti, protože vyučující může mít jiný náhled.

Závěr

V příspěvku jsem se snažil zájemcům poskytnout můj pohled na výuku programování, která se dá aplikovat ve formě distančního vzdělávání, ale je dobře aplikovatelná i při klasických hodinách. Je ale potřeba dobrá příprava žáků na hodinu, tj. naprogramování daných úloh a následná ukázka možného řešení, kdy na hodinách by se mělo o daných možnostech příkladů diskutovat a žáci by měli získávat podněty a náměty. Je to samozřejmě náročnější i pro učitele, který musí správně rozvrhnout učivo, připravit pro žáky více úloh a postupně jim dávat řešení. Výhodou tohoto přístupu je určitě to, že každý žák pracuje individuálně svým tempem, vyučující má více času na jednotlivé žáky, tj. nevyučuje typicky frontálně a je žádoucí i diskuze při řešení úloh, kdy žáci mohou třeba daný problém pochopit lépe od spolužáka a diskuzí i otázkami si posilují příslušné kompetence. Doufám, že i náměty na příklady mohou být pro zájemce přínosné a třeba je při svých hodinách využijí.  

2      Literatura

[1] ČAPEK, Robert. Moderní didaktika: lexikon výukových a hodnoticích metod. Praha: Grada, 2015. Pedagogika (Grada). ISBN 978-80-247-3450-7.

[2] MILKOVÁ, Eva. Algoritmy: základní konstrukce v příkladech a jejich vizualizace. Hradec Králové: Gaudeamus, 2010. ISBN 978-80-7435-064-1.

[3] PAVLÍČKOVÁ, Jarmila a Luboš PAVLÍČEK. Úvod do Javy. Praha: Oeconomica, 2005. ISBN 80-245-0963-6.


Autor: Mgr. Ondřej Kořínek, Ph.D., vyučující odborných předmětů na Vyšší odborné škole a Střední průmyslové škole, Jičín a předseda krajského kabinetu Informatika a ICT v Královéhradeckém kraji

Zpět