“Code Reading”と“Code Quality”の著者であるDiomidis Spinellis氏がGOTO Amsterdam 2016カンファレンスで,ソフトウェアのデバッグとエラーの防止について講演する。
InfoQはSpinellis氏にインタビューして,ソフトウェアエラーの検出と修正,ソフトウェアデバッグの原則,デバッグの効率を改善する方法,デバッグが簡単なコードの書き方,エラーの防止と対処のためにマネージャがなすべきことなどを聞いた。
InfoQ: ソフトウェアのエラー検出と修正が難しいのはなぜでしょう?
Diomidis Spinellis: コードを書き終えたと感じたなら,デバッグしてみてください。新たな関数やメソッドを書いている時,実際には,それらしく見えるステートメントをいくつか並べているに過ぎないのです。プログラムをデバッグする段になれば,不確実な数千や数百万というコードを正しいものにして,エラーを修正しなければならないのですから,はるかに難しいのは当然です。それが終われば,今度はドライバシステムとレイヤとの複雑なインタラクションや,毎秒数十億という速度で実行されるCPU命令,再現の難しいバグ,本番実行時のシステムのストレス,といったものも扱わなくてはなりません。
その上,デバッグはほとんどの教育コースでは教えてくれません。失敗と苦労を重ねて体得した経験を整理して,短時間の講義にするというのは至難の業なのです。加えて,システムのエラーはさまざまな形で発生しますから,デバッグの方法やツールも臨機応変にそれに合わせなくてはなりません。まずは状況を観察し,次にデータを解析し,いくつかの実験を行ない,最終的にバグの原因を推測します。初心者にできない作業の典型ですね。
InfoQ: ソフトウェアのデバッグに一般的な原則はあるのでしょうか?
Spinellis: 残念ですが,ソフトウェアで発生する問題には気の遠くなるほど多様性がありますから,ソフトウェアをデバッグする上で用いられるような一般的な原則があるとは思えません。私は次善の策として,3つのタイプの汎用的アプローチを定義しています。
- 高レベルの戦略 – 現象から原因へのドリルアップ,あるいは前提条件を満たすコードの確認。
- メソッドとプラクティス – 効率的なバグの再現,あるいはエラーによる影響の明確化。
- 汎用ツール – Unixのコマンドラインツールやトレースツール(strace, dtrace, systemtapなど),リビジョン管理システム。
InfoQ: デバッグの効率性を向上させるために,プログラマには何ができるでしょう?
Spinellis: まず大事なのは,デバッグを成功させようという姿勢です。自分が問題を解決できると信じて,集中できる十分な時間を確保して継続し,必要ならば睡眠をとります。環境やツールや知識に関して,継続的に投資することも大切です。効率的な作業を行なうためのハードウェアやソフトウェアを用意してください。例えば,ソフトウェアが巨大なデバッグログファイルを生成するならば,それを効果的に処理するためのディスクスペースやCPU能力,帯域が必要になります。デバッグ時にはありとあらゆる問題が発生しますから,自分自身のセットアップの整理と最適化でそれらに備えなくてはなりません。キーバインディング,エイリアス,ヘルパスクリプト,ショートカット,ツール設定といったものが必要です。これらはすべて,デバッグの生産性を飛躍的に高めてくれるでしょう。
InfoQ: デバッグが少なくてすむようなコードを書くための,テクニックや手法といったものはあるのでしょうか?
Spinellis: もちろんです! メンテナンス性のよい – 可読性が高く,安定性があり,解析や変更が簡単な – コードを書くことによって,発生するバグは少なくなります。さらにユニットテストやコードレビュー,アサーションの使用などもすべて,製品に混入するエラーの最小化に役立ちます。
設計時には,高レベルの抽象化を用いる(例えばフレームワークのアルゴリズムやコンテナデータ構造を,手作りのものに代えて使う)ことで,コーディングもエラーも削減できます。プログラムをデバッグしやすくすることも大切です。これには詳細なログの組み込みや内部エラー発生時の詳細なコンテキスト報告,障害やクラッシュの詳細情報を中央リポジトリに送信することなどが含まれます。
InfoQ: 障害の防止と対処に関して,組織のマネージャはどのようなサポートができるでしょう?
Spinellis: 基本プロセスを導入することで,エラーが手に負えなくなるような状況を回避できます。イシュートラッキングシステムを導入し,組織に展開して,現在取り組んでいる問題の優先順位を管理しましょう。十分に管理されたリビジョン管理システムにソフトウェアの変更を記録して,イシュートラッキングシステムとリンクするとよいでしょう。ファイルの履歴や変更を注意深く調べるだけで,バグが修正できることも少なくありません。ソフトウェア構築の面では,高速でリーンで簡素なビルド・アンド・テストサイクルを維持しつつ,ユニットテストの採用を促進し,ソフトウェアビルドのパフォーマンスのプロファイリング実施,静的解析と動的解析を導入します。こういった努力が,開発者による早期なバグ発見と迅速な修正に役立つのです。そして最後の運用面では,段階的なソフトウェア展開,旧バージョンと新バージョンの比較手段の確保,使用ツールの多様化,ツールやライブラリのアップデートの組織的な実施,といったことを心掛けてください。
GOTO Amsterdam 2016は6月14日と15日に開催される。チームリーダやアーキテクト,プロジェクトマネジメントを対象として想定した,実践者主導型のエンタープライズソフトウェア開発者によるカンファレンスである。カンファレンスの様子はInfoQでもQ&Aや要約,アーティクルを通じて伝えて行く予定だ。
Diomidis Spinellis氏はアテネ大学で経営学および経済学を教える教授であり,IEEE Softwareの編集長であり,さらには“Code Reading and Code Query”の著者でもある。最新書の“66 Specific Ways to Debug Software and Systems”が,2016年7月1日にリリースされる予定だ。
この記事を評価
- 編集者評
- 編集長対応