開発工程とは

## システムの開発工程とは
「開発工程」とは、``システム（もしくはアプリ）を最小限の時間・コストかつ高品質で開発するための枠組み``のこと。十分にテストされた高品質のシステムを迅速に開発できるようにするための、構造化されたフェーズ。

開発工程を定義する目的は、``計画通りの期間・予算・品質でプロジェクトを進めていけるようにする為``。

## ソフトウェアライフサイクル
ソフトウェアライフサイクルとは、``システムを開発し、使って、もう使わなくなるまでの全工程``のことを指す。

>ライフサイクル自体の意味は、「始まってから終わるまで」や「生まれてから消えるまで」的な意味の用語

もっと具体的にいうと、ソフトウェアは開発されると、
使用→保守→使用→保守→使用…のフェーズに入り、そのソフトェアが使用される限りこの循環が続く。

一般的な製造業などにおける保守は修理が目的だが、``ソフトウェアにおける保守は修正と更新がメイン``。

## 基本的な開発フェーズ
``要求分析　→　設計　→　実装　→ テスト``

**要求分析**
開発の初期段階でこのシステムやソフトウェアを使う利用者が``何を求めているのか、どんなシステムがいいのかを明確にしていく工程``のこと

**設計**
要求分析によって定義されたソフトウェアをどのような計画でどのように実現していくかを決定していく作業。

**実装**
設計が固まった段階で実際にプログラミングを行いソフトウェアを構築。

**テスト**
要求分析、設計によって決められたソフトウェアが実際に正常に動作するかを確認する作業。

## システム開発の種類
・ウォーターフォール
・プロトタイプ
・スパイラル
・アジャイル

## ウォーターフォール

ウォーターフォールモデルは「計画（要件の定義）」「外部の設計」「内部の設計」「プログラム自体の設計」「プログラミング」「テスト」などの``各工程が終わるまで次には進まず、かつ前の工程には戻らないという開発手法``で、各工程ごとに成果物を作り、各工程の品質を確保するという特徴がある。

予算やスケジュールの予測がしやすい反面、手戻りが出来ない為、不測の事態に対応しづらく、また各フェーズで全てを決める必要がある為、プロジェクトが長期化しやすいというデメリットがある。

工程が水が流れるように進み、元の状態には戻らない性質から、ウォーターフォールと呼ばれている。
[![Image from Gyazo](https://i.gyazo.com/7f487eed4fabc54c9e9a137da06b29e5.png)](https://gyazo.com/7f487eed4fabc54c9e9a137da06b29e5)

## プロトタイプ
ウォーターフォール型開発を改良してできたのがプロトタイプ型開発。
プログラミング開発に入る前に、試作品であるプロトタイプを作成し、発注者のレビューを受けて認識にずれがないか調整する。

プロトタイプをその後どのようにしていくかによって開発プロセスの呼び名が変わる。

[![Image from Gyazo](https://i.gyazo.com/489b63523b13b3ce6befed4fac6d4550.png)](https://gyazo.com/489b63523b13b3ce6befed4fac6d4550)

#### ラピッドプロトタイピング
プロトタイプ（試作品）を**破棄することを前提として、プロトタイプ（試作品）を作成する**。Figmaのようなデザインツールで``UI/UX``のみを検証したり、最近ではプログラミングを行わずノーコードのみでシステムを構築し、検証を行うこともある。

#### 進化型プロトタイピング
ある程度のプロトタイプを作ってから、その後工程で詳細な要件・要求仕様が決まるので、決まり次第プロトタイプを**流用・改良しつつ開発して完成品を作る**という手法。

## スパイラル
スパイラルは機能単位で基本的な開発フェーズを繰り返していく開発手法。

#### インクリメンタルモデル
スパイラルの１つ。インクリメンタルモデルは機能やモジュール単位で分割し、1つずつ完成させていく手法。
[![Image from Gyazo](https://i.gyazo.com/88566d4a785001045467d4dfe5cef501.png)](https://gyazo.com/88566d4a785001045467d4dfe5cef501)

#### イテレーティブモデル（反復モデル）
スパイラルの１つ。イテレーティブモデルはプロトタイプからシステム全体の開発を繰り返し、完成度を上げていく手法。
[![Image from Gyazo](https://i.gyazo.com/3d5725599f35ef3220a854a57a164345.png)](https://gyazo.com/3d5725599f35ef3220a854a57a164345)

## アジャイル
アジャイルとは『すばやい』『俊敏な』という意味で、短い開発期間で反復を行い開発を進めていく手法。

スパイラルとの違いは、スパイラルは完成するまでリリースしないことに対して、アジャイルは都度の開発ごとにリリースを行っていくことが特徴。

[![Image from Gyazo](https://i.gyazo.com/8ec90976e96b2e9cffbafe0929247a84.png)](https://gyazo.com/8ec90976e96b2e9cffbafe0929247a84)

#### スクラム
アジャイルの１つ。スクラムはアジャイルの中でも、少数のチームが一体となってプロジェクトを推進する為の規則を定義したフレームワーク。
スクラムではチーム内での役割や見積もり、コミュニケーションの方法論までも定義されている。

#### XP（エクストリームプログラミング）
アジャイルの１つ。XPはチーム開発を導く共通の5つの価値（コミュニケーション、シンプリシティ、フィードバック、勇気、リスペクト）を定めており、プラクティスと呼ばれる手法も定められている。

代表的なプラクティスとして「テスト駆動開発」、「ペアプログラミング」、「リファクタリング」、「YAGNI」などが挙げられる。

## 参考記事
[ソフトウェア開発ライフサイクル（SDLC）](https://www.synopsys.com/ja-jp/glossary/what-is-sdlc.html#1)
[ウォーターフォール型開発・モデルとは？定義やメリット・デメリット - アジャイル開発との関係](https://boxil.jp/mag/a1738/#1738-1-1)
[ソフトウェアライフサイクル](https://wa3.i-3-i.info/word19438.html)
[要求分析](https://www.itnavi.jp/words/%E8%A6%81%E6%B1%82%E5%88%86%E6%9E%90/)
[進化的プロトタイピングとは](https://confrage.jp/%E9%80%B2%E5%8C%96%E7%9A%84%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF/)
[あなたはどれを選ぶ？いろんな開発手法](https://enjoyworks.jp/tech-blog/7265)