オブジェクト指向は「自然」じゃないよ

「オブジェクト指向」を説明するときに、よく例え話として「哺乳類」というクラスがあってそのサブクラスに「イヌ」とか「ネコ」とかがあって、実際の犬猫はそのインスタンスであり云々、とか言ったりする。クラスという概念を生物における種に例えて説明するパターンだ。そしてそれをもって「オブジェクト指向は現実世界における関係性を記述するのに適している」とか解説されていたりするんだけど、しかしこれは本当に適切な例えなんだろうか。実際のところ、自然界における「種」という概念は極めて曖昧なものなので、曖昧な記述が許されないプログラミング言語とは相性が悪いことも多い。一体どこに問題があるのか。まずは「種」という概念を疑うところから始めてみよう。

僕らは普段、似たような性質のものをひとまとまりにして考えるという習慣を持っている。リンゴのようなものはすべてリンゴとして扱い、それぞれのリンゴ一つ一つの小さな違いにはあまり気を留めない。リンゴとミカンは違うもので、その二つははっきりと区別できると思って暮らしている。 でも細かい事を言い出せば、同じリンゴとして扱われるものでも、まったく同じなものは存在しない。違う木に育ったリンゴ同士は遺伝子レベルで微小な違いを持っているし、同じ木や接木したもので育ったとしても、木のどこに実をつけたかで、生育条件が微妙に異なる。だから皮の赤くなり具合とか、実の甘さとかにかすかな違いが生じる。

こうした小さな違いに対してぼくらは、それらの個体はあくまでも同じ「種」で、ちょっとした違いはその種に属する個体が持つ「個性」だとして捉えがちなんだよね。リンゴみな兄弟、ちょっとした違いはあってもリンゴはリンゴ、そう考える癖がついている。そしてそれが自然の姿なんだと思って暮らしている。

オブジェクト指向ってのは、この人間の考え方の傾向にピッタリ即している。つまり「クラス」と「インスタンス」という奴ね。すべてのオブジェクトは何らかのクラスに属していて、そこからのインスタンスとして表される。インスタンス間の違いは色々あるけれど、それは属しているクラスの規定する範疇に収まるもので、それらは同じクラスとして扱うことができる、ということになっている。

ところが、ちょっとシステム開発に携わった人なら、物事はそう簡単には行かないことを経験しているだろう。 どうしても、定めたクラスの範疇からちょっとはみ出てしまうものが出てくるからだ。 そしてそういう時は「ああ、分析が甘かったんだなぁ。クラスを再定義しよう」なんて考える。 はみ出た部分を収容するように、クラスの大きさを少し大きくする訳だ。

でも、そんな事を繰り返していくと、やがて二つのクラスが衝突する事態を招く。どっちのクラスに分類するべきかわからない対象が現われるのだ。その特別なオブジェクトを収容するための派生クラスを定義したところで、じゃぁそれと良く似た、今までどちらかのクラスに収容していたオブジェクトは元のクラスに置いておくべきなのか派生クラスに移すべきなのか? こうしてクラス分析は破綻する。 そしてこれは、何も特別な例じゃなくて、自然界では当たり前のように見られる光景だ。

「フィンチの嘴」
ジョナサン・ワイナー著 (ハヤカワノンフィクション文庫)

Amazon 商品ページ

進化論の祖、ダーウィンはフジツボの研究をするにあたりその分類を試みているんだけど、ジョナサン・ワイナーのピューリッツァ賞受賞作「フィンチの嘴」によれば、その試みはこんな様子だったらしい。

「いくつか異なるタイプのものを別々の種に分類してみたが、その記述が気に入らなくて原稿を破き、今度は同一の種だとした。それも破棄して分けたくなった。かと思うとまた一つにしてみた。なぜこんなことをくり返しているのかと、歯ぎしりしたり、種を呪ってみたり、何の因果でこんなに苦しまなければならないんだろうと自問したりした」

まさしくクラス分析の過程を見ているみたいだ。結局ダーウィンは、種と種の間には厳然とした壁なんてものはなく、滑らかに変異していくものだということを確信する。どんなに良く似た二つの個体でも、ちょっとづつ違うところがある。言い換えれば、自然界の生物には、明確な「種」なんてものは厳密には定義できない、ということ。どの二つの個体をとっても、それらはちょっとづつ違うところがある。その違いが積み重なって、それこそアメーバからヒトまで、様々な種の違いとして現われている。前掲書によれば「種の起源」でダーウィンは

