著作一覧 |
アスキーの鈴木さんから分厚い封筒が届いたので、wktkしながら開けるとやはりThe Art of Computer Programmingの1が入っていて、猛烈に嬉しい。ありがとうございます。
世の中には、読むべきであり、読めなくても蔵書しておくべきであり、少なくとも眺めてはおくべき本というものがある。でも時代のちょっとした隙間で入手できなくなることがある。また、それはべきべきなので、必ず現時点に何らかのかたちで反映されている。したがって、意識せずとも済ますこともできる。つまり古典というものだ。
その古典の奥付に記された発行者を眺めて、不可思議な感慨を覚える。
1巻は大雑把に(量的に)3つのパートから構成されている。
最初は離散数学で、シグマが山ほど出てくる。O記法(O(n**2)だからダメとかのO記法)もここで触れられている。知らなくても多分なんの問題もなくプログラミングはできるが、ある時点で、なんでおれは知らないのだ? と疑問に感じて(ということは必要性を理解する瞬間があるということだ)結局調べることになる。そこで初めて、高校の時に習った数学の必要性を思い知らされて、もっとまじめに勉強しておけば良かったなぁと感じたりすることになるわけだ。
次が情報構造(第2章)として、線形リストと木について説明してある。こういったことは知らなくても、Javaプログラマであれば、ArrayListやjavax.swing.tree TreeModelくらい何となく使えるはずだ(というか、ArrayListを使わずにプログラムを書くのは無理がある)。
双方向リスト(2.2.5)を読むと、今となっては使われることはないLinkedListについても、なぜJavaの実装当初は必要だと考えられたのか、なぜ.NET Frameworkでは無視されているのか、理解できるかも知れない。(ほとんどのユースケースではArrayListが十分に性能を発揮できるからで、もし、リスト全体のサイズが500MBくらいになってしかも途中挿入(add(index, element))とかが発生しまくれば、ArrayListよりもLinkedListのほうが良い結果となるかも知れない。でも先頭から最後までをしょっちゅう舐めまくるのであれば、途中挿入が発生しまくってもArrayListのほうが性能が良いかも知れない……というときに、プロファイリングしやすくできるので抽象List型を使えば良いね、というような話になるのであって、なんでもList型で受ければ良いというわけではない、別の話になっているけど)
木は使う人は使うが、使わない人にはまったく縁がないデータ構造だが、純粋におもしろい。
残りの1/3は演習問題の解答で、本書の演習問題は基本的に解答がちゃんと出ている。したがってモヤモヤした気持ちになることは無い。
サンプルのコードは、MIX(引用すると「MIXは1960年代から1970年代にかけて使われた数々のコンピュータとよく似ている。違っているのは、たぶんそれらのコンピュータよりも魅力的なことであろう」というわけで、クヌースのある意味理想のコンピュータなのだろう)という仮想マシンのアセンブリで書かれている(MMIXというRISC版に書き直した版についての言及が本文にも奥付にもあるけど、RISCで読みやすいのだろうか?)。多分、このコードを読むと、なぜ1970年代まではフローチャートが仕様の図示に使われていたのか、なぜGOTOが有害とされるにいたったのかを理解できるであろう。というのはともかく、理解しやすいと思う(また、なぜアルゴリズムを考えなくても今はプログラミングするプログラマーが存在できるのかを理解することもできる)。
The Art of Computer Programming Volume 1 Fundamental Algorithms Third Edition 日本語版(Donald E.Knuth)
なぜ、ドワンゴの第一弾(だと思う)が本書なのか、その歴史的な意義を考えて、まずは購入して欲しい。
あらゆる意味から得こそすれ損となることはあり得ない(本書そのものを蔵書する価値は当然だが、今後の技術書という存在自体の存続に関係するものに違いないと考えざるを得ないからだ)。
ジェズイットを見習え |