by shigemk2

当面は技術的なことしか書かない

ソフトウェアの品質

ソフトウェアに望むもの

  • 速い
  • 信頼性が高い
  • 使いやすい
  • 読みやすい
  • モジュール性が高い

など。しかし、これらの形容詞は、2種類の異なる性質に大別される。

  • 外的品質要因
  • 内的品質要因

スピードや使いやすさなど、ユーザが認識出来る性質を外的品質要因といい、
モジュール性や読みやすさなど、ソフトウェアのコードにアクセスできる専門家にしか認識されない性質を内的品質要因という。
だが最終的に問題になるのは外的品質要因である。というのも、システムの破壊に比べたら、モジュール性の高さとか
リーダブルなコードは外的品質要因を達成するための手段に過ぎないから。

外的品質要因について

外的品質要因に必要なものは以下である。

正確さ 正確さとは仕様によって定義されている通りに仕事を実行するソフトウェア製品の能力のこと。
一にも二にもまず正確さが求められる。すべきことをシステムが正確に実行しなければインターフェイスとか処理の速さとかは何の意味もない。
前提条件依存 正確さを保証するための方法。アプリケーションを実行するにはコンパイラが必要で、アプリケーションの正確さはコンパイラの正確さに依存する。そのコンパイラも、OSの正確性に依存し、OSはハードウェアの正確性に依存する…といった具合である。

頑丈さ 異常な条件に対して適切に対応するソフトウェアシステムの能力。異常事態が発生したときに、システムが破壊的なイベントを引き起こさないようにするべきだ。

拡張性 仕様の変更に対するソフトウェアの適用のしやすさ
拡張性を工場させる上で重要な原則は、以下の2つ。

  • 設計の単純さ 単純なアーキテクチャは変更に適用しやすい
  • 非集中化 モジュールの自治性が高いと、モジュールの変更がシステム全体の変更にならず、変更を適用しやすくなる

再利用性 多種多様なアプリケーションの構築に使うことのできる、ソフトウェアの能力
システムは同じようなパターンになることが多いので、同じものを何度も作るより、既存のものを使いまわすほうが労力、正確さ、頑丈さなどの
向上に繋げられる。

互換性 ソフトウェアの要素の、他のソフトウェア要素との組み合わせやすさ
互換性が欠如していると、いくつかのシステムを統合するのに失敗しやすい。

効率性 処理時間、内部記憶および外部記憶上の空間、通信装置で仕様する帯域幅などの
ハードウェア資源をできるかぎり必要としない能力

基本的に効率性は軽視されがちである。理由は、技術革新が日進月歩なのですぐに性能のよいマシンやら技術やらがリリースされるから、効率性をちょっと上げるだけのプログラムに意味はないからである。
しかし、効率性は以下の理由から、無視するべきではない

  • より速いコンピュータを買っても、それが同じ問題を以前のコンピュータと同じ速度で解決していては意味がない
  • アルゴリズムによっては、新しいコンピュータでも結果に何倍もの差が出る。数十%しかパフォーマンス向上が見込めないなら投資的な価値はない
  • リアルタイムのシステムなど、効率性が正確性に影響を与える場合もある

可搬性 多様なソフトウェアおよびハードウェア環境へのソフトウェア製品の移植しやすさ

使いやすさ 経験も資格も異なる人々がいかに容易にソフトウェア製品の利用法を学習し問題解決に応用するか
ユーザインターフェイス設計の原則として、「そのユーザのことを知っている気にならないこと」が上げられる。
何も期待してはいけない。期待できるのは、ユーザが人類で、知っているのはマウスとキーボードの使い方くらいだ。

機能性 そのシステムが提供できるサービスの範囲

開発者はより多くの機能を求める圧力に直面している。この機能主義には2つの問題が付き纏う。

  • 新しい機能の追加によってソフトウェアの使いやすさが損なわれ、一貫性を失う
  • 機能に集中するあまり品質要因を忘れがちになる

適時性 ユーザが必要なとき、または必要とする前にソフトウェアシステムをリリースできること

その他、実証性、統合性、修復性、経済性などが外的品質要因として挙げられる。
これらの要因は、しばしばトレードオフになりやすい。効率性を求めて最適化をパーフェクトにしてしまうと他の環境への移植が困難になり可搬性が低くなる、適時性を意識しすぎてタイムリーなソフトウェアにしてしまうと将来の拡張性が見込めない、など。

ドキュメント 品質要因の結果であり、ドキュメントの必要がないものもある。

特に重要な事柄

正確さと頑丈さ
バグのないソフトウェアを生産することは非常に困難
これらを向上させるための技術として、以下が挙げられる。

  • より体系的なソフトウェア構築
  • より形式的な仕様
  • 出来上がってからのテストとデバッグだけでなくソフトウェアの構築過程全体に組み込まれているチェック

ナド。

拡張性と再利用性
ソフトウェアは変えやすく一般に応用されやすくて然るべきである。

まとめ

  • ソフトウェア工学の目的は品質の高いソフトウェアを作る方法を探求すること
  • ソフトウェアの品質は1つの要因ではなく、複数の異なる目標のバランスを基準に判断すべき
  • 外的品質要因はユーザと顧客に認識できる要因で、設計者や開発者が認識できる内的品質要因とは区別されるべき
  • 特に重要な外的品質要因は、正確さ、頑丈さ、再利用性、拡張性
  • ソフトウェアの保守にはコストの大きな部分が費されるが、これは変更を実装することの困難であることと操作するデータの物理的構造にプログラムが依存しすぎていることの罰