Hlavní navigace

D. Crockford: JavaScript - The Good Parts (extrémní recenze)

13. 8. 2008 15:53 (aktualizováno) Martin Hassman

Dlouho očekávaná kniha, kterou napsal JavaScriptový guru Douglas Crockford z Yahoo!, vyšla letos na jaře. Pro koho je určena? Vyplatí se ji pořídit?

JavaScript – The Good Parts se od všech knih o JavaScriptu odlišuje. Soustředí se jen na základní syntaxi (žádný DOM a použití v prohlížečích), představuje JavaScript pokročilým programátorům a zcela subjektivně z pohledu autora.

O autorovi

Douglas Crockford pracuje jako Senior JavaScript architekt v Yahoo! a krom toho, že vymyslel JSON (JavaScript Object Notation) a vytvořil JSLint, pořádá i nádherné přednášky o JavaScriptu, na kterých se vyznává, jak moc JavaScript miluje a nenávidí zároveň. Schizofrenně extrémistický postoj (nachází se na obou protipólech zároveň) je typický jak pro Crockforda tak pro jeho knihu.

O knize

JavaScript – The Good Parts není o JavaScriptu, jen o podmnožině, o „dobrém“ JavaScriptu, který Crockford miluje. A nejspíš protože láska je slepá, jsem si nebyl jistý, zda mám špatný vkus já nebo autor. Jeho postoj jsem často nechápal. Název knihy je totiž marketingový podvod. Měla by se správně jmenovat „JavaScript podle Crockforda“ resp. „Které části JavaScriptu se líbí Douglasu Crockfordovi“.

Obsah knihy

Kniha je určena začátečníkům v JavaScriptu, kteří jsou zároveň alespoň středně pokročilými programátory. Pokud nejsou, odpadnou již v první kapitole o gramatice jazyka. Crockford je extrémně stručný, syntaxi nepopisuje slovy, ale železničními diagramy (jako jsou na json.org), což občas komplikuje srozumitelnost.

Následují kapitoly věnované objektům, funkcím, dědičnosti, polím, regulárním výrazům a přehledu metod základních objektů. Na závěr knihy jsou shrnuté ty „ošklivé“ části JavaScriptu (přílohy Awful Parts a Bad Parts), je představen JSLint a JSON.

Kapitoly o funkcích a dědičnosti jsou nejlepší z celé knihy. Crockford je rozebírá podobně jako Resig, ale má teoretičtější přístup a jde víc do hloubky. Zatím nejlépe, co jsem kdy četl. Naopak kapitola o regulárních výrazech je velmi špatná. Nejhorší představení regulárních výrazů, které znám. Nevěřím, že je někdo podle ní pochopí. Kniha obsahuje málo chyb (našel jsem jen tři!). Autor je extrémně pečlivý.

Co se Crockfordovi nelíbí

Crockford JavaScript ustavičně kritizuje. Ačkoliv s ním někdy souhlasím, většinou jeho přístup nehodlám následovat. Je totiž extrémista (neříkal jsem to už?) a dobré myšlenky dotahuje do extrémů. Podle poučky „globální proměnné jsou zlo“ do globálního prostoru povolí vložit jen 1 proměnnou (tedy objekt s celým programem) a nic víc. Na druhou stranu to, že vkládá funkce do prototypů veřejných objektů, kde konflikt také hrozí, mu nevadí.

Demonstruje příklad, ve kterém víceřádkový komentář /* … */ způsobí v JavaScriptu problém, což mu stačí, aby víceřádkový komentář odsoudil a doporučil nepoužívat. Ačkoliv zmíněný příklad je reálný, nikdy jsem se s problémem nesetkal.

Funkce místo obvyklého function k() { … } deklaruje zápisem var k = function() { … };. Vysvětlení „je důležité chápat, že funkce jsou hodnoty“ mě k používání méně ohrabané varianty nepřesvědčilo.

