čtvrtek 5. března 2015

Dohadování s učitelem na programování je peklo

Měli jste někdy ve škole hodinu programování? Dohadovali jste se s vaším učitelem? Většinou to radši nezkoušejte, nedopadá to dobře.

Moje řešení je nejlepší!

Liší se to kus od kusu, ale většinou si učitelé myslí, že právě jejich řešení je nejlepší. A proč? Protože nelze objektivně zhodnotit, který kód je pro studijní účely lépe pochopitelný.

To mi tak připomíná jednu starší hodinu, když jsme psali 2 zanořené cykly, generující tabulku v podobě šachovnice. Určitě vás taky napadá mnoho špatných řešení a vězte nebo ne, je vysoce pravděpodobné, že právě to špatné řešení (a hlavně složité) vám bude jako studentovi předkládáno.

Elegance kódu

Mám rád krásný a elegantní kód, který je krátký a výstižný. Rád používám méně známé konstrukty, které jsou ale přímo šité na míru určitému typu problému. Nechci si připadat zajímavý, ale přijde mi takový přístup jako samozřejmost každého dobrého programátora. Tento postoj jsem si vybudoval během studia matematiky, kde je také dobré, když se najde krásné a elegantní řešení.

Jeden příklad za všechny:
Jak jednoduše v PHP zjistit, jestli je vyplněný formulář správně a všechny položky obsahují to, co mají?

Řešení učitele:

if ($jmeno == "") $error = 1;
elseif ($prijmeni == "") $error = 1;
elseif (strlen($heslo) > 4) $error = 1;
elseif ($pohlavi == "") $error = 1;
else { /* zpracování */ }

Mé řešení:

S ohledem na výkonnost a eleganci by se to celé dalo zapsat jako jedna podmínka na jednom řádku:

if ($jmeno && $prijmeni && $heslo[4] && $pohlavi) { ... }

Všimněte se použití funkce strlen() a mého načítání znaku jako pole. Pokud je řetězec delší, než 4 znaky, tak určitě musí existovat 5. znak, tedy index [4]. Takové volání je mnohem rychlejší, než jakákoli funkce, nebo jiná metoda.

Při pokusu o "reklamaci" a návrhu na lepší řešení jsem byl odbyt se slovy: "Pane Barášek, vaše řešení je sice správné, ale zkuste ho studentům vysvětlit. Mé řešení je více polopatické, protože je přesně vidět, co se kdy stane.".

A jak na toto lze reagovat? Jedině snad: "Fajn, stanu se učitelem a za pár let vám předvedu, jak snadné to bylo!".

To nezvládneš! Ale já vím, jak na to.

V prváku jsem se setkal s učitelem programování, který na to nahlížel úplně jiným způsobem. Jako učitele jsem ho měl rád (než odešel na jinou školu), protože na něm bylo vidět, že programování opravdu rozumí (nebo aspoň tak vypadal) a dokázal zodpovědět většinu mých dotazů (a to jsem si dával vážně záležet, aby otázka byla těžká a musel se zamyslet).

Při výkladu hovořil stylem, kterému většina třídy nerozuměla, ale mě se to líbilo. Poprvé v životě jsem se totiž na nucených hodinách programování také něco nového dozvěděl.

Horší to ale bylo v případě, když jsem po hodině přišel s nějakým teoretickým problémem, který bych rád vyřešil a žádal o případnou teoretickou radu, jak to udělat správně. Onehdy jsem přemýšlel nad tím, jak udělat matematický parser, který zvládne vyřešit základní matematické předpisy, využívající čísla, sčítání, odčítání, násobení a dělení.

Bylo mi oznámeno, že jako prvák (v té době) to nemohu absolutně zvládnout napsat a že na to jsou potřeba hluboké znalosti problematiky. Ale také jsem se dozvěděl, že se prý celý problém dá řešit za pomoci jednoho průběhu cyklu řetězcem (s tím zadaným příkladem) a pak jen vypsat řešení i přesto, že se mohou zanořovat závorky. Tehdy mi to přišlo nepochopitelné - ale později jsem si uvědomil, že měl vlastně pravdu - šlo to udělat taky pomocí rekurze.

Ve finále to dopadlo tak, že jsem si nakonec parser vymyslel a napsal sám. Dalo mi to sice hodně práce, ale dostal jsem se do stavu, kdy jsem pouze nekopíroval hotové řešení, ale vytvořil vlastní. Nebylo sice úplně ideální, ale zato jsem se na problém díval úplně jinou optikou a tak jsem nalezl způsob, kterým by to on (učitel) prý nikdy neřešil - ale fungovalo to.

Později (někdy na konci druháku) jsem za toto tomu učiteli poděkoval. Že mi poskytl možnost problém řešit samostatně a později konzultovat možnosti řešení. Škoda, že takových není víc.