品質とは何か

品質という言葉の意味

「品質」という言葉は、我々の世界ではよく使いますが、 品質とは何でしょう。 品質が良い/悪い、と言ったり、 品質を上げる、と言ったりしますが、 これがどんなものなのか、明確に認識しているでしょうか。 いろいろな人の話を聞いていると、 意外と認識が一致していません。

人によっては、検証の結果を見て言います。 「このモジュールは品質が悪いね」と。 人によっては、プロジェクト開始前に言います。 「前回のような品質問題は起こさないようにしよう」と。 人によっては、常に使います。 「品質を測定しろ、品質目標を立てろ」と。 それぞれの人が、それぞれの立場で、 主観で話すケースがほとんどです。

実は「ソフトウェアの品質」というものについては、 ISO 9126-1 という規格に定義がなされています。 もっとも、 品質という概念自体が社会通念上明確というわけではありませんから、 規格にあるからといってそれが唯一の正解、 ということにはならないかも知れません。 しかし、この定義が参考になることは事実です。 そこでまずは、ISO 9126-1 に記載されている 「品質」について整理してみたいと思います。

ISO 規格は一般に日本語に翻訳されたものが JIS 規格として発行されています。 ISO 9126-1 に関していえば、JIS X 0129-1 になります。 発行年を併記すると、ISO 9126-1(2001)および JIS X 0129-1(2003)です。 元々はこの規格、ISO 9126(1991)だったものが改正されて ISO 9126-1 と ISO 14598-1(こちらの翻訳版は JIS X 0133-1) の2つになりました。 2つを合わせると、1991 年版に比べて分量が格段に増えています。 1991 年版の方が簡潔にまとまっていて理解しやすいと思われますので、 もし旧版を入手できるなら、そちらから読んだ方がよいかと思います。

測定との関係と視点

品質、というものは具体的な「物」として存在するわけではなく 「概念」ですから、「測定」という行為によって、 なんらかの測定値に置き換えて認識する必要があります。 つまり、品質を論じるには、本来、 測定とセットでなければならないのですが、 測定の詳細については 別の項 に記載することにします。 ここでは、ソフトウェアの「ライフサイクル」 の視点から、次の図(JIS X 0129-1 から引用)を用いて説明します。

image/quality_kinds_01.png

この図は右から見ていくのが理解しやすいと思います。 ソフトウェアの品質に直接影響を受けるのは利用者です。 その段階での品質のことを「利用時の品質」と呼び、 利用者の必要性に合致するかどうかを表しているものになります。 これは利用状況によって異なります。 例えば、ある環境で十分満足に機能するソフトウェアも、 別の環境では障害を露呈するかも知れないということです。

「利用時の品質」に直接影響するものが「外部品質」です。 ソフトウェアが実行されるときの品質のことであり、 テストデータを用いたテストの結果(実行時のコードの振る舞い) などが該当します。 ほとんどの人が「品質」として認識するのはこれでしょう。 「利用時の品質」を代表するもの、と捉えることもできます。

「外部品質」に直接影響するものが「内部品質」です。 ソフトウェアの内部的な特徴で、 ソースコードのみならず、仕様書なども測定対象になるでしょう。 静的な測定によって得られるものがほとんどで、 例えばモジュール性(ソフトウェアが適切に構造化され、 変更、修正などが局所的なもので済むようになっている性質) や追跡可能性 (要求から実現されたものへの関連、 および実現されたものから要求への関連を追いかけることができる性質) などが該当します。

「内部品質」に直接影響するものが「プロセス品質」です。 プロセスとは設計/開発のやり方や手順のことです。 この「やり方」の品質が結果的にすべての品質に影響を及ぼす、 ということになります。

だからこそ、「設計プロセス改善」は重要なのです。

ISO 9126-1 では、ソフトウェアの品質を分類して理解するために、 ここで示した「外部品質」と「内部品質」 を6種の特性に分類するモデルが採用されています。 まずは、この分類モデルについて理解することにしましょう。

品質の種類

基本的な考え方

ISO 9126-1 では「ソフトウェア品質モデル」 というものを定義しています。 それによれば、 ソフトウェアは仕様書やソースコードにおいて、 記述の長さやプログラム構造、表現の一貫性やクラス継承の深さ、 といった内部の実態に関する様々な「特徴」を持っています。 そして、利用者によってソフトウェアが利用されたときや、 ソフトウェアの開発者が開発を行なったときなど、 この「特徴」に起因した様々な現象に遭遇することになります。

