開発プロセスをカレーの作り方で理解してみる

# はじめに
この記事は[ウェブクルー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/webcrew) 1日目の記事になります。
参加していただいた方々本当にありがとうございます！！

# 経緯
よっぽどプログラマーに特化した人でもない限り、システム開発にかかわる人は開発工程を意識せずに仕事はできません。
しかし開発プロセスに関する話は基本情報でも応用情報でもさっくり終わってしまう範囲であり、意識せずなんとなく仕事をしているというのを最近強く感じました。
そんなシステム開発の工程をみんな大好きカレーの作り方へと具体化することで、理解しようという記事になります。

# 開発プロセス
アジャイル開発にスクラム開発、プロトタイピングモデル…と手法は多々ありますが、今回は由緒正しき(?)ウォーターフォール開発で理解していきたいと思います。
1つずつ確実に進めるという考え方が料理の工程と似ているのと、(情報の漏れが無ければ)スケジュールの管理や進捗把握がしやすいということが大きなメリットになります。~~まぁそんな都合よく進むことはないんですが。~~

## 1.システム要件定義(要件定義)
**概要：**
そのシステムを作ることでどんなことをしたいのか。何のどんな業務を対象にするのか明確にしていく段階。
実現するために実装しなければいけない機能や性能などを話し合って決定していく。
ユーザーがシステムに求めていることをまとめた発注者向けの「**要求定義**」とそのために必要な機能をまとめた開発者向けの「**要件定義**」の二つをまとめて要件定義とみなすこともある。
ここのヒアリングを重点的に行わないと、壮大な手戻り(=やり直し)が発生したり、出来たものが誰のためにもならないという事が起こりかねません。(参考リンク:[顧客が本当に必要だったもの](https://dic.nicovideo.jp/a/%E9%A1%A7%E5%AE%A2%E3%81%8C%E6%9C%AC%E5%BD%93%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE))

**カレー：**
どんなカレーが食べたいのか。甘口か辛口なのかを話し合っていく段階。
そもそも作るべきなのはカレーなのかをヒアリングする必要もある。
聞いてみたらただ辛い物を食べたいだけという事が分かるかもしれない。

激辛が食べたいというのは「**要求定義**」、じゃあ唐辛子を入れましょうというのが「**要件定義**」となる。
ここのヒアリングを漏れなく行わないとあとで悲鳴を上げることになる。(日本カレーを作ったら求めていたのはインドカレーだった、なんてときは鍋を投げたくなります。)
ライスではなくナン派の人は早めに言っておきましょう。考えのすれ違いが許されるのはラブコメだけです。

## 2.システム方式設計(外部設計)
**概要：**
要点定義でまとめたことを実現するために、ハードウェア、ソフトウェア、ネットワークの構成などを決定する。
例えばサーバーであれば**オンプレミス(自前)**にするか**クラウド**にするか等を決定する。
また、**システムが自動ですること**と**利用者が手作業で行うこと**の範囲を決定する。

**カレー：**
要件定義でまとめた味・形式を達成するために何を使うのか決定していく。
カレーの味を作るのに**ルーを買う**のか、**スパイスの調合**から行うのか、というのを選び決めていく。
また、レシピとして**カレールーとごはん**は出すけど、**福神漬け**は各自に乗せてもらうという事を決定する。

## 3.ソフトウェア要件定義(外部設計) 
**概要：**
利用者の視点からソフトウェアに必要な機能や能力を決定する。
システムを使う一連の流れを定義するために[**ユースケース図**](https://www.google.com/search?q=%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%9B%B3&rlz=1C1GCEU_jaJP1012JP1012&oq=%E3%82%86%E3%83%BC%E3%81%99%E3%81%91%E3%83%BC%E3%81%99%E3%81%9A&aqs=chrome.1.69i57j0i4i131i433i512j0i4i512l8.3403j0j7&sourceid=chrome&ie=UTF-8#imgrc=D1KiRt3xJRNU9M)を作成したり、データの流れに着目した[DFD](https://www.google.com/search?q=DFD&rlz=1C1GCEU_jaJP1012JP1012&oq=DFD&aqs=chrome..69i57j0i512l9.1049j0j7&sourceid=chrome&ie=UTF-8)を使用することもある。

**カレー：**
野菜炒めて、肉焼いて、水入れて…という**レシピ**を作る状態。

## 4.ソフトウェア方式設計(内部設計)
**概要：**
開発者の視点からソフトウェアに必要な機能や能力を決定する。
ソフトウェアの構造とコンポーネントについて考える。

**カレー：**
米を用意するのに、ご飯を炊くという工程が必要になるのでレシピの手順書に追加する。
同じように野菜を用意するために皮むき工程を挟む必要があるので、手順書に追加する。

## 5.ソフトウェア詳細設計(内部設計)
**概要：**
各プログラムの構造設計を行う。
テストするソフトウェアごとに詳細化して、クラスの名前を一つずつ付けるなどして文章化する。

**カレー：**
野菜は○○で買う、肉は△△で買うというように詳細に決めていく。
ぶっちゃけ無くても良いという意見はあり、内部設計は行わず外部設計から一足飛びにプログラミングに移る場合も実際にある。

## 6.ソフトウェア構築(プログラミング)
**概要：**
詳細設計に基づいて作成していく。

**カレー：**
買い出し、準備、作成、召し上がれ！

## 7.テスト
**概要：**
作成したプログラムは要求水準を満たしているか、ミスやバグが無いかを確認する。
全体の3~4割の時間を費やす場合が多い。
モジュールレベルの単体テスト、結合させた状態を検査する結合テスト、システム全体を稼働させたシステムテスト、実際の運用と同じ環境で行う運用テストがある。

**カレー：**
要求レベルの味が出来ているか確認する。
野菜・米レベルでチェック、料理全体でチェック、実際に出してみてチェックを行う。
不味かったら作り直す。

# まとめ
これで完成！ としたいですが、実際に出した場合には「**思っていたのと違う**」と言われることもあるのがウォーターフォール型です。
カレーの場合「嫌なら食べるな」とでも言えますが、システム開発ではそうもいきません。
このような不幸な事故を防止するために[アジャイル開発](https://www.google.com/search?q=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA&rlz=1C1GCEU_jaJP1012JP1012&oq=%E3%81%98%E3%82%83%E3%81%84%E3%82%8B%E9%96%8B%E7%99%BA&aqs=chrome.1.69i57j0i4i10i37i512.2938j0j7&sourceid=chrome&ie=UTF-8)や[プロトタイピングモデル](https://www.google.com/search?q=%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%83%A2%E3%83%87%E3%83%AB&rlz=1C1GCEU_jaJP1012JP1012&oq=%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0mode&aqs=chrome.1.69i57j0i4i512l5j0i4i30l4.4578j0j9&sourceid=chrome&ie=UTF-8)が用いられたりします。
興味ある方はぜひITパスポートなどの取得を目指しつつ、調べていただければと思います。
ここまで読んでいただきありがとうございました！

明日は、[@piwi](https://qiita.com/piwi)さんになります。
よろしくお願いします！

ウェブクルーでは一緒に働いてくれる方を絶賛募集中です！
興味のある方はぜひお問い合わせください。
https://www.webcrew.co.jp/recruit/

# 参考
https://qiita.com/chocode/items/fd51dd8f561e2a0fbd70
https://www.it-shikaku.jp/top30.php?hidari=00-00.php&migi=km00-00.php
キタミ式イラストIT塾　応用情報技術者
栢木先生の基本情報技術者教室