勝てるプログラマ「9割る0は0である」(キリ
2012/12/04 20:27:00


汚いコードシリーズ(笑)。ちょっとまえに小学校の算数の問題で「9割る0は0」と教えているという話題があった。だがちょっと待ってほしい。プログラマにも身につまされることがあるのではないか?

0での除算が処理できないのはプログラムも同じ。計算しようとするとプログラムはそこで止まってしまう。で、止まった箇所がだいたいわかるので、その部分を作ったプログラマに「おまえが作った部分がバグってるぞ、すぐ直せ」と、怒りの指示が出る。

で、そのプログラマは調べ始めるのだが、見てみると0除算を起こしている原因は、他のプログラムから渡されてきた値。確かにその値で割り算をしているのは自分の担当のプログラムだけれど、そもそもこの値が0になるのがおかしい。

なんでこの値が0になって自分のところに渡されてくるのか?まさに「9割る0はいくつですか?」と問題を出された小学生の立場。「そんなこといわれたって…」と途方に暮れるしかない。

   *   *   *

もちろん調べる努力はしてみる。他人が書いたコードの部分を読んでみる。でも自分が書いたんじゃないからよくわからない。その部分の担当のプログラマを探しだして尋ねてみるけど、のらりくらり。

そりゃそうだ。下手に首を突っ込んだら巻き込まれて仕事が増えてしまう!「いや、そんなはずないですよ」「俺も別のプログラムから渡されてきた値をそっちに渡してるだけだしぃ」とか、とにかく逃げまくる!(笑)

   *   *   *

なんでこの値が0になるのかわからない。でも0除算で止まってしまうのは確かに自分の担当のコード。上司からはら「早くバグをとれ!」と矢のような催促。

そこでとれる選択肢は…割ろうとする数が0の場合、実際に除算はしないで、答えを0にしちゃおう!これでプログラムが止まることはない!

そもそもこの値が0になるのがおかしいのだから、おかしいケースにおかしい答えを返しても、俺は悪くないぞ!

   *   *   *

ということで、そういう処理を付け加えて、「バグ修正終わりました」と報告。確かにプログラムは止まらなくなってる。一件落着!

で、しばらくすると他のプログラマから「あの~なんか変な値が渡されてくるんですけど…」と問い合わせ。「え?そんなことないはずだよ。知らん、知らん、いま忙しいんで」以下ループ。

   *   *   *

いざという時に一発逆転のシュートを放ってくれる「勝てる」プログラマの中には、こういう人たちが紛れ込んでいるという話。きっとこういうバグを長時間かけて他人のコードまで全部調べて、正攻法でバグをとるのは、例の社長に言わせれば「デバッグが目的化しちゃってる自己満足のエンジニア」となるのだろう(笑)。

でもシャレにならないんだよな。問題と思われる箇所が別な会社の担当の部分だったりすると、「うちの責任ではなくA社担当のコードが原因です」と、かなかなか主張しづらい。うち→発注元の会社→A社というルートで、修正を頼むことになるが、そう主張するならそれなりの証拠(というと大げさだけど)を整えなければならないし、調査するにしても他社のコードは見れなかったりするし。それなら手っ取り早く「回避(隠匿?)」してしまって、その分他の生産的な仕事をこなした方が、「勝てるプログラマ」なのだろう。

   *   *   *

ちなみにこういうときに0を選ぶことが多いのは、プログラマの良心なのだろうな。1とかの方が発覚しにくいはず。いや、分かり難くしようとすればいくらでもできる。それをストレートに0にするのは、「私も苦悩の末の決断なんです」「不可抗力なんです」というプログラマの思いが、コードの行間から滲み出ているようだ(笑)。さすがに発覚しにくい工作までしてしまうとね…。

   *   *   *

森博嗣のミステリー「S&Mシリーズ」にもこんなシーンがあった。学会発表を控えてデータの処理を焦っている犀川創平教授。ところがプログラムにバグがあるらしく、うまく計算出来ない。教授はとりあえずおかしな振る舞いをするケースだけ除外して処理するように助手の国枝桃子にプログラムの修正を頼むが…。

この国枝桃子は超カタブツ。そんな正当性のない処理を入れたら、データ全体の信憑性が台無しになります!と断固拒否。

ここでのポイントは犀川創平教授は準主人公で、シリーズ全編を通して非常に頭のいい人物として描かれていること。しかも人間性もすばらしい。だからこそ国枝桃子のような融通の聞かない助手を抱えていられる。

国枝桃子も犀川創平教授を基本的には慕っているので、最初5日(この辺の数字は記憶だけでいいかげん)必要というプログラム修正を「徹夜すれば3日でできます」と譲歩する(でも、正攻法で修正する点は譲らない)。

結局、犀川創平教授は自分の指示に理がないことを認めて、このデータの学会発表は断念し、プログラムの修正も暇な時でいいと撤回するのだが、自分でも理不尽だと思っている指示を出さなければならない心境と、それをストレートに正論で反論された時の腹立たしさ。この場合の腹立たしさは国枝桃子に対するものではなく、自分に対するものなのだろう。

ま、ミステリー本編とは直接関係ないエピソードでした。

   *   *   *

さらに余談だけど、Intelのプロセッサの除算のバグを思い出してしまった。

  Pentium FDIV バグ - Wikipedia
  http://ja.wikipedia.org/wiki/Pentium_FDIV_%E3%83%90%E3%82%B0

1994年のこと。Pentiumの除算命令にバグがあり、特定の数値での除算で著しく精度が低下するという問題。発見したのはどこかの大学の教授だが、発見した経緯を想像するとなんとも複雑な心境になる。

この先生、CPUのチェックをしたかったわけではなく、自分の実験データを処理してたのだろう。ところがなぜかデータの精度が予想より悪い。まずは自分の実験の計測方法にミスがないか疑ったことだろう。そして次に自分のプログラムのどこかに誤りがあるに違いない、と。まさかCPUにバグがあるとは思わないから、一生懸命調べたのだろうな。何百回も…。そして最後にたどり着いたのがCPU…。

   *   *   *

追記

例外を投げろとかassertを使えとか言ってる人、そんなことしたらプログラムが止まっちゃうじゃん!バグ報告「○○でassertに引っかかる」、バグ修正報告「assertを取り除いた」(キリ

俺がせっせと入れたassertがいつのまにかなくなってる。理由を尋ねてみると、「それが入っているとプログラムが動かないから取ってくれと言われて取りました」だと。「ちょっと、おまえ、表に出ろ!」


関連記事:
汚いコードとは何か?
「すべてがFになる」(森博嗣)

ページサマリー
December 2012
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Powered by asks.jp