怠慢
全体の労力を減らすために手間を惜しまない気質。この気質の持ち主は、役立つプログラムを書いてみんなの苦労を減らしたり、同じ質問に何度も答えなくてもいいように文書を書いたりする。よって、プログラマーの第一の美徳である。
-- Larry Wall (翻訳:小飼弾)

私は前に「プログラムには命令と条件分岐しかない」と言いました。実はこれだけでも、きちんと動くプログラムは書けます。しかし、それだけでプログラムを書こうという人は今ではいません。

なぜなら、プログラマーには次の三大美徳が備わっているからです。

  • 怠慢(laziness)
  • 短気(impatience)
  • 傲慢(hubris)

この三つをはじめてご覧になった読者は、「え?背徳でなくて美徳」とおっしゃるかもしれませんが、本書を読んだ後であれば、この三つが美徳であることが理解できると思います。

それでは、まず「怠慢」から見ていきましょう。

変数:名前を付けて保存

別にプログラマーでなくとも、メールやワープロで普通に文章を書くことはあるはずです。その際に、過去に書いた文章を参照する必要に迫られたことも何度もあるはずです。そういうとき、あなたはどうしますか?過去に保存したファイルを開きますね。では、そのファイルを保存するとき、あなたはどうしたでしょうか?

名前を付けて保存したはずです。

もし「名前を付けて保存」できなかったら、一体どうなっていたことでしょう。あなたはその文書が必要になる都度、それをはじめから打ち込み直さなければなりません。「君が代」ぐらいならまだしも、それが「戦争と平和」だったりしたらえらいことです。このことだけでも私はトルストイを尊敬します。「名前を付けて保存」も出来ない時代にあれほど長〜い小説を書いたのですから。

まずはトルストイの気持ちになってもらいましょう。「私は怠慢ではない」という文を百回表示するプログラムを書いてください。

答えは、こんな感じになっているはずです。

p('私は怠慢ではない'); // 1回
p('私は怠慢ではない'); // 2回
// ...
p('私は怠慢ではない'); // 100回

お疲れさまでした。もしプログラマーの仕事がこんなだったら、私は今すぐにでも夜逃げします。

ありがたいことにプログラマーは怠慢なので、たいていのプログラミング言語にも、「名前を付けて保存」するための機能が用意されています。そして、たいていのプログラミング限度では、その「名前」のことを変数(variable)、その中身のことを(value)と呼んでいます。

それでは、上のプログラムを名前、いや変数を使って書き直してみましょう。

var s = '私は怠慢ではない';
p(s); // 1回
p(s); // 2回
// ...
p(s); // 100回

少しすっきりしました。ここで、「名前を付けて保存」している箇所をもう一度見てみましょう。そう、var s = '私は怠慢ではない';です。これは、「sは'私は怠慢ではない'に等しい」ではありあません。「'私は怠慢ではない'という値にsという名前をつける」あるいは「'私は怠慢ではない'という値をsという変数に代入(assign)する」と読みます。ちなみに頭についているvarというのは「ここで変数を用意します」という「おまじない」だと思ってください。

ちなみにJavaScriptでは、変数名は「英単語」でなければなりません。あと、なぜ数字でもないものを「変数」と呼ぶかは、もう少しあとで解説します。

この「中身に名前をつける」という習慣は、プログラミングという習慣がこの世になかったころから存在した人類の叡智です。もし名前というものが存在しなかったら、あなたはこの本に言及するのに、「小飼弾」という名前ではなく、本そのものを取り出してみせなければなりません。そして、今ではURIという形で誰もが「変数」を目にしています。そう。実はあれも変数なのです。Webサイトの「内容」に対応する。

以下同文

これだけでは、まだ充分怠慢とは言えません。上のプログラムでは、まだp(s);が100回も登場します。ふつうの文書だって「以下同文」と書けたり、歌詞だって「くりかえし」と書けるのに、プログラムで反復が出来ないとしたらそれは哀しすぎます。

怠慢なプログラマーは、当然それをお見通しです。JavaScriptでは、こうやります。

プログラム:
出力:
エラー:

このプログラムを解説しましょう。

var s = '私は怠慢ではない';
var n = 0;    // n の値を0に設定
while( n < 100 ){ // n が 100 より小さい間、{}の中身を繰り返し
  p(s);
  n++;          // n の値を一つ増やす
}

これで、101行あったプログラムが、わずか6行になりました。そろそろ怠慢が美徳であることに納得いただけたかと思います。

プログラマーの天敵、無限ループ

しかし、これにもまだ一つ問題がないわけではありません。もしn++;という一文を書き忘れたら、一体どうなっていたでしょう?

そうです。未来永劫、'私は怠慢ではない'という出力が続くことになります。この「終わらない繰り返し」のことを、プログラマーは「無限ループ」と呼びます。当然無限ループに陥ったプログラムは終了することはありません。実に怖い無限ループですが、プログラムを書いている間に時々そうなってしまうことはよくあります。そのためにプログラムの実行環境には「強制停止」スイッチがある場合が多いのですが、その強制停止スイッチすら利かないともなると、電源をひっこぬくしかコンピューターを止める方法はないのです。くわばらくわばら。

ちょっとひねったくりかえし

先ほどまでの設問では、出力する内容は100回とも全て同じでしたが、少しずつ内容を変えて繰り返したいこともよくあります。たとえば、先ほどの設問に「頭に何行目かをつける」という条件を課すと、プログラムはこうなるでしょう。

プログラム:
出力:
エラー:

ちなみにここに出てくる(n + ':' + s)は、「足し算」ではなく「文字をつなげる」という意味です。これでも正解なのですが、今時のプログラマーは、これでも満足しません。少しずつ値を変えて繰り返すというのは、プログラムにおいては実に繁雑に登場するので、これをもっとすっきり書く方法を要求するのです。幸いJavaScriptにはそれがあります。

var s = '私は怠慢ではない';
for (var i = 0; i < 100; i++){
  p(i + ':' + s);
}

このwhileの代わりにforとなっているのが問題の箇所です。全部でfor (var i = 0; i < 100; i++)ですが、これは「iの最初の値を0にして、iが100より小さい間は{}の中身を繰り返す。一回{}の中身を繰り返したら、iの値を一つ増やす」という意味になります。

これを利用すれば、こんな問題も簡単に解けます。

Q:九九を出力せよ

実際にやってみましょう。

プログラム:
出力:
エラー:

いかがです?81行もある九九の表がわずか5行。プログラマーの怠慢さを、あなたも是非身に付けましょう。

まとめ

  • プログラマーの三大美徳とは、怠慢、短気、そして傲慢である
  • プログラマーは名前を「変数」と呼び、中身を「値」と呼ぶ
  • 段落は{}で囲む
  • 単純な繰り返しはwhile、すこしづつ値を変えて繰り返すのはfor
  • 繰り返しは、繰り返してやるのでなく「繰り返してやれ」とプログラムに書く

Dan the Programmer