どうも、21日目を担当する肉体派プログラマの48代tomiokaです。プログラミングのテクニックとLisp入門と何を書こうかそれなりに迷ったのですが、今回はあまりプログラミングと関係ない記事を書こうと思います。「○○」には好きなモノを入れてください。
この前、みすの活動内で発表をする機会がありました。その発表は大分適当なものでしたが、特に分かりにくい部分を説明しているときに前に座っていた人から「それってつまりなんなんですか?」という質問を受けました。
プログラミングに限らず、初めて勉強する分野の本を読んでいると「説明がわからない」とか「説明は読んだけど結局○○って何だったの?」という疑問が浮かび、自分が理解できていないということが浮き彫りになることがよくあります。しかし、どうすれば自分で理解できたと感じることができるのでしょうか?
この記事を読んでいる人はおそらく「コンピュータ」というものを(程度の差はあれど)理解していると思います。それでは、コンピュータを全く知らない人に「コンピュータって何?」と聞かれたらどのように答えますか? ある人は「ディスプレイとキーボードがあって、キーを叩くと何かの処理をしてディスプレイに表示してくれるものだよ」と答えるかもしれません。しかし、この答えを聞いて質問者が納得してくれるとは思いにくいですし、そもそもこの定義に当てはまらないコンピュータが存在します(スマートフォンにはキーボードが付いていませんね)。相手に理解させるのに一番早い方法は何と言っても使わせることです。実際に触ってみて、目的を達成し、時には失敗し、コンピュータの可能性と限界を少しずつ学んでいきます。そうしているうちに、その人の中で「コンピュータとはこういうものだ」という理解が生まれます。
たいていの場合、○○の説明で可能なのは「○○は××からできている」とか「○○は△△をする」といった〇〇に関する性質を列挙することのみです。コンピュータのように実際に触れるものであれば良いのですが、より抽象的なもの、例えば数学的概念のようなものはどうでしょう。専門書などでは定義などを並べ立てたり、定理を示していたりしますが、「○○はこういうもので、これこれこういう性質があるんだよ」ということを(厳密さを損なわないように)頑張って説明しているわけです。先ほどの例で言えば、
- 定義
- コンピュータは、1つ以上の入力装置を持つ。
- コンピュータは、1つ以上の出力装置を持つ。
- コンピュータは、数値の計算を行う。
などのように定義が与えられて、
- 定理1
- コンピュータが入力装置としてキーボードを持つとき、ユーザはキーボードに印字されている文字をコンピュータに入力することができる。
などのように定理が加えられるわけです。(ここに書いてあることは適当なので本気にしないでください)こういった性質を基にこねくり回してみることで、「入力装置としてタッチパネルを使うこともできるんだな」とか「キーボードの入力を行うにはテキストフィールドにフォーカスしてないとダメなのか」といった定理にない暗黙的な性質を体験し、自分なりの理解を深めていくわけです。そしてある日、ふと振り返ってみるとコンピュータの大先生になっていた……ということですね。
コンピュータの例では実際に触ってみるということが重要であると言ったわけですが、○○の場合でも同じです。それでは、実際に触ってみましょう! ……どうやってやればいいのでしょうか。そこで、プログラミングの出番です。抽象的な○○の場合は、自分で再現(シミュレーション)してみることが「触ってみる」ということにあたります。紙とペンを使ってみるのはとても良い(というか一番良い)方法なわけですが、それが困難な場合はプログラミングは強力なシミュレーションツールとなります。(Lispがうまく使えないなら自分でLisp処理系を書いてみれば良いのです……とこれは違うか)
〇〇に入るものが何であれ、体を使って覚えることが理解の上では不可欠です。プログラミングはすぐに成果が実感できるため、その点について有用であると言えます。要はわかんねーって言ってる間に手を動かせってことですね!(脳筋)
以上、肉体派プログラマの脳内からお送りしました。