毎日ブログを書いていることを知っている人から、よく「大変でしょう」と言われる。実際、大変だ。本を2日で1冊ほどのスピードで読まないと、本をネタに話を書くのは行き詰まりそうな気がするので、頑張ってほぼ2日に1冊のペースで読んでいる。それだけ勉強になるから、本人としては満足しているが、読んだ本が全てネタに向いているかというと、そうでもない。面白いのだが、ブログのネタにはどうも…という本もある。ただ、「人生のまとめブログ」なので新しい知識は必ずしも必要ない。本は、要は、テーマを決めるための触媒だ。
気を付けているのは、必ず書いた文章の見直しをするということだ。できれば2日以上にわたって見直すようにしている。原稿を夜に書くことが多いが、夜書いた文章は昼間に読むとみじめだということを知っているから、昼間見直すようにしている。ということは、書き終えた原稿と、書きかけの原稿が同時進行しているということだ。今も書きかけの原稿がいくつかあるが、見直しの時間が無いので、まだ公開できない。だから、2週間ほど前に読んだ本について書いたブログだが、公開していなかったものを「蔵出し」することにした。コンピューターのプログラミングの話だ。

コンピュータ関係の雑誌を定期購読しているが、時にはコンピュータ関係の単行本も読んでいる。今回、Boswell、Foucher『The Art of Readable Code』(O'Reilly)を読了したので、いつもとは違うが、この本のことを書きたい。コンピュータの話に関心の無い方には申し訳ないので、前半は一般的な話を書く。

この本は読んで分かりやすいプログラム(コード)を書く方法を解説したものだ(ここから既に分かりにくいかもしれないが、プログラムと言うのはコンピュータに作業を命令する命令書、コードとはその命令書の文章のことである)。対象読者として「プログラムを随分作成しているが、コードの書き方を本式に教わったわけではない」という人を想定しているようだ。大企業ではコードの書き方についての社内規約がしっかりできていることが多いだろうから、中小企業、ベンチャー企業といったところのプログラマーを対象としているのだろう。英語の本を読んでいてよく感じるのが、日本では読者数が少なくて出版ができなさそうな本も、英語ではしっかり出版されているということだ。コンピュータの世界では英語が「共通語」なので、読者層が非常に厚いのだろう。
面白かったのは、どのようにプログラムに落とし込めば良いのかわからないときは、平易な言葉で説明してみるとそれだけで問題が解決することがあるというアドバイスだ。
しかしこの「平易な言葉で説明する」という方法が応用できるのはプログラムの作成に限ったことではありません。たとえば、ある大学のコンピュータ科学の研究室では、学生がプログラムの不具合の原因究明に助けを必要とする場合は、まず最初に、部屋の隅に置いてある専用のクマのぬいぐるみに問題を説明しなければならないという決まりを作っています。驚いたことに、声に出して問題を説明するだけで、学生が答えを考えつくことが多いのです。この手法を「ラバー・ダッキング」と呼んでいます。(137ページ)

また、プログラマーが自戒すべき指摘もある。「プログラマーは製品を構想する場合、機能を盛り込みたがる」という指摘だ。その後のメンテナンスを考えれば、機能はできるだけ絞った方が良い。
プログラマーは機能の実装に要する作業量を少なく見積もりがちです。大雑把な試作品を実装するのに要する時間については楽観的に見積もりますが、将来的にメンテナンスし、解説文書を書くのにどれだけ時間をとられるか、コード全体がどれだけ複雑になるかを忘れています。(140ページ)

また、できるだけライブラリ(定型的な作業を行うプログラム部品を集めたもの)を利用するように勧めている。
よく引用される統計ですが、平均的なソフトウェアエンジニアが1日に作成できる出荷可能品質のコードは10行です。プログラマーが最初にこれを聞かされると、信じられないと驚きます―「コード10行だって? そんなの1分で書けるよ!」
肝心なのは「出荷可能品質」というところです。枯れたライブラリのコードの1行1行が、設計、デバッグ、書き直し、解説文書作成、最適化、検証といった非常に多くの作業の賜物なのです。この生存競争で生き残ってきたコードは、どの行も貴重なものです。(144ページ)

このブログの読者にどれだけプログラマーがいるかわからないが、最後にこの本で学んだプログラム上の注意点を挙げておきたい。1と3は、仕様書なり解説文書を丹念に読めば書いてあることだが、文書が膨大で、つい読まないでいたため、知らなかった。

1.C++のSTDでvector、list、mapなどを消去したい場合、clear()してもメモリは解放されない。swap()すると、コピーコンストラクタが自動的にぴったりのサイズのメモリを確保するので、消去した部分が解放される。(52ページ)
struct Recorder {
    vector<float> data;
    ...
    void Clear() {
        vector<float>().swap(data); // なぜdata.clear()としないのか。
        // こうするとvectorのメモリが解放される。
        //「STL swap trick」でネットを検索すること
    }
};

2.JavaScriptでクロージャを利用してプライベート変数を作成する。以下の例で、最後に()があるので、外側の無名関数が即座に実行され、内側の関数を値として返す。(99ページ)
var submit_form = (function() {
    var submitted = false; // この変数は次の関数からしかアクセスできない。
    return function (form_name) {
        if (submitted) {
            return; // フォームの二重送信を避ける。
        }
        ...
        submitted = true;
    };
}());

3.JavaScriptでは変数にvarを付けないで定義した場合はグローバルスコープになる。すべての<script>ブロックから見えるようになる。(100ページ)
<script>
    var f = function() {
        // 以下のiにvarが無いので、iのスコープはグローバルとなる
        for (i = 0l i < 10; i += 1) ...
    };

    f();
</script>