ようこそ。睡眠不足なプログラマのチラ裏です。

ソフトウェアの品質要因 その3「頑丈さ」

頑丈さ(robustness)

■定義:頑丈さ(robustness)
「頑丈さ」とは、異常な条件に対して適切に対応するソフトウェアシステムの能力である。


頑丈さとは正確さを補完する要素
頑丈さとは、正確さを補完するものである。
「正確さ」は、仕様に記述されている振る舞いを対象としているが、
「頑丈さ」は、その仕様以外のところで起きることについての特徴を表している。


「頑丈さ」は、「正確さ」に比べて本質的にあいまいな概念である。
頑丈さの問題となるのは仕様に記述されない場合についてとなるため、
想定外の異常系に対するソフトウェアの適応能力が、ここでいう「頑丈さ」である。


正常系とは?異常系とは?
正常系と異常系という概念は、常に特定の仕様に対して相対的に言うことができる。
つまり、異常系とは単に仕様に記述されていない場合に過ぎない。
仕様の範囲を広げれば、たとえそれがユーザの入力エラーなどのイベントに対処するのであっても、
それは正常系のケースとなる。その意味で、正常系は「ソフトウェア設計の中で考慮されている事柄」に過ぎない。
入力エラーや例外ケースを正常系と呼ぶことに、最初は矛盾を感じるかもしれないが、
これ以外のアプローチは主観的な基準に基づくことになるので、役に立たないだろう。
したがって、仕様の範囲を広げて異常系を減らし、正常系を増やすことが、
「正確さ」を補完するための「頑丈さ」を高めることになる。


頑丈さの役割
仕様に明示的に記述されていないケースというのは、必ず存在する。
「頑丈さ」の役割というのは、そうしたケースが発生したときに、
システムが破壊的なイベントを引き起こさないようにするということである。
例えば、障害が発生したときに適切なエラーメッセージを出力し、実行をきれいに終了させるなどを指す。
つまり、「頑丈さ」を考慮する場合、いわゆる「適切なグレードダウン(graceful degradation)」を
意識するようにしなければならない。


以下、「頑丈さ」に関連する用語について。

フェール・ソフト (fail soft)
システムの障害が発生した際に、機能を完全に喪失するのではなく、
障害が発生した個所を破棄、切り離すなどして障害の影響が他所に及ぼされるのを防ぎ、
可能な範囲で最低限のシステムの稼動を続けるための技術。


ハードディスクを複数個備え、内容を常にミラーリングしているRAIDシステムや、
電源やネットワークカードのコントローラを複数個備えているリダンダント電源や、
リダンダントネットワークカードなどでは、運用中に一ヶ所に障害が生じても、
残された系統で運用を続けることができ、直ちにシステムが停止しないようになっている。


このように、システムの要所に複数系統を用意した多重化(冗長化)を行ない、
さらに障害の自動的な検知、障害に対する対処の自動化を盛り込んだシステムをフェール・ソフトと呼ぶ。
この挙動は、グレースフル・デグラデーション (graceful degradation) とも呼ばれる。

フォールト・トレラント (fault tolerant)
システム障害や誤動作が発生しても機能が正しく維持されること。
耐故障性。この概念は、フェール・ソフトの礎となっている。
フォールト・トレラントを考慮する場合、大抵は構成要素の多重化 (冗長化) によって実現される。


構成要素の多重化(冗長化)とは、例えばバックアップの部品があって、
障害が発生した場合、その部品に自動的に代替して動作するような仕組みを指す。

フォールト・アボイダンス (fault avoidance)
システム障害の可能性が充分に低いこと。つまり高い安全性と信頼性を意味する。

フール・プルーフ (fool proof)、フール・レジスタント (fool resistant)
人間が誤って不適切な操作を行なっても危険を生じない、あるいは正常な動作を妨害されないこと。
フール・プルーフを保証するためには、通常は意識的に不適切な操作を行なうことまでを考える必要はないだろうが、
さまざまな状況でどのような誤りを犯す可能性があるかを考えることが必要となる。
安全インタロックの多くはこの特性を実現するためのものであると考えられる。


「fool proof」を直訳すれば「愚か者にも耐えられる」だが、
その意味するところは「よくわかっていない人が扱っても安全」ということ。
その思想の根底には「人間はミスするもの」、「人間の注意力はあてにならない」という前提がある。
システムの安全設計の基本として重要な基本概念であると言える。

タンパー・プルーフ (tamper proof)、タンパー・レジスタント (tamper resistant)
人間が「いたずら」をしても障害を生じないこと。
この種の行為としては“できごころ”程度によるものを考えることが多いだろうが、
意志 (場合によっては悪意さえも) を持って行なわれるものまでを考える場合もある。
保護の対象として子供を考えている場合にはチャイルド・レジスタントなどと呼ばれることもあり、
この考え方の例としては、小さい子供には開けにくいように工夫した薬瓶が有名。

オネスト・プルーフ (honest proof)、オネスト・レジスタント (honest resistant)
これは正式な用語ではないかも知れない (また、普通の文脈では別の意味を持つように思われる) が、
人間が目的 (悪意ではなく) を持って行なった、あるいは行なおうとした作業が不適切なものであっても
危険を生じないことを示すために用いられることがある。
この例としては、例えばシステムが不調となった時に現場作業者 (修理作業を行なうべきでない者) が
それを自分で直そうとして障害を生じる可能性が予期される場合に、
それを防止するために重要な部分をセキュリティによって制御すること。