ファミリーキャンプで考える要件定義

この記事は「[【マイスター・ギルド】本物の Advent Calendar 2021](https://adventar.org/calendars/6579)」7日目の記事です。


皆さん楽しくコード書いてますか？
どーも、MGの新人おっさんエンジニア ma-k です。
12月になって一気に冬っぽい感じになり毎日寒がってますが皆さんいかがですか、寒いと頭はしゃっ
きりするものの、手がかじかんでくるのでキーが叩きにくいと室温設定に悩む今日この頃です。


#はじめに
この記事は、要件定義ってなんだろうなぁ、と思うような上流未体験の方になんとなくこんな感じ？
と理解していただければ、と思って書いてみましたがなんか違うかもしれません。
ファミリーキャンプを題材にしていますが、グループキャンプでも似たようなものだと思いますの
でそのまま使いまわせると思います、だいぶ無理矢理ですがぜひ笑って読んでください。
![photo_site.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2248965/085bd9fc-9590-05ca-eaca-2100854ab64b.jpeg)

#ファミリーキャンプの計画？
っというわけでキャンプです、しかもファミリーキャンプです。
野宿はしていましたが、ちゃんとしたキャンプは実はつい最近始めましたので一家でブームです、
IT業界では割とキャンパー多いような気がするんですがみなさんいかがですか？
道具にこだわったり、設営に工夫したり、わりと手順を楽しんで結果に満足するキャンプって、エ
ンジニアと親和度高いよね、といつも思いながら楽しんでいます。

#計画を立てよう
車停めて車中泊とは違います、ちゃんとしたファミリーキャンプです、子供たちも奥様も楽しめる
キャンプを計画し実行しなきゃいけません。
寒さに震えるキャンプは、大人だけなら笑い話ですが子供がいると割とシャレになりません。天候
チェックした上で雨対策もしっかりしないといけないかもしれません。何がしたいか、何を食べた
いか、どう楽しみたいか、持っていくギアの選定は目的により大きく異なりますし、必要かもと思っ
てなんでも持っていった結果、ぎゅうぎゅうに詰め込んだ荷物の中に「これ使わなかったね」な
んて物があると悲しいものがあります。
**ファミリーキャンプって思った以上に計画力が問われます**

##何を決めればいいんだろう
最初の頃はただテント泊を楽しめればそれで満足でしたが、慣れるにしたがってやりたい事もそれ
ぞれ、勝手に色々と心に秘めた物があったりするので厄介です。
直前に現地で「あれしたい！」とか言われてしまうので大変困ったものです。
・どんなアクティビティをするのか？どんな道具が必要なの？
・何時に入ってどう設営するの？
・焚火はどうするの？
どんなギアを準備して、何を買い足せばいいのか、食材は？飲み物は？設営の順序などタイムスケ
ジュールを決め、混乱なく楽しめるように計画するのはあなたにかかっていませんか？ウチは大体
そうです（料理回りは奥様の譲れない領域なのですが）

このように、希望の聞き取り、事前の計画、準備、調達をこなして本番を迎える。
なんかシステム開発の計画・プランニングフェイズにに似ているというのは私だけでしょうか。
これはまさに要件定義力が問われるんじゃないでしょうか！

##キャンプ計画は要件定義！
一般的には、「何をどうシステム化するのか」を決めるのが要件定義です。
ユーザーの山盛りの構想・希望を、限られた予算・人員で実現し、与えられた時間内に完成させ、
リリースを平和に迎えるためには、きちんとした要件定義は必須ではないでしょうか。
（世の中には様々な方法論もありますが・・・・・・）
ユーザーはたいていの場合期待値は高く、予算は少な目で、時間は短めです。そこをうまく整理
して、現実的な目標設定をしなければなりません。何が必要で何を作るかを、お客様から聞き出し
整理し、取捨選択して合意を取るのが要件定義のメインのミッションだと思っています。

特に間違えたくないのは、要求定義と要件定義は違うという事。
盛り込みたい事すべてが入っているのが要求定義ですが（いわゆるRFPが近いですね）要件定義は
実現可能性を種々の条件を踏まえて判断した、「ここまできちんと作ります」、という約束でも
あります、逆に言えば時間・予算など種々の前提により、要求定義に入っていてもできそうもない
事は要件定義に盛り込みません、お客様との合意の上である事はもちろん大前提ですが、出来な
い事はきちんと出来ないときちんと説明し、だからどうするか、次期開発とするのか、予算追加
してやってしまうのか、こういった事をきちんと決める事も大切な事です。

あれもやろう、これもやろう。あれも使うこれも使うではキャンプは盛りだくさんすぎて消化不良
になってしまい、やりたい事はイマイチやれなかったなんて事になりがちですが、初心者キャンパー
にはよくある失敗の一つじゃないでしょうか。
![photo_prepare.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2248965/d6bf9ef9-be94-050f-2e05-f2346db78a05.jpeg)


##要件定義するって？
さて、ここで実際の要件定義作業を考えてみましょう、やらなければいけないのは
1)顧客へのヒアリング
2)顧客の要求を細分化し分析
3)要件定義書の作成
シンプルに考えればこの3つになります。

