ソフトウェア工学の基本
informationsoftware-engineeringundergraduatelecture
data/lecture/information/software-engineering/software-engineering-portal.lecture.n.md
1導入
この講義では、要求から運用と保守までのライフサイクルを通じて、ソフトウェアの品質と変更可能性を管理する方法を説明する。
プログラムが計算結果を返すことは、ソフトウェアの品質の一部にすぎない。利用者の要求との一致、障害時の信頼性、攻撃に対するセキュリティ、変更のしやすさなども評価する必要がある。ソフトウェア工学は、これらを個別の工夫ではなく、体系的な開発・運用活動として扱う。
2要求と受入条件
要求 は、システムが提供すべき機能または満たすべき制約である。
- 機能要求 は、システムが実行すべき処理や提供すべき機能を規定する。
- 非機能要求 は、性能、可用性、セキュリティ、使用性など、機能の品質や制約を規定する。
要求を「高速である」のような曖昧な表現だけで記述すると、実装の完了を判定できない。受入条件 は、要求が満たされたと判断するための観測可能な条件である。たとえば「同時に1000件の要求を処理したとき、95%の応答を200 ms以内に返す」と記述すれば、性能を測定できる。
3設計と変更の局所化
設計 は、要求を実現するために、システムの構成要素、責務、および構成要素間の関係を定める活動である。設計の目的は、単にファイルやクラスを分割することではない。一つの変更理由が多数の構成要素へ波及しないように、責務を配置する。
凝集度 は、一つの構成要素に属する責務がどの程度まとまっているかを表す。結合度 は、構成要素間の依存の強さを表す。一般に、関連する責務を高い凝集度でまとめ、構成要素間の結合度を必要最小限にすると、変更の影響を局所化しやすい。ただし、分割を過度に進めると、インターフェースと通信の複雑性が増加する。
インターフェース は、構成要素が外部へ公開する操作と情報の境界である。入力の前提条件、出力の保証、失敗時の応答を明示すると、内部実装を変更しても利用側への影響を抑制できる。
4テストと検証の水準
テスト は、入力と実行条件を設定し、観測結果を期待結果と比較して欠陥を検出する活動である。テストが成功しても、未実行の入力や状態に欠陥がないことまでは証明できない。このため、要求とリスクに応じて試験範囲を設計する。
- 単体テスト は、関数やモジュールなどの小さな単位を検証する。
- 結合テスト は、データベース、ネットワーク、モジュールなどの境界を介した連携を検証する。
- システムテストは、統合されたシステムがシステム要求を満たすかを検証する。
- 受入テスト は、利用者や発注者の観点から受入条件を評価する。
修正によって既存機能が損なわれることを回帰という。自動化された回帰テストを変更ごとに実行すると、既知の振る舞いが維持されているかを継続的に確認できる。
5変更管理・運用・保守
版管理 は、ソースコード、設定、ドキュメントなどの変更履歴を識別可能な版として記録する。継続的インテグレーションは、開発者が変更を共有された主系列へ頻繁に統合し、そのたびに自動ビルドとテストの結果を得る実践である。これにより、複数の変更の不整合を早期に検出できる。レビューは変更内容を検討する補完的な活動である。
運用 は、配備したシステムを利用可能な状態に維持する活動である。構成を管理し、稼働状態を監視し、障害やセキュリティインシデントへ対応する。監視結果とインシデントの記録は、新たな要求や保守の優先順位へ反映する。
保守 は、運用開始後にソフトウェアを修正し、環境へ適応させ、または品質を改善する活動である。障害の修正だけでなく、新しい要求、依存技術の更新、性能改善、セキュリティの強化も含む。
短期的な納期を優先して設計上の問題を残すと、将来の変更費用が増加することがある。この将来費用を技術的負債として捉える。技術的負債は比喩であり、すべての未改善箇所を直ちに解消すべきことを意味しない。影響と費用を評価して返済の優先順位を定める。
6品質特性とトレードオフ
品質には、機能適合性、信頼性、性能効率性、使用性、セキュリティ、保守性などの複数の特性がある。すべての特性を無制限に最大化することはできない。たとえば、冗長化は可用性を高める一方で、構成と運用を複雑にする。要求、リスク、費用を明示し、トレードオフを合意することが設計判断となる。
7具体例:データベースを利用する履修登録システム
履修登録システムでは、「学生が科目を登録できる」が機能要求となる。「定員を超える登録を許可しない」「二重登録を防止する」は、受入条件として検証できる。設計では、画面、登録規則、SQL による永続化を異なる責務として分離する。
単体テストは登録規則を、結合テストはアプリケーションとデータベースのトランザクションを、受入テストは利用者の操作手順を検証する。要件変更によって抽選方式を導入するとき、責務の分離と回帰テストが変更の影響範囲を明確にする。
8要点
- 要求と受入条件は、実装とテストの共通基準となる。
- 設計は責務とインターフェースを定め、変更の影響を局所化する。
- テストは欠陥を検出するが、欠陥が存在しないことの一般的な証明ではない。
- 版管理、レビュー、継続的インテグレーションは、変更を追跡し、統合時の問題を早期に検出する。
- 品質特性間のトレードオフは、要求、リスク、費用に基づいて判断する。
9次に進む講義
ソフトウェアを複数の機器や拠点にまたがるシステムとして構成するには、情報を信号として伝送する仕組みも必要となる。次のポータルでは、通信を支える信号、雑音、変調などを扱う。
data/lecture/information/communications/communications-engineering-portal.lecture.n.md