「その場で」と「あとから」と成功体験

昨日のリアルタイムモニタの話を書いた後,色々考えてみたんですが,ちょっと思い出したことがあるのでメモ.

リアルタイムデバッグ信仰と成功体験

これは自分でも経験があるのですが,ゲームプログラミングはじめたての頃は,「リアルタイムにパフォーマンスがモニタできるとかっこいいんじゃね?」とゲーム内にいろんなカウンタを表示させてみたりするものです*1
また,デバッガを使えば実行中のプログラムの様々な情報を引き出せることを知るようになると,実際にリアルタイムデバッグで問題を解決したという成功体験も増えてきて,「その場で調べられること」の気持ちよさに傾倒していくことになります.
これには対話型環境を持った軽量言語の良さとして語られている点にも通じるものがあるかもしれません.軽量言語屋さんが思っている以上に,現代のインダストリアルな静的型付け言語の開発風景はインタラクティブなのです.
そして私自身,こういうスタイルのデバッグは大好きです.

でも別のルートもある

そんな私の考え方を変えるきっかけになったもののひとつが,PIX for Windows でした.PIX for Windows は元々 Xbox 開発用に作られていたプロファイラを Windows の Direct3D にも使えるよう移植されたもので,DirectX SDK と一緒に無償で公開されています.概要については 今給黎さんの解説 が参考になるでしょう.
PIX for Windows では,プロファイル対象のゲームを実行しながらとりあえず必要そうな情報を一通りデータファイルにダンプします.ゲームの起動中にはほとんど何のパフォーマンス情報も得られません.そうして一旦ゲームを終了し,あとから得られたデータを解析するのです.
PIX を使うようになってすぐに,今まで見つけるのに苦労していたり,見逃していたりした問題が実は簡単に見つけられることに気付きました.例えば描画設定の順序を勘違いしているミスや,ゲーム中特定シーンでのみ非常に重くなっている処理,必要もないのに何度も呼び出されているパラメータ設定,描画前後の画像を比較してはじめて気付くようなバグ等々です.

「あとから」方式はスケールしやすい

PIX のようなツールをゆるく使うコツは,「もしかしたら関係あるかも」という数字を大量に収集し,あとでそれを手早く解析することです.「もしかしたら関係あるかも」の閾値はかなり低めで OK です.可能性が 10 % でもあれば,とりあえず収集しておくという感じです.そうすることで,10 回の試行錯誤が 1 回で済むかもしれないと考えるわけです.
ただし,この「あたりをつける」という作業にある程度システムの知識が必要です.また,収集したデータから,何が起きているかを正しく理解するのにも,場合によってはかなり高度な知識が要求されます.その意味では,全くの初心者にお勧めできる方式ではありません.
何をやりたいかというと,リアルタイムに収集するデータは「モデル」と割り切ってしまい,プログラムの実行後に適切な「ビュー」を設定して問題を解決する,と言うと雰囲気が伝わるでしょうか?
「その場で」方式は,取っつきはいいのですが,えてして「モデル」と「ビュー」が混在してしまいます.問題のスケールが大きくなると,「ビュー」に特化する場を設けた方が効率は良くなります.「その場で」方式だと,時系列方向に最初からスライスが入っちゃいますからね.

成功体験と多数決

リアルタイム方式のデバッグ/チューニングは,取っつきやすく,経験値も溜めやすいため,多くのプログラマが強固な成功体験を持っています.一方で,「あとから」方式は,それほどツールも行き渡っておらず,スケールの小さな段階ではそれほど必然性もないため,必ずしも多くのプログラマにとってなじみ深いものではありません.例えばツールに欲しい機能で前者と後者の比較を多数決で行えば,ほぼ確実に前者の拡充が採択されるでしょう.
技術系掲示板における議論にも同様の傾向が見られます.多くのプログラマはソースデバッグに自信を持っているため,提示されたソースコードのアラはとことん指摘しはじめます.「議論を簡単にするために」,ループはずっと一定速度で動くといった仮定すら設けられます.でもそうじゃなくて,「もしかしたらループ速度が途中で変わってるかもなぁ」とか「未知の要因で変化が同期しているパラメータ無いかなぁ?」を手広く富豪的に行うスタイルだってありますよと.
成功体験と多数決の問題は,初心者層の流入が予想される XNA も無関係ではないと思いますが,PIX のような良いツールもありますし,うまい具合にバランスが取れたらなぁと思う次第です.
PIX 良いですよ PIX.みんな PIX で幸せになって下さい.

*1:そしてシステムだけ作ってそこで力尽きるのはお約束