Programování pro pokročilé děti a pro ty, co skutečně začínají

Mírně osobní a spíše brainstormovací článek. Řeším teď pro syna Vojtu (10 let) programování. Chodí (chodil, bo COVID) ve škole na Javorkovic kroužek programování, skvělé. Jenže všechno je to takové hraní. Scratch je skvělý pro menší děti, ale skutečnému programování se tam jen přiblížíte. Také s Microbitem je zábava, Vojta tady týden přeprogramovával hry Scratch hry, aby je mohl ovládat svým vlastním ovladačem postaveným na desce Microbitu. Skvělý seznam materiálů pro první stupeň vytváří Miroslav Suchý, doporučuji tam započít studium tématu. Ale taky se to časem omrzí. A tady přichází problém: je velká mezera mezi „hracím“ programováním a tím „skutečným“?

Abych to objasnil. Nejsem programátor. Moje programování skončilo u Fortranu, Pascalu a Assembleru. Znám Python, PHP, ale nikdy jsem v nich rutinně nic nedělal, používal jsem je, když vznikaly, asi před sto lety. Pokud si prohlížím cizí kód, chápu čistotu kódu, strukturu i samotný kód, ale už mám problémy řešit framework či knihovny, protože je konkrétně neznám. A to začíná být dnes problém: velká část viditelného programování je správné volání správných kódů, které vytvořil někdo jiný. Pokud je neznáte, jste namydlení. Pokud nevíte, že Flask nebo Django, tak si s pythonem moc webů nenakreslíte. Abych byl přesný: jasně, že to jde, ale vynaložíte neúměrně síly, což vás rychle omrzí.

Velké jazyky jsou pro mládež neintuitivní

Teprve, když se podíváte na vývoj aplikací očima dětí, pochopíte, jak neintuitivní to je. Nejde o to, že se musíte naučit příkazy, ty jsou vcelku pochopitelné. A vlastně všude stejné, FOR je FOR od Fortranu a Cobolu přes C++ až po Haskel. Kecám, v Haskelu je to jinak, ale co naděláte, není to procedurální jazyk…

Tak například de-facto standardní GUI v Pythonu je TKINTER. Potřebujete to vědět (z čeho byste to jméno odvodili, jako u FOR cyklu z angličtiny?) a zavolat jej. Podívejte se někdy na začátek programu, ve kterém používáte tkinter, django nebo turbogear. Začátek zápisu je hodně nesrozumitelný, což vám s lety praxe samozřejmě nepřijde a uvědomíte si to až se zvídavou otázkou dítěte.

Ve výsledku se mi zdá, že chybí nějaký mezistupeň mezi Scratchem a vyššími programovacími jazyky. Takový, který by umožnil dosahovat rychle přiměřených výsledků a byl intuitivní. A dost možná nebyl založený na otrockém textovém zápisu.

Rozumějte: udělat webovou stránku by mělo být průchozí i bez abstrakce do tří vrstev – to je přeci jen míra abstrakce dětem nemilá. Ano, vím, Pygame Zero. To je vlastně nejblíže tomu, co jsem myslel. Umožňuje to tvořit dostatečně důstojně daleko od Scratche a přitom se držet na mělčině.

Low-code a No-code

Proč o tom vlastně píšu? Delší dobu se zájmem pozoruji posuny v low-code a no-code hnutí. Myšlenka osvobodit programování od datlování příkazů je samozřejmě dobrá z mnoha pohledů, od omezení chybovosti, po zpřístupnění širším masám. Její limity ponechme stranou, ty jsou od toho, aby se odstraňovaly. Low-code a No-code platformy ovšem nejsou standalone záležitosti, jde zpravidla o striktně cloudové záležitosti, které je třeba platit, i když váš kód neběží a až na výjimky nejde o levné záležitosti (Outsystems je na hraní levný).

Co s tím? Zatím není mnoho dalších cest, snad zkombinovat low/no-code záležitosti s transcodery (proč asi do nich investuje Facebook) a nechat je generovat cílový kód, ale to se zase míjí s oblíbenou momentální módou lidi nechat platit za cloudy a služby v nich

My jsme začínali od píky, ale za nás všechno to vznikalo

Je to tak. Když já jsem začínal s Pythonem, neexistovalo Django. Když přišlo, byl to pomalý nástup, který jste snadno vstřebali. Když se dnes posadíte před Python 3.9, sedíte před strašlivě široce rozkročeným jazykem, který lze použít od frontendu, přes backend až po mikrokernel. Je těžké začít a mít výsledek, který by přesvědčoval, že to dává smysl, když vstupujete do takhle širokého proudu řeky.

