ポインタと再帰は難しい

私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータサイエンスのカリキュラムで教えられているもので、多くの人がうまく理解できないものが2つあった: ポインタと再帰だ。

Javaスクールの危険 - The Joel on Software Translation Project

僕が内定をもらって基本情報処理試験のためにCのプログラミングの勉強をし始めたときわからなかったのはおもにこの2つだ。いまでもわかっているとは言えない。

その証拠に以下にある問題1bがわからなかった。答えをみてもしばらく意味が分からず、実際に具体例を書いて考えてみてやっとわかった。

この問題に関していうならばあまりポインタは関係ない。しかし再帰高階関数の考え方になじんでいなければ解くのは難しいだろう。Javaのように関数型言語から離れた言語ばかりやっているとこういった概念が存在することさえ知らないままだ。もちろんJavaが悪い訳ではない。Javaは仕事言語としては優れていると思う。ポインタは参照という名の下で隠蔽されガベージコレクションがある。再帰を使う必要のあるものはライブラリとして整備されている。仕事で使う言語としては上質の部類に入るだろう。

しかしポインタと再帰の明らかな重要性以上に重要なのは、これらの学習から得られる精神的な柔軟さと、これらを教えている授業からふるい落とされないために必要な精神的態度が、大きなシステムを構築する上で欠かせないということだ。ポインタと再帰には、ある種の推論力、抽象的思考力、そして何よりも問題を同時に複数の抽象レベルで見るという能力が要求される。そしてポインタと再帰を理解できる能力は、優れたプログラマになるための能力と直接的に相関している。

Javaスクールの危険 - The Joel on Software Translation Project

そうだろうと思う。ただ最近はJavaから学び始める人も多いので、そうなるとポインタと再帰はいかにもスルーされそうなところだ。僕はかろうじてCから入ったのでポインタと再帰という概念があることは知っている。ただ知っているだけだ。わかっているとはいえない。

たとえそうなのだとしても、コンピュータサイエンスというのは証明(再帰)、アルゴリズム(再帰)、言語(λ計算)、オペレーティングシステム(ポインタ)、コンパイラ(λ計算)の話なのであり、結論を言うなら、CもSchemeも教えないJavaスクールというのは、本当のコンピュータサイエンスを教えているとは言えないのだ。関数のカリー化のような実世界では役に立たない概念であっても、コンピュータサイエンスの大学院には前提条件となる。

Javaスクールの危険 - The Joel on Software Translation Project

そうだろう。昔会社の先輩で大学時代(ちなみに東大)に情報処理専攻だった人に訊いたら、授業ではSchemeをやっていたそうな。JavaはもちろんCなんかも授業ではやらないでそういうのは学生が勝手に学んでいくものだったとのこと。それを聞いたとき超えられない壁があるように感じたものだ。僕はSchemeのような関数型言語というものに触ったことがなかったこともありYコンビネータも最近知った。これも知っているだけ。とはいえ何かをやるのに遅すぎることは無いって誰かが言ってたので、僕ももっとコンピュータサイエンスの勉強をしようと思う。