このとき、測定可能で物理的または概念的な「特徴」、 とりわけ分解不可能で基本的な「特徴」のことを「属性」と言います。 この「属性」をある観点から整理し、 分類したものを「特性」と呼び、 「特性」を細かく分類したものを「副特性」と言っています。 特に、ソフトウェアの「品質」の観点から整理した「特性」 のことを「ソフトウェア品質特性」と呼んでいます。

つまり、ソフトウェアが持つ様々な特徴(属性) を品質の観点から整理したものが「品質特性」で、 品質特性をより細かく分類したものが「品質副特性」 というわけです。 これを図にしてみると、次のようになります。

image/quality_kinds_02.png

ここで注意ですが、 それでは属性にはどんなものがあるのか、 と問うても答えはありません。 上記の考え方も、 「ソフトウェアの品質は、複数の『品質特性』という形で表現することができる。 『品質特性』に影響を与えている要素として 『特徴』/『属性』といったものがあるはずである。 また、『品質特性』は、 より細かく『品質副特性』というものに分類できると考えられる。 『特徴』/『属性』としてどのようなものがあるのかは対象依存である。」 といった程度のものです。 品質特性の種類は後述しますが、 例えば「関数の行数」という「属性」が、 「保守性」という品質特性に影響していると思っているのであれば、 そう解釈すればよいだけのことです。

上記の図は、属性というものが明確に存在して、 それらがいくつか集まって品質副特性を構成し、 さらに品質副特性がいくつか集まって品質特性を構成しているように見えますが (ボトムアップの方向)、 発想自体は逆(ブレークダウンの方向)です。 また、一つの属性が複数の品質副特性に影響を与えている場合があり、 一つの品質副特性が複数の属性に影響を受けている場合があるので、 完全な階層関係になっているわけではありません。

ソフトウェア品質特性

まずは大分類であるソフトウェア品質特性について見てみましょう。 ソフトウェア品質特性は、大きく6種に分類されています。 その名称と内容を記載します。

機能性
ソフトウェアを指定された条件の下で利用するとき、 明示的および暗示的必要性に合致する機能を提供する ソフトウェア製品の能力のこと。 ソフトウェアが必要性を満たすために何をするか、 実現された機能に過不足がないかを示すものです。 ここでの必要性には、 暗に期待されている必要性が含まれます。 例えば、要求仕様書に記述されているか否かには依存しません。
信頼性
ソフトウェアを指定された条件の下で利用するとき、 指定された達成水準を維持するソフトウェア製品の能力のこと。 信頼性では、狭義の平均故障間隔などで示される概念だけでなく、 ソフトウェアに潜在していた障害による誤動作からの回復、 ならびに障害に対する許容性に対する概念も含まれます。
使用性
ソフトウェアを指定された条件の下で利用するとき、 理解、習得、利用でき、利用者にとって魅力的である ソフトウェア製品の能力のこと。 いわゆる「使い勝手」、「使いやすさ」、「操作性」の概念です。
効率性
明示的な条件の下で、使用する資源の量に対比して 適切な性能を提供するソフトウェア製品の能力のこと。 つまり、定められた条件下でいかに速く処理できるか、 単位時間内にどれだけ多くのトランザクションを処理できるか、 また、いかに資源を有効に使用するかを示すものです。
保守性
修正のしやすさに関するソフトウェア製品の能力のこと。 修正は、是正もしくは向上、または環境の変化、 要求仕様の変更および機能仕様の変更にソフトウェアを 適応させることを含めてもよいです。 保守性は利用者には関係ない特性というわけではなく、 利用者自身が保守を行なう場合もあり、 ソフトウェアの誤りが短期間に修正され、 使用可能となれば利用者にとっても有益ということになります。
移植性
ある環境から他の環境に移すためのソフトウェア製品の能力のこと。 環境には組織、ハードウェアまたはソフトウェアの環境を含めてもよいです。 要するに、別の環境へどれだけ容易に移せるかを示します。

品質特性の大枠を飲み込めたでしょうか。 次に、各品質特性の品質副特性について見てみます。

機能性品質特性の品質副特性

機能性品質特性に関わる品質副特性には以下のものがあります。

