Advanced Windows Debugging [ドライバ開発]
Advanced Windows Debugging
デバッグ方法の集大成みたいな本みたい
開発者は読むべき
といっておいて自分はまだ読んでない
今の仕事はデバッグが厄介なので、会社で買ってもらおう
でよかったら自分でも買う
Advanced Windows Debugging (Addison-Wesley Microsoft Technology)
- 作者: Mario Hewardt, Daniel Pravat
- 出版社/メーカー: Addison-Wesley Pub (Sd)
- 発売日: 2007/10/26
- メディア: ペーパーバック
・開発スタイルについて
/.jによくまとめられた書き込みを発見したのでこぴぺ
http://slashdot.jp/askslashdot/article.pl?sid=07/12/18/1813257
自分のコードに誇りを持っていますか?
プログラムが『バギーで、遅くて、脆弱で、保守するのも一苦労』な状態になるのは、
・熟慮されたアルゴリズムを用いず(バギー、遅い)
・計算量を事前に予測せず(遅い)
・例外が多く(バギー、脆弱、保守が大変)
・目の前の問題を直せばよい、と修正を最小化使用としすぎるから(保守が大変、脆弱)
で、これを直すために8か条があるが、ものぐさぷろぐらまーの自分としては、最初からすべてをやるのは現実的に無理がある。といいたい。
バグとは、経験不足、知識不足からくる予測不可能、予測したけど実装ミス/忘れの表れであって、デバッグ無しには無くせないし、最初からあらゆるすべての場合を考慮してプログラムを書くのはコストに見合わない。
誰が不具合を起こすかというと99%は自分か周りの人だが、たまにベンダ(コンパイラやライブラリ)にバグがある場合もある。よって、常に誰かがミスをする前提でプログラムを書かなければならない。
ネットワークと同じで、誰か一人でもバグを生み出せば、システムは動かない。
したがって、常にバグがある前提でコードを書くべきである。また、そうしておくことで、ミスが見つかってもすぐに直せる。規模が大きくなるほどデバッグコストは飛躍的に増えていくので、最初から仕込んでおくことは大幅なコストカットにつながる。そのなかでも、重要なことは
機能ごとにインターフェイスを用意して、実装を容易に分離できるようにしておくこと。
リスト情報を保存するのにvectorを使うかlistを使うかsetを使うかmapを使うかは、何をしたいかによるが、「あとでコンテナを変えたくなるかもしれない」。STLはちょっとだけは汎用性はあるが、これらのコンテナは基本的に互換性は無い。(listはoperator[]が使えない)
そもそも、リスト情報があるときの要求は、追加、削除、検索(存在するかどうか)しかない。
追加については、以下のように実装する。
vector<int> v;
int addIntToList( const int &a )
{
v.push_back(a);
}
検索のコスト、追加のコストが多すぎるなぁと思ったら、vectorから、setやmapに変更し、このソースコードを変更するだけで、今までどおり動く。また、マルチスレッドであることがわかっているなら、これらの関数で使うCriticalSectionを使うようにすればよく、コンパイルするのはこのファイルだけである。
いろんなところで言われてることだが、やりたいことと実装はできる限り分離すべきである。また、そうすることで、機能ごとに独立性の高いソースコードが自然に生まれ、結果として保守性は格段に上昇するし、にた機能を2つ実装するような愚も無くせる。
boostのbindに代表されるようなtempleteで楽をすることを覚えることも重要である。同じアルゴリズムを何回もコピペしないことは、メンテナンスを容易にする。Cが使われる職場では、C++が使えないプロジェクトも多くあるが、少なくとも上記ぐらいのことは誰もが必ずやるべきだと思う。
ここから愚痴
しかし、そこまで考えてプログラムを書いている人間は私の周りには今だいない。というのも、職業の性質上、年上の人と仕事をすることが多いが、彼らはアセンブラの時代から仕事をしていて、今の仕事につながっている人が多く、コピペすることが当然だと思っている。しかし、それで安全なプログラムを作れるのは、はるか昔の話。ソースコードが大きくなればやりかたも変えなければいけない。それぐらいは理系なら当然の発想として、考えて欲しいなぁ。
コメント 0