2007年10月24日

難しいプログラミング入門

 『やさしいプログラミング入門』といったタイトルの本を見るたびに、『鈍才の数学』のことを思い出す。
 これは中学か高校のとき教師から聞いた話だ。
 かつて、『鈍才の数学』という学習参考書を書いた人がいた。著者がいうには、「天才にとって数学は簡単なので、鈍才が数学に苦しむ理由がわからない。しかし自分は鈍才なので、それがわかる。だから天才よりも私のほうが、鈍才の読者諸君をうまく教えることができる」。納得できる話だ。本の内容も大変優れていた。しかし『鈍才の数学』はまったく売れなかった。そこでタイトルを『英才の数学』に変えたところ、ただちにベストセラーになり、数学の学習参考書の定番になった。どうやら、学習参考書を選ぶときに、自分を鈍才と認めることのできる人は少ないらしい。
 『やさしいプログラミング入門』には、『英才の数学』的なごまかしを感じる。数学もプログラミングも、ほとんどの人にとっては難しいものなのに、それを認めていない。『鈍才の数学』の精神でもって『難しいプログラミング入門』と銘打った本はないものか。もしあれば、それはどんなものになるだろう。

 
 プログラミングのどこが難しいのか。逆にいえば、どこが易しいのか。独断で言ってみる。
 
易しい例:
・チューリングマシン(TM)は易しい。状態、メモリアドレス、実行順序などの概念は易しい。アセンブラは、理解するだけなら、一番易しいプログラミング言語である。
・参照透明な式は易しい。表計算は、関係や状態だけで実行順序がない、一種の純粋関数型言語といえる。同様のことはHTMLにもいえる。
 
難しい例:
・破壊的なTMの上で、参照透明な式が「評価」されることを理解するのは、難しい。
・実行順序が半順序になるケース(共有メモリと同期による並行プログラミング)は難しい。実行順序があるプログラミング言語のなかでは、半順序なるものを想定することさえ難しい(演算子の評価順序など)。
 
本質:
・原理的に異なる2つの領域が混じるときに難しさが発生する。実行順序のある領域とない領域は、片方だけなら易しいが、混ぜると爆発する(式の評価、副作用、半順序)。
 
 『難しいプログラミング入門』では、2つの異なる領域をそれぞれ独立して教えたあとで、2つを混ぜることになるだろう。たとえばこんな具合だ。
 
第1章:チューリングマシンと入出力
 Z80のアセンブラをいじりながら、TM、入出力、データ構造の概念を学ぶ。簡易的な電卓を作る。
第2章:表計算、HTML、SQL
 表計算とHTMLとSQLをいじりながら、関係と状態の概念を学ぶ。
第3章:表計算の実装
 Z80のアセンブラで簡易的な表計算ソフトを作る。
 
 読者はほぼ全員、プログラミングがどれほど難しいものかを思い知らされつつ、第3章で爆死するだろう。「あたまじゃわかっているんだが」とはこのことだ。2つの領域をどちらも完璧に理解しているのに、その混合物を思い描くことができないという、悪夢のような体験である。
 C言語のポインタの難しさも、同じ本質から生じている。C言語のポインタという概念は、状態やメモリアドレス(TM領域)と型(コンパイラ領域)を混ぜている。
 再帰の難しさも同じだ。コールスタックは、実行順序と変数スコープを混ぜている。
 
 「プログラミングができる」と「プログラミングの難しさを知っている」は、まったく違う。後者のほうがより重要で、面白い。

Posted by hajime at 2007年10月24日 15:41
Comments
Post a comment






Remember personal info?