記事を書く発端として、「オブジェクト指向とは、現実世界を正しく捉えること」とする記事の存在がある。
私はその表現自体を否定するつもりはないが、「現実世界を正しく捉えること」=「自然言語を基準に設計すること」として捉えている人もいるように見えた。
これは「犬と猫の機能をまとめあげるクラスが必要で、そのクラスの挙動を表現するには動物という単語が適切だ」ではなく、「犬と猫は動物だから、動物というクラスを作る」といったような発想だ。
私自身、大学時代に自然言語処理について研究していたのもあり、自然言語の信用性について懐疑的だ。
そのため自然言語を基準に考えた設計について、持論満載で記載していきたいと思う。
自然言語を基準に考えた設計の問題
自然言語に単語が存在しているのはたまたまである
まずその概念が存在するから、その単語が存在するのではない。
ある概念を表す表現があったほうが便利だから、それを表現する単語が生まれるだけである。
そういう意味では、その単語が存在しているのはたまたまなのである。
先ほどの例を見てみよう。
犬と猫は動物だから、動物というクラスを作る。
ここで問題なのは、「動物」という概念は日本語においてある特徴を持つ集合をそう呼称しているだけだという点だ。
この世には「動物」という絶対的な概念が存在するわけではなく、ある特徴を持つ集合を動物と呼んだら便利だから呼んでいるに過ぎないのだ。
つまり、この設計は『日本語』に依存しており、自然言語における世界観をプログラミングの世界で表しているのだ。
言語・文化間での違い
動物だと日本語以外にもあるじゃないかと反論されるかもしれないので、別の例を出そう。
たとえば日本語には成長の度合いによって呼称の異なる出世魚があるが、英語圏にはそれらを区別する単語はない。
これは島国であり漁業が盛んな日本において、魚の成長度合いにより表現を分けたが便利だったからだろう。
このように言語の違いを見ても、その単語が存在するか否かは文化的なものに起因していることがわかる。
逆に言えば自然言語に基づいた設計が正しいのであれば、母国語によって正しい設計が変わってくることを意味する。
この例だと日本人は「イナダ」や「ブリ」でクラスをわけ、英語圏の人は「Yellowtail」クラスを既定するのが正しいということになるわけだ。
果たしてそんな不安定なものを基準に設計することが、本当に正しいのだろうか。
設計は、「どの観点で切り分けるか」によって変わってくる。
そして自然言語における単語は「その観点で切り分けたときに、文化的に便利である」から存在している。
したがって単語の存在を設計の理由にすることは、文化的なものに依存した設計をしていくことに他ならないのだ。
自然言語における単語は曖昧性を持つため、完全に再現ができない
自然言語というのは言葉が先に生まれて、後付けでその意味が説明されていく。
たとえば「バブみ」という言葉は誰かが「バブみとは○○です」と定義したことで使われるようになったのではない。
あくまである概念に対して「バブみ」という単語を使う人が現れ、他の人はその用例から汎化し意味を推測しているにすぎない。
つまり「バブみ」という単語に対する意味合いは人により異なり、単語の持つ意味は一意に決まらないのだ。
https://matome.naver.jp/odai/2149008444398555201
したがって自然言語における単語の意味は人により異なり、曖昧性を持つわけである。
しかしそれを形式言語であるプログラミング言語に翻訳したときに、その曖昧性を具体化する必要が出てくる。
たとえば「池」「湖」「沼」の違いはしっかりは定義されていない。
人により水たまりに対して「池」と呼ぶか「湖」と呼ぶか「沼」と呼ぶかは異なるのだ。
それをプログラムに落とし込むとしたら、「沼は水深が〇以下で湿度が○以上で○㎢以内の水たまりのことである」と具体的に定義する必要が出てくる。
これは「Aは池である」「Bは沼である」と一意に意味が決まることを意味し、自然言語における単語のもつ曖昧性を再現できない。
したがって、そもそも自然言語における単語の意味をプログラミング言語で表すこと自体が不可能なわけだ。
自然言語は流動的であり、捉えるのが難しい
自然言語では、どんどん新しい単語が生まれるし、単語の定義は変わることがある。
それはもちろん流行り言葉もそうだが、より基幹的な単語についてもそれは当てはまる。
例えばWikipediaを見ると、ペニスはオスの持つ生殖器とされている。
しかし近年、ペニスを持つメスが発見された。
https://www.huffingtonpost.jp/2017/09/14/ig-nobel_a_23209921/
このことから、「これでオスの定義に『ペニスを持つ』と書いた教科書は、全て過去のものになった」と受賞者は発表したそうだ。
つまりこの発見により、オスやペニスの定義から根本的に覆されたことになる。
https://twitter.com/yusai00/status/1047433528416206850
ではその場合、ペニスクラスとオスクラスの設計も変える必要はあるのだろうか。
「自然言語通りに設計することが正しく捉えること」なのであれば、そうする必要が出てくるだろう。
おわりに
プログラム内の概念が自然言語と同一だと思うと議論がややこしくなる
ここまで説明してきた通り、プログラム内の概念は自然言語と同一にはなりえない。
しかし自然言語上の単語の意味と同一であると捉えてしまうことで、議論がややこしくなってしまうものと思われる。
例えば『Humanクラス』は『人間』という単語の持つ意味合いと、完全に同一にはなりえない。
『人間』が『動物』であるというのは、自然言語上の概念においての話であって、『Humanクラス』が『Animalクラス』をextendsしているかどうかとは別の話なのだ。
そういう意味でいうと、プログラミングという行為は新しい単語を定義している行為に近いように思う。
もちろん自然言語上の言葉の意味と異なりすぎるのは純粋にコミュニケーションコストが上がるため、避けるべきことである。
しかしどこかで『別物である』と妥協をしない限り、問題を正しく捉えられないのではないだろうか。
自然言語で設計を制限するべきではない
自然言語における単語はその言語圏の文化においてそう切り分けることが便利だということでしかない。
したがって適切な設計が自然言語とリンクしている保証はなく、設計は自然言語に制限されるべきではないと考える。
これは「現実世界を正しく捉えること」と相反するものではない。
「現実世界を正しく捉えること」はあくまで自然言語から切り離された観察だからだ。
したがって表現したいものの挙動をしっかり認識し、何を基準に汎化すれば良いのかを自然言語から切り離してフラットに考えた先に最適な設計があるのではないだろうか。