@uents blog

Code wins arguments.

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

SICPようやく読み終わりました。

2014年5月から読み始めたので、 足かけ丸2年。愛娘も1才から3才に成長。

練習問題やブログの記事を上げていたGitHubのコミットグラフを見ると、 サボっていた期間も結構あり、実働は1年ちょっとくらいかな。

image

他のSICPブログを見ると、ほぼ全問解きながら3.5ヶ月や 6ヶ月で読み終えた方もいるようなので、決してペースは早くもないし、 練習問題も特に§5の後半は全然解けていないですが、 社会人で仕事・家事・育児をこなしつつ、通勤時間・深夜・たまの有休を 使っての活動だったので、結構頑張ったかなという感はあります。

SICPで学んだこと

過去の記事を見返しながら列挙してみました。◎,△は僕の理解度です。

  • ◎ 変数の束縛と代入の違い、環境との関係を理解した
  • ◎ 関数がファーストクラスである言語の実装の考え方を理解した
  • 再帰呼び出し高階関数が自然と使えるようになった。末尾再帰を意識するようになった
  • ◎ 関数適用や評価の順序を意識しながら実装できるようなった
  • ◎ データ主導やメッセージパッシングの戦略の違い理解した
  • ◎ 型変換の動機と過程を理解した
  • ◎ 局所状態とクロージャによる抽象化の構築を理解した
  • ◎ ストリームと遅延評価を理解した
  • △ 字句解析、構文解析を実装できるようになった (BNFコンバータまでは使ってないので△)
  • Schemeインタプリタフルスクラッチで実装した
  • ◎ 継続や非決定性計算の概念を理解できた
    • §4.3でcall/ccに出会い、§5.2のレジスタマシンのconitnueレジスタがまさに継続だと気づけた
  • レジスタマシンで動作するインタプリタコンパイラの構造を理解した (練習問題を解いていないので△)

さらに発展的なものとして、

  • 万能機械の概念を知り、ユーザープログラムであれ処理系であれ 解くことのできる問題もそうでない問題も同じ、というメタな視点が得られた
  • プログラムはある意味全て処理系、という考え方に至るようになった

副次的なものとして、

  • 社会人での継続学習、ブログを書く習慣が定着した
  • GitやGitHubが使えるようになった
  • わからなくても書いて動かせば道は開ける、と思えるようになった。 まずは手を動かすことが大事!

ざっとあげてこんなところかな。

読み始めの頃といまの比較

読み始めた頃の自分といまの自分を比較してみました。

読み始めたころの自分 いまの自分
関数型言語を習得したい SICP関数型言語を習得する本ではないが、
高階関数クロージャあたりは自然と使えるようになり、めちゃめちゃ楽しい!
情報工学へのコンプレックス インタプリタコンパイラの学習を通して、全く無くなりました!
単なる力試しがしたい 学生の頃の自分と今の自分は全く別。
自分自身でも成長が感じられた!
プロブラマーとしてもっと飛躍したい 2年前とは全く違う景色は見えている気がする
(これはこれからのお楽しみ!)

まとめ

image

長い時間はかかりましたが、間違えなくその価値はあったと断言できます。

やはりSICPは計算機科学の入門書でした。 こうして読み終えたいま、改めて学生時代に読んでおくべきだったと感じてます。 (大学時代のボスに言われたことは正しかった..)

それでも、得たものを大きさをこうやってまとめると、 社会人である程度のキャリアを積んだいまでも、読み切ることができて良かったです。

最後に、RacketやGaucheのような素晴らしい処理系、 ウェブで公開されている原文、和田先生やその他有志の方の翻訳版、 練習問題の回答など今ではとっかかりがたくさんあるし、 昔に比べてSICPの敷居はずいぶん下がったように思います。

これらが無ければ絶対に完走することはできなかったでしょう。 先人のみなさま方、ほんとうにありがとうございました。


※「SICP読書ノート」の目次はこちら