「プログラミングの宝箱 アルゴリズムとデータ構造」を読んでプログラミングについて考えたりした
この年末休みはずっとCを勉強してた。
なんでCかというと、実は自分はCをやったことがなかったから。
情報系もとい理系全般の学部卒以上であればCは必修科目でやってると思うんだけど、自分の場合は文系だったのもあり触れてこなかった。
webエンジニアの人の中にはCなんてやらなくても大丈夫だよという先輩方がいると思うが、個人的にはあれは嘘だと思ってる。
普段使ってるツール(自分はRubyとかImagemagickとか)でCで書かれてるコードはクソたくさんあるがそれらの内部が読めないの本当に機会損失だと思う。
そうした事情があり、Cをやりはじめたわけ。
そんで、基本的なシンタックスとポインタの考え方とかがわかってくると最低限のコードは書けるようになった。
そこで次はCSの基本学習でもやるかとなり、ここやここで紹介されてたプログラミングの宝箱 アルゴリズムとデータ構造 第2版をやることにした。
この本は、
あたりの基本的なアルゴリズムとデータ構造の話に加えて、
あたりの話も書いてある。
自分はCSの学習をちゃんとやってこなかったので、1から優しく図などを交えながら解説してくれる本書はとても理解しやすく読みやすかった。
特に全編にわたってCとJavaでの動くコードが掲載されているのが非常によかった。
理屈を理解するのと実際にコードにするのは別だと思う。
その点この本はすべてコードが掲載されているので、この理屈はどう実装すると良いのかが理解できる。
Cを少し学んだくらいの人間には、実際にアルゴリズムやデータ構造の仕様が文章で与えられて、それを自分のあたまで考えてコードに落とし込み、それを正解と見比べながら学習するという体験がワンステップずつ登っていける感覚があり上達を感じられると思う。
また、B木についての話が出てきたり浮動小数点のOO誤差の話とかオーダーの話とか、プログラマとして仕事をしてると結構頻繁に耳にする言葉がCSを修了してる人間は大学ですでに学んでるんだなということもわかり「はぁ〜〜」というなんともいえない気持ちになった。
余談だけど、この本を読んでて「プログラミングできる人とできない人との間の深い溝」に引用されている
結局、プログラミングや数学に求められるのは抽象的なものを抽象的なままで扱う能力ということになるのだろう
という言葉をひしひしと感じた。
例えば、i番目の値がi+1番目の値と比較して大きかったらdataのi番目をi+1/2で更新みたいな文章を読んでコードに落とし込む場合とか。
この例は簡単だけどこういった抽象表現にされたときにそのままコードに落とせる能力が自分にはあまりない。
iが1の場合はこうなって2の場合はiが1のときの値を使ってこうやって...みたいなことをずっとしてしまう。
具体的な値を想像して処理をイメージしないと実装できない。
このやり方だと再帰とか変数が増えた時に解けなくなる or ワーキングメモリが大量に必要になるので脳をめちゃくちゃ使うという感じになる。
今は詰将棋とか毎日解いてるからワーキングメモリが少し増えてなんとか理解できる感じになってるが、もっと歳をとったらどんどん厳しくなっていくのだろう。
35歳定年説とかあるけど、少し不安になった。
話がだいぶそれてしまったが、本書は全くアルゴリズムやデータ構造について学んでこなかった人でも最低限のCの知識さえあれば読みこなせる本だと思う。
大学時代にCSをやってこなかった自分のようななんちゃってプログラマは一度は読んでおいて損はないかと。
注意としては、池袋のジュンク堂や秋葉原の有隣堂、その他デカめの本屋でもこの本は置いてないのですぐ読みたくてもAmazonで注文することをおすすめします。
自分は4店くらい探したけど見つからなかったので。