この記事のアイキャッチ画像は、vilius.kukanauskasさんが作成されたもので、pixabayで配布されています。とてもこの画像好きです。
背景
練習用Webアプリの作成で、システム設計を行っています。「そもそもシステム設計ってどうやってやるのか」から始まったのですが、ネットで調べたところよくわかりませんでした。いくつかのページを読んで思ったことは、今の自分の知識とページに記載されている情報量のギャップです。
例えば、僕はインフラ側のことが全くわからないのですが、そんな僕がインフラ側の要件を考えろ、と言われても手も足もでません。そういった箇所が多くあり、途方に暮れてしまいました。
しかし、途方に暮れていてもしょうがないので、ひとまずわかる範囲で作り、あとから書き足していくことにしました。そこで、今回は基本設計について、自分の理解の範囲でまとめようと思います。
調査結果
参考文献は以下になります。
- geeksforgeeks, “What is the goal of High-Level Design(HLD)?“
- geeksforgeeks, “Vending Machine: High Level System Design“
基本設計の目的
基本設計の目的は、システムの構造、要素、やりとりの詳細な概要を示し、プロジェクトの詳細なデザインや実装フェーズの方向性を設定することです。
参考文献1では、上記のように定義し、さらに以下の7個の項目に分けて定義しています。
- システムの把握
- 要素の識別
- インターフェースの設計
- 技術の選択
- 拡張性とパフォーマンス
- リスク緩和
- 要件の調整
それぞれの説明を以下に示します。但し、内容は参考文献1の引用です。
システムの把握
基本設計の最も重要な目的は、開発者、設計者、システムマネージャーを含んだstakeholderがシステム全体のArchitectureと設計を明白にすることです。
要素の識別
基本設計は、システムの主要な要素・モジュールの識別とその役割 及び 責務の識別を目標とします。それによって、システムを扱いやすいいくつかの部品へと整理することができ、設計や実装、メンテナンスを簡単にすることができます。
インターフェースの仕様書
基本設計では、システムの様々な要素間のインターフェースを定義します。これは、要素間でのデータのやり取りを明らかにすることを含み、その際に用いるプロトコルといった、いかなる要件も含みます。
技術の選択
基本設計では、システムを実装するために用いる技術やフレームワーク、そしてツールの概略を示します。これは、プログラミング言語やデータベース、ミドルウェア、そして、その他のソフトウェアやハードウェアの要素を含みます。
拡張性と性能
基本設計では、システムの拡張性や性能要件を示します。これは、潜在的なボトルネックや性能の課題、そして、それらの課題に対処するための戦略の概要を示します。(例, キャッシュやロードバランス、データベースの最適化)
リスク緩和
基本設計は、設計における潜在的なリスクや課題、システムの実装を識別します。これは、技術やリソース、スケジュール、そしてその他の要因のリスクを含みます。基本設計では、それらのリスクの緩和策を示します。(例, 証明された技術、テストの実施、臨時の対策)
要件との整合性
最後に、基本設計では、要件やプロジェクトの目的とシステムの整合性を確実にします。ここでは、機能・非機能要件を設計が満たしているかを確実にします。(例, 使いやすさ、セキュリティ、コンプライアンス)
成果物
練習用Webアプリの作成で作成した基本設計の初版です。ファイルが見やすい方はダウンロードからご確認ください。
システム要件
- 1. カレンダーを用いて予定(例, 試合日程)を共有することができる。
- 2. チーム内での連絡を行うことができる
-
連絡形式は、掲示板を想像しており、書き込みに対して自由にコメントすることができ、それを他のユーザーが閲覧することができる。さらに、画面を更新する手間を省くため、コメントはリアルタイムで更新されるものとする
- 3. アプリを使用するユーザーを管理することができる
使用する言語・フレームワーク
- C# 10
- .NET 6.0
- ASPNetCore.MVC 6.0
システムの構成
本システムのデザインパターンはModel – View – Controller パターン(以降、MVCパターン)を採用する(下図)。
/

- スケジュール
- 1カ月の予定をカレンダー形式で表示する
- 1日の予定を24時間形式で表示する
- 予定
- 予定を作成する
- 予定を表示する
- 予定を編集する
- 予定を削除する
- 掲示板
以下の機能を、ユーザーの種類がコーチのユーザーにのみ、行えるようにする。- 掲示板を作成する
- 掲示板を表示する
- 掲示板を編集する
- 掲示板を削除する
- 書き込み
- 掲示板を指定して書き込みを作成する
- 書き込みを表示する
- 書き込みを編集する
- 書きこみを削除する
- コメント
- 書き込みを指定してコメントを作成する
- コメントを表示する
- コメントを編集する
- コメントを削除する
- ユーザー
- ユーザー権限を指定してユーザーを作成する
- ユーザーを表示する
- ユーザーを編集する
- ユーザーを削除する
また、コメントの送信方法については、リアルタイムで更新する機能を実装するため、ASP.NETを利用する開発者に向けたパッケージ、signalRを利用する。signalRでは、通信規約にWebSocketを使用し、Client – Server間のメソッドの呼び出しにパイプライン (Hub) を利用する。また、送信先のユーザーの指定には、いくつか方法があるが、Claimを用いる方法を採用する。
画面フロー

まとめ
基本設計とは、詳細設計前に、方向性を定めるためのものです。そのため、基本設計には、用いる言語やフレームワーク、デザインパターン、関係する要素(パッケージ ~ オブジェクト)を示す必要があります。
僕のインフラ側の知識が不足しているため、そのあたりの記述は今回ありませんが、本来は必要になります。
用語
stakeholder
仕事や組織、プロジェクトの活動と意思決定において、私利的に関与する個人や組織のこと
TechTarget, “What is a stakeholder?“
コメント