Crockfordovi se nelíbí ani operátory ++ a --, protože jsou nepřehledné, operátor new, protože na něj lze zapomenout, eval je zlo atd. Pokud chcete mít představu, jaký je ten Crockfordův osekaný „dobrý“ JavaScript, podívejte se na www.jslint.com, zvolte volby „Good parts“, „Assume a browser“ a zkuste tím prohnat nějaký používaný kód.

Dojmy

Knihu napsal skutečný odborník, ale je extrémně stručná a dosti nepedagogická. Příklady se občas odkazují na funkci, deklarovanou o několik stránek dříve, aniž by to bylo zmíněno. Proto se čte pomalu a stěží. Obsahuje zajímavé myšlenky, které nejsou zdůrazněny nebo zopakovány na koncích kapitol. Musíte se při čtení hodně soustředit, abyste vše našli. Spíše připomíná skripta k přednáškám než knihu.

Ačkoliv se staví do pozice „ukažme si, jak je to správně“, cituje často i ty „špatné“ příklady. A protože zakázané ovoce nejvíce chutná, tak se s nově naučenými triky můj JavaScriptový styl sice místy zlepší, ale zároveň i zhorší. Dříve by mne třeba vůbec nenapadlo, že lze prázdný řetězec použít jako klíč pole, ovšem po přečtení knihy mám dokonce chuť to někde použít. Kniha je totiž paradoxně tou nejlepší učebnicí „šedého“ JavaScriptu, jaká kdy byla napsána a Crockford je nepřekonatelným znalcem nekonzistencí a neočekávaných situací v JavaScriptu jako takovém (podobně jako Peter-Paul Koch je nepřekonatelným znalcem jemných nekonzistencí implementací v prohlížečích).

Mám ale pocit, že hlavním cílem knihy není ani tak naučit čtenáře JavaScript, jako propagovat autorův přístup k JavaScriptu. Možná zde Crockfordovi křivdím, ovšem citaci na obálce „If you develop sites or applications for the Web, this book is an absolute must“ již považuji za čistou lež. Kniha není určena pro dnešní převažující „uživatele“ JavaScriptu.

Crockford vs. Eich

Nelze přehlédnout autorův kritický postoj ke tvůrci JavaScriptu Brendanu Eichovi (Mozilla CEO). Ironie čiší z každé Crockfordovy zmínky o původu JavaScriptu, např. v úvodu najdeme: „Finally, thanks to Brendan Eich, the world's most misunderstood programming language designer, without whom this book would not have been necessary.“ Naopak Eich nedávno veřejně obvinil Crockforda ze lhaní.

Pokud bych věděl, že Crockford a Eich kdysi bydleli ve stejném městě, nic bych za to nedal, že v minulosti Eich přebral Crockfordovi přítelkyni nebo se s ní alespoň vyspal a Crockford se mu za to nyní mstí. Ať již je skutečnost jakákoliv, nikdo mi nevymluví, že něco velmi osobního a nevyřčeného mezi těmito dvěma pány je.

Závěr, komu je kniha určena

Jedná se o extrémní knihu, která není vhodná pro každého. Pro klasického webdesignera nebo pro začínajícího skriptaře, který chce oživit své stránky, tato kniha určitě není.

Naopak pro zkušeného programátora, který po letech programování dostal za úkol proniknout i do JavaScriptu, se může jednat o tu nejvhodnější knihu vůbec. Kniha nenaučí používání JavaScriptu na webu, ale v dnešní době knihoven à la jQuery bude přibývat programátorů, kteří se naučí jazyk, svou oblíbenou knihovnu a mají vystaráno. Možná to není dobře, ale takový je trend. A kniha jej následuje.

Dalším typickým čtenářem může být i středně pokročilý programátor v JavaScriptu, který se v něm chce zlepšit. Zejména pak v používání objektů a funkcionálního programování (nejlepší části knihy). Kniha je na svůj rozsah neobvykle drahá, je nutné zvážit, zda se vyplatí. Možná ano, možná ne.

