24 December '2003 - 02:34 | 雑記 デバグの技術
当たり前のことだが、プログラミングは、やはりいかにバグを早く見つけられるかがキモだ。動くコードを書くこと自体は、比較的早く上達するが、バグを取る技術はなかなか上達しないものだ。 シンプルで理解しやすく、つまり保守しやすく、綺麗なコードを書くためには多くの経験とたぶんそれなりのセンスが必要だが、動くコードを書くために必要な知識は、プログラムと言語のそれぞれの仕様の二つだけだ。両方とも、ドキュメントを見ながらでもいいわけだから、よく知らない言語でもプログラムをすること自体はできる。仕事でプログラムを書く場合、必ずしも綺麗に書くことそのものは目的ではないから、実際、そういうコードはよく生産される。それでもいい。動くなら。ま、動けばいいのだ的にしかコードを書かないヤツとか、綺麗さに拘り過ぎて抽象化が行き過ぎて難解になったり、やもするとなかなか完成しないヤツとか、そういう極端なのは、どっちもイヤだけれど。
そして、特に初級者には見落とされがちなんだろうが、コードを書くことと違い、バグを見つけるために必要な知識は、実は到底その二つだけではこと足りない。だいたい、何が原因か簡単に分からない時に、それを想像するための知識には何が必要なのかは一概にはいえないのは当たり前だ。
つまり、バグを早く見つけるためには、とにかく、いろんな知識が必要なのだ。
実は、おれの下で働いているヤツが3日ほど悩んでいるバグがあった。かなり頑張ったようだが、今日、とうとう、根を上げた。根を上げるまでにかかる時間が3日もかかっているというのがそもそもダメなのだが、まぁ、ダメだからこそ3日も費やさないと自分には分からないということが分からないわけだから、ある意味仕方ない。
そして、結果から言うと、バグの原因はプログラムのロジックにはなく、開発環境の方にあった。ライブラリの一部が壊れていたのだ。それも、ちゃんとリンクできて、ある特定の関数さえ呼ばなければ何も問題なく動くというような絶妙の壊れ方で。
このバグ取りは、おれの貴重な半日を捧げることになったのだが、その過程をずっと彼に見せていたにも関わらず、彼にはどうしておれがそう想像してそこをつついたり、ああ想定してあそこを探ったりするのか、サッパリ分からなかったし、発見するために通った推理の過程を説明しても、やはり、よく分かってもらえなかった。
デバッガで追えば見つけられる程度のバグならいざ知らず、こういうタフなバグを取るための方策はやはり教えようがないと思う。経験を積むしか。
ま、今回のバグは、ライブラリのせいとかコンパイラのせいとか、何とそういうことだって本当にあるのだ、といういい勉強になっただろうと思う。