プログラムの理論とはなにか

プログラムには、手続きを記述するという側面と、式を記述するという2つの側面があります。
そして、それぞれの基礎理論としては、チューリングマシンとラムダ計算があるので、プログラムの理論としては、この2系統を勉強する必要があると思います。


ラムダ計算というのは、式によってどのような計算ができるかという理論です。式による条件分岐はそれほど難しくなく、Yコンビネータなどの不動点定理で、式によって繰り返し処理が行えるということが証明されたので、どのような計算でもできるということになっています。


チューリングマシンの理論とは、どのような手続きがどのような性質をもつかという理論です。プログラムの性質というのは、ある出力を行うプログラムが、入力に対してどのように時間がかかるか、どのようにメモリを使うかというものです。そしてこれがアルゴリズムの理論になります。


ところで、ぼくはブログで「アルゴリズムを勉強するべき」ということをよく書くのですが、そのたびに「アルゴリズムの勉強は必要ない、オブジェクト指向デザインパターンを勉強するべき」というコメントが付きます。
おそらくアルゴリズムの勉強は必要ないという人は、アルゴリズムの勉強を、アルゴリズムカタログを頭のなかにもっておくことだと誤解しているのだと思いますが、上に書いたように、アルゴリズムの勉強というのはそういうことではなく、プログラムの性質がわかるようになることです。


反対に、プログラムの理論としてオブジェクト指向デザインパターンを勉強する必要があるかという話ですが、オブジェクト指向デザインパターンはプログラムの理論ではありません。


オブジェクト指向デザインパターンは、ソフトウェア工学という分野での成果物で、ソフトウェア工学というのはどのようにソフトウェアを作成するかということを研究する分野です。つまりどちらも、プログラムの性質の話ではなく、作り方の話で、オブジェクト指向は要求分析から設計、実装、テストまでの手法の提案であり、デザインパターンオブジェクト指向設計のベストプラクティス集です。
そもそも、オブジェクト指向の決定的な理論というものは存在しえず、数多くの研究者の提案するオブジェクト指向手法の、最大公約数か最小公倍数のようなものをオブジェクト指向としてまとめている状況です。
ということで、オブジェクト指向デザインパターンは、理論ではなく技法なのです。


アルゴリズムの勉強は必要ない、オブジェクト指向デザインパターンを勉強するべき」という話は、要するに、「プログラムの理論は必要ない、作り方を勉強するべき」という話ということになります。
これに関しては各人それぞれの結論の結論があると思いますが、「プログラムの理論を勉強しましょう」となったときには「アルゴリズムよりもオブジェクト指向を勉強しましょう」ということにはならないわけです。