Věřím, že se objeví i čtenáři, kteří budou knihu zbožňovat a Crockfordova pravidla považovat za svatá. Vzpomeňte si na to, až narazíte na: „Takhle to říkal Crockford!“

Pokud stále váháte, přečtěte si pár autorových článků o JavaScriptu a rozhodněte sami.

Informace o knize

Autor: Douglas Crockford

Název: JavaScript: The Good Parts (ukázky z knihy)
Jazyk: Angličtina
ISBN: 0–596–51774–8
Rozsah: 153 stran
Rok vydání: 2008
Vydal: O'Reilly, Yahoo! Press
Cena: 650,– u Shakes.cz, 565,– u Libris.cz, £18.50 + poštovné u Amazonu

Sdílet

  • 14. 7. 2008 11:28

    David Majda (neregistrovaný)

    "Crockford je extrémně stručný, syntaxi nepopisuje slovy, ale železničními diagramy (jako jsou na json.org), což občas komplikuje srozumitelnost."

    Pokud chceš relativně přesně popsat gramatiku jazyka srozumitelně lidem, co se nezabývají psaním parserů, jsou tyhle diagramy asi nejlepší forma. Myslím, že slovní popis nebo syntaxe založená na BNF by mátly mnohem víc. Pamatuju si na referenční příručku k Borland Delphi, kde byl jazyk popsán přesně takhle a bez problémů jsem to pochopil, byť jsem o parsování vůbec nic nevěděl (v prváku na gymplu).

    "Pokud bych věděl, že Crockford a Eich kdysi bydleli ve stejném městě, nic bych za to nedal, že v minulosti Eich přebral Crockfordovi přítelkyni nebo se s ní alespoň vyspal a Crockford se mu za to nyní mstí. Ať již je skutečnost jakákoliv, nikdo mi nevymluví, že něco velmi osobního a nevyřčeného mezi těmito dvěma pány je."

    Zajímavé je, že z toho, co jsem od Crockforda četl (většina jeho webu) a viděl (jeho přednášky o JS) jsem tenhle dojem nikdy neměl. Myslím že dobře ví, v jakých podmínkách byl JS navržen a implementován ("potřebujeme *něco* hotového nelépe už včera" - viz můj dávný spot http://www.majda.cz/zapisnik/?29 , kde je vidět, jak se do JS postupně dostávaly některé dnes naprosto klíčové vlastnosti) a že je malý zázrak, že JS vůbec je takový, jaký je.

    Asi bych za tím neviděl nic osobního, spíš jen Crockfordovu rozmrzelost nad tím, že JavaScript nevypadá tak, jak by si ho představoval on. Ono to asi naštve, když se tak masově rozšíří jazyk, který má hodně hodně blízko tvé představě o "dokonalém" jazyce, ale dojem kazí spousta "diletatntských chyb". Promarněná šance.

    Jinak při kritice Crockofra je třeba nezapomenout na to, že to byl on, kdo ty "good parts" JavaScriptu pro svět objevil a jako první o nich psal. Dlouhé roky se o funkcionálních a prototypově-objektových fíčurách jazyce běžně nevědělo a jeho web byl jediný (nebo alespoň jediný trochu známý), kde bylo ukázáno, jak hodně si je možné s JS hrát a přiohýbat ho. Crockford v JS viděl to, co mnozí jiní ne (Lisp :-). Já osobně jsem si teprve po pročtení jeho webu uvědomil, jak zajímavý a silný jazyk to prohlížeče mají a určitě nejsem jediný. V tomto smyslu (popularizátor pokročilých věcí v JS) na Crockofrda BTW Brendan Eich i odkazoval ze svého blogu.

  • 14. 7. 2008 11:29

    Karel (neregistrovaný)

    Co se týká "železničních" diagramů tak je pravda, že laikovi se hůře čtou, protože v malém množství elementů poskytují velké množství informací. Jakmile si na ně zvyknete nebo je dokonce začnete používat pro svoji práci, zamilujete si je. Krásné příklady, kde "pár čar vydá za tisíc slov" je SQL (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10002.htm#i2065646). Ostatně, jak byste tohle chtěli přepsat do slov? Jediné s čím bych souhlasil je, že použití "železničních" diagramů pro něco tak "komplexního" jako je JavaScript je trochu zbytečný luxus.

  • 14. 7. 2008 19:02

    c0stra (neregistrovaný)

    Musim rict, ze jak clanek, tak ukazky z knihy me dost zaujaly. Vypada to, ze konecne vysla kniha, ktera pekne vystihuje hlavni silu i slabiny JS. Hned uvod kapitoly o dedicnosti upozornuje na obskurni implementaci prototypicke dedicnosti. Misto opravdovych prototypu je tu podivna mezivrstva Function.prototype.
    Knihu si urcite poridim. Crockford je asi prvni clovek, ktery vzal do ruky vychovu programatoru JS. Myslim, ze prirucek k tomu, jak psat a pouzivat cykly a funkce je dost. Ale JavaScriptoveho programatora je potreba vzdelavat. Ukazat mu pokrocile moznosti, principy dedicnosti, viditelnosti promennych, atd. a tahle kniha vypada, ze jde tim smerem. To je krasne videt i na ukazce deklarace funkci
    function k() {...}
    var k = function() { ... };
    Co je to zasadni, co tim chce autor rict? "Uvedom si, ze funkce je objekt a 'k' je jen reference. A podle toho s ni nakladej. Treba za behu ji prirad jinou funkci, a mas stavovy polymorfismus, ktery se v jinych jazycich slozite nahrazuje navrhovym vzorem State".

    "Pro klasického webdesignera nebo pro začínajícího skriptaře, který chce oživit své stránky, tato kniha určitě není."
    Tito lide jsou prave ti, kteri javascript spatne pouzivaji. Je jasne, ze s touto knihou nemuzou zacit, ale meli by se ji, nebo nejakou podobnou, zacit ridit hned jak se nauci zaklady programovani, at pak nemame internet plny bastlu jako jQuery, lightbox apod.

  • 14. 7. 2008 20:54

    Martin Hassman (neregistrovaný)

    c0stra: já si říkal, že se určitě ozveš 8-)

    S jQuery a spol. je to tak, že se jedná o nejsnazší řešení. Ani ne nejlepší, ani ne nejrychlejší, ale nejsnazší. A lidé obvykle volí nejsnazší řešení. Zatím o jQuery nikdo pořádně moc neví (ta hrstka poučených je stále menšina), nikdo to neučí. Ale jakmile se rozletí pár knížek (některé už vyšly!), vydá se pár tutoriálů, začne se to servírovat začátečníkům a tyhle knihovny skutečně zaplaví Web, ať se nám to líbí nebo ne.

    BTW Používáš JavaScript k něčemu, co je reálně vidět někde na Webu? Rád bych se podíval, jak kóduje Crockfordův fanoušek (můžu-li tě tak nazvat 8-).

  • 14. 7. 2008 21:07

    Martin Hassman (neregistrovaný)

    MikRom: Ve srovnání s podobnými knihami podobného rozsahu je skutečně drahá, kurz dolaru na tom nic nezmění.

  • 14. 7. 2008 23:38

    karf (neregistrovaný)

    [3] Nazvat jQuery bastlem je trochu silná káva. Právě jQuery je špičkovou ukázkou pokročilého využití JavaScriptu s důrazem na jeho funkcionální vlastnosti. Jinak s názorem na Crockforda se plně ztotožňuju, taky jsem se učil z jeho materiálů.

    [4] "Zatím o jQuery nikdo pořádně moc neví" - Pardon? jQuery už dávno patří mezi nejpoužívanější JS knihovny vůbec. Tahle věta platila tak před dvěma lety.

  • 15. 7. 2008 7:25

    Martin Hassman (neregistrovaný)

    karf: Vítám tu zástupce oné poučené menšiny! (Pokud je nějaká knihovna nejpoužívanější, nijak to neznamená, že ji zná a používá většina. Většina z webkodérů, kteří čtou tenhle blogu asi ano, ale i to je jen malá kapka v moři.)

  • 15. 7. 2008 8:39

    David Majda (neregistrovaný)

    [8] Martine, ten tvůj odstavec o JQuery v [4] je opravdu out-of-date.

    Troufnu si říct, že nějaký JavaScriptový framework dneska používá drtivá většina lidí, co píšou něco složitějšího v JS. Určitě neplatí, že "o jQuery nikdo pořádně moc neví" (ví o ní prakticky všichni lidé, co píší JS jiným stylem než copy-paste z ukázek na webu). Různých tutoriálů a návodů na netu najdeš dost - od praktických "how to..." po ty, co to berou od základů a vysvětlují funkcionální přístup JQeury.

    "tyhle knihovny skutečně zaplaví Web" - to už se před nějakou dobou stalo. Pokud dnes někdo při psaní víc jak několika řádků JS nepoužije nějaký framework, tak je IMO pravděpodobnější, že pro to má konkrétní důvody (technické či jiné), než že by o té možnosti nevěděl.

  • 15. 7. 2008 8:57

    Martin Hassman (neregistrovaný)

    David: distortion field? Dokud se tenhle knihovní přístup nezačne učit jako default (a to bude), tak se o většinu jednat nebude. Když nakouknu do diskusních fór, vidím, jak se lidi s jQuery seznamují, řeší základní věci, teprve ji objevují. Málo návodů v češtině (řada kodérů pořád anglicky dobře neumí). Za rok, dva to bude o něčem jiném. Ale teprve to přijde.

  • 15. 7. 2008 9:28

    karf (neregistrovaný)

    Jo takhle, no tak většina webkodérů jistě ne :). Ale ti, co se o JS nějak aktivně zajímají, nemohli na jQuery (a pro Prototype to platí taky) nenarazit. Ale možná žiju v nějaké iluzi, protože mám fakt pocit že zrovna jQuery už web zaplavila (minimálně jako součást různých lightboxů apod.).

    Abych jen nerýpal - ta recenze je moc pěkně napsaná, díky za ni.

  • 15. 7. 2008 9:59

    Martin Hassman (neregistrovaný)

    karf: Ano, většina kodérů nesleduje aktivně novinky, neaplikuje trendy a žijí z toho, co se naučili ve škole nebo co jim ukázali kolegové. Samotného by mě zajímala nějaké čísla (odhady), o jak velkou část programátorské populace se může jednat.
    Jsem rád, pokud recenze k něčemu byla.

  • 15. 7. 2008 23:50

    c0stra (neregistrovaný)

    ad jQuery: "o jQuery nikdo pořádně moc neví" - to je prave ten problem. Kazdy vi, ze jQuery existuje, ze se jednoduse pouziva, a tak ji zvoli pro svoje potreby. Proto nam zaplavuje web. Ale malokdo uz vi, jak je efektivni, jake ma nevyhody a bugy. Neefektivni prochazeni celeho DOMDocumentu je prvni vec, ale horsi jsou nekonecne cykly zpusobene treba jen tim, ze odstranite nejaky element. Na aplikace, kde potrebujete realtime odezvy, je neco podobneho nepouzitelne. To nemluvim o nesvarech vetsiny dalsich knihoven, a to prave naprosto neefektivni psani kodu = spatne pouzivani JavaScriptu.

    Martin Hassman: To mas tak, v praxi clovek vetsinou pracuje v tymu, a dela na vecech, ktere uz jsou rozpracovane, a je nucen pokracovat v tom, co dostal, a jen malokdy ma sanci prosadit "JavaScript - the Good Parts" ;) proto jsem si tolik "uzil" a tolik mi nesedi zminovane knihovny, a proto take malo kodu, ktery prosel myma rukama, vypada tak, jak bych si predstavoval. Tak jen asi tyto dve ukazky:
    http://www.gambrinus.cz/microsite/uneseni/_js/i4ajax.js + http://www.gambrinus.cz/microsite/uneseni/_js/vote.js jsou pouzity na nektere Ajax requesty v http://www.gambrinus.cz/uneseni/
    a tahle starsi semestralni prace:
    http://moon.felk.cvut.cz/~fischeo1/PJ/

    Za Crockfordova fanouska se spis nepovazuji, on je az moc velky extremista. Odmitat veci jako operator 'new' uz je trochu moc. Bez nej clovek prijde o dedicnost tak jak byla v JS navrzena (i kdyz se da nahradit jinymi zpusoby), a o vztah rodic potomek pro operator instanceof. Podle me je zbytecne z JS delat pomoci knihoven neco jineho. Napr. Base ci Prototype ho priblizuji k beznejsim a vetsine programatoru srozumitelnejsim jazykum. Podle me staci ho spravne uchopit.

    Zaverem bych chtel take clanek pochvalit. Sice dost veci vidim presne obracene :) ale to je otazka nazoru. Recenze je to kvalitni a rozhodne prispiva k zviditelneni JavaScriptu jako aplikacni technologie a ne jen jako okrajove hracky pro nepotrebne efekty.

  • 17. 7. 2008 21:41

    Pavel Tisnovsky (neregistrovaný)

    [12] zrovna u JS (a snad ještě u PHP) je situace dost žalostná - po síti se povaluje spousta příkladů různé kvality a mnoho webů vzniklo právě slepením fragmentů kódu. To jak programátor napsal svůj kód lze poznat docela jednoduše: stačí si vyžádat nějakou (třeba i triviální) změnu v logice programu; u špatně napsaného (slepeného) programu to bude trvat dost dlouho, mnohdy to dokonce autor vzdá, rozumě navržená aplikace je mnohem lépe a také rychleji měnitelná.

    Osobně se nepovažuji za opravdu dobrého programátora, ale některé konstrukce, co jsem viděl v komerčních kódech, jsou docela hrozné.

  • 18. 7. 2008 22:31

    WD (neregistrovaný)

    V ecma specifikacii sa pise ze bez operatora new sa vytvori napr u premennej typu string iba "primitivny" string, nie objekt. celkom by ma zaujimal aky je rozdiel ked sa to viacmenej stale sprava ako objekt.
    ku knizke. vyzera zaujimavo :) skor by ma zaujimal styl kodenia a triky. zatial som najlepsie vysvetlenu gramatiku videl v ecma spec.
    Nie su to nahodou Conwayove diagramy?

  • 19. 7. 2008 7:28

    Martin Hassman (neregistrovaný)

    WD: Tady půjde o slovíčkaření. String "x" je v JavaScriptu objekt a má své metody, byť typem zůstává string. Naopak new String("x") je typem object (byť má v zásadě stejné metody jako string 8-)

    Srovnej:
    http://tinyurl.com/stringpresnew
    http://tinyurl.com/stringjednoduse

    Kromě rozdílu v příkladu by se možná našly další jemné rozdíly (např. v dědičnosti, pokud by ji člověk využíval), ale nenapadá mne nic praktického.

  • 23. 7. 2008 11:53

    Jakub Vrána (neregistrovaný)

    Mohl bys prosím uvést ten příklad, kdy /* */ způsobí problém?

  • 28. 7. 2008 21:13

    Martin Hassman (neregistrovaný)

    Jakube, jedná se o regexpové literály, např. tuhle řádku do víceřádkového komentáře nevložíš (způsobí syntax error):

    var isHx = /<h*/.test("<h1");