デュエット

先日,Science 誌をつらつら眺めていたら,Wrens(ミソサザイ)という小鳥がデュエットするときの神経学的調整機構に関する論文がありました(DOI: 10.1126/science. 1209867  著者による動画はここです.実際にデュエットを聞くことができます).ミソサザイは,常にあるパターンに従った鳴き方をするのではなく,相手の声に反応して,素早く自分の鳴き方を変える.それによって,デュエットが成立します(勝手に雌雄で歌っているわけではない).そのためには,一般に鳥が鳴くときに動作するHVCニューロンとは異なる回路,例えばCPG(中心パターン生成器)が関与するのではというのが,論文のテーマになっています.

***

さて,今回は機能安全における成果物のうち文書について考えてみたいと思います.文書というのはこうすれば良いという正解があるわけではなく,あくまで書き手ー読み手間の関係で定まります.技術文書といえどもその構図は変わらないだろうと思います.本当は,黙ってても伝わるというのが良いのでしょうが.
少し前に,文書チェックをお仕事となさっているから正しい技術文書の書き方といったお話しを伺って,幾つか昔のことを思い出しました.文書は,時間的・地理的に離れた人とコミュニケーションする上でソフトウェアの世界でも重要なものです(そもそもプログラムは,ある種の文書です).最初に,一般的な技術文書が持つべき特性について考えます.IEEE Std 830-1998(ソフトウェア要求に対する推奨される実践,以下IEEE文書)という文書があります.特にSRS(ソフトウェア要求仕様書)を書くときにとても参考になるガイドラインです.ここで,SRSは,次のような特性を持つべきとしています.

  1. 正確である
  2. 明白である
  3. 完全である
  4. 一貫している
  5. 重要性,そして/または,安定性に従ってランク付けされている
  6. 検証可能である
  7. 修正可能である
  8. 追跡可能である

このうち,今回は (2) の明白であるというのを取り上げてみることにします.ここでの明白さというのは「記述された要求がたった一つの解釈しか持たない」ということなのですが,様々なコミュニケーション理論が示すように,これは簡単なことではありません.どのように書いたところで,書かれたものの解釈は,多義性から逃れることはできず,多少なりとも保証してくれるとすれば,それはコミュニティ内の約束を前提とするしかありません.先の文書でも次のような注意事項があります.

“…しかしながら,これらのグループは,しばしば同じバックグラウンドを持つというわけではない.従って,同じような流儀でソフトウェア要求について記述しない傾向がある.開発者が要求仕様を変更した時の表現は,ユーザにとっては理解しづらくなる可能性があるという意味で,生産的でない可能性がある.逆も同様にあり得る. “


文書は自然言語/要求仕様言語/表現ツール(図式)を使って記述しますが,先の多義性からは逃れることはできませんし,それぞれ長所・短所を持ちます.従って,「明白に」いうのは,正しい日本語で書くとか,ある特定の手法で書くといったことで,直ちに実現できるわけではありません.
「明白に」を実現するために,唯一の評価軸として採用できるのは,書き手ー読み手間の経済合理性しかないのだろうと思います.誰も読まないと思えば,書かない.チーム内の同じ技術者が読むと思えば,同一の土俵上で,最小限の記載を行う.この合理性を考慮しない技術文書の書き方はおよそ意味がないだろうと思います(もちろん,時間の経った書き手は読み手でもあります).もちろん,とりあえず作ったソフトウェアが長く使われるのだけれど,文書がなくて困るということも沢山あるだろうと思います.しかし,予知能力が人間に備わっていない以上,そこにはやはり経済合理性を求めるべきだろうと思います.逆に,そういう自体に対処できるソフトウェアであるべきということだろうと思います.およそ,このように合理性を考慮しないとアリバイ的文書だけが存在して,結果的に明白さを著しく損なう気がします.

***

