どうも、sasa0です。
この記事は『Jisibari Advent Calendar 2017』1日目の記事の記事です。
2週遅れで頑張っていきます。
スーパーポエムかつ答えの出ていない悲しみの「ぼやき」なので、
忙しい方は読んではいけません!
では、はじめていきます。
人にものを教えるのって難しい
プログラミングは、人に教えたり(教わったり)することが多い分野だと思います。
その中で僕がよく感じることが、
「あれっ・・・ピンとくる説明ができない・・・」
というあの不思議な感覚です。
この感覚は、
僕だけのものではなく、皆さん感じたことがあるものだと思います。
「なぜ説明することができないのだろう・・・」
と考えた結果をさっくりとまとめていきたいと思います。
りんごはオレンジじゃない
例えば、赤ちゃんがいます。
赤ちゃんは無知です。
りんごを知りません。
あなたは、その赤ちゃんにこの画像を見せて、
「これはりんごだよ!」
と教えてあげます。
赤ちゃんは
「ふむふむ、これがりんごか!」
と思うでしょう。
赤ちゃんは無知です。
やはりオレンジも知りません。
心優しいあなたはオレンジの画像も見せてあげます。
ここからが難しいです!
この時は赤ちゃんは
「おっ、りんごじゃん!」
と思ってしまうかもしれないのです!!
なぜなら、りんごとオレンジはそっくりだからです。
「いやいや!全然似てないでしょ!色も違うでしょ!」
と思う方もいらっしゃると思いますが、
実は似ていて、
両方とも『緑の葉っぱがついている木になっている丸いもの』という共通の特徴があるのです。
もし、赤ちゃんがりんごの画像を見たときに
「あーこんな感じの緑の葉っぱがついている木になっている丸いものってりんごっていうのか〜」
と思ってしまった場合、
オレンジを見せたとしても「りんごだりんごだ!!」となってしまうでしょう。
りんごという言葉を「緑の葉っぱがついている木になっている丸いもの」の総称として覚えてしまうのです。
この誤解を解くは
「これはオレンジで、りんごとは違うものだよ!」と教えてあげる必要があるのです。
つまり、何か(A)を教えるにはBCDE.....を教えてあげて、他との差別化をすることでようやくAを理解することができるのです。
もっと具体性をあげたらいいじゃない!
Aの説明を具体的にして、Aの説明だけで差別化するという方法もありますが、こちらも難しいです。
wikipediaで詳しく見ましょう。
リンゴ(林檎、学名:Malus pumila)は、バラ科リンゴ属の落葉高木樹。またはその果実のこと。植物学上はセイヨウリンゴと呼ぶ。春、白または薄紅の花が咲く。果実は球形で甘酸っぱい。
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B4
この説明はおそらく正しくて、りんごをピンポイントでさしているのでしょう。
しかし、りんごを知らない人にこの説明をしたところで僕らが知っているりんごを想像できるとは到底思えません。
具体性をあげると理解することが難しくなってしまうのです。
概念の説明はもっと難しい。
画像は素晴らしいです。
ピンポイントでそのものを表示して伝えることができます。
しかし、概念は実体がないので画像で説明することがとても難しいです。
プログラミングをやっているとこういった実体のない概念の説明をする必要がある場合が多いです。
その場合よく使われる手法が、
「身近なもので例える」
というものです。
僕はプログラミングをRubyで勉強を始めました。
Rubyはオブジェクト指向の言語です。
その中でClassの説明でよく見かけるのが
「Classという設計図を元に車というオブジェクトを作成するようなもの!」
などなどです。
- 設計図
- 車
などの身近な例で説明していて、シンプルでとてもわかりやすいです。
しかし、実際Rubyを触っていて、それらの説明を思い返すと「う〜ん・・・」となることが多いです。
身近なもので例えるという技は、
「オブジェクト指向におけるClass」
「設計図と車」
というところに共通項を見出し、抽出するという高度な技です。
これは説明している側の人間はとても気持ちがいいです。
「なんてわかりやすいんだ・・・やっぱり俺って天才だな!」
と悦に入ります。
しかし、説明されている側は
わかったような?わかっていないような?不思議な感覚になってしまいます。腑に落ちないのです。
なぜでしょう?
それは、抽象性が高いからです。
抽象性が高くなればなるほど、理解することが簡単になります。
(具体性が高くなればなるほど、理解することが難しくなるのと逆ですね)
しかし、抽象性をあげすぎると現実と乖離してしまい、「説明してもらっている概念」と「身近な例」を紐づけて考えることができなくなってしまうのです。
プログラミングは思考の塊で実体が掴みづらいので、ある意味現実と乖離していると言えます。
その「プログラミング」と「設計図と車」という大きく距離の開いたものを繋ごうとすると抽象性も大きくなってしまうのです。
距離の大きさは抽象性の大きさです。
(エンジニアはしばしば浮世離れした連中が多いと言われていますが、それはプログラミングという現実と乖離したことをしているせいでそうなってしまうのだと僕は思います。)
しかも、頭が良い人ほど距離が大きく開いたものから共通項をみつけるのが得意です。
およそ共通項など見つかるはずもない距離ものから、共通項を見出します。
そして誰も腑に落ちないということが多いです。
最後にまとめ
- 具体性が高いと理解できない。
- 抽象性が高いと理解できても腑に落ちない。
具体性と抽象性のバランスが取れた時に美しい説明になるのです。
やっぱり人に教えるのは難しいですが、頑張って行くしかないですね!