メンバページ: Go
エレガントデバッグのススメ
Do you like the Elegant Debug ?
2日目 --- 使えるものは何でも使え
エレガントデバッグの定義、再び
ここではエレガントデバッグの定義をもう一度考えてみます。
エレガントとはその姿やふるまいがエレガントであることです。 これから、エレガントデバッグとはデバッグの結果だけでなく、「そのデバッギング作業でのふるまいがエレガント」なことです。
次に何がエレガントで、何がエレガントでないかを、例を見ていきましょう。
最初にエレガントでない例を見ていきましょう。
- メモリダンプをする、これはエレガントでないです!
- すべての関数にトレースを入れる、全くエレガントでないです!
- 勘を頼りに狙い撃ちした場所にデバッグ文を入れる、あーなんて、野蛮!
それでは、次にエレガントな例を見ていきましょう。
- バグの原因をみんなが納得する根拠を示して開陳する、名探偵的なエレガントさです!
- 目的を持ってバグの原因を科学的に絞り込んで捜査する、これも名探偵なエレガントです!
- 一瞬の閃きの妥当性を科学的に捜査する、これもまさにエレガントです!
ここでは例だけを挙げましたが、エレガントデバッグの雰囲気は分かってもらえたでしょうか。
例示するのも、エレガントを装う重要なポイントです。
- A 君: え、昨日の続き?それに結局定義が書いてないし。3番目は同じように見えるし・・・
- G 君: エレガントデバッグとは各々の心に中にあるんじゃ。
- A 君: わからないし・・・もう定義はいいからちゃっちゃと進めて!
疲れることはしない
名探偵には、いつも助手がいます。ホームズに対するワトソン君のように助手がいます。 「エレガントでないこと=疲れること」は助手にさせるのです。 あなたはそれを元に推理するのです。これが名探偵のコツです。
ここでは、助手の代りにデバッグツールに疲れることをさせます。 つまりこれが「機械でできることは人間はしない」というエレガントデバッグの第一原則になります。
トレースが必要と思うのであれば、例えば、VisualStudio のトレースポインタの機能を使うのです。 決して、あなた自身が関数にデバッグ用のトレースログを出すためのプログラムを入れるのではなく、機械にやらせるのです。 もう、printf 文の散りばめは終わりにしましょう。println 文の散りばめはなしです。 エレガントではありません!
void foo() {
printf("Enter in foo"); // トレース情報を表示する
...
}
このような printf 文は入れないようにしましょう。エレガントではありません。
もちろん、この print 文はデバッグのためでなく、ログとして運用時にも残すプログラムであるなら、入れることはいいことです。但し、その場合でもログ用のフレームワークを使った方がいいでしょう。フレームワークを使わない場合でも少なくともログ用関数を作成した方がいいでしょう。
アサーション用であれば、専用のアサーション文を入れるようにします。
機械化の助手たちには、具体的には有史以前から存在しているブレークポインタや、ウィッチウィンドウなども使ってください。メモリフットプリントを見たいときは purify などのツールを使ってください。 また各種プロファイラも役に立つでしょう。
ESC の資料室には、この手のツールを紹介しています。 ESC 資料室を参照してください。 Eclipse, NetBeans Profiler, JUnit, TestNG, VisualVM, jvmstat, ...など多くのデバッグ・テストツールを紹介しています。
ここで学んでほしいのは、疲れることはしない=機械にさせることです。
もっと言えば、積極的に機械を使ってくださいと言うことになります。そして、状況を正しく掴むということになります。
昔からある諺の「立っているものは親でも使え」を座右の銘にしましょう。
つまり、「クリックひとつで動くツールは使え」です。
これを発展させるときに以下のことを行います。
機械化するためには、つまりツールを使えるようにするためには、人間が苦労する必要があります。
「(機械化して)苦労しないためには、(人間が機械化対応するために)どんな苦労もする」のです。諺で「急がば回れ」というのもあります。」
しかし、一方で無闇にツールを掛けるのも問題があります。
「立っているものは親でも使え」ですが、使えないときもあります。
目的を持って使うのは当然です。これこそがエレガントです。
例えば、メモリリークのバグを調べるのに、速度を計測してもたぶん意味はないでしょう。
逆にツールが何ができるかを知る必要があります。それを知って、助手たちに情報を集めさせます。
例えば、ワトソン博士は有用な医師でもありますので、プログラムの健康診断にも使えます。
Windows の Dr.ワトソンのツールと、シャーロックホームズのワトソン博士をごっちゃにして書いているジョークです。
- A 君: ってつまり、ツールを使えってこと?当たり前ジャン。。。
- G 君: そうはっきり言わなくても。まずは第1原則じゃ。
- A 君: 立っているものは親でも使え?
- G 君: じゃなくて、機械でできることは人間はしないじゃ。
- A 君: へい、へい。それにジョークの解説は恥ずかしいだろうに。。。
みなさんもエレガントなデバッグしていきましょう。
See you again !!