合目的性
指定された作業および利用者の具体的目標に対して適切な機能の集合を提供する ソフトウェア製品の能力のこと。
正確性
必要とされる精度で、正しい結果もしくは正しい効果、 または同意できる結果もしくは同意できる効果をもたらす ソフトウェア製品の能力のこと。
相互運用性
一つ以上の指定されたシステムと相互作用するソフトウェア製品の能力のこと。
セキュリティ
許可されていない人、またはシステムが情報またはデータを読んだり、 修正したりすることができないように、 および許可された人、またはシステムが情報またはデータへのアクセスを 拒否されないように、 情報またはデータを保護するソフトウェア製品の能力のこと。
機能性標準適合性
機能性に関連する規格、規約または法律上および類似の法規上の規則を 遵守するソフトウェア製品の能力のこと。

「機能性」といったときに、多くの方が想像するのは、 上記の「正確性」という品質副特性だと思います。 つまり、定められた仕様に対して正しく動作するか、という視点ですね。 でも、「機能的に正しいかどうか」を論ずる際には、 上記のその他の品質副特性が関係するということは理解できると思います。

最後の「標準適合性」は、他の品質特性にも出てきます。

信頼性品質特性の品質副特性

信頼性品質特性に関わる品質副特性には以下のものがあります。

成熟性
ソフトウェアに潜在する障害の結果として生じる故障を回避する ソフトウェア製品の能力のこと。
障害許容性
ソフトウェアの障害部分を実行した場合、 または仕様化されたインターフェース条件に違反が発生した場合に、 指定された達成水準を維持するソフトウェア製品の能力のこと。 指定された達成水準にはフェイルセーフの能力を含んでもよいです。
回復性
故障時に、指定された達成水準を再確立し、 直接に影響を受けたデータを回復するソフトウェア製品の能力。 故障に伴い、ソフトウェア製品がしばらくの間ダウンすることがありますが、 その時間の長さで評価することができます。
信頼性標準適合性
信頼性に関連する規格、 規約または規則を遵守するソフトウェア製品の能力のこと。

使用性品質特性の品質副特性

使用性品質特性に関わる品質副特性には以下のものがあります。

理解性
ソフトウェアが特定の作業に特定の利用条件で適用できるかどうか、 およびどのように利用できるかを、 利用者が理解できるソフトウェア製品の能力のこと。 理解性は文書類およびそのソフトウェアから得られる最初の印象に依存します。
習得性
ソフトウェアの適用を利用者が習得できるソフトウェア製品の能力のこと。
運用性
利用者がソフトウェアの運用および運用管理を行なうことができる ソフトウェア製品の能力のこと。 合目的性、変更性、環境適応性、 および設置性といった他の品質副特性のある側面は、 運用性に影響を与える場合があります。
魅力性
利用者にとって魅力的であるためのソフトウェア製品の能力のこと。 色彩の利用やグラフィカルデザイン性のように、 利用者にとってソフトウェア製品をもっと魅力的なものにするための属性に 相当します。
使用性標準適合性
使用性に関連する規格、 規約または規則を遵守するソフトウェア製品の能力のこと。

効率性品質特性の品質副特性

効率性品質特性に関わる品質副特性には以下のものがあります。

時間効率性
明示的な条件の下で、 ソフトウェアの機能を実行する際の適切な応答時間、 処理時間、および処理能力を提供するソフトウェア製品の能力のこと。
資源効率性
明示的な条件の下で、ソフトウェアの機能を実行する際の、 資源の量および資源の種類を適切に使用するソフトウェア製品の能力のこと。 「人的資源」は後述の利用時の品質の方に含まれますので、 ここには含みません。
効率性標準適合性
効率性に関連する規格、 規約または規則を遵守するソフトウェア製品の能力のこと。

保守性品質特性の品質副特性

保守性品質特性に関わる品質副特性には以下のものがあります。

解析性
ソフトウェアにある欠陥の診断または故障原因の追及、 およびソフトウェアの修正箇所の識別を行なうための ソフトウェア製品の能力のこと。
変更性
指定された修正を行なうことができるソフトウェア製品の能力のこと。 修正の実施にはコーディング、設計、および仕様書の変更を含みます。
安定性
ソフトウェアの修正による、 予期せぬ影響を避けるソフトウェア製品の能力のこと。
試験性
修正したソフトウェアの妥当性確認ができるソフトウェア製品の能力のこと。
保守性標準適合性
保守性に関連する規格、 規約または規則を遵守するソフトウェア製品の能力のこと。

