こんにちは、Japan Developer Support Core チームの松井です。
私たちのサポート チームでは、弊社の開発者向け製品に関するお問い合わせの他、お客様が開発しているアプリケーションで発生する問題に対してトラブルシュートやデバッグの支援を承っています。その際、問題を再現するためのサンプル プログラムの提供をお客様へお願いすることがあります。しかし、以下のような理由で弊社で問題を再現できないサンプルをご提供いただくケースが少なくありません。
- 実際のアプリケーションをそのまま添付されている (問題箇所が切り分けられていない)
- ビルドに必要なファイルや依存関係が不足しており、ビルドできない
- お客様固有のデータや環境に依存しており、そのままでは実行できない
本記事では、お客様が開発しているアプリケーションに関する問題でお問い合わせいただく際に、サンプル提供のポイントとして「最小限の再現サンプル」の重要性と作成方法について解説します。
なお、お客様が開発しているアプリケーションではないサードパーティ製品や弊社がサポートを提供していないオープンソース プロジェクトに関する問題については、弊社ではトラブルシュートやデバッグのご支援を承っていません。サードパーティ製品やオープンソース プロジェクトの開発元にお問い合わせください。
最小限の再現サンプル
最小限の再現サンプルとは、問題を再現させるために必要な要素だけを含んだ、できる限り小さく、独立した、それ単体で実行可能なサンプル コードです。 Minimal Reproducible Example (MRE) や Minimal, Complete, and Verifiable Example (MCVE) とも呼ばれます。 Stack Overflow をはじめとする技術コミュニティでも、質問時に MRE を提供することが推奨されています。
最小限の再現サンプルは、以下の 3 つの要素を満たしていることが重要です。
| 要素 | 説明 |
|---|---|
| 最小 (Minimal) | 問題の再現に無関係なコードをすべて取り除いた状態 |
| 再現可能 (Reproducible) | 問題が確実に再現される状態 |
| 完結 (Complete) | 受け取った側がそのままビルド・実行できる状態 |
なぜ最小限の再現サンプルが必要なのか
問題箇所の特定が容易になる
実際のアプリケーションは多くの機能や依存関係を持っています。問題の原因が、ビジネス ロジックにあるのか、特定のライブラリの使い方にあるのか、それとも環境設定にあるのかを判断するだけでも多大な時間がかかります。
また、お客様のアプリケーションを最も詳しく把握されているのは、通常はお客様ご自身です。問題が十分に切り分けられていない場合、サポート側ではまずアプリケーション全体の構成や前提条件の把握から着手する必要があり、調査に多くの時間を要する可能性があります。
さらに、最小限の再現サンプルに絞り込む過程で、お客様ご自身がアプリケーションの問題の原因に気づくこともあります。これはいわゆる「ラバーダック・デバッグ」と呼ばれる手法に似た効果とも言えるかもしれません。
調査の効率が向上する
サポート エンジニアが問題を再現・調査するためには、まずプログラムを手元で動かせる状態にする必要があります。再現サンプルが小さくシンプルであるほど、サポート エンジニアが問題の本質に集中できるため、調査の速度が向上し、より早く解決策を提供できます。
また、再現サンプルは修正案の妥当性を確認するうえでも有効です。事象の原因が弊社製品の不具合である場合でも、アプリケーション側の実装に起因する場合でも、同じ条件で修正前後を比較できるため影響範囲や改善有無を確認しやすくなります。
なお、プロフェッショナル サポートではサポート契約のスコープとしてお客様アプリケーションで起きる問題の切り分け支援が対象外となるため、切り分けはお客様ご自身で行っていただく必要があります。しかし、切り分けのご支援を承っている上位サポート サービスでお問い合わせいただく際もこうした考え方は有効であり、最小限の再現サンプルを提供いただくことでスムーズに調査を進めることができます。
よくある問題と対処方法
以下は代表的な例です。実際のアプリケーションでは、アーキテクチャや外部依存の性質によって、ここで挙げる形にそのまま当てはめることが難しい場合もあります。
問題 1: 実際のアプリケーションをそのまま提供されている
例: 数十のプロジェクトで構成されるソリューションを丸ごと添付される
対処方法: 問題が発生しているコードの箇所を特定し、そのコードだけを含む新しいプロジェクトを作成してください。
問題 2: ビルドできない
例: 参照先のアセンブリや NuGet パッケージが不足している、独自の共通ライブラリへの参照が含まれている
対処方法: 提供したサンプルを別の環境 (例: 新規の Windows PC 上の Visual Studio) で開いてビルドできるかどうかをご確認ください。
ビルドに必要な要素の確認観点は、プロジェクトの種類 (.NET、.NET Framework、Web アプリケーション、デスクトップ アプリケーションなど) によって異なります。 例えば .NET / .NET Framework の場合は、以下のような点について確認してください。
packages.configや.csproj/.vbprojに記載されている NuGet パッケージはすべて含まれているか (またはdotnet restoreで自動取得できるか)- 社内の共通ライブラリや独自 DLL への参照を、標準的な NuGet パッケージや同等のコードに置き換えられているか
- ソリューション ファイル (
.sln) を含めており、参照先プロジェクトがすべて含まれているか
問題 3: お客様固有のデータや環境に依存している
例: 特定のデータベース スキーマやデータがなければ動作しない、社内のファイル サーバーへのパスがハードコードされている
対処方法: 外部依存をできる限り排除し、サンプル内で完結するダミー データや設定値に置き換えてください。
- データベース接続が必要な場合: SQL Server LocalDB や SQLite など、環境を選ばない軽量なデータベースを使用し、テスト用のスキーマとデータをサンプル内でセットアップするコードを含める
- ファイル パスが必要な場合: ダミーのテキスト ファイルを同梱し、相対パスで参照する
- 外部サービスへの接続が必要な場合: モック オブジェクトやスタブを使用して外部サービスへの依存を除去する
問題 4: 問題が再現しない
例: 提供されたサンプルを実行しても、問題が発生しない
対処方法: 提供前に、ご自身の手元で問題が確実に再現することをご確認ください。また、問題を再現させるための手順を具体的に記載してください。
- どのような操作をすると問題が発生するか
- 期待される動作と実際の動作の違い
- 発生する例外やエラー メッセージ (スタック トレースを含む)
- 問題が発生する条件 (常に発生するか、特定の条件下でのみ発生するか)
また、問題発生時の画面のスクリーンショットや操作手順の画面録画をご提供いただくことも有効です。特に UI 上の表示に関わる問題や、操作手順が複雑な場合には、現象をより正確に伝えるうえで助けになります。
最小限の再現サンプルの作成手順
以下の手順は一例であり、すべてのアプリケーションで同じ進め方ができるとは限りません。実際には、利用している技術や依存関係に応じて、可能な範囲で再現条件を単純化していただくことが重要です。
新しいプロジェクトを作成する 問題が発生しているプロジェクトを直接修正するのではなく、問題の種類に応じた新しいプロジェクト テンプレート (コンソール アプリ、Windows フォーム アプリなど) から始めます。
問題を再現するコードを最小限追加する 問題が発生している箇所のコードだけをコピーし、新しいプロジェクトに貼り付けます。業務ロジックや UI など、問題の再現に関係のない部分は含めません。
外部依存を排除する データベース接続、外部サービス、独自ライブラリへの依存を、サンプル内で完結するダミー実装に置き換えます。
問題が再現することを確認する 新しいプロジェクト単体で問題が再現することを確認します。この時点で問題が再現しなければ、手順 2 に戻ってコードをさらに調整します。
別の環境でビルド・実行できることを確認する 可能であれば、開発環境とは別のクリーンな環境でサンプルをビルド・実行し、問題が再現することを確認します。
再現手順を記載する サンプルを ZIP ファイルなどに圧縮してサポートに提供する際、問題を再現するための具体的な手順を別途テキストで記載します。
切り分け前のサンプルも参考情報として提供する 切り分けの過程で、見た目は同じ事象でも原因の異なる別の問題に変化してしまう場合があります。最小限の再現サンプルに加えて、可能であれば切り分け前のサンプルを参考情報として併せてご提供いただくと、変化の有無を確認しながら調査を進めやすくなります。
まとめ
最小限の再現サンプルを作成することは、私たちサポート側だけでなくお客様側にとってもメリットがあります。
- 問題の本質を絞り込む過程で、ご自身で原因に気づくことがある
- サポート エンジニアが迅速に問題を再現・調査できるため、解決までの時間が短縮される
- 問題の再現条件や変更点を共有しやすくなり、認識合わせを進めやすくなる
- 修正案の妥当性を確認しやすく、検証結果に基づいた正確な解決策を提供できる
お問い合わせの際は、ぜひ本記事を参考に最小限の再現サンプルをご用意いただければ幸いです。 ご不明な点がございましたら、サポート担当者までお気軽にお問い合わせください。
参考資料
本ブログの内容は弊社の公式見解として保証されるものではなく、開発・運用時の参考情報としてご活用いただくことを目的としています。もし公式な見解が必要な場合は、弊社ドキュメント (https://learn.microsoft.com や https://support.microsoft.com) をご参照いただくか、もしくは私共サポートまでお問い合わせください。