První jazyk: Python

John M. Zelle, Ph.D.

<zelle zavináč wartburg tečka edu>
Katedra matematiky, počítačových věd a fyziky
Univerzita Wartburg
Waverly, IA 500677, USA

Originál: http://mcsp.wartburg.edu/zelle/python/python-first.html
Zveřejněno v roce 1999.

Překlad:
    Pavel Kosina <pkosina zavináč seznam tečka cz> a
    Vláďa Macek, http://macek.sandbox.cz
    za pomoci korektury Hynka Fabiána

    Verze: září 2004

Shrnutí

V současné době panuje malá shoda v tom, který programovací jazyk je nejvhodnější na začátek výuky výpočetní techniky. Většina škol učí v úvodních kurzech tradiční systémové programovací jazyky jako např. C, C++, Java nebo Ada. Nicméně skriptovací jazyky, jako např. Tcl, Perl a Python, se stávají stále populárnějšími vývojářskými nástroji. Tento článek pojednává o výhodách skriptovacího jazyka jako prvního jazyka ve výukových osnovách počítačových oborů. Skriptovací jazyky jsou jednodušší, bezpečnější a pružnější než jazyky systémové. Obzvláště Python se ukazuje být téměř ideálním kandidátem na jazyk pro začátečníky.

1  Úvod

Prakticky každý by před pěti lety souhlasil s tím, že Pascal je správným jazykem pro ilustrování konceptů ve výpočetní technice. Nadšenci jím začínali a studenti používali učebnice s příklady v Pascalu. Pak přišla objektově orientovaná revoluce. Jediná shoda, která dnes panuje v oboru programovacích jazyků je, že Pascal je pryč. Odklon od něj proběhl v posledních letech, ale žádný jazyk nedospěl do stavu, aby byl přijat jako jasný nástupce. Jedna nedávná studie programů akreditovaných organizací Computing Sciences Accreditation Board ukázala, že nejoblíbenější jazyk první volby, C++, se vyučuje jen na 22% dotazovaných institucí (McCauley a Manaris, 1998). Do zmatku přispěl raketový vzestup Javy, a to jak v praxi, tak v akademické oblasti.

Někteří lidé tvrdí, že tzv. „válka jazyků“ skončila a (jedinými) rozumnými volbami jsou jazyky C, C++, Java, Ada (a snad Eiffel). Myslím, že prohlášení o konci takové války je předčasné přiznání porážky. Doba velmi malé shody ohledně jazyka první volby se ukazuje být vhodnou pro návrat k základům a ke zvážení vlastností, které by první jazyk měl mít. Najednou možná zjistíme, že nejlepší kandidáti ještě ani nebyli vzati v potaz.

V tomto článku tvrdím, že vysokoúrovňové jazyky jako např. Python, Perl, Tcl, Rexx a Visual Basic jsou lepšími kandidáty na první jazyk. Konkrétně jeden z nich, Python, se zdá být téměř ideální.

2  Požadavky na jazyk první volby

2.1  Předpoklady pro úvodní kurzy výpočetní techniky

Všimneme-li si, že je zde značná neshoda ohledně toho, co by se mělo vyučovat v úvodních kurzech, pak jakákoliv rozumná diskuze o nevhodnějším jazyku musí začít u základního pochopení kurzů samotných. Následující předpoklady odrážejí dosti běžný přístup, nicméně je chápu jako sporné.

Za prvé, úvodní kurzy se v zásadě týkají programování. Ačkoliv tyto kurzy se zajisté dotýkají širších okruhů teorie a praxe výpočetní techniky, jádro informatiky a těchto prvních kurzů je jednoduše řešení problémů, návrh a programování. Výuka programování je velice praktická činnost a dané kurzy zahrnují návrh a programování projektů různé velikosti jak ve volném čase, tak v rámci výuky.

Za druhé, programovací jazyk sám o sobě není tím hlavním, na co jsou tyto kurzy zaměřeny. Ačkoliv studenti často nazývají kurzy například „předmět C++“ nebo „kurz Javy“, je výuka navržena tak, aby poskytovala zejména úvod do informatiky. Použitý jazyk je skutečně až na druhém místě. Tendence uvažovat o prvním ze série kurzů jako o úvodu do určitého programovacího jazyka je právě tím, co ukazuje na složitost často používaných programovacích jazyků.

