システム開発をする時の客観的思考について

# はじめに
システム開発を行なっていて、よく発言している言葉に気づいた。

* 〜として考えると？
* 〜の立場だとどうなるの？
* 〜の欲しい物は？
* 〜としての表現は？

どれも、誰かに良い物、分かりやすい説明などを提供するために発言している（・・・はず）。
という事は、システム開発を行うにあたって、重要なポイントではないかと考えるようになった。

# 客観的思考とは
ここで伝えたい客観とは、主観の逆ということではない。
（私の頭のスペックが低いことが原因で、良い言葉が思いつかなかったので客観的思考という言葉になっているだけです。）

* 主観的思考<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/4426d263-f3d6-a75b-21e8-b4ad40c6f80b.png)
    * 自分の思考
    * 自分から見える情報、自分としての解釈に基づき構成される
   
* 客観的思考<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/d5430c64-441c-e275-99bc-a3a3590225d5.png)
    * 特定の誰かの主観的思考
    * 特定の誰かになりきって、見える情報、解釈されるであろう想定に基づき構成される
    * 自分以外の全ての思考ではないので要注意

# よく発生する間違い
結局全て同じですが、ケース事に発生するやりとり。

## プログラミングの場合
* 担当者：　プログラミングが完了しました！レビューをお願いします。

```javascript:pg.js
/*
 * Overview:有効なユーザの一覧を取得する。
 */
function getUserList() {
  // 現在有効なユーザを検索する
  // ユーザに関連する各種ファイル（契約、顧客、利用履歴など）を取得する
  // 取得した結果を後続処理で利用する為に加工する
  // 加工したユーザリストを返却する
}
```

* 先輩　：　確認した結果。１箇所修正をお願いします。
    * ファイル参照の処理は、他の機能でも利用する可能性があるので、共通部品として独立させてください。

* 担当者：　承知しました！修正終わりました！

```javascript:pg.js
/*
 * Overview:有効なユーザの一覧を取得する。
 */
function getUserList() {
  // 現在有効なユーザを検索する
  // ユーザに関連する各種ファイル（契約、顧客、利用履歴など）を取得する
  // *** commonUtilを呼び出し
  // 取得した結果を後続処理で利用する為に加工する
  // 加工したユーザリストを返却する
}
```
```javascript:commonUtil.js
/*
 * Overview:有効なユーザ一覧の各種ファイルを取得する。
 */
function getFileData() {
  // 各種ファイル（契約、顧客、利用履歴など）を取得する
}
```
* 先輩　：　ありがとう！確認した結果、１箇所修正をお願いします。
    * 共通部品の説明は、「有効なユーザ一覧」となっているけど、この処理では「有効なユーザであるかのチェック」「複数を一気に処理する」などは行なっていないので、「指定されたユーザ」かな？


---
担当者は、作成している機能として利用する用に修正を行い、説明を記載したが
先輩は、共通部品として考えた時に、適切な表現となっていないので修正をして欲しいと指摘をしています。

ここで重要なのは、`プログラムの１ファイルだけを見た時に理解ができるか？`です。
共通部品は共通なので、個別の部品でやっている説明を記載すると、他の人が見た時に混乱します。


## ユーザ部門とのやりとりの場合
* 担当者：　明日の12時にシステムリリースがあるので、ユーザ部門に連絡します。

```text
明日、x月x日にシステムリリース（不具合修正、インフラ設定変更、脆弱性対応）を行います。
その為、システムの利用が出来なくなります。
```

* 先輩　：　この内容で連絡して、ユーザ部門は何をすれば良いのかわかるかな？
    * ユーザが知りたい情報は、`いつ使えなくなるか、いつ使えるようになるか`が重要なのでそこを明確にお知らせしましょう。

```text
明日、x月x日にシステムが利用できなくなります。
=====================
 x月x日 12:00-13:00
=====================
（作業状況により記載の時間より前後する場合が有ります）
指定の時間以外での利用をお願いします。利用されていた場合は、強制的にログアウトされます。

作業開始、終了の連絡を行います。
本作業に関する連絡は、xxxxxまでお願いします。

作業内容：
システムリリース（不具合修正、インフラ設定変更、脆弱性対応）

```

---
担当者は、実施する作業をベースに記載したが
先輩は、連絡する相手（ユーザ部門）が知りたい情報となっているかをベースに修正をしました。

ここで重要なのは、`ユーザ部門が知りたい情報になっているか？`です。
システム側の情報は、記載していても良いが、適切な相手に適切な情報をお届けする必要があります。


# 客観的思考を鍛える
鍛えるなんて、カッコよく書きましたが、どうすれば良いかよく分かりません。
なので、ゲームを作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/cb6f4523-b835-653e-decb-6403b88a9ec4.png)

`回答者が、指定された人に代わって回答をする。`という簡単なゲームです。

1. 左側の項目を更新する。チェックのついている項目がルーレットに利用されます。
2. 右側のルーレットを実行する。<br>
   「START」を押すと、スロット形式でルーレットが開始し、「STOP」を押すとルーレットが止まります。
3. 全てのルーレットを実行して、３つの項目を決定する。
4. 回答者は、1分程度で指定された回答する。

画面の例は、「佐々木希」さんが、「林田貢太郎」さんの「保有しているスキル」を回答する。
（できるだけ、「林田貢太郎」さんのつもりで）

このゲームの応用で、時間があれば議題をルーレットで回して、討論したりする事もできる。
頭の体操と、誰かの視点で考えることを鍛えていくことできると良いなー。

## ゲームについて

https://github.com/Yamamoto-Shohei/game-answer-as-other-person
Reactで作ってあるので、ご自由にどうぞ。
オンライン飲み会などのゲームにでも使えるかも！？

# 最後に
仕事をしていく中で自然と身につくスキルなのかもしれませんが、初めは中々難しい人も多いと考えています。
少しでも早く、この客観的思考を身に付けることができれば、物事が円滑に進むような気がしています。

私もまだまだ修行中なので・・・大きな事は言えません。