著作一覧 |
アスキーの鈴木さんからC++によるプログラミングの原則と実践をいただいた。うれしい。
重さ1.9Kg、厚さ4.5cm、ページ数1200越え、お値段は7000円だ。
さすがに、こうなると、今更(おれは既にプロフェッショナルなのだ)おれが自分で購入する本ではない。読み切れないのがわかっているからだ(金額については「今更」ということはなく、むしろ今のほうが手に届くので別の話となる)。
まず、きちんとしたネガティブな評価を見ておこう。
幸い、同じアスキー(ではなくドワンゴのほう)の江添さんが「およそ悪書の見本のような本だ」という完全読破されたうえで結論を出されている。
おれはストラウストラップではないのでどうでも良いのだが、しかし一応、あるべき反論は少ししておこう。
「文章は簡潔にすべし」→それは違う。この本は仕様書ではなく、
・何よりも教科書
・次善として熱心な独習者の学習書
なのだ。
あらゆる方向から現在のトピックについて考察し言及し説明し明確にすることで、読者にそのトピックについて基礎的な概念を根付けたうえで学際への端子を用意し、考察の発展への可能性を生む。むしろそうでなければならない。
冗長性(特に「脱線」)は反復からくる退屈さを多少軽減し、客観的であるものを多少なりとも主観的に軸足をずらすためのテクニックだ。さらに反復は退屈さも生むが、反面、記憶への焼き付け効果ももたらす。考えながら読むには冗長性は不可欠とも言える。
本書を教科書として採用する先生は、少なくとも自覚のうえでストラウストラップには経験も知識も考察も気力も一歩譲るはずだ。であれば、講義のためのネタとして含まれる冗長さはむしろ望ましい。それは独習者にとってもそうであり、特に「自問自答の文章」は、それをドライブするには欠かせないものだ。
「サンプルコードの1割ほどがコンパイルできない」→しかしストラウストラップは達人ではない。達人はそもそも研究者にも先生にもならずに実務を行う。
(以下、『達人プログラマー』P.101の「書籍の執筆」をネタに延々とストラウストラップに対してお説教がはじまるのだが、現実問題として、これは本当に悩ましい問題なのだ)
というわけで、事前に、タイポがたくさんあるとわかっていれば間違い探しをしながらコンパイルしてください。
エディター上でコードを記述しているときは適切と考えた名前が書籍(実際は同じくテキストかも知れないしTeXかも知れないしWordかも知れないが)として「読む」と非常に不適切に思えて修正したくなることはある。これは断言できる。プログラムのコンテキストと書籍のコンテキスト(本文とのレイアウト上のバランスのような、プログラミングではあり得ない要素が含まれてくるからであり、部分抽出となるためにコードでの説明に追加をしたくなるのだ)は異なるのだ。驚くべきことだが。そこでつい手を入れてしまい、ここで再抽出-再コンパイル-再実行(テスト)しないと、まず100%間違える。多忙なストラウストラップが、この罠に陥ったとおれは推測するが、まず間違いないだろう。
「文字コードへの理解がない」→原書には存在しない第28章「C++と日本語対応」という江添さんその人の手による補章で補償してある。(ただ、ストラウストラップ自身の理解がどうかについてはwchar_tの限界程度で特に他のプログラミング言語よりもC++がひどいとも思われないので判断は留保する)
本書は、誰のためのものではないかはわかっている。
少なくともWebフロントエンドプログラマーのための本ではない。確かに1200ページを読む時間的投資と7000円の金銭的投資は無駄になるだろう(短期的には)。
しかし、下から上まで、プログラミングのフルスタックプログラマーを目標とするのなら、まったく無駄ではない。むしろたかだか7000円と教師について1年、著者によればまじめに独習して3か月(でも足りない)で、手に入るものはあまりに巨大だ。
この日記の題にも書いたが、本書はC++の入門書ではない。あくまでもプログラミングの入門書なのだ(言語としてC++を利用している)。入門書である以上は読んですぐ実践に使えるわけではない。しかし必要な概念(と周縁領域の知識)はほぼすべて得られる(20世紀レベルでは、と入れないとちょっと不誠実だな。でも並行、並列、分散は別の話だと思う)。とんでもない網羅性を持つゆえの厚さと重さなのであった。
まずは目次を見よ。と書き出すのが面倒なのでアスキーのページを示したら、章題しか出てないや。小見出しレベルが重要なのだが。
でも、0章(ここはストラウストラップの真摯な態度に感銘を受けるとても良い章なので立ち読みだけでもしておきたいところ)に目次を無視してストラウストラップ自身が本書で学べる内容について箇条書きしている。こちらを引用しよう。
本書では、効果的かつ実用的なプログラミングを行うために最低限必要な概念、手法、ツールを示したいと考えている。これには以下のトピックが含まれる。
・プログラムの構成
・デバッグとテスト
・クラスの設計
・計算
・関数とアルゴリズムの設計
・グラフィックス(2Dのみ)
・グラフィカルユーザーインターフェイス(GUI)
・テキストの操作
・正規表現マッチング
・ファイルおよびストリーム入出力(I/O)
・メモリー管理
・科学技術計算
・設計とプログラミングの理想
・C++標準ライブラリ
・ソフトウェア開発戦略
・C言語のプログラミング手法
(最後とその2個前はまあしょうがないかなぁ。「2Dのみ」とわざわざ限定しているところが上に書いた20世紀っぽさの自覚がある点かも知れない。「設計とプログラミングの理想」に刮目せよ)
(多分続く)
C++によるプログラミングの原則と実践(Bjarne Stroustrup)
(おれは逆にこのサイズだと紙の書籍のほうが読みやすいと思うが、そうは言っても重いし厚い。ディスプレイが2面あるのなら、片面にEmacs(コンソールとvimでも良いけど)、もう片面に本書というのもありではなかろうか。というわけで達人出版の電子書籍版もリンク)
#(コメントでメタテキストを始めるマークなのだが、マークアップ記法では……という小ネタをどこかで見かけたが忘れた)江添さんの
このことから、私たちはとても重大な教訓を得た。
というユーモアは好きだ。
ジェズイットを見習え |