注目ブログご紹介

ディターミニズム、Simics、空飛ぶブタ


投稿者:Jakob Engblom, 11/27/2012

先日Simicsのセミナーで、再現性、変動性、ディターミニズム、Simicsについて質問されました。この質問は、テスト経験のある参加者の前でSimicsについてプレゼンテーションを行うと、毎回必ずと言っていいほど聞かれます。質問する人たちは直感的に「ディターミニズム(決定論)は悪いこと」と思うようです。テストで検証する実行シナリオが「限定される」ように聞こえるからです。テスト担当者にとって、バリエーションはいいことです。しかし、ディターミニズムはバリエーションと対立するものではありません。このことを、コンピュータシミュレータよりも手が届きやすく、わかりやすい環境で説明できる、絶好の例を見つけました。Rovio社のコンピュータゲーム「Bad Piggies」です。

Bad Piggiesは、物理シミュレーションをベースにしたゲームです(リアルとは言えませんが、日常的な感覚と無理なく整合しています)。珍妙なパーツを組み合わせて、愛嬌のあるブタを乗せ、スタート地点からゴールまでたどり着かせます。このゲームで感心したのは、100%ディターミニスティック(決定論的)でありながら、入力に驚くほど敏感に反応する点です。思うに、これはSimicsの仕組みにそっくりなのです(我ながら、突飛なたとえだとは思いますが)。

このゲームで重要な入力は2種類あります。プレイヤーが組み立てる乗り物の(静的な)構成と、エンジンをかける、風船を割る、爆薬の箱を爆破するといった、プレイヤーがプレイ中に行うインタラクティブな入力です。操作するタイミングのわずかな違いが、成否を左右します。静的な面では、乗り手のブタの位置を変えて乗り物の重心を移動することで、挙動に大きな影響を与えられます。中には、プレイヤーの操作は、重心を動かして、完璧なバランスがとれる位置を探すだけというレベルもあります。

そうはいっても、このゲームは紛れもなくディターミニスティックです。特に、インタラクティブな入力を必要としないレベルでは一目瞭然です。プレイヤーは乗り物を組み立てて、それが進むのを見守るだけです(丘を下り、風船で空を飛び、爆薬の箱が爆発して、ブタが宙に浮かぶ)。このようなレベルでは、各場面はまったく同じように再現されます。ディターミニスティックになるように、物理エンジンは意図的に高精度に作られています。HD版をAndroidタブレットでプレイしても、通常版をiPod touchでプレイしても、結果は同じで、レベルをクリアする方法も同一です。これは、強い「ディターミニズム」です。

ただし、「あらかじめ決められて」はいません。プレイヤーは新たに乗り物を組み立てて、スタートさせるとき、何が起きるかを予想できません。自分なりに考えて、きっとうまくいくだろうと思います。しかし、やってみるまでは、わかりません。おそらく最初の試みは失敗です。元に戻って、乗り物の設計を手直しします(コンピュータプログラミングでは、デバッグと呼ばれる作業です)。そして再挑戦します。毎回、違うことが起きるはずです。設定した入力が異なるからです。とても大きな「変動性」があるわけです。このゲームを組み立てた乗り物をテストする手段と考えた場合、基本的にディターミニスティックなゲームエンジンを土台に、無限のバリエーションが広がります。

もしこのゲームが非ディターミニスティックだとしたら、どうでしょうか。おそらくプレイ不可能になります。サイコロを振るような、運頼みのゲームになってしまうでしょう。プレイヤーはまったく同じ初期条件を作って、それをスタートさせます。何回目かで、運がよければゴールにたどり着くように願うばかりです。私にはちっとも面白くありません。ディターミニズムはテストや開発にプラスであり、役立つのは明白です。変動性と入力への反応は必要です。しかし、入力を変えないのに挙動が変わるのは望ましくありません。通常、コンピュータシステムはランダムです。それは避けがたい事実なので、多くの人々はその難点を逆手にとって、このランダムさがテストに適した手法だと考えます。しかし、可能であるならば、ランダムさを避けるほうが、体系的なテストを目指す方法としては明らかに優れています。もちろん、コンピュータゲームのブタをゴールまで飛ばす方法としても有利です。

Simicsは、Bad Piggiesゲームと同じように機能します。OSのブートのような、インタラクティブではない静的なテストケースでは、実行するたび、同じように動作します(構成の変更がない場合)。ターゲットOSイメージを変えると、違う結果になります。プロセッサの数やメモリのサイズを変えれば、異なる状況が発生します。ホストマシン(Simicsが動作するマシン)を変えても、ターゲットが同じなら、同じ結果が得られます。

制御されていないインタラクティブな入力を追加すると、毎回違う結果になります。インタラクティブな入力は、スクリプトを作成したり、記録したりすることで、ディターミニスティックにできます。ディターミニスティックな入力であれば、同じように実行されます。これが、Simicsが100%の再現性を実現する仕組みです。何をどのように実行するかを制限するのではなく、システムへの入力をコントロールすることで、どんなバリエーションでも再現できます。

さらに一歩進めて、入力のバリエーションをスクリプトにプログラミングすれば、シミュレータで問題を体系的に検討することも可能です。その最たる例が不具合挿入ですが、正常な範囲内でプログラムへの入力を自動的に変えるだけでも、とても面白いです。たとえば、Simicsを使って、OSのバグを引き起こしたり、システム内のプロセッサコアの数を変えて、プログラムの挙動をテストした実例があります。

再現性とディターミニズムが意味するのは、偶然起きるあらゆる状況を繰り返すことができるということです。テストで検証できる範囲を限定するという意味ではありません。一度だけ発生したテストケースの失敗を、再現して報告しなければならなかった経験のあるテスト担当者にとって、再現性は実にすばらしいものです。

ウインドリバーの詳細については、Facebookをご覧ください。