6. května 2006

Jak učit programování

Na svém novém blogu Guy Peters napsal:

Řekl bych, že účelem výuky programování není naučit triviální úlohy typu třídění seznamu apod.

Smím-li parafrásovat G. B. Shawa, kdo umí, umí, kdo neumí, učí, a kdo neumí učit, stane se didaktickým methodikem...

Účelem výuky programování je naučit studenta dvěma věcem: 1. algorithmickému myšlení a 2. abstraktní počítačové representaci datových struktur. Třetím, méně podstatným aspektem výuky programování, je vysvětlit adeptu zásady strukturovaného programování.

Každý obor lidského poznání má určitý základ, bez něhož lze sice dospět k pozoruhodným vědeckým výsledkům, ale s pravděpodobností asi tak 999:1 bude výsledkem pozoruhodně desorientovaný diletant neboli totální mimoň.

Knuthův Pascal je praktický prostředek, jak lze tomuto základu naučit a při výuce přitom abstrahovat od všeho, co je implementačně závislé nebo irelevantní. V tom - a jen v tom - je Pascal dokonalý. Naučit se for i:=1 to n do begin ... end; je pro člověka, který základ zatím nemá, principiálně daleko jednodušší než pochopit *p++, což je fakticky jen zkratka a těsnopisný zápis často opakovaného triviálního úkonu, a jazyk C/C++ je jen geniální systém takových zkratek.

Na druhé straně nemůže být hlubšího omylu, než že se lze stát programátorem bez tohoto základu. Implementace grafu stromem, třídění seznamu methodou QuickSort nebo řešení šachových problémů pomocí backtrackingu jsou osvědčené učební úlohy, které usnadňují pochopení myšlenkových základů tohoto fascinující oboru lidského poznání.

Nevěřím, že umělou inteligenci naprogramuje někdo, kdo se nenaučil programovat v Pascalu.

7 komentářů:

  1. Pascal je úplně na nic. Naučil jsem se programovat podle knihy Teach Yourself C++ in 21 Days stažené z internetu.

    OdpovědětVymazat
  2. Nenaučil jste se programovat. Naučil jste se psát programy v C++, to je rozdíl.

    OdpovědětVymazat
  3. Naučil jsem se co je variable, variable assasement, while, switch, for, clss, vsechno. Netvrdím, že umím programovat, ale to se nenaučí člověk ani pouhým psaním programů v Pascalu...

    OdpovědětVymazat
  4. Pascal se na praktické programování nehodí, přestože díky zdařilé implementaci společností Borland se dodnes používá.

    OdpovědětVymazat
  5. Neznám odpornější jazykovou konstrukci, než je vnořená procedura / funkce. Pascal tuto techniku umožňuje a výukové knížky plné příkladů typu Hanojské věže nebo zmíněný Quicksort vnořené procedury / funkce ve spojení s tzv. nelokálními proměnnými s oblibou používají (občas snad dokonce i s více než dvěma úrovněmi). To zavádí do problému zbytečnou složitost.

    Další příklad je naprosto zmatené vysvětlování problematiky ukazatelů v učebnici jazyka Pascal, kterou jsem si coby teenager kdysi koupil. V Heroutově Učebnici jazyka C jsem chápal všechno hned napoprvé, od jednoduchých příkladů (ala spojové seznamy) až po tu pointerovou aritmetiku. C sice zavedlo různé zkratky a "černou magii" (ale třeba pointerovou aritmetiku není nutné dnes používat a moderní kompilátor nenutí programátora optimalizovat přístupem přes pointery namísto indexů), některé věci jsou však naopak jednodušší.

    Za další omyl považuju pascalovskou práci se soubory: tři typy souborů (binární, Text a pole záznamů nějakého typu), assign + reset / rewrite; těžko pochopitelné hacky jako packed array atd. atp., možná spíše slušely počítačům typu JSEP.

    "Klasický" Pascal se v praxi při výuce moc nepoužíval a Turbo Pascal se často používal i pro větší (nejen školní) projekty přes svoji kostrbatost a zoufalý nedostatek funkcí. Pascal měl velké výhody v době, kdy byl problém nevelký program v C zkompilovat v rozumném čase.

    Pro výuku programování (nebo základů algoritmizace) se dá použít leccos - od Pythonu přes ABC, LUA až třeba po Smalltalk nebo Scheme. Pascal podle mě už morálně dosloužil, ale pořád lepší, než začínat třeba s Visual Basicem.

    Naprogramovat si perceptron, nějakého toho agenta atd. si podle mého názoru zvládne střihnout i samouk, který se naučil C++. Že ten program nebude dokonalý, je další věc.

    OdpovědětVymazat
  6. To je zásadní nepochopení toho, k čemu je Pascal určen (bohužel, velmi rozšířené - Borland Pascalu poskytl medvědí službu).

    Pascal vůbec nepotřebuje I/O (k čemu?), o packed arrays nemluvě, a pokud jde rekursivní funkce, je dobré naučit se jejich princip, i když v praxi používány zřejmě nebudou a identickou funkcionalitu bude programátor implementovat jiným způsobem.

    Ve zbytku souhlasím.

    Mimochodem, české učebnice neznám, Pascal jsem se kdysi učil z Knutha a C/C++ z Kernighana & Ritchieho.

    OdpovědětVymazat
  7. On ten "problém nevelký program v C zkompilovat v rozumném čase" vyřešil už asi tak před patnácti a více lety MS svym QuickC -- co si pamatuju. A učit se programovat v nějakym prostředí a pak všechno zahodit a přejít "do ostrýho" neni moc efektivní. Nehodilo by se dneska začínat výuku programování místo v Pascalu třeba v Javě?

    OdpovědětVymazat

Kursiva: <i></i>
Tučné písmo: <b></b>
Uvozovky: „“
Odkaz: <a href = ""></a>