初めてのアプリ開発 ~ 要件定義 ~

# 目次

[1. 要件定義とは](#要件定義とは)
[2. とりあえずまとめてみる](#とりあえずまとめてみる)
[3. 参考](#参考)
[4. 終わりに](#終わりに)

# 要件定義とは
システム開発など本格的に実施する前に、クライアントからの要求を開発者目線で明確化し、予め決められた予算やスケジュールからシステムの要件を取捨選択をし、最終的にクライアントと合意を取る為のプロセス

ここのプロセスで不明確さが残ると以降の工程作業に影響し、手戻りが発生する可能性があるので、可能な限り作りたいシステムの要求を明確化する必要がある。

## クライアントからの要求とは
クライアントにて事前に要望やニーズ、問題などを洗い出して整理されたものを指す。これを要求定義と呼ぶ。
ただこの要求定義はあくまでクライアント視点でまとめられた定義(定義書)なので、これを開発するという視点で再整理を行なっていく。

再整理をすると、クライアント側にも開発者側にも納得して以降の工程を進められる成果物が作成されることになる

## 開発者目線で明確化とは
クライアントが求めているシステムに対して、実際に製造する際に必要な情報を明確化していく。

大きく分けて以下を明確化していく。※1
 - 機能要件
     - システムの機能一覧
 - データ構造
     - システムで扱うデータの把握
     - エンティティの定義
     - CRUD図の作成
 - インタフェース
     - システムを使用する人に対しての画面一覧
     - 他のシステムと連携を取る必要があれば、外部インタフェースの一覧
     - 画面遷移図
 - 非機能要件 ※2
     - システムの可用性
         - どれくらいの時間稼働できるか
         - メンテナンス時の計画停止の有無
         - 故障や障害が発生した際にどれだけ迅速に復旧できるかなど
     - 性能・拡張性
         - システムがどれだけ効率的に動作できるか
         - システムの応答速度や処理能力、スループット(単位時間当たりの処理能力やデータ転送量)
         - リソース拡張性
     - 運用・保守性
         - 運用時間
         - バックアップ
         - システムの保守運用
     - 移行性
         - 新しい環境やプラットフォームにどれだけスムーズに移行できるか
         - 移行対象の設備やデータなど
     - セキュリティ
         - システムがどれだけ安全で、データを保護できるか
         - アクセス制御やデータ暗号化、脆弱性対策など
     - システム環境・エコロジー
         - システムが稼働する環境の要件
         - ハードウェア・ソフトウェア・ネットワーク要件
         - エネルギー効率・廃棄物管理・環境への影響など
 - 技術選定

※1 : これら以外にも業務内容を明らかにしたり、ビジネスで達成したい目標などの要件定義(ビジネス要件)、リリースまでのスケジュール(かなり大事)、リリース後の運用などをまとめる必要があるが、今回は開発向けに絞るため対象外とする。
※2 : 「非機能要求グレード2018」より抜粋

# とりあえずまとめてみる

どうやってまとめたら良いか(どう書いたら良いか)はこの時点でがっつりとは調べず、一旦まとめてみる

### 今回作成するアプリ

iphoneで食品の栄養成分表示を写真に撮ったら、その写真を解析して1日のカロリー等を記録するアプリ

### 1回目作成結果

以降のフェーズで要件定義に問題があれば理由も含めて要件定義書を修正する。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/03e0e0a0-757a-45db-a159-eb2d23588e50.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/651a9908-4229-4f7b-ad6f-9927d3f5b13d.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/7d80a568-b4b7-4193-96de-2eb2ea848735.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/45a0fa32-f474-4665-bf07-9bb6c9fa35fa.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/750ce1af-2332-4bf0-867d-a87a718a76f0.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/50f56564-45c8-4800-b9c5-ad9e234af45d.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/d7cb8b78-35a4-4af4-9fd3-ba2247eca089.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/0bffdc01-36a1-4056-9e4c-61ea1f0383d1.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/49c24a34-094b-4816-98e2-3836c7047f6e.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/bc32fb5e-459e-41c9-bbe7-083d1e5ddf3e.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/2fbf3867-d6c8-46fb-a565-a58c0b7ed4fd.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/23f1afa5-a55c-49f1-8055-28590cceb35b.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/909ce919-5137-436a-8949-3ad49aa3e65e.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/41538bb7-fd01-4268-ab2c-73b51d795fe1.png width=50%>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469387/655f0266-dff6-4320-8532-e941539fdc88.png width=50%>

- 技術選定の妥当性検証結果
https://qiita.com/ogu-bob/items/3d8b8b0499e192018632

### 課題

非機能要件の性能要件の決め方が難しいなと感じました。
今回はスマホアプリ限定であること、複雑な処理がない、ユーザ数が少ないなどの理由で最低限な要件としましたが、
これらと逆な理由だった場合などはどのようにして決定するのかを改めて勉強しないとなと思いました。

参考：
https://xtech.nikkei.com/it/article/COLUMN/20071220/289917/

# 参考
- 要件定義について
https://hnavi.co.jp/knowledge/blog/requirements-definition/
https://www.cm-net.co.jp/blog/requirement-definition/
https://service.shiftinc.jp/column/8507/
https://tokyoitschool.jp/know-how/requirement-definition-howto/
https://qiita.com/KNR109/items/8b37f7f8c051868d9a98
https://codezine.jp/article/detail/17022
- 非機能要件について
https://www.aimc.co.jp/blog/p-4283/
https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ps6vr700000077he-att/000066170.pdf