「結城さん、 ちょっと相談が」
「はいはい、 何?」 私は読みかけの本を置いて、 S君を振り返った。 彼は新人のプログラマ。 手にしたプリンタ用紙の束と困った表情から、 プログラムのトラブルの相談であることがすぐに判る。
「実は、 このプログラムが無限ループに入ってしまうんです」 S君は紙を手早く私の机に広げ、 息せき切ったように説明を始める。
「ここが呼び出されて、 ここでループしてるんです…。 これまでは動いていたんです…。 そっちの関数が悪いのでしょうか…」
私は、 と言えばS君の説明を聞きながら、 プログラムの内容ではなく別のことを考えている。 いや、 考えているのではなく、 私は待っているのだ。 S君が例のキーワードを口にするのを。 S君の説明は続く。
「…で、 ここで if 文を実行します。 ここは大丈夫です。次に…」
「ちょっと待った」 と私はS君の説明をさえぎる。 やっと彼がキーワードを言ったのだ。 私は彼に言う。
「その if 文は本当に大丈夫なのかい」
「もちろんです。 だってこの変数の値を見て if-else が連鎖するだけですよ。 パケットが着いていればこっちに来るし、 まだならこっちに来ます。 もうここは何度も読みましたから絶対に大丈夫です。 次にですね…」
「ちょっと待った」 S君は先に進もうとするが、 私はそう簡単に引き下がらない。 「その if-else の途中でパケットが到着したらどうなるの?」
「え?」 S君は困惑げにプログラムをのぞき込む。 沈黙。
「あ、 まずい!」 S君は声を上げる。 「…まずいですね。 if文の途中で条件が変化しちゃいますね」 彼は腕組みをして考え込む。 「なるほど」
…解決は時間の問題であろう。
* * *
人が作ったプログラムのバグを取るのは自分が作ったプログラムのバグを取るよりずっと楽な作業である。 なぜなら、 作者の話にじいっと耳を傾けるだけでよいからだ。 私はそのとき、 二つのことを待っていればよい。
(1)大丈夫という言葉を待つ
作者はプログラムの説明をする。 私はそれを聞く。 しばらくすると作者がこう言うことがある。 「ここは大丈夫」 と。 しかし残念ながら、 たいていの場合、 そこがまさにマズいところなのである。
(2)説明の省略を待つ
作者はプログラムの説明をする。 順々に説明をしていくのだが、 なぜか途中で説明をはしょるときがある。 何回か説明をさせても、 必ず説明を省略する部分があるのだ。 それは不思議なほど頻繁に起こる。 作者自身も自分が説明を省略していることに気がついていなかったりする。 作者の意識からスポッとその部分が抜けているのだ。 そう、 ちょうど、 道路工事のために開けられた暗く深い穴のように。
* * *
プログラムのバグが取れない、 ということは、 その作者のどこかに誤りがあるか抜けがある、 ということである。 全く誤りがなく、 抜けもないとしたらプログラムはその作者の考え通りに動くはずであるから、 これは当然のことである。 だとするならば、 アドバイザの役割は、 作者が「大丈夫」 というところで「本当?」 と問い返し、 作者が説明を省略するところで「そこを説明して」 と要求することである。 作者が大丈夫というところで大丈夫と思い、 省略したところを抜かして考えるなら、 作者の陥った同じ穴にアドバイザまで落ちてしまうではないか。
もしかしたら、 優れたプログラマは、 自分が当り前だと考えていることをもう一度疑ってみることができるのかもしれない。 しかし、 自分が当り前だと考えていることをもう一度問い直すことは、 とてもとても難しい。 私はプログラムを書きながら、 毎日それを痛感している。 私も、 つい「ここは大丈夫。 ここは大丈夫。 絶対ここは大丈夫」 と言ってしまうのだ。
* * *
「結城さん、 結城さん」
小一時間ほどしてS君がまたやって来る。 うれしそうな顔を見ただけで、 問題が解決したことが判る。
「おかげさまで、 無限ループから脱出できましたよ」 S君はうれしそうに言う。
プログラムだけでなく、 君自身も無限ループから脱出できたことになるね。 自分の思考の無限ループから。
(Oh!PC、1993年10月25日)