科学的なDebug
Udacity の 「Software Debugging」を見た
https://www.udacity.com/course/viewer#!/c-cs259/l-48648797/m-48723419
※ 日本語字幕あり
まだ前半だけど
内容は簡単には「デバッグをする際には気合と根性で調べるのではなく、仮説を立て、検証すること」
というもの
講義内では explicit debug と呼んでる手法
どういったものかというと
目隠ししながらゲームするのは無理
先生「仮説を書き出して一つ一つ確かめること。何も書き出さずにデバッグするのは目隠ししながらマスターマインド(数当てゲーム)をするようなもの」
これは覚えておこうと思った。絶対に書き出して検証しないと、無理。目隠ししてゲームできるわけがない。
そりゃパッと見て治せればいいけど、最初の5分だけにしなさい、とのこと。それ以降は仮説検証をすべき。
これがまず絶対としてじゃあ具体的にどういう風にやればいいか?
仮説を立てて検証すること
何かバグが起きていたとして
・何を期待して
・何が起きていて
この二つから →「じゃあ何がどうなっている」と推測する。これが仮説。
当たり前と言えば当たり前。
これを一個一個潰していく、というのが趣旨。
仮説の正否を確認し、仮説のリファインを繰り返す。
これらを書き下していく。
講義内では assert を入れたりして検証してたけど、必ずしも assert で確かめないといけないわけでもないだろうとは思う。
ただ、変数の中身を見たりするにも全て「何を期待してどうなってて、そこから推測したこと」これを書き出して確かめれば、それで explicit debug になると思う。
他の手法
automated simplification
再現の簡略化を自動化。手作業でやるな、と
https://github.com/vilion/udacity/blob/master/softwaredebugging/p3_delta_debugging_ddmin.py
Assertion
https://www.udacity.com/course/viewer#!/c-cs259/l-48587907/m-48691544
Assertion の使い方。不変条件について。
また、不変条件は自動で取得する。traceit を使う、だっけ
udacity/p2_bonsaikon.py at master · vilion/udacity · GitHub
具体的にはまた次回
デバッグは効率よく
よく言われてるけど、デバッグは開発の50-75%を占める、と。割合とはか曖昧だけど、要は多大な労力を要するわけで。
俺は仕事遅い遅い言われてるけど、だからってミスはしてはいかんわけで、せめて効率を上げないとなあ、と思った次第。
絶対、仮説検証の形をとらないと、効率は上がらない。これだけは確か。
この講義、半年ぐらい前には見てたんだけど今一そこがわかってなかった・・・毎回 assert するのは手間だなあ、ぐらいに思ってた。
目隠ししてマスターマインドするようなことはないようにしないとなあ、と思った次第。
続きはまた次回