ISO 26262では,機能安全に関する成果物が定められています.そこでの成果物の構造は,とても興味深いのですが,また別の機会に書きたいと思います.ここでは,成果物の持つ特性に対する規定をみたいと思います(ISO 26262-6 6. Specification and management of safety requirements).安全要求の特性として以下を挙げています.対応とあるのは,先のIEEEの文書で要求している特性の番号です

  • a) あいまいさがなく,理解が容易であること 対応:(2)
  • b) 原子的であること 対応:?
  • c) 内部では一貫性のあること 対応:(4)
  • d) 実現可能であること 対応:?

最初の「あいまいさがなく,理解が容易」というのは,必ずしも,「明白である」こととは一致していません.しかし,概ね意図していることは同じと云って良いと思います.読み手側に対する配慮になります.b)の原子的であることというのは,特定のレベルで考えたときにそれ以上分割できないということを示しています.こちらは,要求の記述と云うより,そもそも要求がどのように識別されるかということであり,IEEE文書には含まれていません.c)の一貫性については,IEEE文書の(4)に対応します.この(4)は,内部での一貫性と外部との一貫性の2種類の意味がありますが,26262では,6.4.2で内部の一貫性を,6.4.3で外部との一貫性を要求しています.d)は,安全要求が実現可能であるか否かです.こちらも,成果物の特性と云うよりは,要求の特性だろうと思います.或いは,一般には要求の実現可能性とは,要求と別に議論されるべきで,要求に含むのは違和感があります.書くとすれば,IEEE文書にある(5)のランク付けによる色分けに対応可能かも知れません.総じて,IEEE文書は,SRS文書がどう書かれるべきかということに重点を置いているのに対して,26262では,安全要求はどうあるべきかということ,文書記述を混在させているように見えます.6.4.3の管理をみると,前者に関する内容が主になるので,どういう表現かというよりは,安全要求の論理構造を議論していると考えた方がよさそうです.もちろん,その方が自然な気もしますが,表現に関する規定も含んでいるので分かりづらくなっています(本来,論理構造と表現は不可分です).
さて,自動車の場合は一般にOEM-サプライヤの境界が存在します.この部分のインターフェイスは26262では,DIA(Development Interface Agreement)でとることになります.もちろん,この3文字で済ませても良いのですけれど,実際にDIAに記述されるべき内容は,ライフサイクル上の位置によって異なることになります.従って,かなり悩ましいことになりそうです.先の書き手ー読み手間の経済合理性を考慮した文書化というのも,OEMーサプライヤのインターフェイス位置によって表現を変える必要がでてきます.部位によって概ねそのインターフェイス位置は,現実的に決まっているとすれば,それに応じて適切な表現レベルを*合理性に基づいて*定めると云うことになるのだろうと思います.

***

ミソサザイのデュエットの話ですが.記事を読んで,少しショックを受けました.デュエットをリードしているのは,必ず雌とのこと.むかし,ペアのダンスをしていたことがあります.そのときに,注意されていたのは,リードするのは男性なのでしっかりしなさいと.陸上のダンスも,氷上のダンスも同じです.しかし,遠い目で,昔を振りかえってみると,決してリードしていたわけではなく,リードしやすいようにリードされていた気がしてきました.すべからくそうなのかもしれません.

(nil)

形態と構成

構成管理をイメージしてみます.各構成品目が複数あり,それらを横に並べます,各品目は,図面でいえばサフィックスが増えていくように,プログラムでは各コンパイル単位のバージョンが増えていくように,速度差はあっても時間軸方向に縦に伸びていくとします.一つの構成・ベースラインはそれらに横串を刺したものとなります.私には,ベースラインは,波のようにイメージできます.

11月の葉山海岸(SPIN世話人会のあとで)
***

ソフトウェアの世界でここ十年ほどでよく使われるるようになった構成管理ということばは,もちろん,Configuration Management の訳語です.別の訳語もあります.形態管理という言葉で,いまでも航空宇宙の分野で良く使われていると思います(私は形態管理という名前で最初に覚えました).
形態というのは見えるさまで,使用する部品が異なれば見え方にも影響してきます.例えば,自動車の部品表に色を指定することで,形状は全く同じでも識別することが可能な別の車となります.
さて,この形態管理或いは構成管理は,ハードウェアの世界とソフトウェアの場合とで,少し異なっているように思います.今回,その違いを考えてみようと思います.分かりやすくするために,ハードウェアでは<形態>という用語を用いて,ソフトウェアでは<構成>という言葉を使うことにします.同じものを異なる相でみたいというだけで,基本的には同じものです.特に区別しないで済むところは構成管理とします.

