要件定義〜基本設計（備忘録）

# 要件定義

## 大まかな流れ

**1. 要望**
　こんなシステムあったらいいな

**2. 要求**
　こんな機能を作って欲しい

**3. 要件**
　この機能を作ろう

## 具体的な進め方

### 1.  要望

対象：ユーザ
ユーザに「何が欲しい？」「何を解決したい？」を聞く

**成果物：業務フロー**

### 2.  要求

対象：PM
目的に合う要望を取捨選択する

**成果物：機能一覧**

### 3.  検討  

対象：SE
技術的に目的が叶えられるか検討

※ユーザが使いやすいかは都度検討する必要があり

### 4.  提案

対象：SE
目的に合う要望を取捨選択する

※「○、×」で言わない。これならできるという提案も持っていく

### 5.  要件

対象：SE,PM
決定事項の整理

**※「やらないこと」「変更点」も決めてしっかり文書化しておく**

**成果物：要件定義書**

## 要件定義成果物

- 要件定義書（基本設計でもブラッシュアップ）
- 業務フロー
- 機能一覧（基本設計でもブラッシュアップ）
- 画面設計（ユーザがイメージしやすいのでなるべくあった方がいい）


# 基本設計

## 大まかな流れ

1. 画面設計
2. 機能要件
3. データ設計

※適宜要件定義の修正は行う

## 画面設計

**成果物:**
- 画面設計書
- 画面遷移図


画面設計から行う理由はユーザがイメージをしやすくし、
要件定義に修正があれば早い段階で修正するため。

### UI/UX

UI/UXを意識した上で画面設計を行う

UI・・・「ユーザーインターフェース(User Interface)」
UX・・・「ユーザーエクスペリエンス(User Experience)」

**UXは要望（目的）であり、UIはそのための手段**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/e402d85c-c645-ac7b-9b9e-09bcce53819a.png)

### タスク指向/オブジェクト指向

画面を作成する上で採用されている考え方にタスク指向、オブジェクト指向の考え方がある

#### タスク指向
具体的なタスク（やりたいこと）に注目されたUI
タスク一覧を真っ先に表示されることが多い。
**「何がしたいか？」を基に決めていく**

例：銀行ATM,賃貸の検索サイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/0879934d-7210-43b9-67c8-6592f21c96d0.png)


#### オブジェクト指向
ユーザが知りたいこと（興味対象）に注目したUI
物、情報一覧が真っ先に表示されることが多い。物、情報を選んだ後に「何をするのか」を決める。
**「物、情報（オブジェクト）」を基に決めていく**

例：UberEats,Email
![スクリーンショット 2022-07-07 8.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/d100cb73-999c-ca11-5f52-d28fa538aa69.png)



## 機能設計

### 機能設計で考ること（大まかに）

1. ユーザー操作の裏側で行われる処理
2. そのために必要なデータ

**成果物:**
- 機能一覧
- 機能ごとの設計書（整理のためで必ず必要ではない）
- 機能を紐づけた画面遷移図（データ設計でも利用）

### 機能設計流れ

**作成した画面設計書を基に下記を明確化していく**

**1. 変動項目の洗い出し**
 →どの項目が固定で、どこが変動する項目か？
**2. ユーザ操作の洗い出し**
 →ユーザはその画面で行える操作は？
**3. 機能説明の作成**
 →2の操作を行なった際に起こる処理は？

#### 変動項目の洗い出し

- 固定ではない変動する情報（項目）は何か？
- データの取得基は何処から取得されるのか？（DBか入力値かAPIか）


#### ユーザ操作の洗い出し

**画面設計書を見ながら下記の項目を洗い出していく**

##### 処理内容
例
- DBから情報の取得
- 画面への一覧表示
- 合計金額や個数の表示


##### 関連するDB

例

- 顧客DB
- 商品DB
- 購入履歴DB


##### トリガー

例

- ボタンのクリック
- 画面表示時
- 時間


#### 機能説明の作成

1. 必要なデータベース、処理を一覧化する
2. 画面遷移と裏側の処置を紐づけた画面遷移図を作成

## データ設計

**成果物:**
- ER図
- テーブル設計書（DB定義書）
- 画面遷移、裏側の処置、DBを紐づけた画面遷移図の作成

### 前提
**テーブルは２種類ある**


| 項目 | 説明 | 例 |
|:-:|:-:|:-:|
| マスタテーブル |  オブジェクト固有の情報を保存したテーブル<br>他のテーブルから参照される基礎情報  | ユーザテーブル<br>商品テーブル |
|   トランザクションテーブル |  システムが利用される中でデータが蓄積されるテーブル<br>マスタ以外のテーブルのこと   | 購入履歴テーブル<br>検索履歴テーブル|


### データ設計流れ

**作成した画面設計書を基に下記を明確化していく**

**1. データ構造を明確にする**
**2. データ間の関係性を定義**
**3. 全体を可視化**


#### データ構造を明確にする

- テーブルをマスタトランザクションに分ける
- テーブルの具体的な中身（データ構造）を決める
    - 機能設計を見て必要なデータがを探す
    - ユーザやビジネス関係者にヒヤリングして欲しいデータが何かを決める

**ここでの必要なデータの正解はユーザやビジネス関係者にあり、引き出すことが大事** 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/67de42a8-a39e-a01d-b428-0feb369c9d1c.png)


#### データ間の関係性を定義

##### ER図
- どんなテーブルがあるのか？
- どんなカラム（列情報）があるのか？
- テーブル間の参照関係（外部キー）は？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/9f8f4003-c3b7-40ec-0edb-6af6f5b103d7.png)

#### 全体を可視化

システム全体のデータ、処理の流れを可視化する
**「画面設計」x「機能設計」x「データ設計」を紐づける**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529836/c378cd83-6ab1-2a39-ad59-fb6838c817a7.png)

## 基本設計成果物

- 画面設計書
- 機能一覧
- ER図
- テーブル設計
- 「画面設計」x「機能設計」x「データ設計」を紐づけされた画面遷移図


## 参照した資料
[Udemy_【入門】システム要件定義と基本設計（実践ワークで理解する上流工程の進め方）](https://www.udemy.com/share/1062XY3@b1vGb2xoTsE_TTIun8tfoB0o0lyZvhfPQFiqZrQsxIJ0f8fOAfQwTlqS7Ti0AS0g/)