ソフトウェア開発について

## ソフトウェアテストとは
ソフトウェアテストは、ソフトウェアの品質を評価し、機能や要件に対する適合性を確認するプロセスです。主な目的は、ソフトウェアがユーザーの期待に応え、正常に動作することを確保することです。

### ソフトウェアテストの視点
#### V&V
V&Vは「**検証と妥当性確認 (Verification and Validation)**」の略称です。ソフトウェア開発やシステム工学などの分野で使用される重要な概念です。

V&Vはソフトウェアやシステムが高品質で信頼性が高いものであることを確保するために重要です。

- **検証 (Verification)**:
システムやソフトウェアが仕様書どおりに構築されているかどうかを確認するプロセスです。つまり、ソフトウェアが正しく機能し、要件を満たしているかどうかを確かめることです。これは主に、開発プロセスの中で行われ、設計やコーディング段階でのテストなどによって行われます。 
　
- **妥当性確認 (Validation)**:
実際の利用環境で、ユーザーや顧客が求める要件を満たしているかどうかを確認するプロセスです。つまり、ソフトウェアがユーザーのニーズや期待に適合しているかどうかを確認することです。これは主に、ソフトウェアが開発された後の段階で行われ、ユーザーのフィードバックや実際の使用によって行われます。
　
#### Never ・ Must ・ Want
「テストの never must want」とは、テストの完全性を確保するために、必要な条件や要素が欠けてはならないこと、そして特定の指示や要求があること、そして追加の価値を提供する要素があっても必ずしもそれらが必要ではないことを意味します。
　
- **Never**
これは「決して」という意味で、特定の条件や要素がテストから除外されてはならないことを示します。言い換えると、その条件や要素は必須であるということです。例えば、特定のセキュリティ機能がテストされなければならない場合、"**never**" の部分がそのセキュリティ機能を指し示します。
　
- **Must**
これは「しなければならない」という意味で、指示や要求を強調します。テストで実施すべき行動やチェック項目を明確にします。例えば、ある機能の動作が特定の仕様書に準拠しているかどうかを確認する場合、その仕様書に基づくテストが "**must**" の部分に該当します。
　
- **Want**
これは「望ましい」という意味で、特定の条件や要素がテストに含まれていてもよいが、必須ではないことを示します。言い換えると、その条件や要素は追加の価値を提供するが、必ずしもテストの完全性には不可欠でないということです。例えば、ユーザビリティテストでは、ユーザーの操作性や使いやすさが重要ですが、必ずしも全ての機能に対して行う必要はないかもしれません。


## ソフトウェア開発の流れ
ソフトウェア開発の流れは、一般的に以下のような段階で構成されます。
　
1. **要件定義**:
要件定義は、ソフトウェア開発プロセスの初期段階で、システムやソフトウェアに関する要求や期待を文書化するプロセスです。役割としては、開発チームや利害関係者が一貫した理解を持ち開発方針を明確にすることができます。メリットとしては、開発コストやスケジュールの予測が容易になり、品質を向上させることができます。
ユーザーストーリーや要件仕様書などの文書を作成します。
　
2. **基本設計**:
基本設計は、ソフトウェア開発の段階の1つであり要件定義の後に行われます。この段階では、要求された機能やシステムの動作を実現するためのシステムの構造やアーキテクチャ・データベースの設計などを詳細に計画します。基本設計の目的は、要求された機能をどのように実装するかを定義し、開発プロセスの指針となる設計文書を作成することです。この段階では、システムの動作や機能に関する詳細な技術仕様が定義され、実装フェーズに向けて準備が進められます。
　
3. **詳細設計:**
詳細設計は、ソフトウェア開発プロセスの段階の1つであり基本設計の後に行われます。この段階では、基本設計で定義されたシステムの構造や機能を実装するための詳細な設計が行われます。具体的なプログラミング言語やテクノロジーの選択、モジュールやコンポーネントの詳細な設計、データベースの詳細な設計などが含まれます。詳細設計の目的は、基本設計で定義された要求を満たすために必要な具体的な実装計画を立て、開発チームに実装の方針を明確に伝えることです。
この段階では、ソフトウェアの各機能やモジュールが具体的にどのように動作し、相互にどのように連携するかが詳細に定義されます。詳細設計は、開発プロセスの効率性や品質を向上させるために重要な段階であり、開発チームのコミュニケーションを促進し実装の方針を統一する役割を果たします。
　
4. **実装**:
設計に基づいて、プログラミング言語やフレームワークを使用してソフトウェアを開発します。
コーディング・テスト・デバッグを行いながら機能の実装を進めます。
　
5. **テスト**:
単体テスト・結合テスト・システムテストなどのテスト活動を実施し、ソフトウェアの品質を確保します。
また、テスト計画やテストケースを作成しテスト実行と結果の検証を行います。
　 
6. **デプロイ**:
開発したソフトウェアを本番環境に展開します。
デプロイメントプロセスやCI/CDパイプラインを使用して、自動化されたデプロイメントを実行することが一般的です。
　
7. **運用・保守**:
ユーザーサポート・バグ修正・機能の改善など、ソフトウェアの運用と保守を行います。
ユーザーからのフィードバックや新たな要件に応じて、ソフトウェアを更新・改善していきます。

## 様々な開発モデル
#### ウォーターフォール型開発モデル:
ウォーターフォール型開発モデルでは、開発プロセスが段階的に進行し、各段階は次の段階への完了を前提としています。一度に1つの段階のみが実行され、次の段階に進む前に前の段階が完了している必要があります。
ウォーターフォール型開発モデルは、前の段階の完了を前提として次の段階に進むため、変更が必要になった場合には後の段階に影響を及ぼす可能性があります。そのため、要件の変更や新たな要求に柔軟に対応することが難しいとされています。

![test-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2001657/29f30314-abbc-6a4a-19bc-55aebede09d3.jpeg)

#### V字モデル:
V字モデルは、ソフトウェア開発プロセスの一つで、ウォーターフォール型開発モデルの拡張版とも言えるモデルです。ソフトウェアの開発ライフサイクルを、ウォーターフォール型モデルの一連のフェーズとそれに対応するテストフェーズという「V字型」に表現したことから名付けられています。
V字モデルでは、ソフトウェア開発の各フェーズに対応するテストフェーズが存在し、開発フェーズと対になっています。各フェーズで行われる仕様や設計の検証を、その対応するテストフェーズで行うことで、品質の確保を図ります。

![test-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2001657/99678b7a-d0fb-e720-01c7-bbeabcc6772d.jpeg)


#### 反復型開発モデル:
反復型開発モデルは、ウォーターフォール型開発モデルの欠点を補うために提案されたアジャイル開発の一形態です。反復型開発では、ソフトウェア開発を複数の短いイテレーション (反復) に分割し、各イテレーションで要件定義・設計・実装・テストなどのプロセスを繰り返します。
反復型開発モデルでは、柔軟性が高く変更や新たな要求に迅速に対応できるため、アジャイル開発に適しています。また、顧客とのコミュニケーションを重視しソフトウェアの品質を向上させることができます。