プログラマが知るべき97のこと/Hello, Worldから始めよう
Paul Lee(通称Hoppy)は、私の同僚の中でも、プログラミングのことに関しては最高のエキスパートで、皆の尊敬を集めています。先日も少し困ったことがあったので、Hoppy のデスクまで行って「ちょっとコードを見てもらえないだろうか」と頼みました。
「いいよ」Hoppyはそう答えました。「じゃあ、椅子を出してそこに座って」そう言われて私は、彼の後ろに築き上げられたコーラの空き缶のピラミッドを壊さないよう、慎重に椅子を引っ張り出しました。
「どのコード?」
私は、問題になっている関数の名前と、その関数のコードが収められているファイルの名前を告げました。
「じゃあ、その関数を見てみようよ」Hoppyはそう言って、置いてあったK&Rをどけると、キーボードを私の前に移動させました。
「IDEはどこ?」Hoppyは、IDEを使っておらず、エディタで作業しているようでしたが、そのエディタは私に使えるものではありませんでした。Hoppyはキーボードを私からひったくると、何やら打ち込み始めました。すると、私の言ったファイルが開き、内容が画面に表示されました。大きなファイルです。表示されていたのは、私が言った関数のコードでした関数も大規模なものです。彼はページを送ると、ある条件ブロックの部分を表示させました。私が彼に尋ねたかったのは、その条件ブロックについてです。
「xが負の値になった時、この部分のコードはどう動くのかな」私はそう尋ねました。「負の数になると絶対にまずいってことだけはわかるんだけど」
私はその日、午前中いっぱいを使い、xの値を強制的に負の数にする方法を探して、あれこれ試したのです。しかし、何しろ大規模なプロジェクトで、ファイルも関数も大規模です。コードに変更を加えてコンパイルして実行、という作業を繰り返していたら、疲れ切ってしまいました。それで、Hoppyのようなエキスパートならすぐに答えがわかるのでは、と思って助けを求めたわけです。
しかし、Hoppyもすぐにはわからないと言いました。K&Rを手に取るのかな、と思いましたが、意外にもそうはせず、新しいエディタ画面を開いて問題のコードブロックをコピーしたのです。コピーしたコードは、インデントし直し、関数にラッピングしました。そしてさらに、彼は永久にループするmain関数を書きました。永久にループし、ユーザに値の入力を求めるコードです入力された値は、問題のコードブロックをラッピングした関数に渡され、実行結果が画面に表示されます。彼は、書き上げたコードをtryit.cという新しいファイルに保存しました。素晴らしい早業でした。私なら、仮に同じことができたとしても、もっと時間をかける必要があったでしょう。そして、何よりすごかったのはそこからです。彼は次のように入力したのです。こんなにもシンプルな方法があるなんて、私には思いも寄らないことでした。
$ cc tryit.c && ./a.out
これだけで、彼がほんの何分か前に作ったプログラムは動き出しました。私たちは、プログラムの求めに応じていくつかの値を入力し、私の懸念が正しかったことを確かめました(私も、この点だけは間違っていなかったわけです) 。さらにHoppyは念のため、K&Rの該当ページを開いて再確認もしてくれたのです。私はHoppyに礼を言い、コーラの缶のピラミッドを壊さないよう注意しながら椅子をしまって、その場を後にしました。
私は自分のデスクに戻ると、IDEを閉じました。長いあいだ大きなプロジェクトチームの一員として、大規模な製品の開発ばかりしてきたので、いつの間にかそのやり方に慣れきってしまっている自分に気づいたからです。プログラミングが元来どういう作業だったのか、ということを忘れかけていました。IDEを使わなければ、コンピュータが自動でやってくれることなどほとんどなく、あとは自分の手でやるしかないのです。プログラミングとは元々そういうものだったはずです。私はテキストエディタを開き、こんなコードを書きました。
#include <stdio.h>
int main()
{
printf("Hello, World");
return 0;
}