Za třetí, tyto kurzy předkládají studentům základní současná paradigmata návrhu a řešení problémů, konkrétně strukturované a objektově orientované metody implementované v imperativním (příkazově orientovaném) jazyce. Ačkoliv existují silní zastánci jiných přístupů (např. používání funkcionálního jazyka v prvním kurzu), valná většina vstupních kurzů se kloní ke tradičnější cestě.

Za čtvrté jde o snad nejvíce sporný bod. Domnívám se, že cílem prvního kurzu je zaujmout a vychovat odborníky a snad i najít nové. Při současné poptávce po našich absolventech a potřebě toho, aby všichni vzdělaní lidé rozuměli informačním technologiím, je medvědí službou považovat první počítačový kurz za jakési síto. Programování je obtížné, ale my bychom se měli snažit o to, aby nebylo těžší, než je třeba.

2.2  Co předchází volbě programovacího jazyka

Pokud považujeme první kurzy skutečně za úvod do informatiky a ne za výklad podrobností konkrétního jazyka, vyplývá z toho, že vybraný jazyk by měl mít jednoduchou syntaxi i sémantiku. Všichni jsme si zažili frustrující první kurz, ve kterém zabředla diskuze do syntaktických chyb a konstrukcí jazyka. Jak jen to půjde, měli bychom vybrat takový jazyk, který minimalizuje tyto složitosti, aby se mohlo více času věnovat rozvoji schopností návrhu. Závěr této úvahy je takový, že jednoduché problémy by se měly řešit jednoduše. Jazyk, který vyžaduje mnohem více námahy k vyřešení i triviálních problémů, způsobuje, že se studium věnuje jazyku místo řešení problému.

Také praktická, experimentální povaha vstupních kurzů ovlivňuje výběr jazyka. Jazyk, který umožňuje vyjádřit návrh s minimální redundancí, vybízí k experimentování a vylepšování. Proto by měl být takový jazyk vysokoúrovňový a pružný, aby studentům dával možnost experimentovat s alternativními řešeními. Toto podporuje přemýšlení o algoritmu a návrhu, a není nutno se zaměřovat na zbytečné detaily implementace. Jazyk by měl v nejvyšší možné míře poskytovat bezpečný prostor pro experimentování. Měli bychom upřednostňovat jazyky, které chrání před tajemnými pády programů způsobenými chybami v ukazatelích nebo hranicích polí. Na této úrovni se studenti naučí toliko způsoby vyhledávání a odstraňování chyb. Jazyk by jim měl pomáhat a ne je znechucovat.

Je také důležité, aby jazyk podporoval moderní přístupy k abstrakci návrhu, zapouzdření a objektovou orientaci. I když objektový návrh může být implementován v kterémkoli jazyce, použití jazyka, který objekty přímo podporuje, je intuitivní a přímočaré. A znovu: Umožňuje to soustředit se na koncepční problémy vyšší úrovně spíše než na detaily implementace.

A nakonec: Jsou tu praktické ohledy při výběru jazyka. Je nanejvýš žádoucí, aby byl jazyk k dispozici na nejrůznějších platformách. Stejně tak jazyk, který se používá v praxi mimo akademickou oblast, je lepší upřednostnit před takovým, který je jen „pro učení“, pokud splňuje kritéria popsaná výše. Vyučovat jazyk X jednoduše proto, že se běžně používá, by nemělo mít samo o sobě velkou váhu. Každý náš student se bude během své kariéry učit a používat mnoho jazyků. V prvním kurzu je ale důležité jim poskytnout nejlepší možné základy ústředních principů a technik, které jim pak umožní přijmout a adaptovat se na nejrůznější jazyky, se kterými se setkají ve „skutečném světě“.

3  Přednosti jazyka Python

3.1  Případ skriptovacích jazyků

