2009-03-21(土)
■いまSICPを読むのは時間の無駄

SICPは、よい内容について書かれた本であり、最良の本だった時期もあった。
けれども、今となっては、理解が難しく内容の割には時間がかかる、時間の無駄ともいえる本といってもいいかもしれない。
もちろん、Schemeの可能性、数値計算、プログラミング、コンピュータ教育の歴史、そしてSICP自体のすべてに興味があれば、効率がいい本かもしれない。
けれども、コンピュータ教育の歴史、SICP自体に興味がないのなら、あまり効率のいい本とはいえない。特に、Scheme、数値計算に当面の興味はなく、プログラミングについてだけを学びたいのであれば、時間の無駄でしかないと思えるし、今となっては足りない部分もある。
SICPの欠点として、まず、次の点が挙げられる。
- 日本語がよみにくい
- サンプルに数学の知識が必要
- プログラムがよみにくい
日本語がよみにくいというのはよく指摘される。ただこれは翻訳だけが悪いのではなくて、もともとの原文もよみにくいという指摘もある。文章をよみとくのに、そこに書かれている内容を理解していないと読み解けない部分がたくさんある。いまから知りたい内容を読むのに、すでにそれを知っている必要があるのでは学習書として本末転倒になる。
サンプルに数学の知識が必要というのも、プログラミングという本質からは外れてしまう部分だ。
ニュートン法で平方根を求めたり、フェルマーテストで素数判定を行ったり、数式の記号微分を行ったり、数学に興味があれば面白い内容が多いのだけど、この本を読む目的がプログラミングの勉強であれば、無駄に難易度をあげて理解をさまたげることになってしまう。
Schemeの、括弧の多い文法や、演算子を算数のように書けない事は、とまどう原因になる。
また、本文中で定義した関数をあとから使っていることも多く、その関数名もsqrtやaddなどありそうな関数名で、それがScheme組み込みの関数なのか書籍中で定義したものなのかわかりにくい。そのため、興味のあるところだけ途中から読んでみるということが難しくなっている。
ただ、こういった書籍の構造は、あまり問題としては本質的なものではないかもしれない。本当の問題は、プログラミングの勉強として、もはや最適の内容ではないということだ。それには、例外やパターンマッチのような言語機能が説明されていないということもある。
一番の欠点は、どこまでも手続き的であるということだ。
オブジェクトの定義なども手続きを通して行われていて、どのようなオブジェクトを定義しているかは手続きを追う必要がある。静的に宣言的には定義されていない。
例えばJavaのサンプルで、つぎのようなコードで「オブジェクトを定義しました」などといったとき、いろいろデメリットをあげて怒られるだろう。
Object[] obj = {"きしだ", "福岡", "プログラマ"};
こんな感じでクラスを定義して、静的で宣言的なデータ構造を使うほうがいいと言われるはずだ。
class Person {String name; String home; String job;}
こういった、クラスを定義して宣言的にデータ構造を示したときのメリットが、SICPには記述できてないように思える。
静的で宣言的なプログラミング言語の機能について触れられていないというのは、プログラミングについての学習書としてのSICPの一番の欠点だと思う。
もちろん、ここで、代替となる書籍がないのであれば、SICPを勉強する価値はある。けれど、SICPに代わるいい本をみつけてしまったのだ。
プログラミングの勉強のためにSICPを読もうとしているのなら、この本の方を読むことをおすすめする。
この本のいいところはこういうのが挙げられる。
- 日本語が読みやすい
- プログラムが読みやすい
- サンプルがわかりやすい
- 薄い
- すぐ終わる
SICPを読むことで得たかったことが、コンパクトにまとめられていて、読みやすい日本語で説明されている。
SICPは、Schemeにふりまわされてページが進むことが多い印象がある。けれども、この本はシンプルで短いサンプルで説明がすすむ。
言語はOCamlではあるけども、そこまで戸惑わずに進むことができる。
テストファーストも徹底されてる。
なにより、すぐ終わるというのが大きい。
SICPがどんなにいい本でどんなにいい内容が書いてあったとしても、最初の方で挫折してしまうのであれば全く意味がない。「プログラミングの基礎」は、おそらくこの連休にちょっとがんばれば終わらせてしまえるような分量だ。SICPを読む前に、この本を読んでみて、本当にSICPに時間をかけることが必要か考えてみるといいんじゃないだろうか。
やってて楽しいというのもある。
SICPのように、よくわからないけど全部やると大人の仲間入りできるらしいとか、よくわからないけどこの先に何かあるかもとか、よくわからないけどオレは今SICPをやってるんだという満足感とか、よくわからないけどオレは今Schemeをやっているんだという満足感とか、そういうちょっとずれた満足感ではなくて、純粋に楽しい。
なので、どんどん進めてしまって、いつのまにか終わってしまう。(まだ読み終わってないけど)
あ、オレは今OCamlをやっているんだという満足感はある。
ただ、SICPについて、こうやってグチをたれたり、それでもSICPはすごいよねとか言ったりする会話に混ざれないのは、プログラマ人生においてさびしいと思うので、いつかはチャレンジしてみることをオススメする。
2009/3/21 20:40 追記:
「プログラミングの基礎」はSICPの4章5章に対応する部分はなくて、今回のエントリはそういう視点が欠けてます。SICP読むなら、4章5章をやらないと意味がないのではないかと思います。
2009/3/22 17:43 追記:
補足エントリ書きました
例えば、「class Person {String name; String home; String job;}と抽象化するのがいいよ」と教えるものではなくて、「class Person {String name; String home; String job;}と抽象化したかったら、その中身はこういうふうに組み立てられるよ」ということを教えるものではないかと。
そしてSchemeは本書中では、「特定の言語に中立な、プログラミング言語を組み立てる抽象的な要素」を実現するための透明な道具としての役割しか与えられていません。つまり「Schemeの教科書」でもない。
まあそういう観点で見ても古い (特に、メタ情報としての型にほとんど触れられてない) というところはありますが。「プログラミングを学ぼう」と思って読もうとするとなお難しく感じられるのではないかという気がします。
あと、日本語訳について。第2版は最悪です。というか、ピアソンさんの翻訳物はすべからくだめだめなので、日本語訳を諦めるか、第1版を探した方が良いです。
「プログラミング教育」という観点からのSICPの功罪および対案については、Felleisenらの "The Structure and Interpretation of Computer Science Curriculum" が興味深いです:
http://people.cs.uchicago.edu/~robby/pubs/papers/htdp-sicp-fdpe2002.pdf
ところで
@udさん: 「SICPは大学院レベルのコンピュータ・サイエンスを学ぶための基礎」
SICPはもともと学部生向け、しかもかなり最初に取る授業の教科書です。一応。
もっとも、大学でやる場合はTAによるヘルプがあることが前提になってますから、独学するとなると敷居がうんと上がると思います。