デバッグは大変ね(棒読み)

| コメント(2) | トラックバック(0) このエントリーを含むはてなブックマーク
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等の単純ミスを除いて理論的に完結できていないのはプログラミング以前の問題でこれはデバッガに頼る前に徹底して詰めなければいけない所です。


過去に見た、酷い設計・開発はこんな感じです。

  • 条件分岐が甘い
    指摘すると言い訳が「想定外です」。想定外はあってもフェイルセーフに思考が及ばないのはPGとしてどうかと思う。設計に書かれて無い場合に条件漏れに気づかないとかね。これはSE/PG両方ダメな例です。

  • 変数やオブジェクトを初期化しない
    これはデータ汚染やメモリバグに繋がる事があるのでデバッグ難易度が一気に上がる。大体の言語ではWARNING(警告)が出るので絶対無視しないように。PHPだけは何故かNOTICEでしかもデフォルトのエラーレベルではNOTICEが除外されているので気付かれない事が多い。さらにPEARライブラリはPHP4の負の財産も受け継いでいるのかUndefinedでNOTICE出しまくりなのでPHP5でPEAR使っててエラーレベルをE_ALLにするとNOTICEでエラーログがパンクしましたというシャレにならないことがありました。またJavaで例外ウゼェーと言ってた人の画面にはしっかり「ぬるぽ」が表示されていました。「ガッ!」してあげたほうが良かったのでしょうか。

  • 変数を宣言しない
    これはもっと悪質、スクリプト言語ではよくありますがまだstrict宣言できるVBやPerlはマシな方でPHPに至っては変数宣言自体用意されないという糞仕様の為、コーディング規則を守らない輩を締めるのに苦労します。変数の宣言が出来ないということは内側のスコープ内で計数を使うときに名称に気を使う必要が出てきます。$iが重複したために無限ループなんてありました。

  • 何でも配列に溜め込む
    DBからレコード取り出すときは1行毎なのにそれをループでひたすら配列に溜め込む。そしてワークメモリーを食いつぶしておいて、メモリ増設しろとかリミット外せとか要求してくるのね。まずはレコード数によってワークメモリを消費するアルゴリズムを何とかしろ、どうみても時限爆弾。

  • メモリの開放を忘れる
    地味ですが障害として顕在化すると原因追跡が難航します。

  • ログ出力をやめた
    これはPHPでNOTICE多すぎてログ出力を諦めた例。もはや実行環境で何もキャッチできない。。。

  • 重複するオブジェクトが多い
    これは変数をスコープ含めて管理できてなくて、汚染すると怖いからとちょっとだけ名前変えて同じ意味の変数を作ってしまう場合です。後で修正する時にコストが掛かるし影響範囲が分からなくなりさらに別の変数を・・・と負のスパイラルが発生。これはコーディング規則で締め上げた方がいい。

  • スコープが深すぎる
    一回しか使わないからと言って全部if文で書く奴とかね、せめてインライン関数にして。画面でも印刷でも見づらいったらありゃしない。あとスクロール操作が増えるのとか地味に作業効率に影響しますね。スクロールばっかやってて思考飛んだりとかさ。。。

  • defineや定数を有効活用しない
    修正が発生したときのコストも高くなるし、修正漏れによる新たなバグ発生源にもなるし、そもそも移植性が低い。ファイルオープンで直接絶対パスで書いてるとかもう呆れる。

  • 勝手にタブや改行コードを自動変換するツール
    バージョン管理システムの敵です。

  • 実機でテストしない
    予算が許される限りやりましょう。エミュレータでは発生しない問題が出てきます。あとエミュレータでは大丈夫だったのでという言い訳はプロとして失格。コンパイラを信用しすぎているのと同じくらいみっともない。当然ですがハードウェアやOSだって不具合はありますからね。それらを全て組み合わせてみないと見えてこないものもあるという事です。

トラックバック(0)

トラックバックURL: http://blog.c-production.com/mt/mt-tb.cgi/1414

コメント(2)

トラックバックありがとうございます。

細かいことなんですが、わたしが言及しているのは「プログラミング入門書では」であって、「プログラミング言語入門書」ではないんですよ。プログラミングの入門であれば、テスト、デバッグあたりのことも言及してもばちはあたらないと考えますがいかがでしょう。

わたしのイメージしているのは、「プログラミング作法」みたいな本がいっぱいいあったらいいなあという感じですね。

デバッガがある環境というのが恵まれているというご指摘はあまんじて受けます。

> hyoshiokさん
コメント頂き大変ありがとうございます。「C実践プログラミング」がどんな本か調査もせず言語入門書と思い失礼いたしました。
これが設計メインの本として宣伝してるならまだ許容範囲ですが本の説明でデバッグも解説していると宣伝しているのにデバッガについてたった4行というのは流石に酷いですね。
ただプログラミング作法の本でデバッグツールについて書くとなると広く浅く紹介するか、メジャーなデバッグツールをひとつ取り上げてそれについて解説する形式になってしまうような気がしますのでデバッグツールに関してはIDE別ターゲット別にちょっとだけでよいので参考リンクや専門書を紹介して欲しいと思います。
私の場合現在デバッガが使えない環境というのが納品物に対してぐらいなので、開発中のプログラムに関してはデバッガを使える環境にあります。主張したいのはデバッガの有無よりもデバッガの結果を過信してはいけないという事ですのでデバッガを使用しない別の方法においても確証を取る事が望ましいと思ってます。

コメントする

アーカイブ