##まずヒアリングしよう
ヒアリングの無い要件定義というのはまずあり得ないでしょう。頂いた資料・それぞれの担当者
からのヒアリングで得られた情報を基に分析し、発生した不明点疑問点は随時再度ヒアリング、
このような流れを繰り返しながら、システム化対象業務の詳細と具体像を詰めていく事になりま
す。
つまり、ファミリーキャンプでは主人公たるお子様方の希望をヒアリングして明確化し、それを軸
に計画を立てていかなければならないわけですね。

まずは簡単なメモを作りながらキャンプでやりたい事を確認しましょう。お子様方にヒアリングした
ら「昼は水遊びして夜は星の観察～」と言われても、多分夜は力尽きて早々に寝てしまうに決まっ
ています、ヒアリングを重ねて優先したいのはどちらか確認する必要があります。
実現可能性を考慮しながら決めていきましょう、「星の観察」ね、じゃあ望遠鏡持って行かなきゃ
ね（メモメモ）その時期の星座は※※だし、○○時ごろからはじめなきゃね（さらにメモメモ）とい
う感しに、本当に実現したい事を出来る事として明確化していきます。

###ちゃんと当事者に聞く
大抵の場合システム化対象業務は複数にまたがり、それぞれの業務ごとに窓口/主担当は複数存在
します。ウチのキャンプの場合、最近野外調理の楽しさに目覚めている奥様へのヒアリングも欠
かせません、息子氏と娘氏もそれぞれやりたい事を勝手に何か持ってます。
それぞれの業務のキーパーソンに直接ヒアリングする事は必須です。よく代表する窓口に全て
聞いてくださいというパターンを見聞きしますが、あまり良い結果になっているケースは無いよ
うに感じます。
その業務に精通している人、責任を持っている人にきちんと直接ヒアリングする事はとても大事
です。

###情報提供してさらにヒアリング
「子供達は星が見たいって言ってるから、○○時頃には食事終わってないと厳しいかな」という情報
提供をした上でメニューを決め込んでもらいましょう。こんな風に適宜情報提供しながらヒアリング
し、その結果を受けて分析を行わなければなりません。

###回答をもらうために
いつまでに決めなければならないか、回答期限は明確にした上で、都度ゆるやかに督促をしておか
ないと「駆け込み特急作成資料爆誕！」とか「そもそも忘れてた！」といった悲惨な事故を回避す
る事ができなくなります。
「質問はしたし締め切りも明示した、回答してくれないのが悪い」といつも言いたい所ですが、
お客様も奥様も日常業務に追われる身です、進捗具合に応じた助言やしつこくないけど有効な督促
はかならず行いましょう。

###追加要望どうしよう
さあ、希望は一通り確認できたでしょうか？合意は取れましたか？
追加であれもしたいこれもしたいはお客様でもお子様方でありがちです、無下に「む～り～」
っと却下も満足度を下げてしまいます、出来る範囲で取り入れてあげて、計画に組み入れられ
ないか検討してあげてもいいかもしれません。
システム開発でもこういった感じで、後から追加など要件定義の段階では非常にありがちです、
具体化してくると本当にやるべき事が具体化してくるもので、全体を見ながら取捨選択するこ
とは、お客様にとってもとても大事ではないかと思います。。
![DSC_0037_1 (1).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2248965/66eb9714-b8ea-2b1b-9d54-4e44d63e87db.jpeg)


###レビューもやっとこう
ヒアリングのとりまとめが出来たなど区切りがつくのであれば、一旦概要をレビューしてもらう
のは非常に効果的です。
お客様と開発側のスコープ・フォーカスが一致しているかどうかは出来る限り確認するべきでは
ないでしょうか。システム化の都合・業務の都合のいずれかが極端に優先してしまうと、あまり
いい結果にはならないのではないかと思います。
要件定義の各段階で、分かった事をある程度整理し、ここまではOKと承認頂く事は、大きな手戻
りを避けるためにも特に重要です。


#要求を細分化と分析
そんなわけで、大体こんなキャンプにするよ、っと話をしてしまいましょう。あなたの頭の
中にはキャンプギアのチョイスや、設営プランもおぼろげながら見えてきたはずです。
家族の合意が得られれば、そろそろ具体化していきましょう、キャンプ当日はもうそろそろです。