Ousterhout (1998) načrtl rozdíl mezi systémovými programovacími jazyky (tj. C, C++, Pascal, Ada, Java) a skriptovacími jazyky (tj. Perl, Tcl, Python, Rexx, Visual Basic). Ty první jsou staticky typované, obvykle překládané (kompilované) a představují mírnou abstrakci nad výkonným prostředím. Ty druhé jsou dynamicky typované, obvykle interpretované a vysokoúrovňové. Skriptovací jazyky se obvykle popisují jako „stmelující jazyky“, protože spojují nezávislé komponenty do aplikací velkých rozměrů nebo jako prototypizující nástroje pro rychlý vývoj aplikací. Nicméně jak Ousterhout (1998, 23) zdůrazňuje:

Trendy poslední doby, jako rychlejší počítače, lepší skriptovací jazyky, vzrůstající důležitost grafického uživatelského prostředí i architektury komponent a růst Internetu, výrazně zvedly použitelnost skriptovacích jazyků. Tyto trendy budou pokračovat celou příští dekádu, kdy bude stále více aplikací vytvořeno čistě ve skriptovacích jazycích a systémové programovací jazyky se budou používat primárně pro vytváření komponent.

Počítačoví odborníci tradičně upřednostňují systémové programovací jazyky před skriptovacími. Nicméně skriptovací jazyky mohou nabídnout mnoho výhod, obzvláště v úvodu do programování. Skriptovací jazyky mají obecně jednodušší syntaxi a sémantiku než jazyky systémové. Díky dynamickému typování a interpretaci jsou velmi pružné a podporují experimentování. Vysokoúrovňová přirozenost umožňuje studentům vytvářet promyšlené a zajímavé projekty s menším úsilím vydaným na realizaci.

Nedostatek zájmu o skriptovací jazyky má pravděpodobně svůj původ v představě, že to jsou „hračky“, nevhodné pro všeobecné použití v programování. Snad to byla pravda u prvních skriptovacích jazyků (například skripty příkazového řádku systému UNIX), u moderních variant skriptovacích jazyků to opravdu však již neplatí.

3.2  Špetka Pythonu

Mezi různými oblíbenými skriptovacími jazyky je Python pravděpodobně nejblíže tradičním systémovým jazykům (Laird a Soraiz, 1998b). Má zřejmě také nejlepší předpoklady pro to, aby byl doporučen jako první programovací jazyk. Smyslem tohoto článku není naučit jazyk Python. Za tím účelem je k dispozici množství referencí (Lutz, 1996; Watters, Van Rossum a Ahlstrom, 1996). Kvalitní zdroje lze najít i na webových stránkách http://www.python.org. [Jazyku se věnují i české stránky http://www.py.cz, kde lze najít přeložený, dobře čitelný výukový materiál „Učebnice jazyka Python (aneb Létající cirkus)“. pozn. překl.] Namísto toho se zaměřím na vlastnosti tohoto jazyka, které z něj činí obzvláště dobrou volbu pro jazyk první volby. Průběžně budu srovnávat jazyky Python s C++, v současnosti nejpoužívanějším prvním jazykem, a také s Javou, jazykem v současnosti nejčastěji označovaným jako „možný nástupce“ (McCauley a Manaris, 1998).

3.2.1  Python je prostý

Všeobecně se dá říci, že skriptovací jazyky jsou mnohem jednodušší než jazyky systémové jako jsou C++ a Java (Laird a Soraiz, 1998b). Python má jednoduchou, regulární syntaxi. Příkazy jsou ukončovány znakem konce řádku, blok příkazů je označen odsazením. Programy v Pythonu vyhlížejí jako spustitelný pseudokód. To vylučuje množství nepříjemných začátečnických chyb, zvláště v používání středníků, závorek a odsazování. Například nejčastější chybou v C++ a Javě je opomenutí uzavření bloku do závorek:

if (x<0)
    cout << "x je záporné";
    x = -x;

V Pythonu je odpovídající kód proveden správně, protože samo odsazení určuje blok:

if x<0:
    print "x je záporné"
    x = -x

Python podporuje funkce a třídy, ale nevynucuje si je. Jednoduché programy jsou skutečně jednoduché. Všimněme si například notoricky známé ukázky v Pythonu:

