TDDを支えるためのモデルベース開発

 MATLAB/Simulinkによるモデルベース開発、なんていう言葉が示していると思いますが、組み込み業界でのモデルベース開発は、2つの異なる手法を一緒くたに扱っていると思います。2つの手法というのは、1つはコードを抽象化したソフトウェアの設計モデルを使う手法、もう1つは数学的な計算式や物理学的特性を表現した数式で構成されるシミュレーションモデルを使う手法です。
 最近テスト駆動開発を勉強していて気づいたのですが、この後者のシミュレーションモデルを使うモデルベース開発は、画像処理など、学術な計算を行うソフトウェアの開発において、TDDを実現するのにとても有効に働くように感じます。


 まずTDD自体が、学術的な計算に有効なのは確かだと思います。
 というのも、近似誤差や分解能不足、丸め誤差などが蓄積して、計算結果に思いもよらぬ誤差が発生するようなことは、数値処理の世界では珍しくありません。また複数の数式や条件が絡んだ処理の場合、結果に問題が含まれていても、結果からその問題の原因を特定するのが一般的に困難です。
 小さな単位でテストを繰り返すTDDなら、そうしたリスクを早期から確認することができる点で、結構有望だと感じます。(ただ学術的な計算処理の場合、その性質上TDDのサイクルの単位は一般より大きくなるでしょうが)


 しかし有効であっても、学術的な計算が主体の開発にTDDを導入するのにはいくつか問題があります。
 まず学術的な計算では、最終解の理想値を求めるのに手間がかかりやすいという問題があります。これはパラメータや近似手法などを変える際に発生する手間を大きくし、軽快なテストの障害となります。また計算式を部品部品に分けた際の、それぞれの理想値(テストの期待値)を求めるのも、一般的に一筋縄でいきません。


 例を出すと、例えば熱等の数値解析計算では、理想値を求めるのに以下のようなハードルがあります。

  • 理想解を得る方法がいくつかあるものの、それで得られる理想解を使うためには、ソフトウェアをある程度学術的に完成された状態にしないといけない。またその「学術的に完成された状態」を実現するというハードルは、一般的に高い。
  • 一般的な理想解(常識的に認知されている解や、精度が実証された簡単な近似式で求めた解等)がいくつか存在するものの、それらを使用可能にするための条件や設定、精度の実現に非常に手間がかかることが多い。
  • 解析的に解かないと理想値を求められない場面がある。解析的な解法は条件や制約が多い上、一般的に面倒くさい解法を要求してくる。
  • 処理を部品部品に分けてしまうと、学術的なアプローチで理想解を用意できなくなる場合がある。

 すなわち、学術的な計算においては、TDDを導入しようとすると、実行結果と比較するテストの理想値がわからないという状態に少なからず遭遇するということになります。


 そこで今回のテーマですが、こうした問題に対して、モデルベース開発が有効でないか、と思い立ちました。
 というのも、実はMATLABやMathCADといった学術計算ソフトを用いると、上記のような理想解を柔軟に求められることが多いのです。学術的な理想解を楽に求められるのは当然ながら、コードベースの計算もできるため、恐らくテスト対象を部品部品に分けた際のそれぞれの理想解も、かなり求めやすくなると思います。
 そのため、モデルベース開発に従って、先に学術計算のモデルを構築したり、モデルファーストとでもいいますか、モデル開発とプログラム開発を一緒に進めたりすれば、学術計算ソフトウェアの開発でも、TDDの短いテストサイクルを導入できるのでは、と考えます。


 モデルベース開発でのモデルは、現状ではもっぱら全体的な仕様や機能を保証するための、いわばQA Testingでの理想解を求めるのに使われています。
 しかし上記のような理由から、TDDを実現するためのもの、言い換えるとDeveloper Testingでの理想解を求めるためのものとしても、モデルベース開発は非常に有望ではないかと感じます。