デバッグというもの

プログラムを書いてるとデバッグは避けられない作業となる。
デバッグする際には、デバッガを使ったりログ表示を多めに出したりすることも多い。
特にデバッガを効果的に使う人は、バグを見つけるのが早かったりするんだけど、プログラムの内容によってはデバッガを使えない状況も多々ある。
(デバッガの実装してるときに、デバッガは使えない、みたいな)


そういう時は、ログの出力を出せれば出すが、それも難しい場合はソースとにらめっこしながら、コードのシーケンスを頭の中で描きながらデバッグすることになる。
こういう状況でプログラムを書くことに慣れてくると、デバッガに頼らずデバッグする方法をたくさん用意するようになる。例えばdefine一つで、関数の開始と終了時にログが出力できるようにするだとか、assertをいっぱい入れとくとか、malloc/freeの呼び出し履歴を保存する機能とか。


しかし、上記の方法に頼ったデバッグをしてると、今度はデバッガを使える状況でもデバッガを使わなくなってしまう。
これはこれでよくない。デバッガを使って効率的にデバッグできる状況であれば、それを率先して使うべき。
優秀な人は、このデバッガを使ったデバッグと、デバッガを使わないデバッグを使い分けるし、なるべくならデバッガを使ったデバッグを使うように(使えるように)してる人だと思う。


しかししかし、プログラム書いてると、なんとなくここはバグが入りそうだからこういう仕様にしとこ、みたいにちょっとした工夫で未然に防げる(防げたはずの)バグもあったりする。
たぶん本当に優秀な人は、そういったことも無意識にやってて、バグに追われてデバッグするということ自体少ないんだろうなぁと思う。


ちなみに、バキという格闘漫画で、渋川剛気という柔術の達人が出てくるが、彼はトーナメントの途中「真の護身」というのに開眼し「そもそも危険のある方向に近づくことすらできない」という状態になり、試合前に会場に向かおうとすると無意識に会場から離れてしまうという状態になった。結局その後会場に行ってしまい、試合は負けたんだけど、そもそも負けそうな試合は避ける、というのが武術の達人の極意であるならば、プログラマにとっての極意は、

バグが出そうなプログラムは書かない

ということにならないか。
そう考えると、本当に優秀なプログラマとは、プログラムを書かない人、ということになる。
これは目からウロコ。


原因の分からないバグを延々と追ってると、そんな考えが頭をよぎってしまいますね。
おしまい