print "Hello world!"

C++ vyžaduje, aby byl program obalen funkcí a předcházela mu direktiva preprocesoru:

#include <iostream.h>

int main()
{
    cout << "Hello World!";
}

V Javě je to ještě horší, celý kód musí být uvnitř třídy:

public class helloWorld
{
    public static void main(String [] args)
    {
        System.out.println("Hello World!");
    }
}

Sémantika Pythonu je také jednoduchá. Typování je dynamické, není proto třeba žádné deklarace proměnných. To redukuje množství kódu, který studenti musejí psát, a také to vyřazuje obvyklé chyby pramenící z neporozumění jemným rozdílům mezi deklarací, definicí a použitím. Například studenti v C++ a Javě „nedopatřením“ opětovně deklarují proměnné tam, kde je chtějí použít (napsáním int count = 0;, když chtěli count = 0). Takovéto chyby se často vyhledávají velmi špatně.

Python má minimální, přesto úplnou sadu řídících struktur: jednu rozhodovací konstrukci (if-elif-else), konečnou (for) a nekonečnou smyčku (while). Python dále obsahuje moderní mechanismus zpracování výjimek podobný tomu z C++ a Javy. Avšak na rozdíl od Javy není nutné rozumět mechanismu výjimek, když chcete psát jednoduché programy. Z pedagogického pohledu je pythonovský cyklus for ilustrativní. Umožňuje řídící proměnné iterovat přes hodnoty v posloupnosti, a to pro jakýkoli druh posloupnosti: seznam (pole) nebo řetězec. Například prvky seznamu se dají vytisknout takto:

for item in List:
    print item

Operace range vytvoří posloupnost čísel ze zadaného rozsahu. Například zadání range(5) vyrobí seznam [0,1,2,3,4]. Toho se využívá u cyklů řízených čísly. Předchozí příklad může být psán (méně zřetelně):

for i in range(len(List)):
    print List[i]

Cyklus for je jednoduchý a bezpečný. Dovoluje velmi brzké zavedení do výuky bez obav z nekonečných cyklů.

Python má jednotný a jednoduchý datový model. Proměnné jsou vždy odkazy na hodnoty (objekty) přidělené z haldy. Model je konzistentní, vylučuje záměnu mezi proměnnými z haldy a automatickými proměnnými v C++ nebo mezi primitivními a objektovými typy v Javě. Pro tvorbu i relativně jednoduchých programů vyžadují oba tyto jazyky výuku několika modelů přidělování paměti.

Jazyk Python má pouze jediný způsob předávání parametrů (hodnotou). Předání parametrů je jednoduše přiřazení skutečného parametru formálnímu v době volání. Jakmile studenti pochopí tento jednoduchý přiřazovací model, pochopí snadno předávání parametru.

3.2.2  Python je bezpečný

Python poskytuje plnou dynamickou běhovou kontrolu typů a kontrolu mezí indexů polí. Využívá se technika garbage collection (automatické přidělovaní a uvolňování paměti), proto se zde nevyskytují problémy s visícími ukazateli nebo úniky paměti (memory leaks). Uživatelský kód v Pythonu nemůže způsobit porušení ochrany paměti. V tomto ohledu je Python podobný Javě a oba jsou mnohem bezpečnější než C++.

3.2.3  Python podporuje objektově orientované programování

Ačkoliv při tvorbě programů v jazyce Python nemusíte používat třídy, podporuje tento jazyk objektově orientované programování mechanismem tříd, podobným tomu z C++ a Javy. Model tříd Pythonu je zjednodušením modelu C++ a podporuje vícenásobnou dědičnost. Vzhledem k tomu, že Python je dynamicky typován, není zde potřeba abstraktních tříd à la C++ nebo rozhraní Javy. V tomto ohledu je Python blíže k čistě objektovému modelu jazyka Smalltalk.

