2006/11/15

『Binary Hacks』のサンプルPDFでは川合史朗さんによる巻頭言が読めて、プロのプログラマにとって抽象化の壁に無自覚でいるのは致命的だ、と主張されている。もちろんこれはBinary Hacksの巻頭言なので、抽象化が下に有界であることを忘れないようにしないといけないよ、という警鐘と受け止めていいんだと思う。ぶっちゃけていえば、土台を固めろ。もしくは、土台を意識できるようになれ。

その手の抽象化の漏れを自覚することの大切さっていうのは、誰かが抽象化したものを使うときの落し穴を自覚することの大切さだといえる。川合さんの文章にある「箱庭の製作者のアイディアを抜ける」ことは、いわば誰かが手がけた抽象化の漏れを自分でふさぐことを指しているんだろう(勝手な解釈だけど)。

一方で現実の問題を解くうえでは、誰かが抽象化したものをてなずけるだけでなく、自分自身で何かしら抽象化っぽいことをしたい。そのときに求められる自覚は、当たり前だけど、『Binary Hacks』の巻頭言で示唆されている自覚とは別ものだ。もちろん、よりエグいレベルからの抽象化を自分でするなら、まさにBinary Hacksが必要になるんだろう。ただし、たとえばぼくにとっては『Binary Hacks』で扱っているような題材はとうてい自分の力だけでゼロから抽象化できるしろものじゃない。

もっとかわいらしい抽象化のためのHacksも欲しい。「箱庭の箱庭の箱庭を別の屋敷の箱庭にコピーして、さらにその中に自分で箱庭を作るときに抽象化を漏らしにくくするHacks」みたいなの。ちゃちな問題であっても抽象化っていうのはやっぱり強力なので、その無自覚に享受しがちなパワーに目がくらんで掘りがちな落とし穴は何か。そもそも落とし穴を作らないためのHacksは?

たぶん、それは数学なんだと思う。ふだん僕らは、直観的に確からしいと思ってあるアイデアをコーディングし、期待する答えが得られた時点で問題を解いたものとみなしている。問題を解くアプローチや道具を手に入れたところで満足しちゃっている。そのアプローチや道具が本当に適切なのかどうかを確かめるには数学しかない。

ありがちな例はハノイの塔だろう。ハノイの塔の解法を説明した記事は、数学っぽいおはなしでもよく目にする。「一番下の1枚だけ残して隣の棒に移動し、一番下の1枚をあまっている棒に移動して、移動しておいた残りをその上に移動しなきゃいけない」という説明。そんなふうな説明から「n 枚のディスクを移動するのにかかる工数を H(n) とすると、 H(n) = H(n-1) + 1 + H(n-1) 」という関係を導いてくる。1枚ずつディスクを移動するって操作を抽象化して考えることで問題の構造が見えてくるよね、みたいな。でもそれだけだと、どんなに工数がかかったとしてもそれくらいには抑えられるってことしかわかりませんから。もっと少ない方法があるかもしれない。

もちろん実際にはない。ただし、それは数学的帰納法で証明して、はじめて「ない」と断言できる。そして道具や解法の抽象化は、どこまでいっても具体的な事物が対象だからではなく、たぶんこういうところからのほうが漏れやすい。たぶん。

こういう抽象化を漏らさないための数学について、楽しい教科書がないものかなあと思う。ちょうど、深いところに抽象化された部分について『Binary Hacks』が果たすであろう役割に相当するような本が。数学の楽しいところや神秘的に見えちゃうところを取り上げて『Math Hacks』とかっていう方向もあるだろうけど、それは答えじゃないと思っている。むしろ、普通の数学と同等の内容を持つ教科書をプログラマ向けに企画することが直接の答えのひとつだと思っていたし、いまでも思っている。

あるいは、ここ1〜2年くらいだけど、 "SICP" や "Concrete Mathematics" こそがそういう本に違いないという確信も持つようになった(上のハノイの塔の落とし穴も"Concrete Mathematics"の冒頭で取り上げられている例がそのまんま)。つまり、抽象化することのパワーを解説や練習問題をとおして読者に伝えるような本で、しかも直観だけでなく数学的に証明可能な抽象化の道を示しているような本(証明が書き下されている必要はない。分かっていて省略するのと結果的に省略されちゃってるのは別)。しかも、"SICP" や "Concrete Mathematics" よりもっとミニマルな内容におさえたとっつきやすい本にできるはず。←いまこのへん

まあ、本があるだけじゃだめで、手を動かして訓練しないスキルは決して身につかないんですがね。数学に限らず。

No comments :