うさぎともふもふしたりうさぎともっふもっふしたり。プログラミングしたり。
2011-09-30
パーフェクトJavaScriptはガチ本。クソと言われる言語仕様をまとめあげた良書
執筆した井上誠一郎氏ら共著者に敬服。お疲れさまでした。
パーフェクトJavaScript (PERFECT SERIES 4) 
言語仕様のpart2(2〜7章)まで読みました。その後はパラパラっと流し読み。まずは言語仕様までの内容について雑感を述べます。
JSには既にサイ本と呼ばれるバイブルが存在しますが、サイ本は「仕様を淡々と解説している本」といった印象を持っています。対してパーフェクトJavaScriptは「仕様における用語を整理し、分かりやすくまとめて解説している本」といった印象でした。そして表紙がダサいです。ガラケーがのってます。サイ本に対してガラケー本といったところでしょうか。・・・って不名誉な名称だからやめとこうと思いましたが、パーフェクトJavaScriptと長いのでやっぱり使います。
対象読者
入門書ではないと「はじめに」で言い切っています。対象読者についてもそのページで言及されていますが、
- JSの入門書を読んだことがあって、よりJSの本質を知りたい人
- JSを触っているけれど知識があやふやで不安な人
- 他言語の知識を元になんとなくJSを触っている人
- JSができれば勝つると思っている人
などが対象とされています。あとJavaと比較しているケースがいくつか見られますので、Javaと共に毎日を地獄の輪舞曲してる人は読みやすいかも。
それから、プログラミング未経験者でもわかるつもりで書いたと述べられていますが、個人的にはおすすめしません。
誰もがそういうわけではないのではっきりいえませんが、とはいえ、私なら未経験で読んだら挫折します。たぶん「詳しすぎて情報が多い」とか方向性のおかしいこと思っちゃいます。自分のふがいなさに頭抱えます。たぶん。
しかし、この1冊で質のよい体系的な知識を身につけられると思うので、入門書の次の次ぐらいに必読書としておすすめしたいです。あるいは、未経験者であればJSをやめてPythonをおすすめします。むしろPythonが良いです。そうだ、Pythonの話をしよう。
Pythonをプログラミング初心者にすすめたい1000の理由
1〜999省略。
1000個目の理由→結局のところ私はPythonが好きだから
話し戻す
言語経験者はどうなのかというと、入門書は表面的で内容が薄いから読みたくない、かといって日本語訳のサイ本5版みたいにびっちりな文章も嫌だという人にはちょうど良いかと思います。
言語仕様(Part2)の概要
簡単に言うと日本語訳のサイ本5版における言語仕様の内容をスリムにしてまとめたといったところ。JSの言語仕様にあたるEcmaScript 3(ES3)からEcmaScript 5(ES5)を体系的に解説がなされています。今までのJSとこれからのJSにおける言語仕様が述べられているわけですね。
この手の言語仕様を解説しているJS本はだいたいES3が中心です。しかも、サイ本をのぞくとほぼ入門書に偏るはずです。入門書は売りやすいですからね。でも入門書は言語仕様というか「こんなのがあるよ、あんなことができるよ」みたいなとにかくやってみれ的な内容ばかりなので、経験者はそういった本は読みたくないはず。知りたいことはもっとつっこんだ部分でしょう。
そういった書籍が出回っているなかで、ガラケー本はES3だけではなく、ES5も含めた仕様を体系的にまとめて解説した書籍です。他の書籍と比べると立ち位置的にも貴重ですし、ES5も含めた言語仕様の解説をしている書籍は日本語で初かもしれません。外国語であればサイ本6版がありますけど。というかそれ以外にありそうですけど。
本書はES3とES5をなるべく忠実に解説するため用語に配慮しつつ、それぞれ分かりやすいようにまとめられていると思われます。さらに関連する定石的なテクニックも細かく記述されているので、たとえば配列のコピーであるとか、型変換の方法など地味に重要なのに入門書が全くカバーしてない部分をおさえているのが良いです。
もう少しつっこんだテクニックはオライリーから出てるいくつかの書籍を読むことになると思いますが、ガラケー本でも基本的な部分は把握できるので十分かなと。
このように内容についてはサイ本をスリムに読みやすくしたものと言えます。入門書とか指南書ではなく、小奇麗に仕様書を解説している感じ。
サイ本5版との比較
比較するとなるとサイ本と同じ系統なので、日本語訳のサイ本5版になります。ただし、言語仕様の部分だけです。クライアントサイドについてはまた違いますので。
情報量に関してはサイ本が多いと思いますが、サンプルコードと文章に偏りがあって、あるページにはみっちり文章だけでコードが1つも出てこないっといったページがあったと思います。「そこはコードで説明してくれよ」って何度も思った覚えがありますね。
それから専門用語が矢のごとく飛んできます。これは言語覚えたての人であればきつい。用語とは意味や概念を含む重要なものなので、このように読者に依存する文章だと用語に対する前提知識が無ければ置いてけぼりになるでしょう。
それに気づかないと、理解した気にる現象が起きます。困ります。
ガラケー本でも用語については入門書ではないためそういった傾向は見受けられますが、バランスよく文章とサンプルコードが記述されているのでそこがサイ本と違って良い部分ですね。
仕様についてはサイ本は忠実です。そして、ガラケー本も仕様を忠実に伝えようという著者の意思が感じれられました。
だいたいの書籍だと伝わりやすさを優先するため、独自の用語を用意したり便宜的な用語を利用することが見受けられるのですが、本書ではそういった場合に注意書きがなされていますので、本質にそった知識を得ることができるのではないでしょうか。
それから、どうもサイ本を参考にしてる部分がいくつか見受けられるような気がします。憶測ですけど。
たとえば、コアオブジェクトにたいしてもクラスといった表現(実際はオブジェクトであるという前提を書いて)を選択しています。
JSを扱っている人からするとクラスだどう!?とムッとするようなことかもしれませんが、サイ本でもArrayクラスとか書いてたりしてるんで(これもオブジェクトであるみたいなことはいってたと思うけど)、そこら辺に合わせたのかなあと思います。
既存のJS書籍との大きな違い
2つ挙げます。
- JSにおける基本をほぼまとめている
- 言語仕様におけるそれぞれの要素で基本的なテクニックと、はまりどころや注意点など一緒にまとまっている。基本ならこの1冊でほぼ事たる
- 用語を整理している
- ものすごく大事
特に用語は大切。技術本において用語は軽視されている印象が強いです。入門書でも平気でオブジェクトという言葉が突然使われているケースもあります。
それが悪いわけではありませんが、たとえば、オブジェクトという言葉は文脈によって違う意味合いを持ちます。インスタンスとしてのオブジェクトなのか、連想配列としてのオブジェクトなのか、あるいは関数のオブジェクトなのか。
実体であるという根本的な概念は同じなので抽象的に表記しても問題ありませんが、表面的な操作が異なりますので、そこを読者が最初から区別できるかが微妙なんですね。
なので、こういった言葉は入門的な内容であればあるほど丁寧に扱わなければなりません。前後の文脈を読む知識がないと言葉のイメージが頭に思い浮かばないからです。
そんなの知るかよ勝手に判断できるようになれよと思っちゃうものですが、学術的価値はともかく用語を整理することは後発の学習者にとって大事です。
これからの人たちの学習経路のために、そういった知識のゆれを取り除き従来よりもスムーズに学習できるようになるためにです。
このような意味で本書は既存のJS書籍から頭ひとつ抜けています。それほど細く徹底して用語に敏感でした。すばらしいです。ひとつひとつの用語をイチから解説するような入門レベルではないのであれですが、入門してから次のステップに本書は最適です。
読んでガッカリしそうな人
求めていることは人それぞれ違うから仕方がない。いくつか想像して挙げてみます。
- 新しいこと、先進的なことを求めている人
- 既にES5まで手を広げている人には言語仕様のPartは新しい発見はそうないと思う。クライアントサイドのPartは別だけど
- プログラミングの入門的なことを期待している人
- 私がプログラミング未経験者のとき読んだたらたぶんガラケー本をジャイアントスイングして室伏シャウトする
- まったくの主観だからあれだけどサンプルコードで意味は理解できても用語が難しい。用語気にならねえよって人はいけるけど、そもそも本書における言語仕様のPartの役割は概念と用語を正確に結びつけるためのものだと思う
- JSをある程度理解している人
- 冗長だと感じるかも。文章はいいからコードで説明しろよって思っちゃう人とか
- でも知識が断片的であったり不安を覚えている人で、正しい概念とその用語を習得したいってときには便利
- 何か1つアプリを作ることを期待している人
- 得た知識によってアプリを作ることはできるかもしれないけれど、イチから作り方を指導してくれるものではないです
- 文章読みたくない人
- 言語経験者なら最速文法マスターみたいな記事で十分ですが、本書はそういった操作だけじゃなくて、本質的な概念を理解しようってスタンスの書籍なんですね。サイ本以外だとそういうの見かけていないので貴重
- good partsやJSパターンのような内容を期待している人(※追記)
- 言語仕様のPartはそういうものじゃないです。それらのテクニックの基礎となる文法とか概念とかです
- Opera最強伝説人(※追記)
- そういえば対象になかたよ。でも知ってる。最強だよ
- ES3とES5の区別をしたい人(※追記)
- これは区別してなかったような気がする。でも本書はする必要もないと思う
- お嫁さんor旦那さんが欲しい人
- Pythonをおすすめします
7章以降について
実践的な内容に入っていきます。言語仕様に興味がない人はここが気になると思いますが。
パラパラっと読んだ限りでは細かいところまで言及されており、まとまっている印象を受けました。というかHTML5やNode(node.js)は私が知らないことばっかりだったのでありがたいです。適当に箇条で感想書きます。
- DOM
- 基本は抑えられているので十分かと。Selectors APIやElement Traversal APIなども紹介されてる
- Event
- Level 2やLevel 3を表としてカテゴリ別にまとめてある。イベントドリブンなのだからイベント大事。でもだいたいさらっと流すことが多い書籍ばかりでいつもげんなりしてたけど、本書ではそんなことないのでよかった。仕様書がWebに云々ではなくこうして書籍でまとめているという点が重要
- ついでに独自実装のイベントサポート表とか→Events in JavaScript
- ついでに仕様→Document Object Model Events、Document Object Model (DOM) Level 3 Events Specification
- スタイル
- 著者がこの分野は重要性が無いと判断したのかあっさり。JSでCSSをこねくり回すことはそうやらないからこれぐらいで十分なのでしょう
- JSによるCSS周りの操作は羽田野さんの標準DOMスクリプティング JavaScript+DOMによるWebアプリデザインの基礎 がおすすめ。CSS周りに関しては実践的に扱わない知識かもしれないのと、結局私は使う機会がないのでほぼ忘れたw
- 関係ないけど山田 祥寛さんと羽田野 太巳さんの書籍なかったら私は腐ってました。感謝してます
- AJax
- iframeハックやpostMessageまで記述されていたので、スタイルと違って置きにいった感じしますな。この辺は名前程度の知識しかないので個人的にありがたい
- ライブラリ
- jQueryの解説。Deferredが扱われていたのでこの辺すっぽかしている私としてはうれしいけれど、全体的には流して紹介しているといった具合。普段から扱っている人はつまんねっていうレベルかも。既存の書籍がいくつかあるから本書ではこれぐらいでいいかとは思う
ここからHTML5に関連する内容とWeb APIとNodeといった流れ。
HTML5についてはバズワード化してんじゃねえかと言及しています。W3Cがあの状態だしどうやって扱えばいいか困ったものですが。
WebSocketやHTML Canvas 2D ContextやWeb Workersなども同じ文脈で語られていていますし、それがHTML5であるというのが一般的?になっちゃってるような風潮でもありますからね。
それにこんなLogoがあるし・・・。それぞれ何を意味してるか図を見ても私はわからないです。