Zapouzdření je vynucováno pouze konvencí, což je z perspektivy systémového vývoje slabina. V jazyce Python neexistuje mechanismus pro určení, že členové tříd jsou soukromí (private). Z pedagogického hlediska se toto ale nejeví jako velká nevýhoda, protože je stále možné vyučovat principům skrývání dat (data hiding); jen to jazyk nevynucuje. Ten poskytuje elegantní a jednoduchý mechanismus, kterým se vyhýbá složitosti některých „režimů dostupnosti“, které musí být probírány v C++ nebo Javě.

Dynamický typovací model Pythonu je obzvláště výhodný pro objasňování kontejnerových tříd v kurzech o datových strukturách. Například třídu zásobník lze použít pro uchování objektu jakéhokoli typu. Může to být zásobník čísel, řetězců nebo směsice typů. Toho se dosahuje bez nutnosti zavádění šablon nebo provádění dynamického přetypování. Následující ukázka nabízí příklad definice jednoduše vázané třídy zásobník.

class Stack:
    def __init__(self,size):
        self.data = [None]*size
        self.size = 0

    def push(self,item):
        self.data[self.size] = item
        self.size = self.size + 1

    def pop(self):
        self.size = self.size - 1
        return self.data[self.size]

    def is_empty(self):
        return self.size == 0

    def is_full(self):
        return self.size == len(self.data)

Ukázka: bstack.py, jednoduše vázaný zásobník

Python dále poskytuje jasný systém modulů, které dynamicky načítají soubory za běhu podobně jako Java (bez těžkopádných organizačních omezení). To umožňuje jednoduchou správu modulárních projektů (Laird a Soraiz, 1998a) bez potřeby hlavičkových souborů a direktiv preprocesoru jazyka C++. Implementaci zásobníku lze použít pomocí příkazu import například takto:

from bstack import Stack

myStack = Stack(10)
myStack.push("Hello")

Náhradu implementace je možné provést pouhou změnou názvu modulu v příkazu import.

3.2.4  S Pythonem je legrace

Díky jednoduchosti jazyka Python je snadné se jej učit. Kromě seznamů (dynamická pole) Python poskytuje n-tice (neměnitelné seznamy) a slovníky (asociativní pole). Společně s mechanismem tříd se toto dá využít k rychlé tvorbě sofistikovaných datových struktur v zajímavých projektech. Absence typové deklarace má za důsledek méně kódu a flexibilnější programování. Existuje také obrovská knihovna standardních i nezávislých modulů poskytující komponenty pro programování grafických uživatelských rozhraní, klient-server aplikací, prohlížečů HTML, databází, animací a mnoho dalšího. Vzrůstající popularita skriptovacích jazyků je přímo svázána s jednoduchostí tvorby sofistikovaných aplikací pomocí skládání již hotových komponent. Zajímavé projekty se dají vyvíjet se zlomkem kódu, který by vyžadovaly systémové jazyky. Pokud to myslíme s přípravou náplně poutavých úvodních kurzů vážně, Python je přirozenou volbou.

3.2.5  Python je praktický

Popularita skriptovacích jazyků obecně roste (viz např. časopis Dr. Dobbs Journal z února 1998, speciální vydání o skriptovacích jazycích). Podle některých zdrojů se více softwaru píše ve skriptovacích jazycích než v tradičních systémových jazycích. Ačkoliv je Python méně známý než jeho bratránci (Perl, Tcl, Visual Basic), je to zralý jazyk a těší se široké oblibě v praxi (Laird a Soraiz, 1998a). Python je k dispozici pro všechny důležité platformy (Windows, MacOS, Linux, BeOS, Java, ...). A je zcela svobodný a zdarma.

4  Pár překážek (skutečných i vymyšlených)

Známe-li tedy všechny výhody skriptovacího jazyka jako je Python pro úvodní kurzy výpočetní techniky, je zde váhavá otázka, proč jej tedy všichni již nepoužívají. Skriptovací jazyky bývají často odmítány bez adekvátního zvážení. V této části jsou probrány některé typické námitky.

4.1  Chybějící kontrola při překladu

