蛍光ペンの交差点[別館]

"どの点に関心をもつべきか ―をわれわれが学びとるのは,もっぱら仮説からだけである"

失敗とプログラマ

優秀なプログラマ(たとえば、某人工知能の世界選手権で1位を取るような開発者)と接していたとき、明らかに一般人と異なる傾向が見られた。

 

失敗に対する態度である。

 

The New Hacker's Dictionaryによれば、ハッカーは非決定論的な世界を嫌うらしい。僕が出会った人もそうだった。彼はプログラムについて以下のように考えていた。

  • プログラム上の失敗(目的と異なった動作をすること、すなわちバグ)は必ず「〜(予想と異なる動きをするプログラム行A)のせいで、その行以降に予想通りに動いていない」という事実で説明できる。
  • その行以前について「一行単位で完璧に動作を理解している」と言えるのでない限り、本当のバグは上記のプログラム行A以前、たとえばプログラム行Bに生じている可能性がある。
  • プログラム行B、すなわちそこまでの動作が実際に期待通りに動いている行までは「そのプログラムが正しく考えている」ので、何の問題もない。探索範囲はプログラム行B以降に狭まる。

 書いてみれば何ということはない、単に「バグがどこかの行に必ずあり、それを確実に見つけるためには、バグ以前の動作については完璧に理解している必要がある」というだけの認識だが、大事なのは彼はこれ以外の価値観を全く受け入れなかったということだ。

僕はヘボプログラマなので「とりあえず全体的に正しく動いているみたいだから次、次」と、動作テストも書かずに新しい部分を書いていってしまう。彼はそれを全く受け入れず、徹底的に批判していた。どちらの価値観が正しいかは、両者のプログラマとしてのパフォーマンスを見れば一目瞭然だろう。

 

この体験から僕は、以下の主張が正しいと思うようになった。

 

 Although high general intelligence is common among hackers, it is not the sine qua non one might expect. Another trait is probably even more important: the ability to mentally absorb, retaion, and reference large amounts of `meaningless` detail, trusting to later experience to give it context and meaning. A person of merely average analytical intelligence who has this trait can become an effective hacker, but a creative genius who lacks it will swiftly find himself outdistanced by people who routinely upload the contents of thick reference manuals into their brains. 

(The New Hacker's Dictionary)

 

`meaningless` という感覚が、多くはプログラムを扱う以前の物理世界で培われたものである、というのが理由だろう。プログラムを書くという行為は、現実で実際に手で箱の中身を入替えたり同じ物体を複製したりするよりも遥かに早い。だが、ここからが重要で、遥かに早いのだが、やっている動作が正しいのか間違っているのかという情報が、自分の動作中ではなくプログラムの動作中に判明するという欠点がある。よって、間違いに関して以下の情報が失われる。()内は、物理世界で間違えた場合に自動認識される情報である。

  • いつ間違えたか?(いま)
  • どこで間違えたか?(いまの操作か、いまの操作の前提となる操作)
  • どう間違えたか?(いまの操作)

スタックトレースやダンプファイル、デバッガによる逐次実行などは、すべてこれらの情報の推定手段である。

つまり、プログラム上で間違えることのコストは、現実の動作を間違えたときのコストとだいぶ性質が異なる。とくに「どこで」が分からないのは、探索時間をものすごく取られるので致命的である。

 

よって、開発時間が限られている以上、マニュアルを読む時間を増やして、デバッグする時間を減らすという策が有効になる。実際上記のプログラマも、僕がmakeについて知りたいといったとき「GNUのソフトウェアはマニュアルが充実しているから、一度通して読んでみてはどうか」と薦めていた。