dankogaiさんのブログ経由でこんなエントリー見つけました。
2009-03-22 - 未来のいつか/hyoshiokの日記
http://d.hatena.ne.jp/hyoshiok/20090322#p1さて、「
わたしがprintf()デバッグをしない理由」というエントリーのタイトル見ただけで世の中恵まれた開発環境なのか釣りなのか?と思い興味本位で読ませていただきました。
プログラミング入門書では、デバッグについて、ほとんど議論されていないし、仮にふれられていても、おざなりな方法というか、かなり邪険にあつかわれていたりする。プログラマの多くの時間がデバッグについやされていたとしてもだ。
と書かれていますが、どう考えてみてもデバッグはプログラミング言語入門とは関係なくね?と思います。プログラミング入門で扱うのはせめてコンパイラが警告出さないように丁寧に書きましょう程度で、デバッグの仕方はちょっとトレースレベルであまり深くやるともはや言語講座じゃない気がする。
学生のころは、デバッグの方法というかスタイルも実に場当たり的で、適当にprint文を埋め込んで状態を確認し、テストをし、試行錯誤しているうちに、どれがデバッグ版で、どれが正式版かわけがわからなくなって、デバッグしているんだかバグをせっせと作り込んでいるのだか、何をやっているか、わからないということが良くあった。
既に動いているスクリプト言語でデバッグの時には確かに場当たりで適当にprint文を入れることもありますが、ファイル管理できないのはprintデバッグのせいじゃないだろ。バージョン管理システムがあれば便利ですが、無かったとしてもオリジナルはちゃんと取っておけよ。確かに全くバックアップ取らずにソース弄る人やファイル名を変更するときに、「新~」「最新~」「最新版~」「~改」とかどれが新しいのか本人の記憶だよりなる銘々規則の無い人とかいますけどね。
デバッグ対象のプログラムを正しく理解するためには、そのプログラムは変更してはいけないのである。動作を虚心坦懐に理解するために、1バイトたりともいじってはいけないのである。そして、そのためにデバッガを使えということになる。
デバッグモードでコンパイルした製品で納品するならその意見もありです。全てが自分で組んだソースなら大丈夫でも、既存のライブラリを使用したプログラムではリリースコンパイルとデバッグコンパイルで違う挙動を起こすものがあるのでデバッガだけで済めば楽なほうです。Cのプログラムでもデバッグコンパイルとリリースコンパイルで全く別物になっています。デバッグする為には途中弄る必要性も出てくるし、デバッガを使うためにコンパイルしただけでもネイティブコードとしては別物なので1バイトたりとも変えないというのはただの思い込みでコンパイラを信用しすぎです。ココまでくると言語入門とは大きく外れてます。一応言語入門でも将来のデバッグに備えるために#define等で切り分けてデバッグ用ログ出力でも手抜きせずに書いたり、さらにサービス中の障害解析用にエラーログレベルを設定して動的にログ出力を調整できるようにしたりしますね。ネットサービスや携帯等の組み込みとなると表面上デバッグ用ログ出せないし実行環境にデバッガの設置が許されないまたは不可能なので裏で取れるように細工します。
デバッグに備えるのも大事ですがdankogaiさんの仰るとおりデバッグ以前の設計はしっかりしておく事の方が大事です。
404 Blog Not Found:デバッグより重要なもの
http://blog.livedoor.jp/dankogai/archives/51195101.htmlあえていわせていただく。コードはデバッグできるだけはるかにましなのだ、と。printfを使うかどうかなんぞ、その問題と比べれば屁ですらないのだと。
全くです。既に動作中のプログラムなんて簡単に手を付けられないですからね。
デバッグよりもはるかに重要なもの、それはデータ構造の選定。
ここで一歩間違えると、バグが仕様化し、デバッグどころかバグにあわせてプログラムを書かねばならぬ羽目になる。
あるあるwありすぎて困るwww。特にDB設計者やプロトコル設計者がアホだったり仕様変更が荒すぎたりすると本当にプロジェクト全体が混乱したり無駄に複雑化してパフォーマンス悪いシステムになったりします。運用始まったらDB設計なんて直ぐに変更できなしプロトコルならまず変更できないから、その後の改修はほんと辛い。あとプログラム設計しないプログラマも結構致命傷だったりします。仕様書がいい加減だったり、設計書が手抜きだったり、人が書くものなので一定の確率で運が悪ければプログラマが苦労する事になりますが、完全分業に慣れるとプログラム設計を忘れるプログラマがいるんですよね。ソースレビューを徹底している所ならそういう問題は起きにくいのですが、アルゴリズムに穴があったり正規表現に漏れがあったりとtypo等の単純ミスを除いて理論的に完結できていないのはプログラミング以前の問題でこれはデバッガに頼る前に徹底して詰めなければいけない所です。