Někteří vyučující protestují proti dynamickým jazykům kvůli chybějící kontrole při překladu, zvláště pak při kontrole typování. Sám jsem dříve měl za to, že silné statické typování je u prvního jazyka důležité. Měl jsem teorii, že překladač by měl zachytit tolik chyb, kolik je možné. Všichni známe základní programátorskou poučku, že čím dříve chybu zjistíme, tím snadněji se dá opravit.

Zkušenosti při výuce jazyků jako Pascal, C++ a Java mne ale přesvědčily, že předkládané výhody kontroly při překladu pro programátorské nováčky jsou iluzorní. Za prvé, valná většina chyb zachycených překladačem jsou triviální (např. všudypřítomně chybějící středník). Jazyky jako Python vylučují mnohé z těchto chyb jednodušší syntaxí. Většina zbývajících čistě syntaktických chyb je navíc ihned hlášena interpretem, který analyzuje syntaxi programu při jeho načítání. Za druhé, jedná se jen o malou výhodu, když překladač zachycuje rafinovanější chyby (např. neslučitelnost typů) v době překladu. Běžná typová chyba je způsobena nerozlišením mezi deklarací a použitím. Mnohé z těchto chyb jsou prostě chybami v deklaraci. V jazyce bez deklarací se tyto chyby nevyskytují. Dynamicky typovaný jazyk i tak ale zachytí případ ryzí chyby u chybného použití typu. Rozdíl je v tom, že dojde k zachycení a vyšetření za běhu programu. Pro ty typy programů, které se tvoří v prvních dvou výukových kurzech, není kontrola při překladu zvláštní výhodou. Jednoduchost cyklu úprava-interpretace daleko předčí výhody získané nalezením více chyb při překladu.

Kontrola při překladu může dokonce určitou měrou znamenat pro některé studenty újmu. Za prvé je demoralizující. Studenti musí mít syntakticky dokonale správný program, než uvidí jakýkoli výsledek. Překlad programu a zírání na obrazovku plnou otravných hlášek je tupé a rozčilující. V případě interpretovaného jazyka se stane alespoň něco: program generuje částečný výstup předtím, než se zastaví s chybou. Studenti vidí program v (částečné) akci a musí pouze odstraňovat jednu chybu za druhou. Každá oprava přináší pokrok. To je mnohem povzbudivější situace.

Druhá nevýhoda rozsáhlé kontroly při překladu je ta, že to dává studentům iluzi důkladnosti. Ti pak věří, že když je jednou program přeložen, musí být v podstatě v pořádku. Jedním z příznaků tohoto je nedostatečné testování. Dalším problémem je, že to způsobuje oddalování chvíle, kdy se zjistí chyby návrhu. Z mých zkušeností vyplývá, že není neobvyklé, že studenti věnují značný čas programu a cítí, že jsou již téměř hotovi, protože již zbývá jen jedna chybička, se kterou si nevědí rady. Pouze se ukáže, že ta jedna chybička je chyba při překladu. Jsou tedy daleko od stavu „téměř hotovo“, úloha zabrala již několik hodin a oni ještě nemají program ani přeložený! Zdaleka neměli možnost objevit nejzávažnější nedostatky v logice svého řešení. V interpretovaném jazyce jde vyhledávání chyb ruku v ruce s testováním; výskyt chyb v typování nezamezuje nutně odhalování závažnějších chyb návrhu.

4.2  Skriptovací jazyky jsou pomalé

Je pravda, že interpretovaný jazyk bude pomalejší (obvykle desetkrát) než překládaný. Množství raných skriptovacích jazyků na tom bylo dokonce ještě daleko hůř. Moderní skriptovací jazyky, jako třeba Python, Perl nebo Tcl, jsou však natolik rychlé, že je s nimi možné budovat i velké aplikace. Například Python i Tcl byly oba použity k implementaci plnohodnotných grafických webových prohlížečů. Pro většinu typů programů, které jsou vyvíjeny v úvodních školních kurzech, jsou skriptovací jazyky rozhodně více než dostačující, a to i na skromném hardwaru.

