根底を理解したい

よくブログなんかみてると、プログラマならアーキテクチャとかわかってないとだめとかいってるのがあるんだけど、確かにそうなんだよなぁと思うときがある。だめというか、ホントは理解で来てればいいのにと思う場面があります。

たとえば、C言語ハッシュ関数を実装しようとしたとき(そんな状況今時ねぇよというつっこみはご遠慮ください。)に、登録したいデータのアドレスは一意になるはずだからということで、アドレスの値と配列の要素数で割ったあまり(剰余)をインデックスとして使うという方法をとろうとします。

このとき、たいてい配列の要素数って1024だとか128だとか、きれいな値を使っているときが多いと思うんですが、これだとかなりすかすかなハッシュができあがります。というか、アドレスを割るときに2の倍数を使った段階で、ハッシュテーブルの半分を無駄にすることになります。

たぶん、メモリやアライメントという概念がないとわかんないと思います。僕も、微妙です。

何か、新しい概念を学ぶときに、その概念が抽象度の高い物ほど、その根底にあるものを理解していたほうが、その概念を理解しやすいのかなぁと思っています。

で、なんでこんなことを思ったかというと、最近Arrowとかを適当にいじってみていて、なんとなく使えるけど、ホントにそれでいいのかなと思っているところで、Arrowの心というのを読んだためです。上のアーキテクチャ理解したいというのは、そうとう長い前振りです。何が言いたいかというと、ちゃんと計算論だとかを勉強したいなぁと。大学時代に、なんで、そんなんが必要なるのかわからず、放棄していたんですけど、今となってはホントやっておけばよかったなぁと(写像とか単射がコンピューターと何の関係があるんだとか、チューリングマシンとか何の必要があるのと思っている時期がありました。)
。あと高校時代に数学が好きだったのに挫折したので、ちょっと数学コンプレックス。

とりあえず、どこから手をつけていこうかしら。

計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)

計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)

この本が以前から気になっているんだけど、どうもこのシリーズは、大学の教科書のおかげで、ちょっと恐怖心が…。何かおすすめとか、ありましたら教えてください。