おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

「計算機プログラムの構造と解釈」は読む価値がないか?

ええと、いわゆる SICP *1 として知られた「計算機プログラムの構造と解釈」。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

とあるブログ、といってリンク貼らないで批判するのもなーって感じなので d:id:nowokay:20090321:1237617054 ですね。
冒頭読んだだけであまりにも的外れな批判なのではてなブックマークで「そりゃないでしょ」と書いてしまったのですが、ほかのみなさんのコメントみてると、ええええええっ! と思うような理解がされていることが分かったので、エントリを立てて補足することにします。

事実

  • SICP は「計算機科学」の教科書であり、プログラミングの教科書ではない。
  • SICP においては Scheme は目的ではなく手段である。つまり計算機科学を教える道具として Scheme を選んでいるということ。
  • SICP は MIT の「非コンピュータサイエンス学科」向けの教科書であり、「他のプログラミング言語の経験が必須」などというのも間違い。
  • 和田訳が日本語としてこなれていないので本としてのハードルを上げている、というのは認めざるを得ないかも*2

意見

  • 「計算機科学」の教科書としては、SICP は非常に良く書けた教科書である。
    • 例えば、「オブジェクト指向言語」というもので与えられた機能としてのオブジェクトが、どのように実現されているのか、ということを知りたいのであれば、この手の本をひもとくことは大事だと思う。
    • そういう内容は知りたいが Scheme は分からない、という人、あなたは多分計算機科学の本を読むには早すぎる。
      • なぜならこの本には Scheme という言語でしか表現できないことは書いていないはずだから。言語を離れてその先の意味が理解できない人はこの本を読んでも消化不良を起こす可能性が高い。しかしこの本ぐらい平易に書いてあってついてこられないのであれば、根本的にあなたは計算機科学に向いていないのではないか*3
  • SICP にはこういう視点が欠けている」という批判をする人は、SICP が非専門家向けの教科書である(が故に、計算機科学を学んだことのない人にも読みやすい)ということを忘れていないだろうか。そういう視点の欲しい専門家はいくらでも他書を参照すればいい。
  • Scheme の勉強がしたければもっと良書がたくさんあるだろう*4
  • Scheme関数型言語として強くないので (いくらでも手続的に書けてしまう) 関数型言語の入門言語としてはそもそもふさわしくないのでは。
  • 和田訳が辛いというならマグロウヒルから出ていた旧版を探してもよいかも。私はこの訳で辛いと思ったことはないが、もう20年も前の本なので探すのは大変かもしれない。

プログラムの構造と実行〈上〉 (COMPUTATION&SOFTWARE SCIENCE)

プログラムの構造と実行〈上〉 (COMPUTATION&SOFTWARE SCIENCE)

プログラムの構造と実行〈下〉 (Computation & software science)

プログラムの構造と実行〈下〉 (Computation & software science)


なおオイラはたいして優秀なプログラマでもなければ計算機科学の学徒でもないのでこのエントリの間違いについては私の目の届く範囲でばしばしやってくださいまし。

追記

ブクマコメントで id:findup さんよりコメントをいただきました。割と典型的な反応なのかな、と思うのと、書き足りなかったことがあるのでちょっとお借りして。

計算機科学に向いていない=プログラマに向いていないという意味なのかな。まぁそしたら私は足を洗わないといけなくなりそうだな。こういうアカデミックな"○○論"的な匂いのするのは苦手だし。

前半「計算機科学に向いていない=プログラマに向いていない」は、そんなことはありませんし書いてもいません。ただ、SICP は計算機科学の教科書であるから、計算機科学……というと大上段に振りかぶりすぎですが、プログラミング言語のある機構がどう実現されているか、などということに興味がない人が読むような本ではありませんよ、というだけのことです。

ただ、My Job Went To India

My Job Went To India オフショア時代のソフトウェア開発者サバイバルガイド

My Job Went To India オフショア時代のソフトウェア開発者サバイバルガイド

を読めばお分かりのとおり、自分の道具としてのプログラミング言語とその周辺知識しか知らないプログラマは遠からず人件費が安い国にアウトソースされてしまう可能性があるため、Something New は必要でしょうね。SICP はその一案として挙げられているだけかと。


後半「こういうアカデミックな"○○論"的な匂いのするのは苦手」ですが、まあ私もいい大人にピーマン食べろとかいうつもりはないので嫌いは嫌いで構わないとは思います。
ただ、エンジニアってやつは好奇心が勝負なので、反アカデミズムによってものすごく巨大な「巨人の肩」をみすみす放棄するのはもったいないとは感じます。例えば Java の本は Java の、PHP の本は PHP の、C# の本は C# のことしか教えてくれませんが、この手の本はその奥にある共通するものを教えてくれるものなので。
そして SICP はこの手の本としては非常に整理されていてわかりやすく、ペダンティックな部分はない。「俺の書いたプログラムってどうやって動くんだろう」っていう疑問に答えてくれる良書です。
もちろん「プログラムはなぜ動くのか」とかでもいいっちゃあいいんですけど、仮にもプログラマでおまんま食べてる人にはレベル低すぎるだろうと(もちろんこれはこれで良書ですよ)。

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

もちろん個人の興味と趣味と知識ポートフォリオは個人で決めていただくよりないので、少なくとも「SICP プログラマには必読!」とか煽られて読んで dis ったりする不幸な事態だけは避けていただければ、私としては幸い。
そして、個人的には、SICP を面白いと思えるようなエンジニアと一緒に仕事できればな、とは思います。


PS2. 追記の方が長くなっちゃった。別エントリにしようかとも思ったが、ひとまずこのまま。

*1:綴り間違ってることをコメントでご指摘いただきました。koguro さまに多謝。

*2:事実じゃないって?

*3:もちろん、プログラミングでおまんまを食べるのに計算機科学を学ぶことは必須ではありません。追記参照。

*4:私は専門家ではないのでしらない。