そんなに正確ではないかもしれないけど、便利であろう情報を数日にわたって書いていきます。
はじめに
ある概念を理解することと、使えるようになることは別のことです。
ある概念に関して定義からその性質を追って行き、その結果理解に到達するという手順はもちろん重要なことですが、その手順を毎回追っていってはより高度なことを理解することは難しいでしょう。例えば僕らは小学校で四則演算を苦労して学習していったわけですが、いつの間にかそれらを瞬時にこなし、より高度なことを中学、高校、人によっては大学、大学院と進み、理解し、また使えるようにしてきました。
未知の概念を使えるようにするには、その概念についてイメージを頭に思い浮かべられるようにする必要があります。ここで浮かべるイメージをその概念の「メンタルモデル」と言うことにしましょう。僕らはより高度な概念を理解するためにそのメンタルモデルを思い浮かべながら文章を追いかけます。もしメンタルモデルと文章に矛盾が発生したらメンタルモデルを修正します。そうして矛盾が発生するごとに今までの事象を全てうまく説明できるように修正していき、メンタルモデルの完成度を高めていくのです。
また、より高度な概念を理解する際だけでなく、アイデアを生み出す際にも適切なメンタルモデルは必要です。雑なメンタルモデルからは雑なアイデアや間違ったアイデアしか思いつきません。僕は「無知ほど新しいアイデアが出せる」という言及は信じることができません。きっかけ出すことだけならともかく、アイデアを生み出せる人間は、向き合っている問題に対して常に適切なメンタルモデルを持っているでしょう。
頭に描くイメージというのは人によって様々なものです。大事なことは概念の要点を頭の中に全て取り込むということです。頭に入りきらないものを僕らは扱うことができません。頭に入りきらないものを基にアイデアを生み出すことも恐らくうまくできないでしょう。
先ほどの四則演算の例では、僕らは数やその演算について、メンタルモデルを長い時間をかけて獲得してきたのです。人によってはそのメンタルモデルが雑であり、学習の過程で脱落してしまったかもしれません。たまたま構築したメンタルモデルがうまい具合にマッチしたために、数年から数十年特に苦労なく来れたかもしれません。僕らはプログラミングという知的活動に関わっていますが、そのメンタルモデルの構築や修正といった過程をずっと続ける必要があります。なんとかして次から次へと大量に現れる概念のイメージを獲得し続けなければならないのです。もっと言うならプログラミングに関わらなくても、スポーツマンであっても、サービスマンであっても、新しい概念の理解は必要なものです。プログラミングに関わる僕らはそれらの量が圧倒的に多いという違いはあるかもしれませんが。
可能なら、メンタルモデルを構築するための手法を磨いておくといいかもしれません。それは未知に対応する能力そのものです。そうすれば、激動と言われるこのIT業界でもいくらか楽になるかもしれません。
現在、プログラミングという領域はまだ教育が整っていない為、多くのユーザが独力かつ長い時間をかけて、プログラミングを「使える」ようにして来ました。そのためそれぞれが持つメンタルモデルの多くは初めに触った言語や、その次に触った言語あたりに大きく依存していることでしょう。プログラマの能力を評価することが難しいのは、そういったプログラマとしての成り立ちがまちまちであることが多分に関わっていることと思います。相手をきちんと理解することすら大変な現状です。将来的にはプログラミングに関する教育が整備され、みんながつまづく箇所やそれに対する処方箋に関しても整備されてくるかもしれません。
なにはともあれ現在において、初心者が触った言語は高い確率でオブジェクトという複雑な仕組みを備えています。その為、Haskellを理解する際には大いに戸惑うことでしょう。HaskellやMLやLispといったλ計算に基づく言語(ここではそれらを指して「関数型言語」と呼ぶことにします)は、驚くほどシンプルな計算モデルを持っています。その理論についても興味深いものですが、それら関数型言語を「使える」ようにするには、そのシンプルすぎるほどにシンプルな計算モデルをきちんと受け入れ(今まで見てきたオブジェクト指向言語等のメンタルモデルとは別であると認識し)、そのλ計算に基づいてメンタルモデルを構築することをお勧めします。現在の関数型言語はその表層だけを見たら複雑すぎるのです。もしHaskellを触っていて複雑に見えるなら、他の角度から試してみてはどうでしょうか。
そういえば、僕がHaskellを理解できたと実感したのはHaskellがλ計算に基づいて非常にシンプルだ、と実感出来たときでした。まあしかし残念ながら前述した様に、それまでの構築してきたプログラミングのメンタルモデルは一人一人異なります。よって僕の経験談はあまり役に立たないでしょう。
僕らエンジニアは今までも未知のものを理解しようとしてきました。Haskellで出会う未知の概念に関しても基本的には同様に扱い、メンタルモデルを獲得して行けばいいと思います。
このアドベントカレンダーでは、Haskellでのスペースリークでの理解に関してもそうですが、使い方、つまりメンタルモデルの構築に関して役に立つ情報が残せればと思います。
メンタルモデルのメンタルモデル
ここまで述べてきたメンタルモデルに関するメンタルモデルは、僕が構築したものです。
なので人によってはfitしないこともあるかもしれませんが、このメンタルモデルを採用することでいろんなものが見えてきます。
- 成長とはより適切、より高度なメンタルモデルの獲得
- 教育とはメンタルモデルの伝達
- 成長の高速化とは、メンタルモデルの自覚的な構築
- 若者の方が成長が早いとか嘘でしょ僕の方が早いし(適当)
まあこれはメンタルモデルを伝達する試みですが、単純に僕の手法を伝えてるだけとも言います。
読み手としては適当に便利に受け取ってもらえればそれで構いません。
あ、明日からちゃんとスペースリークに関連する話に入ります。