漏れのある抽象化
Joel on Software に、「漏れのある抽象化」という項目がある。
TCPは、下層にある信頼性のないネットワークに対する完全な抽象化を提供しようとしているが、しかし、ときどきネットワークは抽象化から漏れ出て、あなたは、抽象化があなたを守ってくれない何物かの存在を感じ取る。そうしてこれは、私が「漏れのある抽象化の法則」と名付けた法則の一例になっている。
自明ではない抽象化はすべて、程度の差こそあれ、漏れがある。
漏れのある抽象化の法則が問題である理由の1つは、抽象化が、それが意図されているほどには私たちの生活を楽にはしてくれないことにある。誰かをC++プログラマとして鍛えていると、char*とかポインタ演算とかについて教えずに済めばいいのにと思う。すぐにSTLのstringに進むことができたらいいのに。しかしある日、彼らが"foo"+"bar"のようなコードを書いて、とても奇妙なことが起こり、私は立ち止まってchar*について教えざるを得なくなる。あるいは、彼らはあるとき「OUT LPTSTRを引数に取る」とドキュメントに書かれたWindows API関数を呼ぼうとするのだが、char*、ポインタ、Unicode、wchar_t、TCHARヘッダといった、漏れ出てくるものすべてについて学ぶまでは、その関数をどうやって呼べばいいのかさえ分からない。
(中略)
10年前、私たちは、将来は新しいプログラミングパラダイムによってプログラミングが簡単になっているだろうと想像していた。確かに、何年にもわたって私たちが築き上げてきた抽象化は、GUIプログラミングやネットワークプログラミングのような、10年、15年前には扱う必要がなかった、ソフトウェア開発の新しいレベルの複雑さを取り扱うことを可能にしてくれた。そして、現代的なオブジェクト指向のフォームベースの言語のような素晴しいツールは、たくさんの仕事を驚くほど早く成し遂げられるようにしてくれる。しかし、ある日突然、抽象化が漏れているところで問題を解明する必要が生じ、それには2週間もかかるのだ。そして、あなたがプログラマを雇うとき、仕事のほとんどがVBプログラミングであっても、VBプログラマを雇ったのでは十分ではない。VBの抽象化が漏れているところに出会うたび、彼らはタールにはまりこんで動けなくなってしまうからだ。
これは本当にそうだと思う。
Joel 氏はプログラミングにおいてこのことを言っているのだけれども、これは一般社会にも言えることだと思う。
例えば、ある人がシミュレーションゲームをやったとする。そしてそれは非常につまらないゲームだった。
次に、別のシミュレーションゲームをやった。そしてそれも非常につまらないゲームだった。
そして彼はこう結論を出す。「シミュレーションゲームはつまらない」と。
彼は、「シミュレーションゲームのおもしろさ」について抽象化したのだ。
たかだか2つのシミュレーションゲームをやっただけでシミュレーションゲーム全てを知っているような結論を出している。
ああ漏れ出ている。他の、彼のプレイしていないシミュレーションゲームが。
彼の行動からわかるのは、「その2本のゲームがおもしろくなかった」ということだけなのだ。それがたまたまシミュレーションゲームだったというだけで、しかしそんなのは無関係なのだ。
抽象化によって漏れだしていることの問題点は、その考え方に大きな抑制を掛けることだ。
先ほどの例で言うのであれば、彼は今後シミュレーションゲームをやることは無いだろう。もしかしたらシミュレーションゲームが面白いと言っている人と友達になることが出来ないかもしれない。もし彼がディレクターになったのであれば、シミュレーションゲームを作ることはないだろう。
平たく言ってしまえば、「頭が固い」のだ。
彼にとって面白いかもしれないシミュレーションゲームがあったかもしれないのに、漏れのある抽象化によって、プレイする前から否定されているのだ。
これは非常にもったいないことだと思う。
ゲームならまだいい。例えばこれが、親友に裏切られた、とかだったらどうだろう。
こういった考え方をする多くの人は、人間そのものを嫌うようになるのではないだろうか。いわゆる自閉症だ。
こうなると、社会的に問題だろう。
言ってみれば、「シミュレーションゲームはおもしろくない」というのは“推論”、もっと言ってしまえば“妄想”だ。
そんなものは現実に起こった“事実”の前には無力に等しい。
どれだけ「シミュレーションゲームはおもしろくない」と“推論”していても、次にやったシミュレーションゲームが面白かった場合、「シミュレーションゲームはおもしろくない」という“推論”は「このシミュレーションゲームが面白かった」という“事実”に負けるのだ。
“事実”というのは、どんな抽象化にも勝るのだ。どれだけ“推論”を言ったところで、“事実”という2文字の前には無力に等しい。我々はそのことをそれを決して忘れてはならない。
そしてこの文章は、自分の経験から抽象化された“妄想”であり、“事実”というのはいつもぬくもりの感じられない結果を返すのだ。