きしだのはてな このページをアンテナに追加 RSSフィード

2009-03-21(土)

いまSICPを読むのは時間の無駄 15:30 いま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に代わるいい本をみつけてしまったのだ。

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)

プログラミングの勉強のために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 追記:

補足エントリ書きました

SICPの価値

shiroshiro 2009/03/21 16:51 確かにSICP中に "programming" という単語はたくさん出てきますが、SICPは「プログラミングの教科書」ではないのだと思います。プログラム言語という媒体を「どう使うか」という、まず言語があってその上にレイヤで何をするかって話ではなく、現実の問題を記述する媒体としての抽象的なプログラム言語を「どう組み立てるか」という、実は言語よりも下のレイヤの話をしていると。

例えば、「class Person {String name; String home; String job;}と抽象化するのがいいよ」と教えるものではなくて、「class Person {String name; String home; String job;}と抽象化したかったら、その中身はこういうふうに組み立てられるよ」ということを教えるものではないかと。

そしてSchemeは本書中では、「特定の言語に中立な、プログラミング言語を組み立てる抽象的な要素」を実現するための透明な道具としての役割しか与えられていません。つまり「Schemeの教科書」でもない。

まあそういう観点で見ても古い (特に、メタ情報としての型にほとんど触れられてない) というところはありますが。「プログラミングを学ぼう」と思って読もうとするとなお難しく感じられるのではないかという気がします。

nowokaynowokay 2009/03/21 17:48 「抽象化するのがいいよ」という話もやっているのだと思うんですが、「こういうふうに組み立てられるよ」の比率が高いですね。「特定の言語に中立」というには、car/cdrに混乱させられすぎる気もします。

udud 2009/03/21 19:27 SICPは大学院レベルのコンピュータ・サイエンスを学ぶための基礎なので、この用途以外で読もうとしても、役に立たないのかもしれません。
あと、日本語訳について。第2版は最悪です。というか、ピアソンさんの翻訳物はすべからくだめだめなので、日本語訳を諦めるか、第1版を探した方が良いです。

shiroshiro 2009/03/22 08:28 それと、SICPはEECS(電子工学・計算機科学)専攻の教科書であるという点も重要かもしれません。興味のあるなしにかかわず、電子工学ならある程度の数学とは付き合わざるを得ないでしょうから。
「プログラミング教育」という観点からの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によるヘルプがあることが前提になってますから、独学するとなると敷居がうんと上がると思います。

nowokaynowokay 2009/03/22 10:11 PDF、興味深いですね。読んでみます。

kiwanamikiwanami 2009/03/22 15:20 SICPは非モテということですね。わかります。

h_iwkh_iwk 2009/03/22 22:35 こんにちは。はじめまして。
私は現在進行形でちょっとSICPを読んでおり、自分としても思うところがるので、書き込みます。

>SICPはもともと学部生向け、しかもかなり最初に取る授業の教科書です。
とshiroさんがおっしゃられているように、初めての人でも分かるように、SICPは計算機で必要なことがらについて膨大なページをつかって懇切丁寧に説明をしています。
また、こなしきれないくらいの大量の問題があり、いままで分かっているつもりであっても、問題を解こうと思ってやってみると案外よくわかっていないということも多いので、基礎を固めようとする人にとっては最適な本だといえます。
というわけで、いえることとしては、基礎的なことを固めようとする人にはお勧めの本だけど、そうで無い人にはなんともいえず、時間の無駄となる可能性も高い、だと思います。

----余談----
ちなみに、代替の本の『プログラミングの基礎』(浅井健一著)ですが、中の問題を実際にやっていないのでなんともいえないですが、著者の浅井先生はSICP第4章のメタサーキュラーの発展型の研究(自己反映型SchemeのBlack)をされたりしています。なので、もし浅井健一先生が続刊として、自分自身を書き換える自己反映言語に関する本を出されたら、それは間違いなくSICP第4章の代替の本になるはずです。(ひそかに期待。)
部分評価を使った自己反映言語のコンパイル
http://www.is.titech.ac.jp/ppl2004/proceedings/p017.pdf
自己反映言語型SchemeのBlack
http://pllab.is.ocha.ac.jp/~asai/papers/papers.html
下から4段目にあるプログラム。

tempuraturetempurature 2015/07/05 15:59 きしださんの記事を私のブログで紹介させていただきました。
よろしくお願いいたします。

http://ra9ra9.exblog.jp/24356862/