ここではユーザーの要求がシステム化計画として明確化して整理し、実現が可能かどうか判断
しながらまとめ上げる工程です。
この段階で実現が難しい、もしくは不可能と判明する場合がありますが、その場合はユーザー
と相談して代替案の検討や、そもそもやる/やらないの判断をしなければなりません。
特に予算や工数の問題で難しい事項、調達の問題などについて判断するのは非常に難しい場合
もあります。
まだ基本設計などには着手できていませんし、方式も明確ではありませんので、非常に難しい
所です。方式概要の検討やハードウエアの構成案などは、ある程度検討しながら調査分析を行
いましょう。
設計工程にはまだ至っていませんが、大まかなスケジュールもこの段階で提示しておく必要が
ある事が多いです。

##準備作業を具体化しよう
ではファミリーキャンプ計画では何をするのかというと、やる事は決まっているわけですか
ら、用意しなければならないギアの選定と食材やアクティビティに必要なアイテムの選定です
ね。
これをやると決めたアクティビティに必要なギアは何か？そろっているか？買い足すのか？
実際に車に積める量かも問題ですし、当日調達なら経路に適当なスーパーなどがあるかも調査
しておかなければなりません。

予想外に高いギアが必要だからちょっと無理、なんて事もこの段階で出てくるかもしれません、
調達はamaxxnやyoxxxxshiを駆使して調査しなければなりませんし、キャンプ場の選定と予約
もこの段階でしたい所です（しかし私の住んでいる県では3か月前ではもはや予約が遅いくらい
なので困ったものです）

要求を細分化して具体化しながら、難しい場合は子供達や奥様と相談して計画に変更を検討
しましょう。ここまで準備しておいて、当日に「やっぱ無理」というのはあなたの株を大きく
下げてしまいますのでそれは避けたい所です。


#要件定義書？
いよいよ要件定義の最後の工程です、とはいっても今までの工程は並行して徐々に行う事が一
般的なので、ある程度出来上がっているものもあるはずです。
・システムの概要
・システムを導入する目的
・システム導入後の業務フロー
・ユーザーの要求と必須要件
これくらいを文書化する事は最低限ですが、案件の性格や規模によっては、より具体的な内容
のドキュメントを作成する事もあります。
例えば画面一覧だけではなく、遷移図やレイアウト、帳票の一覧だけではなく各レイアウトまで。
ネットワーク構成やアプリ機能構成図など、ほぼ基本設計となるレベルのものまで作成する場合
もあります。

##システムを作る部分だけではなく
キャンプにはどうしても当てはめにくい（笑）工程です、非機能要件、可用性や性能・運用保守、
移行の方針やセキュリティ要件、webサイトならばパフォーマンス指標やSEOなど、詳細度は案件
によりさまざまですが、なんらかの資料作成は必要になります。
この辺りはかなり会社の方針とユーザーの求める所により大きく異なりますがなんらかのドキュ
メントを作成し、配慮の要不要までは合意を得られるよう作成するのは必須です。

##ファミリーキャンプに当てはめると
・買い物リストは作っておかないとあっという間に当日になっちゃうよ
　結局買い忘れた、とかありがちなんですが当日判明して大騒ぎとかかなりがっかり案件になっ
　てしまいます。
・持っていくものリストくらい作っておこう
　けっこう膨大です、当日積み込む時にチェックするようでは忘れ物必至ですし、必要な数をきちんとチェック
　しておきましょう。ペグ足りない！とかかなり不幸な事になってしまいます。
　簡単でもいいので作っておいた方が幸せになれます。
・大体のタイムスケジュールとお手伝いしてほしい事は共有しておこう。
　いつ、誰に、何を手伝ってほしいのか、前もって説明おいた方が無難です、特にお子様方は
　遊ぶ気満々ですので、ほっとくとすっとんでいって奥様と二人で苦労する羽目になったりし
　ます。人手はあるに越した事ないですもんね。　
・天気は大丈夫？
　雨が降ったら全ての計画はおじゃんというわけにもいきません。天気予報をチェックして、小雨
　ならどうする、大雨ならどうするくらいは決めておいた方が無難だと思います。
　雨ならテントでボードゲームなんてのも結構楽しめるもんですよ。


#まとめ
いかがだったでしょうか
ちょっと無理矢理すぎて自分で読み返しても苦笑いしなきゃいけない感じはありますが、
・ 要求を引き出すスキル。
・ 取捨選択するための広範な知識
この2点に尽きるのではないかと思います。

お客様や家族からリクエストを聞き出して、予算や時間に合わせてベストな計画を作り上げ
るのが要件定義、納得出来る落としどころを作り、技術的チャレンジも盛り込み、メンバー
みんなが楽しんで仕事ができて、お客様に喜んでいただく仕組みの計画を作るという、胃が痛い
けど一番楽しい工程じゃないかと私は思います。

さて、計画は完璧、あとは実装に相当するキャンプ当日です。
どうでしょう、要件定義とキャンプ、やりたくなってきませんか？

![photo_takibi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2248965/2dac62f4-062b-39b4-7cf2-90c74bff1b9e.jpeg)