My Daily Programming Life...

悩むということ

今日、ある人からちょっとした相談を受けた。マネージメント的な話だったので僕に相談してきたようだ。
彼女は本当に悩んでいるようだった。ただ、いまいちその本質までは掴み取ることができなかった。話はするのだけれど、いまいちどこに問題の核があるのかがはっきりしない感じがした。
その理由の半分は、僕に当たり前のことが彼女にあたり前ではないからとか、そういう差からくること、もう半分は、どこに答えがあるのか彼女自身もよくわからないということ、じゃないかと思った。
(完全な僕の想像なので、僕の頭が悪いだけなのかもしれない。)

やりとりの中で、何となく「どういう風になったら、よいと思う?」と聞いた。まあ、その答えや、その後の結論は置いておいて、この質問が結構いろいろなことを教えてくれる質問なんじゃないかと思った。

僕は悩んでいる。これは確かで、ずっと悩みながら生きている。でも、正直何に悩んでいるのかが分からないのが現実だ。なぜ毎日、何かが足りないと思いながら生きているのか。それが何なのかが分からない。

さて、僕は「どういう風になったらよいと思う?」のだろうか。
「すごいソフトウェアの開発」ができれば幸せか、「グーグルに就職」できれば幸せか、「ノーベル賞をとった」ら幸せか、「日本一周旅行」ができたら幸せか。
なんとなく、こんな風になったらすごいなぁ、なんてぼんやりと考えているものを並べてみても、実はぜんぜんそれで幸せにならないことに気がつく。

一方で僕が悩んでいなかったころのことを思い出すと、この問いにはっきり答えられていた。
高校生の時は「勉強していい大学に入る」ことができれば幸せだったし、大学に入ってからは「ジャグリングが上手くなる」ことができれば幸せだった。だから、その当時僕にこの質問をしていたら、僕は間違いなく、この答えを言っていた。100%これを言っていた。そういうものがあったということだ。

そういう状態の人間は強いと思う。すべてのことに解決の道が見出せるし、そこに向かっていける。

あまり気にしすぎても答えはでそうにないが、「どういう風になりたいのか」という問いから自分を考えていくのもよいと思う。

再帰処理と再帰手続き

「処理と手続きが混同される一つの理由は、ほとんどの一般的な言語(Ada, Pascal, C)の実装がすべての再帰手続きを手続き呼び出しの量だけメモリを消費するように設計されている空である。たとえ、その手続きが原理的に繰り返しであったとしても。その結果、これらの言語はdo,while,forなどの助けを借りてでしか繰り返し手続きを表現できない。」

SICPより(一部省略)。

再帰呼び出しを行う関数が、必ずしも再帰手続きではないということだ。つまり、再帰呼び出しをしても、たくさんのメモリを使わずに済む場合があり、それは繰り返し手続きとなる。

やっぱり、Cとかそういうものでプログラムを学ぶとこういったことに気づくことができない。それがすべてだと思ってしまう。文字列がNULLで終わるものだと思っているという類の、もうちょっとコンピュータの原理に近い部分の話の気がする。
つまりCなどの実装に影響を受けすぎて、それがコンピュータの動作だと思ってしまう。

こういうことを理解しておくことは重要だ。

続・3年で読む本

以前に3年で読む本をリストアップした。もうそれから半年・・・全然進んでない気がする。
というわけで、何頁進んでいるのか確認
  • アルゴリズムイントロダクション  (18 / 1292 )
  • 計算理論の基礎 1~3  (139 / 507)
  • 暗号の数学的基礎 (29 / 243)
  • 離散数学 コンピュータサイエンスの基礎数学 ( 0 / 275 )
  • Windows Internals 5th Edition ( 0 / 1152 )
  • モダンオペレーティングシステム ( 144 / 986 ) 
  • 詳解 TCP/IP Vol1 ( 0 / 631 )
  • コンピュータの構成と設計 上下 ( 254 / 576 )
  • 分散システム ( 0 / 822 )
  • Database Management System ( 0 / 1065 )
  • 構造化コンピュータ構成 ( 121 / 746 )
  • セキュアソフトウェア ( 533 / 533 )
全体では 1238 / 8828 = 14 %  ... 本来は16%ぐらい終わっていないといけないんだけど。
しかも、一部はこの3年で読むと決める前に読んだ部分も含まれていたりするので、ペースは遅い。Windows Internals二関しては、4th editionの日本語版を半分ぐらいは読んでいるので読み始めれば結構早く理解していけるとはいえ、もうちょっと読む時間を増やさないと。

UCBerkeley CS61A Structure and Interpretation of Computer Programming Week2

だいぶ間が開いてしまったがSICPのWeek2。
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewiTunesUCollection?id=354818464#ls=1


教科書はオンラインで読むこともできる。
Structure and Interpretation of Computer Programs(SICP)http://www-mitpress.mit.edu/sicp/full-text/book/book.html

宿題や試験の内容はこちら。(宿題はCourse Reading Vol1にある。)
http://www-inst.eecs.berkeley.edu/~cs61a/fa10/

Lecture 3

主な内容
  • Function as Arguments( Higher-order function )
  • 関数の表記について( |-> という表記 )
  • lamda関数

関数の表記 |-> "maps to"についての説明はなんとなく聞くことになるけど、SICP 69ページのFixed-Pointの計算でsquare rootを計算するところでその理解が必要になる。(詳しくは後述)

lamda関数については、その歴史から話が始まる。アロンゾチャーチという人が、数学を関数を元に説明しようとしたところから始まっている、というような話だった。その後、AI研究者のジョンJohn McCarthyが、その考え方をLispに取り入れたとのこと。

Lecture 4

主な内容
  • First Class Data
  • Functionを返すFunction
  • letについて
基本的には高階関数の話

宿題

宿題はSICPのSection1.3を読むこと。Section1.2は飛ばしてあとでやるとのこと。読むに当たって知っておいた方が良さそうな英単語は
converge 収束する
differentiable 微分可能
derivative 導関数

いくつか注意が必要なところがあったので、メモ。
まず、SICP67-68は飛ばしてもよい。これは宿題の指示にも書いてある。

それから、その次の「Finding fixed points of function」というところ。まずFixed pointが何なのか分からないといまいちピンとこない。日本語では不動点 http://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9 となるらしい。これを一通り見ればどういうことなのか分かる。
それから、69ページのこのFixed pointの計算を使ってルートを解くところで、y |-> x/y とかなっていて、x,yの二つの変数が出てきてそれでどうして計算ができるのかと一瞬戸惑うのだが、よく見ればこれはyの関数であって、xは定数であることが分かる(このことに気づかないと理解するのに時間がかかる。)。
これは、まさに授業中に言っていたことだ。ax+bとかあったら、勝手にxを変数だと思い込むくせが悪いのだろう。正確な関数の記述はx |-> ax+b ということだ。

読み終わったら、指示にしたがってSICPの練習問題を解く。
教科書の練習問題は、基本的なことが主なので問題ない。
難しかったのはCourse ReaderのWeek2のExtra for expertsの問題。
これはできなかった。なんとなく考え方としては関数を返す関数を書いて・・・2重にすれば・・・などと考えたけどうまくいかなかった。決して方向性は間違っていなかったようなきがするけど。

これはY Combinatorというものらしい。詳しくは以下を参照
http://www.ece.uc.edu/~franco/C511/html/Scheme/ycomb.html
feedSubscribe to my feed