私にはプログラマの知人が多い。 仕事で知り合った奴もいるし、 大学時代の友人でプログラム書きをなりわいとしている奴もいる。 いずれ劣らぬ熟練プログラマである。
個人的につきあいのある人間が書いたプログラムを読むのは、とても楽しい。 ある程度熟練したプログラマだと、性格がプログラムに出てしまうからだ。 プログラムを読んでいると、書いた奴の顔が浮かんでくる。ふむふむ、確かにあいつらしいプログラムだ。 この関数の使い方なぞ特にそうだ。
すぐ判るのはおおざっぱな性格か細かいところまで気がつく性格か、という点だ。 ほんとに細かい部分まできちんとエラーチェックをしている奴もいれば、 まあ正しく動けばいいやという気分をプログラム全体にみなぎらせている奴もいる。
if 文が出てきたら else を見る。きちんと書いているか? switch 文が出てきたら default を見る。 予期せぬ値への用意は万全か? ライブラリ関数を呼んでいたらその返り値のエラーチェックを調べてみる。 適切なエラーメッセージを出しているか? …これだけチェックしただけでプログラマの気配りが見えてくるから面白い。
ネットワークを通じて手にいれたフリーソフトにはソースプログラムがついてくるものも多い。 ひどいプログラムのこともあるし、うーんすごいとうなってしまう美しいプログラムに出会うこともある。 美しいプログラムを読むと、 まだ見ぬ(そしてたいていは一生見ることもない)そのプログラムの作者の人となりを 想像して楽しんでいる。
プログラムはその作者の人柄を偲ばせるだけの表現力を持っていると言ってよい。
* * *
私はプログラムの初心者を指導するときに、
「三日たてば自分も他人」
と言うことがある。三日もたてば自分の書いたプログラムでも何をやっているかわからなくなるものである。 だから他人に読ませるつもりできちんと書かないとダメだよ、というのである。
コメントを書けばそれで済む? いやいや、そんなに単純なものではない。変数や関数にどんな名前をつけるか。 for 文にするか while 文にするか。関数にするかマクロにするか。 一つのファイルにまとめるか複数ファイルに分割するか。 そういった一つ一つの選択にどれだけ心を遣うことができるかで、プログラマの質が見えてくるのである。
よいプログラムを書くための基本姿勢は何か? 一言で言えばそれは、
「読む人のことを考える」
である。 プログラムを読む人は、プログラムの字面しか手がかりがないのである。 そのプログラムの字面を読んだときに、プログラマの意図がうまく伝わるか。 伝わる書き方をしているか。よいプログラムとよくないプログラムの分かれ目がそこにある。
簡単な例をあげよう。
メモリ内に特定のデータが存在するかどうかを調べる関数を作ったとする。あるプログラマはその関数に、
check_memory()
という名前をつけた。「メモリをチェックするのだから」という理由らしい。これはよろしくない。 もっと直接的に書くべきだ、と私は考えた。例えば
exist_data()
というふうに。 これなら、この関数が真を返したらデータが「存在する」、偽を返したら「存在しない」のだと想像がつく。プログラム中でも、
if (exist_data()) { ... }
と書くことができる。
check_memory()
だと、この関数が真を返したときにデータが存在するのかしないのかはっきりしない。 「チェック」という言い回しがあいまいだからだ。
ついでに言えば、場合によっては上記の関数は
no_data()
という名前がいいこともあるだろう。もちろんこの場合は真を返したらデータは「存在しない」のである。 要は読む人間のことを考えて書いているか、自分の意図が十分に反映されたプログラムを書いているか、 がポイントとなるのである。
自分が書いたプログラムが読む人のことをよく考えているプログラムかどうかは、 三日後に読んでみればよくわかる。自分が書いたプログラムのはずなのに、 何でこんなに読みにくいのだろう。私はそういう思いを何度も何度も経験した。
* * *
私はつねづね、
「プログラムは文章と似ている」
と考えている。
ちょっと考えただけでも両者には多くの共通点があることに気がつく。 両方ともコトバで書かれている(プログラミング「言語」とはよくいったものである)。 両方とも書き手と読み手がいる。両方とも技術的側面と芸術的側面を持っている。 そして、両方ともある種の人間を夢中にさせる魔力を持っている。
「文は人なり」とよく言われる。文章にはどうしてもその書き手が顔を出してしまう。 美辞麗句を重ねた文章で自分をよく見せようとしても無駄なことである。 自分をよく見せようとするそういう書き手自身の姿が文章に現れてしまうのである。
プログラムも文章と同じだ。プログラマがプログラムを書いているのだけれど、 プログラムに描き出されるのはプログラマ自身に他ならない。関数名も変数名もいいかげん、 制御構造もいきあたりばったりのプログラムは、そういう性格のプログラマを描き出す。まさに、
「プログラムは、人なり」
なのである。
(Oh!PC、1990年2月25日)