***

ハードウェアの場合は,完成品を頂点として,多数の部品を組み合せることで成立します(自動車の場合は,何万点の部品という云い方がされますが,アッセンブリレベルでの指定が多いので,ある車に関して,実際に部品表に記載される数はそれほど多くはないでしょう.また,概念的には木構造を構成しますが,構成はフラットに表現します).この組合せにより,一つの<形態>が生まれます.
ソフトウェアの場合は,通常は,より細かな単位,例えばコンパイル単位を構成品目とします.”細かな”というのはもちろん相対的な云い方です.ここに,幾つかの特性の違いを見ることができます.例えば,ハードウェアの場合,構成する品目は基本的に図面によって示され,しかるべき手順に則った管理がなされます.図面を書くと上司のチェックを受け,例えば図面室で受理されて初めて品目としての準備ができます.一方で,ソフトウェアの場合,構成品目として一般にコンパイル単位を選択します.この品目は,いわゆるリファクタリングの過程で,品目による構成そのものが変更対象となります.また,そうすることが保守性の観点から推奨されています.従って,ソフトウェアの分野における<構成>管理ソフトウェアは,ファイルの分割や併合に対して柔軟に対応可能となっています.ハードウェアの<形態>管理にあるように番号を付けて,会社が存続する限り全社共通で管理するという文化になじまないことになります.

***

私が,形態管理という言葉を知ったのは,MIL-std-1679Aという規格です(これは以前にアイテムの回で触れました).その後継となったDOD-std-2167Aでは,形態管理に関して興味深い使い分けをしていました.2種類の形態管理があります.一つは開発時の管理であり,もう一つは,出荷時の管理ということです.先の二つの訳語を用いると,前者が開発時の<構成>管理ですし,後者が出荷時の<形態>管理と対応しているということもできます.この区分は形態・構成管理を考える上できわめて重要になります.一つは経時的な問題であり,もう一つは発注者ー受注者問題です.
最初に経時的な問題から考えます.ソフトウェアで一般に使われる構成管理は,主として多人数での開発をサポートするためのものです.一つのコンパイル単位の変更が他に影響を及ぼすことが大きい(これはソフトウェアの特性です),従って,今の<構成>状態(ベースライン)を知ることが重要になり,短ければ半日という時間刻みで更新されます.一方で,機械設計などでいう<形態>管理の対象となる品目は,設計者の設計結果ですから,その時点では固定したものとして,変更は容易ではありません.設計というプロセスでみると前者がその進行状態の話であり,後者は完了時点での話と云うことになります.
次の,発注者ー受注者問題というのは,如何にその構造に構成管理を写像するかということになります.例えば基本設計が終了した後に,受注者側にその結果を受け渡すとすると,発注者側での<形態>は,その時点で確定します.即ち,発注者にとって,その後,如何に細分化されようが,(アッセンブリという)単一の品目として扱うということになります.一方で,受注者側では,単一であるアッセンブリを開始点として,開発時<構成>管理及び,発注者に引き渡すための<形態>管理を行うということになります.この関係は,受注者が更に発注者でもある場面においても同様に繰り返されます.
このように考えることで,実務における構成管理を比較的考えやすくなります.

***

しかしながら,形態・構成管理を実務に適用しようとする場合に,考慮すべき事柄は上記に限定されるわけではありません.先ほど経時的な問題を考えましたが,より長い時間スパンにおける経時的な変化がその一つです.例えば,モデルチェンジを行うような場合(ソフトウェア的にはバージョンアップでしょうか)にどう対応するかといことがあります.このときは,(形態・構成管理がきちんとなされていると前提で)変更管理の枠組みを適用することで,多くの場合は対処可能です.逆の云い方をすると,製品が変化するのは必然なので,形態・構成管理と変更管理は,本来不可分だということになります.
もう一点は,通時的な変化です.民間におけるシステム製品のように,多くの変異(Variation)を持つ場合の効率良い形態・構成管理の方法を考慮しないといけないということです(2167では軍用の二者関契約ですので,変異は余り大きな問題とはなりません).先に開発時と出荷時を分けましたが,ここでもその区分は有効になります.例えば,パラメータによってふるまいを変更するということを,変異への対応手段として良く行いますが,この場合は,パラメータの生成器は開発時の構成管理の対象とし,生成されたものが出荷時の構成管理の対象ということになります.

