hiroshi-manabe様の日本語訳を使わせてもらいます。
和田訳本も持ってるけど。。。。こちらの方が読みやすくていい感じ。
SICPというのは計算機プログラムの構造と解釈(Structure and Interpretation of Computer Programs)という本の略称で、かつてMIT(マサチューセッツ工科大学)で行われていたプログラミング入門コースの教科書です。
前書き
計画を⽴てるということ⾃体を知的な活動として理解するためには、コンピュータプログラミングに⽬を向ける必要があります。
コンピュータプログラムを読み書きする必要があります— それも、⼤量に。何のプログラムか、どういう応⽤のためかというところはあまり重要ではありません。重要なのは、それらがどのようにふるまい、またより⼤きなプログラムを作る中でそれらがどれだけスムーズにほかのプログラムと協調できるかということです。
SICPが取り扱うのは、ある特定の課題を解決する方法ではなく、計画を立てるということ自体をを対象とする、もっと一般的なものだ、ということ。
日々巨大化し、気まぐれな変更が入り、ほうっておくとすぐ手に負えなくなるほど複雑化してしまうソフトウェアという怪物を、いかに暴走させずに飼いならすか?
完全な形式的な正しさの論証というものが⼤きなプログラムについてくるということはめったにありません。⼤きなプログラムは⼩さなものから成⻑していくものなので、正しさについて確信を持てるような標準的なプログラム構造(これをイディオムと呼びます) の武器庫を作り上げ、確⽴された組織化技術によってより⼤きな構造に組み⽴てていく⽅法を学ぶことが決定的に重要になります。
この本を読み進めていけば、解決したい問題に合わせて、プログラミング言語そのものを作り替えていくというアプローチが行われていく、はず。
誰かに用意してもらった環境を利用するだけでなく、自ら環境を作り出すのだ!
・・・ところが、現代のエンジニアリングにおいては既存の資産を組み合わせて目の前の問題を解決していく能力の方が重要だという考えもあって、それが件の入門コースが廃止された理由らしい。
しかし、まだまだソフトウェア開発というのは、便利な部品さえ手に入ってしまえばシステムとして完成させるのは簡単、といった風にはなっておらず、未だにこの怪物と格闘していかなければならない現実が続いている、と私は感じています。
我々が自ら環境を作り出す能力、という武器を捨てるのはまだ早いでしょう。また、拾った武器を使うのだとしても、それを有効に使う能力を身につけるためにも、SICPの内容は有効なはずです。
コンピュータプログラミングに関する興奮の源は、プログラムとして表現されたメカニズムが私たちの⼼の中とコンピュータ上で絶え間なく広がっていくことと、またそれが⽣み出す知覚の爆発です。芸術が私たちの夢を解釈するものだとすると、コンピュータは夢を、プログラムという形で実⾏するものなのです!
夢、というか頭の中だけで考えていたアイディアを、プログラムという形に具体化することで、その本質が浮かび上がる。
例えば、システムの複雑さを緩和する技術として抽象化というのがあるけど、この抽象化を繰り返すことによって、その問題について整理・単純化して理解を深めることができる。
つまりプログラミングによって人間は賢くなれる。プログラミングの本当の楽しさはそこにある!
と、こういう解釈でいいのかな? だとしたら個人的にすごく共感します。
余談ですが、これに対して、こんな抽象的で難解な本を読ませたら、プログラムを学ぼうと情熱を燃やす若人の心を折ってしまうのでは?という意見もあるようです。
代わりに、思い通りに動くプログラムをさくっと作らせる経験を積ませて、「楽しい!」って思わせたほうがよい、と。
うーん。私としては、本当に最初のうちはそれでいいんだけど、コンピュータが「思い通りに動く」だけでは、その喜びは薄っぺらいものにすぎないと思います。それは単に予想通りの結果が得られたというだけ。それより自身の知覚そのものが拡がるほうが楽しいでしょう?
そりゃもちろん、プログラミングは手段にすぎなくて、結果できあがるソフトウェアによって現実社会へインパクトを与えるという経験こそが芳醇なんだと考える立場もわかります。
でもそれだけじゃ、プログラミングがもたらす「知覚の爆発」という果実を、バッサリ切り捨ててしまうことになる。せっかくソフトウェアに関わるんなら、それはあまりにもったいないことです。
第1版序文
プログラムは⼈間が読めるように書かなくてはならず、それがたまたま機械によって実⾏できるというだけのことです。
出ました。「ハッカーと画家」でも引用されてたこの格言。プログラミングはソフトウェアを作るための手段でしかないとする考えに真っ向から対立してます。
(機械によって)ソフトウェアとして実行できるかどうかはたまたまのことでしかない?
じゃあ何のためにかと聞かれれば、人間が読むため? まるで禅問答のようですが・・・
データをいかに処理するかについて表現するなら、自然言語を利用するよりもプログラミング言語を用いる方が簡潔だし、あいまいさも排除できる。人間同士のコミュニケーションを行うのだとしても、自然言語よりもプログラミング言語を介して行う方が良い場合もあります。
プログラムを自ら読み書きできるかどうかは、ソフトウェアに関わる仕事をする上で必要なコミュニケーション能力のひとつと言えるでしょう。
・・・と、まあこんな調子で暑苦しい感想を書きたくなる文章が次々出てくる恐るべき本なのですが、進まないので次からはサラリと(練習問題中心に)やってきたいと思います。