Moje zkušební aplikace? Poznámkový webový bloček, ve kterém si napíšete řádek textu, co jste právě udělal, přidáte tag, datum a čas a kolik jste tomu věnovali minut. A z druhé strany si to podle těch kritérií můžete vypsat. Work-log. Vlastně nemůže existovat triviálnější úloha. V Excelu nebo Google Sheet za minutu. Za jak dlouho ji uděláte ve vašem jazyce tak, aby vypadala rozumně a nebyl to trapný command prompt? Kolik kódu budete muset vytvořit a kolik ho přilinkujete?

Odpověď na otázku onboardingu do programování je přitom důležitá. Pozice programátora je povoláním nejbližší budoucnosti, jenže není efektivní, aby každý programátor měl znalosti na úrovni PhD. Ve skutečnosti většina programátorů jsou učňovské profese, stačí dobře zvládnout řemeslo. K němu ale potřebujete nástroje, jak učební, tak produkční. Zdá se mi, že tohle chybí a bude důležité pro cenovou efektivitu, jak se nám podaří problém vyřešit tak, aby běžná dvacetiletá mládež mohla programovat tak, jako kdysi mohla řezat dřevo.

Výsledek? Pomalu se proklikáváme Pythonem, já pošilhávám po Elixíru / ELM či Julii, jen tak pro svoji duševní hygienu a s otázkou, zda by to dětem nevyhovovalo lépe. Ale ta propast, ta je patrná. Děti se snadno nalákají na možnosti programování, ale pak se výsledky nedostavují dostatečně rychle, ačkoliv k tomu není velký důvod. Už s malým úsilím by se daly dělat dobré webové aplikace, byť třeba unifikovaného vzhledu. Takhle se člověk snadno dostane ke vstupu z příkazové řádky, ale další kvalitativní posuny vyžadují velký znalostní skok kupředu, pro děti příliš těžké.

Samozřejmě je možné nechat to do věku patnácti, dvaceti let, kdy možnosti abstrakce i znalosti tuhle propast dotáhnou, ale připadá mi to škoda.

Pokud máte nějaké myšlenky a tipy, dejte vědět. Možná jsem jenom něco neodhalil, možná se na to dívám špatně.

PS: Ano, očekávám, že opravdoví programátoři budou zděšeni. Jak by někdo mohl nevědět, jak se používá Django! A ať se to sakra naučí, když už se to museli naučit i oni!!! Jenže…

Odebírejte Patrickův Newsletter

Technologie v souvislostech. Týdenní komentář, který jde za pěnu dní.

Invalid email address
Slibuji, žádný spam. Co sám nerad, nečiním jiným.