ガラケー本ではHTML5の定義について配慮しつつ以下のように扱うことにしています。
最近ではネイティブアプリケーションでできることをブラウザ上で実現するための機能拡張が非常に盛んで、本書ではこれらのブラウザ機能拡張をまとめてHTML5と呼んでいます。
こうする方が言葉を扱いやすいので普通だと思いますが、正しい定義についてこちらのスライドで学習しておくといいかも。
自分もHTML5の文脈でCSS3だのCanvasだのひどいこと言ってたりするし、それが楽だったりしてあれなのですが気をつけたいです。残りのWeb APIとNodeについてはほとんど触ったことがないのでなんとも言えません。これを機会に学習させていただきます。
というわけで後半はJS関連の要所を網羅した感じ。Nodeの章は気合入ってる気がした。
さいご
そんなわけで、ガラケー本は用語を整理しているという点で私は後発の人間にとって良書だと思っているんですが、この界隈だと一般的にはそういった部分は重視していない風潮も分かってます。
特にプログラマの人はそういったことが気にならないのでしょうし、そこに価値なんてないと思われているかもしれません。私はあると思ってるんですけど、そう思う気持ちがわからないわけではないです。
少数派かもしれませんが、言葉に含まれる意味や概念を突き詰めてしまうという人であれば、ガラケー本は良書であると感じられるでしょう。逆にそんなのどうでもいいしコードで全部分かる、という人であれば損をした気分になるかもしれません。
私が読んだ限りでは、言語仕様のPartのターゲットは、
- 他言語の経験者で、これからJSを触ろうと思っている人
- 仕様に忠実な意味や概念を求めている人
- 自分の知識に不安な人
といった方々に絞られそうです。プログラミング未経験者は除いておきます。
用語を徹底して整理しているという部分に焦点を当てるとプログラミング未経験者でも大丈夫かなと思う反面、たとえば、ガラケー本では丁寧にリテラル表記という用語の意味を解説してくださっている節があるのですが、はたしてリテラル表記という用語を未経験者がその解説で理解できるのか疑問に思います。
これは解説そのものが悪いと言いたいのではなくて。
たとえば、具体的な日常において文字や数字と言われる対象を目視した瞬間、その1次元で表現されたものにたいして無意識に意味を求めるクセがついてますよね。
AとかBとか0といったものを見たら反射的に意味を持った文字や数字として認識してしまうため、これらは単に点や線の集合に意味付けされた記号であると抽象的に捉える機会があまりないでしょう。
もちろん日常でそんなことを毎回意識していたら面倒なんですけど、そういった抽象的思考を、ある意味人間としてはごく自然な思考を現代はぶっとばして生きているので、リテラル表記の解説にしても、varという言語規則もval0という識別子も'foo'という文字列も、テキストエディタ上において全て「文字列」としてしか認識できないのではないかなと。
もしそうであるならば、じゃあリテラルってなんだよ、実行時にその値のまま意味を持つものってなんだよと混乱してしまわないかと思うわけですが。
しかしながら、このように未経験者が認識しなければプログラミングできないのかといえば別にそうでもなくて、もしかしたらすんなり受け入れられるかもしれないし、そもそもわからないならスルーしちゃってもだいたい問題のないことだろうし、それなら私は一体何を考えていたのだろうと切なくなってきたので終わり・・・(´・ω・`)
とりあえず良い書籍が良いタイミングで出てきたのではないかなと思っております。
著者の方々の意思を正しく解釈できていないかもしれませんが、私なりに思ったことを書いた次第です。技術的な面での評価はそもそもできる知識がないんで見逃してください。こういう性分みたいです。私は。残念ながら。
それでは、おつかれさまでした。識者の方々の評価がどうか分かりませんが、私にとってはとても素晴らしい書籍でございます。うれしかったです。もっと早く出会っていたかったなと思う次第でございました。
- Twitter / @waigania13
- Twitter / @honjo2
- Twitter / @meusonho41
- Twitter / @tanaka_733
- Twitter / @fre_oik
- Twitter / @eldesh
- Twitter / @tamosann_viggen
- Twitter / @gocho
- Twitter / @cpp_akira
- Twitter / @yutuki_r
- Twitter / @0x22F1
- Twitter / @tana_co
- Twitter / @tajima_taso
- Twitter / @hiroyukim
- Twitter / @tatsuoSakurai
- Twitter / @junya
- Twitter / @tsubame959
- Twitter / @inteltweetcity
- Twitter / @saruto
- Twitter / @969ma3
- Twitter / @iwakou
- Twitter / @tyoshii716
- Twitter / @toilet_lunch
- Twitter / @y_isogai
- Twitter / @manzyun
- Twitter / @gattineri
- Twitter / @meymao
- Twitter / @guratora
- Twitter / @editorialengine
- Twitter / @water_resistant
- Twitter / @mikky3
- Twitter / @ichiro_j
- Twitter / @foooomio
- Twitter / @akase244
- Twitter / @teitei_tk
- 2640 http://b.hatena.ne.jp/
- 1654 http://search.yahoo.co.jp/search?p=栗きんとんの作り方&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=5&oq=くりき
- 1410 http://pipes.yahoo.com/pipes/pipe.info?_id=7ed2910a6358c42a7305fae463b19704
- 1158 http://b.hatena.ne.jp/hotentry
- 908 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&container=ig&view=default&lang=ja&country=US&sanitize=0&v=ac8fdbe465718b2e&parent=http://www.google.com&
- 844 http://b.hatena.ne.jp/hotentry/it
- 441 http://t.co/fxq6hAVG
- 415 http://reader.livedoor.com/reader/
- 265 http://phpspot.org/blog/archives/2011/09/2011930.html
- 242 http://www.sleipnirstart.com/