V každém případě je tato starost o efektivitu provádění zmýlená. Začátečníci obvykle nepíší ostrý produkční kód. Jejich programy nejsou omezeny časem a budou spouštěny jen několikrát. Skutečná efektivita se soustřeďuje na objem času věnovaný vývoji daného programu. A to je chvíle, ve které zazáří skriptovací jazyky. Rychlý cyklus úprava-interpretace, neexistence deklarací a vpravdě vysokoúrovňová přirozenost skriptovacích jazyků z nich činí pro toto prostředí perfektní nástroj.

4.3  Je třeba, aby se studenti učili systémový jazyk

Žádný počítačový specialista by zajisté neměl zakončit školu bez znalosti alespoň jednoho systémového programovacího jazyka, jako je např. C++, Java nebo Ada. Ve skutečnosti by bylo lepší se učit více než jeden. Skriptovací jazyky nenahrazují ty systémové, spíše je doplňují. Stále více softwarových systémů je tvořeno z komponent programovaných v systémových jazycích, které jsou pak spojeny dohromady jazykem skriptovacím. Proto by se studenti měli zároveň učit skriptovací jazyk. Tak budou vyzbrojeni sadou nástrojů a budou moci k danému úkolu vybrat právě ten nejvhodnější.

Vyvstává tedy otázka, který jazyk by se měl učit jako první. Jedním z argumentů pro jazyky jako C++, Java nebo Ada je, že jsou samy o sobě tak komplexní a složité, že je třeba s nimi začít ihned proto, aby byl dostatek času na jejich zvládnutí. Tento argument ovšem staví věc na hlavu. První kurzy by neměly být o jazyku, ale spíše o počítačovém oboru a v podstatě o návrhu. Snaha vyučovat komplexní jazyk nás neodmyslitelně odvrací od tohoto cíle, neboť studenti musí věnovat mnoho času zvládnutí jazyka a tudíž méně času zvládnutí ostatní látky. To je důvod, proč někteří lektoři pohlížejí na Javu jako na jednodušší alternativu k C++, ale i Java je stále daleko složitější než Python.

Mnohem citlivějším přístupem by tedy bylo vyučovat nejdříve návrh a začít to za pomoci jednoduchého, avšak výkonného jazyka. S plným pochopením programování a návrhu je daleko snazší porozumět konceptům jako je statické typování, dostupnost, generičnost a polymorfismus. Jako myšlenkový experiment si představte, jak nováčkům vysvětlujete významy každé části programu helloWorld v Javě. Představte si, oč snadnější by bylo vysvětlovat pojmy public, class, static, void a String[] studentovi, který již rozumí pojmům funkce, třídy, instanční a třídní proměnné, typy dat a pole. Složitější konstrukce systémových jazyků (např. šablony, virtuální metody a dynamické přetypování v C++) jsou ve skutečnosti mechanismy k dosažení pružnosti dynamických jazyků ve staticky typovaném prostředí. Proč neučit koncepty nejprve v jazyce, který nevyžaduje takovou složitost pro jejich vyjádření? Kurzy programovacích jazyků nebo systémového programování v dalších ročnících jsou určitě vhodnější k pojetí spletitostí systémového jazyka.

4.4  Python je neznámý

Někteří akademici mohou protestovat proti Pythonu jako prvnímu jazyku, protože není dostatečně známý. Skriptovací jazyky jsou však jednoduché a jakýkoli učitel informatiky dokáže Python zvládnout v několika dnech, ne-li hodinách. Troufnu si dokonce tvrdit, že po několika dnech pohrávání si s Pythonem bude mnoho lidí vyučujících C++ znát Python lépe. Jazyk C++ se vyvíjel během standardizace a značná část obsahu učebnic je zastaralá. Skuteční odborníci na C++ jsou relativně vzácní.

4.5  Naši studenti chtějí jazyk X

Studenti (nebo rodiče či zaměstnavatelé) již mají hotovou představu o tom, co by mělo být v osnovách. Nicméně nikdo by neměl tvrdit, že není v jeho nejlepším zájmu získat ty nejsolidnější možné základy v programování a návrhu. Jak již bylo zmíněno, začínat se skriptovacím jazykem neznamená zpomalovat studentův pokrok v učení se jazyku X (ať už je X cokoliv). Spíše to pomůže vychovat z nich lepší programátory v jakémkoliv jazyce, u kterého skončí. Když jsem představil Python ve vyšších ročnících, téměř všeobecná reakce byla „Proč jsme se tohle neučili jako první?“