「種という語は互いによく似た個体の一群に対して便宜のため恣意的に与えられた用語だと思う」

とまで述べている。

分類の難しさは、生物だけに限られたものではない。例えば海と湖と池と沼は、明確に区別できるだろうか? 山と丘は? 天気はどうだろう。晴と曇りと雨との間に、はっきりとした線引きができるだろうか。 天気雨の日は、晴に分類するのか雨に分類するのか、あるいは天気雨という新しい種を作るのか。気象庁が定める分類はあるけれど、アプリケーションによっては気象庁の分類がどうあれ、雨つぶが落ちてきたら雨に分類しないと、例えば洗濯物の管理システムなんかだと困りかねないよね。†1

なんでこんな事になるかというと、「種」という概念が人工的なものだからなんだよね。 自然物は、人が作った「種」とは関係なく無数のバリエーションが存在している。 でも、ヒトのかよわい頭ではその違いをすべて認めて把握することなんてできっこない。そこで、そのかよわい頭でも扱えるように、似たようなものをひとまとまりにして情報量を削減して認識している訳だ。 だから元々分類には多少の無理がある。それでも、頭の中での情報処理のコストを大幅に節約できちゃうので、普段から僕等はこの無理を通して生きている。

この、もともと無理筋だということを無視して、「オブジェクト指向は自然な記述」なんて解説している本がよくあるんだけど、 これはちょっと間の議論をはしょり過ぎて誤解を招いているように思う。 なんでオブジェクト指向のようなやり方が自然に見えるかっていうと、 それは自然をそのまま記述できるから、ではなくて、僕等の普段の認識手段とよく合っているから、なんじゃないかな。 つまり、オブジェクト指向という人工的な手段は、これまた人工的な手段である「分類」という認識手段と整合性がある、とても馴染みがあるやり方なんだ。だから自然に見える。 でも、さっきも書いたように「分類」は自然界とは細かいところで合わない。それと同じように、オブジェクト指向という手段は、どうしても自然とは整合しないんだよね。

だから、オブジェクト指向を導入する時には、この事をちゃんと受け入れておかないといけない。つまり、「種」というものが厳然と存在する、人工的な世界観しか取り扱わないよ、という覚悟が必要なんだ。なんでも無理なく扱える魔法のパラダイム、では決してない。(だからこそ、プロトタイプベースとかアスペクト指向とか、こうした分類にまつわる困難さを少しでも緩和しようという手法が色々ある)

もともとプログラミング言語の発展過程を振り返ると、オブジェクト指向は世界を「自然に記述」するために生まれてきた訳ではない。 それまでのプログラミング言語でも、データをまとまりとして管理して、手続きをその中に隔離するといった手法はスタイルとして存在していた。それを言語仕様という形で定着させたのがオブジェクト指向なんだよね。 だから、言ってみればオブジェクト指向は、プログラマの都合から生まれてきている。自然状態を記述する新しい方法として生まれてきた訳ではない。

だから、肝心なのはプログラミングパラダイムがどうこうではなくて、放っておけば人間には把握しきれない程に複雑な自然状態を、「ここまででいいや」と、人間が理解できるようになるまでバッサリと削り落とす分析と断定の部分なんだ。 そこのところをちゃんと見据えておかないと、授業や本で覚えた「オブジェクト指向」、例えば「クラスと継承」といったような範疇でしか世界を捉えなくなって、そこから溢れてしまう事柄を捉えられなくなっちゃうようなエンジニアを量産することになってしまう。

それを避けるためには、やはり「種とは何か」「分類とは何のためにするものなのか」について、学ぶ機会を作り出すことが必要なんじゃないかな。自然について勉強するのもいいだろう。前掲書「フィンチの嘴」は、なんでも分類できると思い込みがちな情報科の学生やエンジニアには、ぜひお勧めしたい。

2010.3.18

†1
面白いことに、人工物でも自然物と同じように分類不可能な進化過程を辿るようだ。それが工業製品であっても、例えば「オーディオ再生機」と「ビデオ再生機」があれば、最近の iPod のようにどっちとも言えるようなものが出てくる。音楽でも、二つのジャンルがあればその間にはまるようなものが出てくることが多い。ただしこれまた自然と同様、「売れる/売れない」という選択圧により中途半端なものはやがて市場から消えていくので、一見明確な「種」があるように見える。