『計算機プログラムの構造と解釈』(SICP)を読み終えて

ようやくSICPが終わった。念願の夢の1つを叶えた。「ポインタを理解する」「コンパイラをつくる」とかから始まり 今年に入って 技術者として個人的にやりたかった事を3つ実現できた。良い調子。
サムネは記念にマッカーシー先生(再使用が許可された画像)。

jmc

完了までの期間

3.5ヵ月程度。平日は帰社後に2~3時間ほど、毎週土日はSICPに費やした。

学んだこと・できるようになったこと

1. より抽象的に物事の仕組みが考えられるようになった。
(「言語」という制約されたドメインを取っ払って純粋に実装について考えられるようになった)
2. 再帰のコードは悩まなくてもスンナリ頭に入るようになった。
3. Eval & Apply の陰陽によるプログラムの成り立ちを理解した。

4. 数学・コンピュータ科学に関する以下のことが人に説明できる程度には身についた。
- Newton法
- エラトステネスの篩
- パスカルの三角形
- 不動点探索
- ユークリッド互除法
- 二分木
- モンテカルロ法
- データ主導プログラミング
- メッセージパッシング
- フレーム
- セマフォ
- Huffman符号化木
- 非決定性計算
- 並列処理
- ストリーム
etc…

5. 関数プログラミングに可能性を感じた。
- apply, map, filter の絶大な威力に戦慄した。
- 無限ストリームに戦慄した。
※ 特に Huffman符号化木がモールス信号とか実用で採用されている点に関しては結構感銘を受けたのと同時に、アカデミックな分野がまだまだ現実世界に応用できる可能性を秘めていると確信した。

6. 集中力が養われた。
7. 昔難しいと思っていた本が割とすんなり読めるようになった。
8. (´・ω・`)がLispの構文のようなものに見えるようになった。
9. 「スマフォ」という単語を見ると「セマフォ」を思い浮かべるようになった。
10. 「エラトステネス」のtypoがなくなった。
11. 括弧が無意識の世界に消え去った。
12. Lispの闇の扉が開いた。
13. lambda
14. λ
15. 神はLispで世界をおつくりになられた

大変だったこと・不安だったこと

1. 問題を一つ解くのに相当時間がかかることもあったので常に頭を悩ませていた。
2. 毎晩遅くまでパソコンに向かって勉強していたので日中眠気に襲われることがしばしば。
3. 周囲がAnsibleとかDockerの話をしている中で自分だけ古典をやっていたので 最新技術のアウトプットが遅れるのが心配だった。
とはいえ、いつまでも「SICPやりたい」という思いが頭の片隅に残っている状態だけは避けたかったので集中的に時間を設けてさっさと終わらせた方がよいだろうと思って終わらせた。

実際に終えてみた感想

正直一周するだけでは勿体無い本だと感じた。スルメ本(なんだそりゃ)。
特に4章以降、内容が面白いのにデバッグが中途半端で理解度が曖昧な部分が出てしまったので、これからSICPを始める方にオススメすることは、とにかくデバッグ環境の再現は面倒でも必ずやった方が良いということ。特に4章以降に関してはデバッグがあってこそ理解が深まるし 楽しいし、何より5章への繋ぎになる(逆に4章の理解が曖昧だと5章で地獄を見る)。

SICPは人生を変える本だったか

まだやり終えたばかりだから何ともいえないし、そもそも元々文系寄りの自分が中途半端な理解度でSICPに言及しても良いのかわからない。
ただ、感じた点を3点挙げると以下の通り(飽くまでも主観論)。

1. 技術に対する興味の範囲(個人的に未開拓の部分)は明らかに広がった。
SICPを続けていくうちにLispのごく一部に触れるわけだけど、そのうちLispを取り巻くマクロの世界に憧れを抱き始めるようになった(なお、SICP自体にはマクロの話は出てこない)。その思いはSICPを解き進めていくうちにどんどん強くなっていって、SICPを終えた後はもっとLispを深めたいと思う程になった。SICPはLispの本ではないけれど、それ程までにLispは魅力的だった(初心者の自分から見ても)。

2. アカデミックな視野がちょっと広がった
膨大な学問の世界のごくごく一部とはいえ、コンピュータサイエンスに関する知見は確実に広がったし、先人が生み出した素晴らしい抽象化されたモデルは今後の自分の発想を支える糧になると思う(二分木がHuffman符号化木に、Huffman符号化木がモールス信号のモデルに変貌を遂げたように 現実の状況に応じて姿を変えて)。
アウトプットが重視されている現代においても、個人的に 本質的な革新を支える要素として学術的なモデルに依存する所は物凄く大きいと考えている(今「イケてる」なんて言われている技術が実は1980年代の学術論文に書かれていた なんて話もチラッと聞いたことがある)。

3. 日頃「抽象のモデル」を無意識で組み立てる習慣がついた
これは上記の「学んだこと・できるようになったこと」の1番と若干被るけれど、ある事実がどのように構造化されているのか、どのように抽象化・具体化しうるのか。抽象の概念は学術的なモデル、システムを超えてコミュニケーション、日常生活にも活きてくる(…と信じたい)。

次にすること

Lispと関数型言語にすっかり魅せられてしまった、ということで既に以下の三冊を購入済み。
(僕のようにLispも関数型言語も初心者な人間がSICPをやっていると少なからずこのように闇に引き込まれると思う)
次のアクションは年内に以下の三冊を終了させる。

・Land of Lisp
・実践Common Lisp
・On Lisp

Lispに関しては時間があればLet over Lambda, 実用Common Lispもトライしたい。

んでもってLispを散々遊びつくした後はHaskellかClojureをいじるんだ。
Schemeやった後の感想として、なんか直感的に見やすいのはClojureだけど モナドやら圏論やら面白そうな話題が飛び交っている Haskell をいじることになりそう。

…と、ここまで来るとなんだかインプットに寄りすぎな感じがするので、今年度 上記を一通りいじった後は 実際に上記のツールを交えて 習慣的にアイデアを発想しながら形にしていくことを中心に動いていこうと思ってる。

最後に

正直僕一人だけだったら確実に挫折していました。
読書会で志を共にした皆さん、先にSICPを学ばれてブログに解説を書かれていた方々、SICPを通して様々な考察と問題を投げかけてくれたBen Bitdiddleさん、Louis Reasonerさん、Eva Lu Atorさん、Alissa P Hackerさん 他たくさんの方々に感謝。

リンク

・SICP難易度リスト

ものすごく主観的ですが以下に難易度リストをまとめました。

第1章 難易度リスト
第2章 難易度リスト
第3章 難易度リスト
第4章 難易度リスト
第5章 難易度リスト

・SICP学習事項まとめ

第1章に関するまとめ
第2章に関するまとめ

Written by Nisei Kimura ( 木村 仁星 )

- Sponsored Links -

<<

Top

>>