デバッガと近視眼の関係

What’s old 翻訳で pdb 関係みててちょっと思い出したこと。

仕事ではなくて趣味で Windows のネイティブデバッガを作って遊んでたこともあるし、デバッガは良ければ良いほどありがたい、と思う人だし、使うときは使う、のだけれども。同僚や若手を見ててずっと感じてたことがあってね。ちょっとだけ言っときたいかなぁと思ってさ。

というのも、どうも「デバッグ」をすぐさまデバッガに頼るエンジニアが多過ぎるんじゃないかと思ってなぁ。いや、もちろんデバッガに慣れ、熟達することは必要なことであるし、それは生産性にも関係はするだろう。

けど、「ワタシとは全然違う」のね。ワタシには「デバッガは最後の手段」なのね、いつでも。仮に、だよ。製品コードのほとんど全てを掌握もしくは把握しているのならば、何かが起こったらどこでそれが起こっているのか、ということは何割か、多分半分以上の場合は「すぐに当たりが付けられる」はずなんだ。そうでなくとも「二分木探索」的に数回で近い箇所には辿り着けるはず。自分が把握していないものでないなら。

ワタシは一人プロジェクト、数人プロジェクトから二百人クラスのプロジェクトまで、まぁまぁ幅広く経験したけれど、そのバカでかいプロジェクトでも「サブプロジェクト」に分解されればせいぜい十数人から数十人規模なので、「その程度の規模」であれば、この経験則が当てはまらないことはまずない。(ただし設計・実装も担当している場合には限られるが。)

ワタシがいつもヲィヲィ、と思うのは、ラフに当たりを付けることもなく「イキナリおもむろにデバッガを起動する」エンジニアがあまりにも多かったこと。別にそれでも問題箇所に辿り着ける速さに大差が付くことはない(後述)のだけれど、ただ、「理解度」には大きな開きが出る。つまり「見れば見るほどまさにこれはパッチ」になるか「抜本的な措置」となるのかにおいて、月とスッポンほどの差が出る。なぜって…、簡単に言えばデバッガを素直に使う限りは「常に虫の目だから」。鳥の目視点がどうしても欠けてしまうのね。いきなりピンポイントで「問題箇所」に辿り着いてしまうもんだから、「問題箇所しか直せない」ことが起こるし、これが間接的なものに辿り着いていたりすると、的外れな措置も起こりやすい。

「後述」とした部分について。反論ある人は確実にいると思う。デバッガ使わないのと同じ時間で原因特定なんか出来るもんか、とか、「デバッガ使うより速い」なんて主張は論外だろう、てわけだ。けどそうじゃないよ。もちろんものにもよるけれど、普通はデバッガを使わない原因解析の方が「速い」。もちろん多少の経験値やテクニックは必要ではあっても、「的確に」という意味においてはむしろデバッガなしで特定する方が速い場合が圧倒的に多い。限られた入り組んだものだけが「デバッガでしか見つけられない」のであって、というよりデバッガはそういうときのためにある。

問題は「原因箇所に当たりが付いていない間のステップ実行」にある。これが「虫の目」であり、「近視眼」だ。ところが「ソースコード解読」は、こういうの、さすが人間、としか言いようがないと思うのだが、「猛烈なスピードでの流し読み」が出来る…、のね。というよりか、「関係ないと思われる部分を読み飛ばす能力の凄まじさ」つぅのかね。これはもちろん設計書を読む、でもいい。「どの枝に関係するか」を特定するのは機械でなくとも人間はかなり速いスピードで「二分探索」をやってのける。

問題はここから。じゃぁその「当たりを付けた」ら何をするんだろうか? デバッガでブレイクポイントを設定する、が答え? そうなんだけど、「それが特定した答え」であることはないのかな? つまりそういうこと。「デバッガを効果的に使う」ために最初に「当たりを付け」ないとまさに「step 連打」で疲れ果てる「おバカなデバッガ使い」(あげく連打してるうちに本題を忘れて迷子になる)ハメになるが、当たりを付ける行為こそが「デバッガ外の(思考)作業」で、実際当たりをつけたものが答えであることも多いわけなのである。そうすると必然的に「デバッガを使わない」という機会も増える。というよりワタシはへたすると真面目にデバッガのお世話になるのが年に 1 回にも満たない。

デバッガを使うな、とか、デバッガを使わないワタシは凄い、とか偉い、って話じゃないよ、絶対に誤解するなよ。効果的に使うデバッガほど価値のあるものはないです。けどね、「考える前にデバッガを起動するな」とだけは言いたい。これは断言出来る。これは非常に非効率で、なおかつ成長機会も奪う。ワタシほどに「最後の手段」とまで考える必要はない(こうなるとただの趣味の問題)けれど、最低でも一回は「机上で」原因箇所を想定する作業をして欲しいと思う。

ちなみにデバッガを使わない、あるいは使わなくなった理由はもう一つある。それは「unit テストフレームワーク」を基礎とする eXtreme Programming ね。大抵のものが unittest 通ってれば、確実に「最後の手段として使うデバッガ」しかデバッガのお世話になる機会がない。カバレッジ計測ツールでカバレッジが十分であればあるほどそうである。逆に確かにここから漏れたものは「よっぽどだ」とも言えるので確かにデバッガ大活躍かもしれないが。







ジジィなんで、なんとなく同じ話したような気がしてしょーがないんだけど、繰り返しだったら許してちょ。