4.6  Nejsou učebnice

Hlavní obtíží při výuce nestandardního jazyka v úvodních kurzech je nedostatek učebnic. Jedna z možností je použít učebnici nezávislou na jazyce a vyvinout doplňující příklady za použití dostupných příruček jazyka Python. Co je však skutečně třeba, jsou průkopníci, kteří budou vyučovat ve vstupních kurzech skriptovací jazyky a z jejich poznámek pak vytvořit učebnici. Do hlubin jazyka Java se ponořilo množství vyučujících předtím, než zde byly učebnice; výsledkem toho je mnoho nových učebnic Javy, které nyní přicházejí na trh.

Tato stať je výzvou pro ty, kteří zvažují přechod k Javě. Pokud můžete změnit jazyk, zvažte důkladně své pohnutky. Pedagogické úvahy argumentují pro přechod od systémových jazyků ke skriptovacím a Python je velmi dobrá volba. Je však třeba pár odvážných duší, které se ponoří do Pythonu a vytvoří příslušné materiály. Snad i některý ze současných autorů dojde k tomuto přesvědčení a zpracuje existující populární učebnice pro jazyk Python.

4.7  A co Scheme?

Pro ty, kteří v úvodním kurzu používali Scheme, není volání po jednoduchém prvním jazyce ničím novým. Jazyk Scheme má mnoho vlastností společných se skriptovacími jazyky – je malý, dynamický a interaktivní. (Ve skutečnosti se často jako skriptovací jazyk používá.) Scheme je dobrá volba pro první jazyk, protože je jednoduchý a výkonný. Umožňuje probírat různá paradigmata programování a existuje několik velmi dobrých učebnic úvodního kurzu, které jej používají. Zdá se být ideální volbou.

Slabina jazyka Scheme je, že je vnímán jako okrajový jazyk, který je dosti odlišný od systémových jazyků, které se používají v osnovách všude jinde. To omezuje jeho popularitu v prvním kurzu. Python nabízí mnoho výhod jazyka Scheme, zatímco však stále zůstává podobný jazykům jako jsou C++, Java a Ada, čímž usnadňuje přechod pozdější přechod k nim. Těm, kteří by si přáli objevovat četná paradigmata programování v prvních kurzech, nabízí Python podporu funkcionálního stylu včetně funkcí prvního řádu (lze je přiřadit proměnným nebo předat jako parametry), konstruktů jako je map, apply, lambda nebo closure.

5  Závěr

Vznik nových skriptovacích jazyků jako jsou Python, Tcl a Perl jakožto důležitých nástrojů ve vývoji softwaru potenciálně znamená revoluční změnu programování počítačů. V současnosti jsou skriptovací jazyky v učebních plánech nedostatečně zastoupeny. Je to překvapující, neboť z pedagogického hlediska se skriptovací jazyky ukazují být ideálními pro druh programování, kterému se obvykle věnují úvodní kurzy.

Jednou z hlavních pouček, které se snažíme vštípit studentům, je používání vhodného nástroje pro daný úkol. Pokud ke mně přijde klient a potřebuje velice rychle vytvořit program, který nemá paměťové ani časové omezení a že jakmile bude dokončen, bude spuštěn jen několikrát, okamžitě mu navrhnu k implementaci skriptovací jazyk. Toto jsou přesně ty podmínky, ve kterých se objevuje programování v úvodních kurzech výpočetních techniky. Pokud existují skriptovací jazyky jako Python, které mají zároveň dobrou podporu modulárního a objektově orientovaného návrhu programu, neexistuje dobrý důvod je nepoužívat. Skriptovací jazyky jsou nejvhodnější nástroje pro naše úvodní kurzy. Současný nedostatek shody na jediném jazyce první volby se zdá být ideální chvílí na začátek přesunu ke skriptovacím jazykům. Zvažte využití jazyka Python ve vašich úvodních kurzech.

Literatura

V češtině



Valid HTML 4.01!