12 komentářů

  • Čtrnáctiletý syn chodil na kroužek, kde si hráli s RaspberryPi a asi nejvíc ho to prý bavilo, když vytvořili v basic pythonu na 20-30 řádků skripty, který rozsvěcely LEDky na SenseHatu. Padající vločka, Had, apod.
    Samozřejmě potřeboval trochu vodit za ruku, ale to vlastně bylo fajn i pro mě mu s tím pak doma pomáhat. Rovnou se s tím naučil i pár příkazů v Linuxu, terminál, základy síťování, základy Gitu, princip web serveru…

  • Díky Honza za tip s tím Raspi, hned vyzkouším.
    Jinak k tématu: řeším to samé a přesně jak píše Patrick, narážím na tu obrovskou míru abstraktního myšlení, kterou to vyžaduje. Synovi je 7 let, Scratch už ho nebaví a na Python je ještě moc “dětský”. Ale to s těma diodama by mohlo fungovat, tam by byla motivace.
    Jinak ještě myšlenka: když programuju, tak to taky dnes už vnímám jako dělnickou profesi. Ale je to tak? Já se vrátil k programování před 3 lety ve svých 43 letech, a tak mám možnost srovnávat pohled laika a developera. Ono když už to umíte, tak to vypadá jednoduše. Ale chce to podle mě obrovskou, ale opravdu obrovskou dávku logiky. Jsou to takové užitečnější šachy. Tady jsme ale ve státě, kde se diskutuje o tom, jestli se bude dělat povinná maturita z matematiky, která je matkou logiky. A kolik lidí hraje dobře šachy? Taky mám pocit, že by to mohl dělat každý, ale je to opravdu tak?

    • Tak ještě jeden tip pro mladší děti, KODU – vizuální programování pro děti od Microsoftu… do toho jsem zase úspěšně zapojil jiná děcka.

  • Syn (11) je docela unešen z projektu https://www.umimeto.org, kde je i programování. Ostatně baví to i dceru.

    Jinak k tomu, že by programovací jazyky měly být přístupnější, tak souhlasím. A i proto se mi svého času tak zalíbilo Ruby, které je uděláno tak, aby v něm bylo možné psát programy dosti blízko anglickému jazyku. Takže když tam chci udělat cyklus, aby se něco Xkrát opakovalo, tak nepíšu for (i když taky můžu), ale píšu třeba 5.times { … }. A když chci projít všechny prvky pole, tak píšu pole.each… . Tady je to o trošku víc popsáno s i odkazy dál: https://www.kidscodecs.com/ruby/
    S pomocí to pro děti může být dobré, ale musí být někdo, kdo jim to vše připraví a provede je tím. Nevím o tom, aby si to někde mohli jednoduše zkusit atd.

    Jinak ten požadavek, aby tím šlo udělat weby. Mno, tak otázka je, z jakého výchozího stavu. V Ruby On Rails to jde dost rychle a jednoduše za pomocí scaffoldingu, ale to je docela složitý koncept a pro děti už moc komplikovaný a navíc instalace a rozchození RoR není nic jednoduchého (rozhodně ne pro děti)…

  • Když jsem se já jako náctiletý (ročník 86) učil programovat, tak pro mě na začátku výborně fungoval tenhle BASIC (tehdy na 68k Macu, ale dneska klidně na Linuxu): https://en.m.wikipedia.org/wiki/Chipmunk_Basic
    Nevidím důvod, proč by to nemohlo fungovat pro děti, které vyrostou ze Scratche dneska. Pokud dítě mermomocí chce dělat webové aplikace, tak PHP má docela strmou učící křivku – framework bych žádný neřešil, prostě plivat HTML: to je konceptuálně nejjednodušší a zároveň cenná zkušenost. Jazykům, které mají příliš mnoho syntaktického cukru nebo se nedejbože podobají přirozenému jazyku, bych se vyhnul obloukem. To může být fajn jako zkratka pro pokročilého programátora, ale jednoduchá jasná syntax je lepší na pochopení a vytvoření vlastního mentálního konceptu „co se tam děje“.

  • Podle mě je vhodné v programování stejně jako v matematice při učení moc nepřeskakovat a projít si historickým vývojem. Tak bych doporučila pythom + `import turtle` a postupně přidávat knihovnu jednu po druhé. Zjistit který směr ho baví hry/hardware/web/soutěže a podle toho vybírat knihovny, Django až nakonec jestli vůbec.

    Pokud by chtěl soutěže tak např:
    https://ksp.mff.cuni.cz/z/ulohy/33/zadani1.html#task-33-Z1-1

  • Velmi pekne je code.org. Programovani ve stylu Scratch a jsou tam pripravene kurzy, ktere provedou zakladnimi koncepty.

  • Mě se dost osvědčilo Arduino – koupit sadu s čidlama a Arduino Uno z Číny, z arduino.cc stáhnout zdarma SW a na našich stránkách Arduino shop vzít jedno čidlo, podívat se na návod – zapojení, vzorový kód – CRTL C zvládl každý žáček a dokonce neřešili barvy propojovacích drátků, ale koncovky … a v momentě, kdy potřebujete k čidlu přidat LEDku a ve finále mít na Arduinu vlastně obsazenou většinu pinů, tak se naprosto samospádem dostanete k textovému programování a dobrovolně začnete řešit knihovny 🙂 Dokonce se dá z papírové krabice postavit dům, ověsit ho čidlama a ledkama – až se člověk dostane na hranici napájení, místo jednoho Una má najednou tři… a ještě se naučí něco z elektroniky. https://www.cichnovabrno.cz/fotogalerie/chytry-dum

  • Souhlasím v současné programovací jazyky jsou víceméně nevhodné v porovnání s tím co osmi nebo devítileté děti dokáží v kontextu udržet v pameti, znát.

    Protože taky otázka zda bychom je do toho měli teď tlačit když vlastně za 15 let budou programovat nejspíš v úplně něčem jiném.

    Dobře některé jazyky tu zjevně zůstanou ale zrovna tyhle nejsou vhodné pro děti v tomto věku.

    Já to cítím tak že je potřeba aby děti měly nejen programovat a logiku s tím spojenou ale byli také schopni něco vytvořit, svůj vlastní malý projekt, základy elektroniky, pájení, 3D modelovani a současně i vyklikat něco malého někde v cloudu.

    Ona je to totiž taky otázka zda je vůbec v ho rozumné aby naše děti ve věku 20 let se staly jakýmisi programátory, dělníky nebo aby místo toho zkoušeli optimalizovat nejakou NN, stavet vlastni projekty atp.

    Dalsi faktor je dlouhodoba vnitrni motivace. To mi prijde daleko tezsii. A rozhodne je potreba, kdyz se to taknejak musi stejne vysedet.

    Mohlo by ale pomoci, pokud by misto preruseneho krouzku (covid) sdileli sve napady a projekty, povidali si a vzajeme se motivovali.

    A proto ze o tom uz uvazuju delsi dobu, jako aktivitu „po video skole“ zalozil jsem tedna Discordu skupinu: „Bastleni“ vseho druhu, invite:
    https://discord.gg/ata4kf88hb

  • Tiež by som sa viac rozhodoval podľa toho, čo ho baví a potom sa rozhodnúť ktorým smerom ísť. Deti sa majú hrať a učiť hrou, stavil by som na základy – matematika, logika a kombinovať to s programovaním, aplikovať poznatky zo školy a života. Na rýchlejší postup sa dajú predpripraviť triedy, ktoré bude skrývať nepopulárne a nezáživné časti programovania, stačí vysvetliť ako sa používajú, celé knižnice až neskôr. Skúmať ako veci fungujú (https://slowww.ml ako príklad veľmi pomaly načítavanej stránky). Písať programy typu kalkulačka, formátovanie/konverzia súborov a podobne, programátorské puzzle (pri nich sa dobre učí logika, algoritmizácia, náročnosť/efektivita). Ďalej používať existujúce API, od jednoduchších ako napríklad vytvorenie si vlastného badgu pomocou https://shields.io po zložitejšie ako youtube, mapy.

  • Moje šestiletá dcera začínala jako malá na code.org. To je takový jednoduší Scratch. Scratch nakonec přeskočila a přešla rovnou na Python na codecombat.com. Jde jí to, jsem vlastně překvapený kolik času u toho dokáže strávit a jak rychle to chápe.
    Zajimavý je rozdíl mezi Scratchem a code.org. Jsou to mikroabstrakce. Problém se Scratchem byl že na jednoduché věci jsou potřeba složitější konstrukce. V code.org třeba ani nejsou potřeba proměnné, je to odabstrahované. Takhle můžete dát dítěti do ruky funkci která implementuje Dijkstrův algoritmus o kterém se mluví při maturitě. Děti s tím umí pracovat protože si pod tím představí postavičku které dojde z bodu A do bodu B. Je to pro ně zajímavé protože díky tomu dokážou udělat něco zajímavého.

    Vytvořit takové abstrakce vlastně není zas tak složité. Když se vám jí podaří trefit na poprvé tak za půl hodiny vytvoříte abstrakci se kterou si dítě bude hrát pěkně dlouho. Ale proč to vlastně dělat když si to můžete koupit jako službu za 3 eura na měsíc v prohlížeči.

    Podobné myšlenky jsem slyšel mnohokrát. Třeba na základce v roce 1997 kdy autor dětského jazyka Baltazar říkal, že děti nechápou proč dospělí pořád píšou v céčku.
    Přemýšlí o tom spousta lidí a za 30 let tady pořád máme FOR cyklus. Kdyby existovalo jednoduché řešení tak na něm už někdo šíleně zbohatnul.

    Rozdíl mezi dětským a produkčním programováním je velký jednoduše protože nikdo nepotřebuje aby to bylo jinak.
    Když se podívate na vývoj programování tak spousta platforem jde často opačným směrem – vezměte si třeba Javascript, reaktivní programování, funkcionální programování. To je intelektuální masturbace, tam nejde vůbec o zjednodušení. Jsou hnutí která říkají že programování nemá být cool plné kudrlinek a nových technologií ale jednoduché, nudné a stabilní. Jsou ale zatím v minoritě. Možná se za pár let dostanou do popředí ale nebude to vlastnostech jazyků jako spíše o tom zbytku.

    V programování nejde o to udělat notepad za 30 minut. Tam jde udělat notepad tak, aby byl jeho vývoj byl za rok ještě udržitelný.

    Pokud budeme o programátorech mluvit jako o učních (slyším to poprvé) tak stejně tak můžeme mluvit o projekt managerech jako o sekretářkách (to neslyším poprvé). Ve srovnání s programátory špatně placená práce, dělá jí každý, s kvalifikací je to různé, malé pravomoce, hodně odpovědnosti a stresu… cesta k alkoholismu.

  • Já bych jednoznačně doporučil Pharo Smalltalk.

    Je extrémně jednoduchý a přesto mocný. Je to čistý objektový jazyk, prostředí s okny a všemi nástroji a zároveň objektová databáze.

    5 timesRepeat: [ Transcript show: ‚Hello, world!‘ ; cr ].

    Kdybyste měl zájem o info, tak se ozvěte.