サンタが使うシステム開発:非機能要件の重要性
クリスマスのサンタクロースの話
クリスマスが近づいてきました。
そうです。サンタクロースの繁忙期です。
サンタクロースは、世界中の子供たちに、最高のプレゼントを配らなければなりません。
しかし現実問題、受け取った子供はごく一部です。
ここで、サンタクロースについて紹介します。
サンタクロースは、世界に120人いると言われており、
平均年齢は1700歳だそうです。
(諸説あり)
超高齢で世界に少数しかいないサンタクロースたちが、「世界中約21億人の子供たちへプレゼントを届けよう!」と無茶な目標を掲げ、動き回るという超絶過酷な1日がクリスマスであります。
ここで、サンタクロースが子供たちにプレゼントを渡すまでの流れを見てみましょう。
サンタクロースは、12月25日以外の日は、クリスマスの準備をしています。(24時間365日 年中無休)
まず、サンタクロース業務システム「MX270」を介して、
子供たちに「今年のクリスマスのプレゼントは何が欲しいですか?」といったアンケートを送ります。
そのアンケート回答結果をもとに、プレゼントリストを作ります。
そして作成されたリストをもとに配達物(プレゼント)と配達先を120人のサンタクロースに振り分けます。
各自、割り振られた配達物(プレゼント)を12月24日までに準備して、12月25日になった瞬間に、GO
するわけです。
※Merry Xmas270、通称MX270は、西暦270年に開発され現在まで運用されているサンタクロース業務システムです。
サンタクロース業務フロー
MX270でアンケート作成 → 世界中へ送付 → アンケートデータを回収そして集計 → プレゼントリスト作成 → 120人のサンタにプレゼントリストを振り分け → それぞれのサンタがプレゼントを準備をする →12月25日にGO!
サンタクロースとエンジニア太郎のアプリ開発物語
~ある日~
👴若手サンタクロース
「リーダー! またMX270で障害が発生しました!これまでにとったアンケートデータも消えてしまった模様です!復旧まで1週間かかります!子供たちのデータが一部流出しました!」
🎅リーダーサンタクロース
「またか。。そろそろ、新しいサンタクロース業務システムを作ってもらったほうがええかもしれんのう。」
👴若手サンタクロース
「そうですねえ。レスポンスも遅いですし、使い勝手もあまり良くないんで、このタイミングで新しいシステムに移行した方がいいかもしれないですね。」
🎅リーダーサンタクロース
「なんとかここまで、持ち堪えてきたが、これから先のことを考えると、ちときついのう」
🎅 👴「。。。」
🎅リーダーサンタクロース
「よし! 新しいサンタクロース業務システムを作ってもらおうかのう!」
👴若手サンタクロース
「そうですね!その方がいいと思います!」
🎅リーダーサンタクロース
「そうと決まれば、準備を始めるぞい!」
👴若手サンタクロース
「はい! やりましょう!」
👴若手サンタクロース
「ちなみに、その新しいサンタクロース業務システムの名前は何にされる予定ですか??」
🎅リーダーサンタクロース
「そうじゃな。クリスマスの由来から考えよう。
我々サンタの祖である聖ニコラウスが貧苦に喘ぐ家庭の窓から金貨を投げ入れたところ、その金貨が暖炉に掛かっておった靴下の中に入ったという話がクリスマスの由来じゃな。
」
👴若手サンタクロース
「そうですね。我々、サンタの中では有名な話です。」
🎅リーダーサンタクロース
「よし、今回開発するアプリの名前は、『GoldenKnit』にしよう。そうと決まれば早速、やっていこう!」
🎅リーダーサンタクロース
「おい! エンジニア太郎を呼んでくれい!」
👴若手サンタクロース
「わかりました!」
~次の日~
🧑💻エンジニア太郎
「お久しぶりです! 今回はどのようなお話で?」
🎅リーダーサンタクロース
「実は、新しいサンタクロース業務システム 『GoldenKnit』を開発してもらいたんじゃが。」
🧑💻エンジニア太郎
「。。。 なるほど。」
🎅リーダーサンタクロース
「というのも、古くに開発されたサービスを今まで使い続けておっての。たまに障害が発生して、復旧に時間がかかったり、年々使いがってが悪くなっててのう。」
🧑💻エンジニア太郎
「ふむふむ。」
🎅リーダーサンタクロース
「まあ要するに、最新の技術を使った高品質なサンタクロース業務システム 『GoldenKnit』をお主に作ってもらいたく、ここに呼んだというわけじゃ。」
🧑💻エンジニア太郎
「承知しました。そいうことであれば、お任せください。」
🎅リーダーサンタクロース
「うむ。よろしく頼む。」
🧑💻エンジニア太郎
「ではちょっとお聞きしたいんですが、今回、開発する『GoldenKnit』には、どのような機能を盛り込む予定ですか?」
🎅リーダーサンタクロース
「機能に関しては、『MX270』にあった機能があれば十分じゃ。業務フローも約1700年前から何も変わっておらん」
🧑💻エンジニア太郎
「ふむふむ。 機能は、『MX270』にあったもので十分と。」
🧑💻エンジニア太郎
「それでは、次に『GoldenKnit』に求める品質に関する6つのことをお聞きしますね。」
🎅リーダーサンタクロース
「品質に関する7つのこと?」
🧑💻エンジニア太郎
「そうです。品質は、拡張性、セキュリティ、信頼性、使用性、効率、保守性、可搬性の7つに分けられます。」
🧑💻エンジニア太郎
「それを、1つずつ順を追って伺いますね。」
拡張性の話
🧑💻エンジニア太郎
「まずは拡張性です。」
🎅リーダーサンタクロース
「拡張性?なんかどのぐらい大きいかみたいなイメージじゃの。」
🧑💻エンジニア太郎
「そうですね。そのイメージに近いことを定義していきます。拡張性は、どれぐらいのユーザー数を想定するか、そして想定したユーザー数で同時に操作をした場合に、どのぐらいのスピードで正確に機能を提供するかといったことを考えていきます。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「例えば、1 時間あたり 5,000 人のユーザーのアクセスをサポートして、操作後の応答時間は5秒以内にしたいよねとか。同時に1000人にデータを送れるようにしたいよねとか、といったようなシステムに求めるラインを拡張性で決めていきます。」
🎅リーダーサンタクロース
「なるほど。わかった。それでいうと、まずは、たくさんの子供達やサンタがこのシステムを使うからのう、多くのユーザーが同時にアンケートを閲覧、作成、回答しても安定して快適に使えるようにして欲しいのう。」
🧑💻エンジニア太郎
「ふむふむ。大体何人ぐらいのユーザー数を想定していますか?」
🎅リーダーサンタクロース
「21億人とちょっとじゃな」
🧑💻エンジニア太郎
「ふむふむ。21億人余りの異なるユーザーが同時に複数の処理をしても、安定して応答ができることを確認する必要あり。」
🎅リーダーサンタクロース
「あとは、遅くとも3秒ぐらいには応答が来るようにしてくれ。」
🧑💻エンジニア太郎
「ふむふむ。応答時間は3秒以内っと。」
🧑💻エンジニア太郎
「なるほど。わかりました。まとめるとこうですね。」
セキュリティの話
🧑💻エンジニア太郎
「次はセキュリティです。」
🎅リーダーサンタクロース
「セキュリティはあれじゃろ? 情報漏洩しないようにとかじゃろ?」
🧑💻エンジニア太郎
「そうですね。セキュリティでは、その情報漏洩を引き起こすサイバー攻撃を防いでいこうということで、具体的にどのような種類のサイバー攻撃を想定するかといったようなことや、その対策を決めていきます。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「今回は、httpsにて通信。SQLインジェクション、OSコマンドインジェクション、クロスサイトスクリプティングなどの攻撃を防ぐ、データベースサーバーのアクセス管理、を定義していきます。」
🧑💻エンジニア太郎
「まとめるとこうですね。」
信頼性の話
🧑💻エンジニア太郎
「次に信頼性についてお伺いします。」
🎅リーダーサンタクロース
「信頼性?先ほどのセキュリティのようなことか?」
🧑💻エンジニア太郎
「いえ、非機能要件定義での信頼性は、 システムが正確かつ安定して動作し、ユーザーが期待通りの結果を得られる程度のことを指します。」
🎅リーダーサンタクロース
「ふむふむ。」
🧑💻エンジニア太郎
「例えば、システムがダウンして利用できなくなることを最小限に抑えられるように設計しようね、とか。
どれぐらいの障害やエラーに耐えられるようにしようね、とか。
障害が発生したときに復旧できるようにしようね、といったようなことを考えていきます。」
🎅リーダーサンタクロース
「なるほど、そうじゃのう。それでいうと、MX270は、サーバーが故障すると全てダメになってしもうたからのう。
今度の『GoldenKnit』は、1つのサーバに集中しないような作りにしておくれ。」
🧑💻エンジニア太郎
「わかりました。複数のデータセンターと、冗長化されたサーバー構成、冗長化されたネットワークインフラが必要と。」
🎅リーダーサンタクロース
「あと、障害が発生しても、データがなくならないようにして欲しいのう。そして障害前の状態に戻して欲しいのう。」
🧑💻エンジニア太郎
「ふむふむ。定期的なデータのバックアップとリカバリが必要と。」
🧑💻エンジニア太郎
「なるほど。わかりました。まとめるとこうですね。」
使用性の話
🧑💻エンジニア太郎
「では、次の使用性について伺います。」
🎅リーダーサンタクロース
「使用性?」
🧑💻エンジニア太郎
「使用性は、ユーザーがシステムをどれだけ簡単に理解し、操作できるかという観点で評価されることです。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「例えば、対象のユーザーを想定した作りにしようね、とか
初心者ユーザーにもわかりやすいユーザーインターフェースと、中級者ユーザーの効率化になるような機能を含めた設計にしようねといったことを考えていきます。」
🎅リーダーサンタクロース
「ふむふむ、それでいうと、わしらは皆、老眼じゃから文字とかボタンを大きめにして欲しいのう。あとは子供達が使うアンケートフォームは楽しいクリスマスデザインにして欲しいのう。」
🧑💻エンジニア太郎
「ふむふむ。ご高齢のサンタクロースでも使いやすいデザイン。子供が使うところは、クリスマス感あふれる楽しいデザインと。」
🎅リーダーサンタクロース
「あと、わしらが使う画面は極力シンプルにして新人サンタでも使えるようなものにしてくれ、加えてベテランサンタ用にショートカットキーが使えるとなお嬉しいな。」
🧑💻エンジニア太郎
「ふむふむ。デザインはシンプルに。ショートカットキーを使えるようにすると。」
🧑💻エンジニア太郎
「なるほど。わかりました。まとめるとこうですね。」
効率の話
🧑💻エンジニア太郎
「次は効率について伺わせてください。」
🎅リーダーサンタクロース
「効率?」
🧑💻エンジニア太郎
「効率は、CPU、メモリ、ネットワーク帯域などのリソースの使用効率を焦点に当てたものになります。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「例えば、システムは運用後大きなくなるから、リソースをスケールできるようにしたいね、といったものになります。」
🎅リーダーサンタクロース
「なるほど、そうじゃな、スケールに関しては、世界で人口が増えてるっちゅうのも考えて、それに合わせてリソースを増やせるようにして欲しいのう。」
🧑💻エンジニア太郎
「ふむふむ。自動スケーリングやリソースのパフォーマンスの監視と最適化を考慮すると。自動スケーリングに関しましては、拡張性にて記載しているので、効率ではパフォーマンスの監視と最適化の記述だけしておきますね。」
🧑💻エンジニア太郎
「まとめるとこうですね。」
保守性の話
🧑💻エンジニア太郎
「次に保守性について伺います。」
🎅リーダーサンタクロース
「保守性?」
🧑💻エンジニア太郎
「保守性は、将来的な変更や修正がどれだけ簡単にできるかといったことを指します。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「例えば、新しい機能の追加や既存の変更があったときに修正範囲が少なくなるような設計にしようね、とか
システムに変更があっても簡単にテストできるような設計にしようねといったことを考えていきます。」
🎅リーダーサンタクロース
「そうじゃなあ、今回、開発する『GoldenKnit』も、長く使っていくと思うし、将来的に機能拡張をお願いするかもしれんことを考えると大事な要件じゃのう。」
🧑💻エンジニア太郎
「そうですね。長く使われるシステムは、私以外の誰かがシステムの改修をする可能性もあります。そうなった時のことを考えて、誰でも開発、改修がしやすいような設計にしようというものです。
こちらはの保守性に関しては、後ほどアーキテクチャ設計でやるので、非機能要件定義では、割愛しますね。」
🎅リーダーサンタクロース
「うむ。」
可搬性の話
🧑💻エンジニア太郎
「次に可搬性について伺います。」
🎅リーダーサンタクロース
「可搬性?」
🧑💻エンジニア太郎
「可搬性は、あるソフトウェアが異なる環境やプラットフォームで容易に移植できる性質のことを指します。」
🎅リーダーサンタクロース
「ふむふむ」
🧑💻エンジニア太郎
「例えば、Windows上で正常に動作するだけでなく、MacやLinux上でも問題なく動作できるように設計しようねといったものになります。」
🎅リーダーサンタクロース
「なるほど、意味はわかったが、今回のサーバーシステムにとっては、重要なことなのか?」
🧑💻エンジニア太郎
「そうですね、サーバーシステムにとっては重要ではないですね。この可搬性が重要になってくるシステムは、パッケージソフトやクライアントアプリケーションなどの多数の環境で実行されるソフトウェアですね。ですので今回は特に定義しなくても十分でしょう。」
🎅リーダーサンタクロース
「うむ。」
非機能要件定義のまとめ
🧑💻エンジニア太郎
「それでは、ここまでのまとめに入りましょう。今回、定義した品質に関する定義事項はこちらで間違いないですか?」
🎅リーダーサンタクロース
「うむ。間違いない。」
🧑💻エンジニア太郎
「わかりました。ではここからは内部設計、開発、テストと進めていきますね。」
🎅リーダーサンタクロース
「よろしく頼む。」
この後も、エンジニア太郎が頑張ってくれたおかげで、無事に「新サンタクロース業務システム『GoldenKnit』開発プロジェクト」は着々と進みます。
🧑💻エンジニア太郎
「開発、テストも無事に完了しました。新サンタクロース業務システム『GoldenKnit』は、機能性や信頼性においても高水準の品質を備えています。」
🎅リーダーサンタクロース
「お主の努力に感謝じゃ。では、早速本番稼働を始めよう。」
🧑💻エンジニア太郎
「了解しました。サーバーの切り替えとデータの移行を行いますので、しばらくお待ちください。」
サーバーの切り替えが完了すると、新サンタクロース業務システム『GoldenKnit』は本番稼働を迎えました。
🎅リーダーサンタクロース
「素晴らしい!これで今年のクリスマスもスムーズに進行できるな。」
🧑💻エンジニア太郎
「お役に立てて光栄です。どうぞ安心してお使いください。」
そして、クリスマスイブの夜が訪れました。新サンタクロース業務システム『GoldenKnit』は、21億人の子供たちへのプレゼントの管理を円滑に進め、サンタクロースたちが笑顔で活動できるよう支えました。
続きのお話 ハッピーエンドver
🎅リーダーサンタクロース
「お主のおかげで、今年は何事もなくクリスマスを終えることができた。感謝じゃ。」
🧑💻エンジニア太郎
「こちらこそ、お力になれて光栄でした。来年もより良いシステムを提供できるように努力します。」
🎅リーダーサンタクロース
「エンジニア太郎、お前は本当に素晴らしい仕事をした。」
🧑💻エンジニア太郎
「ありがとうございます。本当に楽しいプロジェクトでした。」
すると、突然サンタクロースたちの笑い声が広がりました。
🤶メリー夫人
「それにしても、エンジニア太郎、君のプログラムのおかげで、プレゼントの配達がスムーズになりましたね。」
🧑💻エンジニア太郎
「光栄です。でも、笑い声は何か面白いことがあったんですか?」
🎅リーダーサンタクロース
「実はだな、新システムがあまりにも効率的すぎて、サンタクロースたちが暇になっちまったんだ。」
🤶メリー夫人
「そうなのよ。サンタたち、暇つぶしにボーリング大会を開いちゃったの。」
🧑💻エンジニア太郎
「ボーリング大会!?」
🎅リーダーサンタクロース
「そうだ、エルフたちも一緒に参加して、クリスマス後の楽しみを見つけたんだ。」
🤶メリー夫人
「エンジニア太郎、君のシステムのおかげで、サンタたちも新しい趣味を見つけたわ。」
🧑💻エンジニア太郎
「それは良かったですね。みんなが笑顔で過ごせるなら、それが一番です。」
そして、サンタクロースたちは楽しいボーリング大会を開催し、クリスマスの余韻を新しい趣味で満喫しました。エンジニア太郎の手による新サンタクロース業務システム『GoldenKnit』は、クリスマスの喜びを広げつつ、サンタクロースたちに笑顔をもたらしたのでした。
続きのお話 バッドエンドver
クリスマスが終わり、新サンタクロース業務システム『GoldenKnit』の成功を祝ったエンジニア太郎とサンタクロースたちは、プロジェクトの疲れを癒すべく一杯の乾杯を交わしました。
しかし、その夜、エンジニア太郎は深夜に目を覚ましました。何かがおかしい気配を感じているようでした。慌ててコンピュータのモニターを確認すると、『GoldenKnit』の画面には異変が起きていました。
子供たちのプレゼントのリストが消え、代わりに見知らぬおもちゃの名前が並んでいるではありませんか。エンジニア太郎は驚きと恐怖の入り混じった表情でモニターを見つめました。
🧑💻エンジニア太郎
「何が起きているんだ…?」
急いでサンタクロースたちに連絡を取ると、彼らも同じような事態に遭遇していたことが分かりました。子供たちが期待していたプレゼントが何者かによって入れ替えられ、喜びのはずのクリスマスが悲劇に変わっていたのです。
エンジニア太郎とサンタクロースたちは焦りながらも、状況を修正しようと奮闘しました。しかし、その日から『GoldenKnit』は制御不能なバグに悩まされ、サンタクロースたちは混乱の中、子供たちに誤ったプレゼントを届けざるを得なくなりました。
次第に、クリスマスの魔法は失われ、子供たちの心は悲しみに包まれていくのでした。
結局、『GoldenKnit』は正体不明のハッカーによって侵入され、システムが乗っ取られてしまったのです。エンジニア太郎とサンタクロースたちは、善意で創り上げたシステムが悪用され、クリスマスの夜が暗闇に覆われたことを知ることとなった。
物語は、幸せな結末を迎えるはずだったクリスマスが、予期せぬ恐怖に彩られた結末となりました。
終わり
ツッコミどころが多々ある物語を読んでいただき、ありがとうございました。
以上、非機能要件定義の紹介(クリスマスver)でした。
Discussion