***

さて,ここまでは一般的な構成管理の話になります.機能安全(例えば,つい最近発行された ISO 26262を例にします)についても基本は同じだろうと思います.結局はテストしましょうということで一般のプロセスの枠組みを用います.しかし,このままだと,一般のテストと同じ構図で,不具合の不在証明はできないという議論に辿り着きます.或いは,ここまでの構成の議論で考えた多様な変異に対しては,「全ての構成をテストすることが現実的でない場合,合理的にサブセットを選択しても良い(Part8 9.4.2.2 (c)」ということになっています.しかし,機能安全は最後の砦であり,全ての不具合を防止することを意図しているわけではない.あくまで安全性に関わる機能の故障に特化しているのですから,網羅性が担保されないのだとすると,「合理的構成の組(reasonable subset)」のみを選択してテストということが,該当する場面はないように思います.構成管理というのはきわめて色々議論されて安定した枠組みですが,こと機能安全との関係(更にはSILとの関係)を考えるときに,いろいろと議論すべきことがあるように思います.

(nil)

あいまいさ

先日の日曜日,桐生市の無鄰館で,金原寿浩さんの展覧会にでかけてきました.「黒くぬれ!」がテーマで,福島原発事故をモチーフにしていました.墨で書かれた無残な建屋は,リアルな写真で見るよりも,心に残ります.今回は,コンピュータを用いたインスタレーションの可能性について,少し可能性を議論したのですが,お互い得意とする表現分野が異なるので,伝え合うのは難しい.

***

さて,今回は良く云われる「要求」のあいまいさについて考えたいと思います.いつも気になるセリフに「要求」が曖昧だからソフトウェアが作れないというのがあります.多くの場合,これは間違っています.例えば,誰かに竜の絵を描いてもらおうと思います(来年は辰年ですし,二年連続日本シリーズおめでとうというのもありますね).

このとき,飛翔している姿にするか,どこかに潜んでいる姿にするか位は伝えた方がよいかもしれません.しかし,ヒゲの長さは,体長の12.98765%にすることとか,爪の幅は,耳に対して,1/11.23581321345589にしなさいとかはいわない.その数字が竜を表しているわけではないからです.事後的に,細かな数字をいうことは可能でしょう.しかし,それでは要求にならない.

この時点で,先の要求は十分に正確なのです.抽象度に応じて,必要な記述レベルは自ずと定まります.それをムリに記述しなければならないとするのは,誤りです.

では,仕様はどうかという議論もあります.要求は形式化の行為を経て仕様になります.ここでの形式性には,何らかの数学的な背景(例えば集合であったり時間的なふるまい記述)や,物理法則があります.その範囲では,或いはその側面では,無矛盾を担保できます.

ただ,ここにも問題があって,先の12.98765%を仕様として書くことはできますが,機械的に導出することはできません.それが可能なのは,線形で発展するシステムだけで(即ち,既存のささやかな改修),それ以外は別の手段をとる必要があります.形式性の持つ有効性は,あくまで存在するもの或いはコトの*形式上の*記述であること,また,形式性は新たなものを生み出すこととは別のことになります.

***

金原さんとは,先月末に同じ場所で個展を開かれた岸田孝一さんのパーティで知り合いました.岸田さんは画家として表現なさるのですが,「作者の意図を伝えない,そもそも意図はない」ということをおっしゃられます.誤解しているかも知れませんが,意図なき表現は,形式性を排除できる.また,より自由な表現を可能にすると,と理解しています.しかし,それもまたメタには意図だとすると,つくづく表現するということはムヅカシイと思います.

(nil)