イベント登録数1,965

QCon Tokyo 2013 Keynote 1 プログラミング・スタイルと私たちの脳

プログラムは完璧でなければならないが、人は完璧ではない~QCon Tokyo 2013レポート
2013/6/12 TIS株式会社 松井暢之  QCon Tokyo 2013最初のKeynoteでは、JavaScriptの第一人者であるDouglas Crockford氏が講演した。  Crockford氏は「JSON」を発見し世に広めた人物として知られており、Yahoo!やPayPalのシニアJavaScriptアーキテクトを歴任している。またJavaScriptの構文チェック&品質改善ツールである「JSLint」の作者兼メンテナとして、および書籍『JavaScript: The Good Parts』の著者として、「良いJavaScript」を書くためのプラクティスをプログラマに発信し続けている。  本講演でCrockford氏は、「Programming Style & your Brain」というテーマで「プログラミングスタイルと我々の思考プロセス」および「エラーを未然に防ぐプログラミングスタイル」について語った。 THINKING, FAST and SLOW  『THINKING, FAST and SLOW』とは、2002年にノーベル経済学賞を受賞した心理学者兼行動経済学者であるDaniel Kahneman博士の著書のタイトルである。  Kahneman博士は、この著書で「人の思考プロセスは直観的で迅速な“SYSTEM 1”と、ハイレベルな演算を行う遅い“SYSTEM 2”で成り立っており、人は基本的に直観ベースのSYSTEM 1で物事を認知するため、労力を掛けず迅速な処理が行えるが、直観はしばしば判断の誤りを引き起こしてしまう」ため、「『人は合理的な行動を取るはず』という、これまでの経済学者の仮定は誤りで、人の思考にバイアスが掛かるのは不可避である」と記している。  Crockford氏は、このKahneman博士の著書を引用し、錯視図形やタバコの広告宣伝における認知バイアスを例に挙げ、完璧なプログラムを作成することの困難さを説いた。  「プログラムは完璧でなければならないが、たとえ全てのテストが通ったのだとしても、完璧であることを証明することは原理上できない。結局、プログラマは理性(HEAD=SYSTEM 2)だけではなく直観(GUT=SYSTEM 1)も用いることで、『これで正しいハズ』という判断を行ってプログラミングをしている。そのため、『直観によるバイアス』に起因するエラーの混入は不可避なのだ」(Crockford氏)  その「直観によるバイアス」によるエラー混入の具体例として、Crockford氏は「優れた部分も多いが、歴史的な経緯もありエラーを混入させやすい悪い部分も多く残っている言語」であるJavaScriptを例にして、具体例を出しながら解説を続ける。 警告:JSLintはあなたの感情を傷つけるでしょう  Crockford氏が提供しているJSLintは、JavaScriptからエラーを引き起こしやすい悪い部分を取り除いた「プロフェッショナルなサブセット」を定義するものである。JSLintのプログラミングスタイルに対するチェックルールは厳しく、「指摘が多過ぎる! 正しく動くのに、エラーと言われるとは!」と嘆く声もよく聞く、とCrockford氏は述べている。  実際JSLintのチェックルールの解説ページの冒頭に、「Warning: JSLint will hurt your feelings.」という言葉が記されているほどだ。 JSLint: The JavaScript Code Quality Tool via kwout  ちなみに、JSLintの厳しいチェックルールに反する声も多く、JSLintに反発して開発された「JSHint」の作者Anton Kovalyov氏も、そのブログで辛辣なコメントを述べている。 JavaScriptにおけるプログラミングスタイルに起因するエラーの例  では、なぜプログラミングスタイルに対する厳しいチェックルールが必要なのだろうか。ここでCrockford氏は、具体的な例を提示する。  例えば、下記のような中括弧の位置は、多くの言語ではプログラミングスタイルの違いでしかない。どちらが正しいという根拠もなく、プログラマ全員が同じスタイルでプログラミングするならどちらでも構わない。 パターンA block { ... } パターンB block { ... }  しかし、ことJavaScriptにおいては、パターンBが正しいと断言できる。これはパターンAのプログラミングスタイルで記述した際、文末にセミコロンを自動補完するJavaScriptの機能により、直観的に期待する振る舞いとは異なる挙動を示す場合があるからだ。  例えば下記のような、「{ok:true}」というオブジェクトリテラルを返すことを意図したプログラムをパターンA、パターンBそれぞれのプログラミングスタイルで記述する。 パターンA return { ok: true }; パターンB return { ok: true };  パターンBは意図通りにオブジェクトリテラルが返るが、パターンAの場合は文末にセミコロンが自動補完されて以下のように解釈され、オブジェクトリテラルではなくundefinedが返される。 return; { // 到達不能なブロック ok: true; // okというラベル付きの文 }; // ブロックの次に、セミコロンしかない空白の文  これはJavaScriptの文法としては正しいため、実行時エラーにならず、解決が困難な深刻なエラーを引き起こす。  Crockford氏は次に、case文のfallthroughを例に取り、Crockford氏自身が陥った直観が引き起こすエラーを紹介した。「当初のJSLintでは、case文から次のcase文に流れ落ちる(fallthrough)プログラミングスタイルが許容されていた。その方が、文に流れができ、エレガントだと思ったからだ。しかしJSLint自身が、このfallthroughの問題に起因するエラーを引き起こしてしまった」(Crockford氏)  さらにCrockford氏は、「エレガントだと思った直観は間違っていた。“めったに起きない”は、“発生する”の別表現にすぎない」と述懐した。  実際、現在のJSLintでは、「switchのcase文の最後(=次のcaseやdefaultの直前)には、break かreturnかthrow文が期待される」というルールが設けられている。  Crockford氏は上記以外にも、with文が引き起こす混乱やブロックスコープの欠如による変数スコープの問題など、エラーを引き起こしかねないプログラミングスタイルを具体例を挙げて解説し、「エラーの混入を防止し、プログラマ同士がプログラムの意図を誤解せず理解できるプログラミングスタイルの適用」について強く主張した。 Bad stylistsの4つの類型  エラーを避けやすく理解しやすい「良い」プログラミングスタイルを採用すれば多大なメリットが得られる一方で、「悪い」プログラミングスタイルでコーディングする人(=Bad stylists)も居なくならない。Crockford氏はBad stylistsを4つに類型した。 Under educated. まだ学習中のため書籍やインターネットから「悪いスタイル」のプログラムをコピペする人 Old school. 例えば、Javaなどの異なる言語に習熟しているがゆえに、JavaScriptの言語特性を無視して知っている言語のスタイルを踏襲していしまう人 Thrill seeker. 「一か八か思い切ってやってしまえ!」とリスクを承知しつつ書いてしまう人 Exhibitionist. 言語仕様に精通し、通常ではない難解なコードを書くことで自分の技術を見せつけたくなる人  これら4つの類型以外でも、「パフォーマンスを気にして美しくないコードを書く人がいるが、そのようなプログラムは本当にクリティカルな部分だけに限定するべきだし、そもそもプログラムの小細工よりもアルゴリズムを改善すべき」とCrockford氏は切り捨てる。  「プログラミングは人が行う物事の中で最も複雑なものの1つである。プログラムは完璧でなければならないが、人は完璧ではないからだ。だからこそ、良いプログラムを書くためには良いプログラミングスタイルが必要で、そのための訓練が必要なのだ」(Crockford氏) Good style is good for your gut  Crockford氏は最後に、JSLintのプログラミングスタイルはJavaScriptのエラーを自動的に見つけることができると語った。  「(上述した中括弧の位置のような)通常正しく動作するとしても、ある状況ではエラーを引き起こす可能性があるプログラミングスタイルに対して、JSLintは警告を発する。過去の歴史があるために削除できない悪い部分はJavaScriptにも残っているが、それらを使わないようにできる。エラーは必ずあるが、良いプログラミングスタイルを守ることで減らすことができるのだ」(Crockford氏)  直観によるバイアスが引き起こすエラーは不可避だが、良いプログラミングスタイルは直観にも有効なのだ。 CoffeeScriptは、どう?  セッションの最後に質疑応答の時間が設けられ、ある聴講者より「JavaScriptを改善するものとしてCoffeeScriptのような代替言語が出現していますが、CoffeeScriptに対する意見を聞かせてください」という質問が投げかけられた。  これに対しCrockford氏は、「CoffeeScriptは好きだよ。JavaScriptに良い影響を与えているし、学ぶべき言語だと思っている。しかしJavaScriptと同様、過去の経緯を引きずった悪しき部分が残っており、それはもう除去できなくなっている。まだ実験的な位置にとどまっており、プロダクトコードとして利用するのは時期尚早と考えている」と回答した。 QCon Tokyo 2013レポート プログラムは完璧でなければならないが、人は完璧ではない FabLabがもたらすソフトウェア+ものづくりの新たな価値 GitHubの中の人が使っているHubot、そしてChatOpsってなんだ? DDDが廻らない? スクラムが廻らない? それ2つ一緒にやれば廻るよ 大人気のログ収集ツールfluentdとは? そして、トレジャーデータやクックパッド、NHN Japanはどう使っているのか? HTML5と情報表現の最適化 WebRTCで変わるWebの未来 HTML5でできる多彩なビジュアライゼーション 「イベントカレンダー+ログ」レポート投稿募集中!このレポート記事が掲載されている本サービス「イベントカレンダー+ログ」では、イベント登録者がレポートを投稿したり、資料を一覧できるまとめページを作成できます。新着レポートは一覧に表示され、こちらのRSSにも配信されるので、ぜひご活用ください。