移植性品質特性の品質副特性

移植性品質特性に関わる品質副特性には以下のものがあります。

環境適応性
ソフトウェアにあらかじめ用意された以外の付加的な作業または手段なしに、 指定された異なる環境にソフトウェアを適応させるための ソフトウェア製品の能力のこと。 環境適応性は、内部的容量(例えば、画面/表/トランザクションの規模など) の拡大縮小の調整能力を含みます。
設置性
指定された環境に設置するためのソフトウェア製品の能力のこと。
共存性
共通の資源を共有する共通の環境の中で、 他の独立したソフトウェアと共存するためのソフトウェア製品の能力のこと。
置換性
同じ環境で、同じ目的のために、 他の指定されたソフトウェア製品から置き換えて使用することができる ソフトウェア製品の能力のこと。 アップグレード時の新しい版の置換性も重要な側面です。
移植性標準適合性
移植性に関連する規格、 規約または規則を遵守するソフトウェア製品の能力のこと。

利用時の品質とは

利用時の品質は、特定の環境および特定の利用状況で利用されるときの、 利用者の視点でのソフトウェア製品の品質です。 これはソフトウェア自体の特徴を測定することによって認識されるわけではなく、 ある環境において、利用者が目標を達成することができる程度を 測定することによってはじめて認識することができます。 同じソフトウェア製品でも、利用者が異なれば結果(認識される品質の度合) は違います。 利用者は自分に関係するソフトウェアの属性のみを暗黙のうちに評価するからです。

ISO 9126-1 では、利用時の品質を次の4種の特性に分類しています。

有効性
利用者が指定された利用の状況で、正確かつ完全に、 指定された目標を達成できるソフトウェア製品の能力のこと。
生産性
利用者が指定された利用の状況で、達成すべき有効性に対応して、 適切な量の資源を使うことができるソフトウェア製品の能力のこと。 資源には、作業を完了するまでの時間、利用者の労力、 材料または使用した費用を含めることができます。 つまり、前記「効率性品質特性」において含まれなかった「人的資源」 に関する効率性は、こちらに含まれます。
安全性
利用者が指定された利用の状況で、人、事業、ソフトウェア、 財産または環境への害に対して、 容認できるリスクの水準を達成するためのソフトウェア製品の能力のこと。 リスクは一般に、機能性(セキュリティを含む)、信頼性、 使用性または保守性の欠陥の結果です。
満足性
指定された利用の状況で、利用者を満足させるソフトウェア製品の能力のこと。 一般に、製品を対話的に利用したときの利用者の反応です。

利用時の品質には副特性が定義されていません。

俯瞰

ここで、前述までの品質特性を図にして俯瞰してみましょう。 下図も JIS X 0129-1 から引用しています。

image/quality_kinds_03.png

image/quality_kinds_04.png

まとめ

品質というものを上述のように捉えることは重要です。 品質を考える際の観点が整理されているので、 これを利用してソフトウェア品質を仕様化したり、 評価項目を設定する際の漏れを防止したり優先度付けを行なうことができます。 また、品質目標を設定するようなときにも大いに参考になるでしょう。

例えば、移植性を判定するために、 ソースコードを直接レビューして、 機種依存部分が1つのファイルに収められているかどうかを検査する、 という方法があります。 これは内部品質を静的に測定していることになり、 この測定結果をもって、移植性の善し悪しを「予測」していることになります。 一種の指標です。 対して、実際に移植作業が発生したときに、 移植作業に要した時間や人員数を測定する、という方法もあります。 これは外部品質を動的に測定していることになり、 現象が発生した事後の測定、ということになりますが、 直接の測定です。

品質に影響を与える「属性」としてどのようなものがあり、 それはどのようにして測定することができ、 それらはどの品質特性に影響するのか、 ということはソフトウェア開発組織ごとに自分で考えるしかないと思います。 上記の例でも、 移植性に影響する属性としてどのようなものがあるかということと、 その属性の測定結果と実際の移植性との関連性を将来にわたって追跡し続ける (データを蓄える)ということも管理上重要(予測精度を高めるという意味で) かも知れません。

品質と生産性 目次へ ↑