プロジェクト企画と要件定義
素人のように考え、玄人として実行する
金出武雄
「正しい設計」「ベストプラクティス」「効率的な方法」——そんな言葉に縛られていませんか? タイパとか生産性とか、正直うんざり。効率ばかり追い求めて、作る楽しさを忘れていませんか?
この章では、あなただけのローカルでパーソナルな「小さなWeb」を子供の頃のように自由に作って遊ぶことを目指してもらいます。
アイディアソン: 自分だけのWebを考える
ステップ1: まずは自由に発想する(10分)
紙でもメモアプリでも何でもいいので、思いついたアイデアを書き出してみましょう。この段階では正しさや実現可能性は気にしません。子供の頃のように自由に考えてください。
以下の3つの視点が助けになるかもしれません。
視点1: 自分の困りごとから
日常で「これ、自動化できたらな」「もっと楽にならないかな」と思うことはありませんか?
例:
- 毎月の経費精算が面倒 → 経費管理アプリ
- 読んだ本を忘れる → 読書記録アプリ
- どこに何をしまったか忘れる → 収納場所メモアプリ
- 友達との旅行の割り勘計算 → 精算管理アプリ
視点2: 既存ツールの不満から
普段使っているツールやサービスに「もっとこうだったらいいのに」と思うことはありませんか?
例:
- Excelでの管理が限界 → 専用の管理画面
- メモアプリが複雑すぎる → シンプルなメモ帳
- 入力項目が多すぎる → 最小限のフォーム
- アプリを行き来するのが面倒 → 統合ツール
視点3: 遊び心から
実用性よりも「作ったら面白そう」「誰かを笑顔にできそう」という動機も大歓迎です。
例:
- 今日の気分で色が変わる日記
- ランダムで今日の運勢を占うアプリ
- 家族だけの写真共有アルバム
- ペットの体重記録グラフ
とにかく自由に、たくさん書き出してみましょう。
ステップ2: 受講者同士で共有する(15分)
自分のアイデアを他の人に話してみましょう。3〜4人のグループになって、順番に発表します。
話すこと:
- どんなアプリを作りたいか(1〜2分)
- なぜそれを作りたいと思ったか
聞く側の役割:
- 「それ面白いね!」「便利そう!」と感じたら絵文字でリアクション
- 「こういう機能もあったら嬉しいかも」と提案
- 批判や否定はしない(この段階では自由な発想が大事)
他の人の話を聞いて、「あ、それいいな」と思ったら、自分のアイデアを変えたり混ぜたりしてもOKです。
ステップ3: アイデアを1つに絞る(5分)
いくつかアイデアが出たら、今回作るものを1つに絞りましょう。
以下の質問に答えられるか確認してみてください。
- 誰が使う?: 自分だけ?友達と?一般公開?
- 何ができる?: 一言で説明できる?
- なぜ作る?: 自分がワクワクする理由は?
- どこまで作る?: 最低限動くために必要な機能は何?
迷ったら、一番ワクワクするものを選んでください。技術的に難しそうでも、気にしなくて大丈夫。作りながら学べます。
要件を整理する
テーマが決まったら、具体的な機能を整理していきます。
機能を書き出す
まずは思いつく機能を全部書き出しましょう。この段階では取捨選択せず、自由に発想します。
# タスク管理アプリの機能アイデア
## 基本機能
- タスクの追加
- タスクの一覧表示
- タスクの編集
- タスクの削除
- タスクの完了/未完了切り替え
## あると便利な機能
- 期限の設定
- 優先度の設定
- カテゴリ分け
- 検索・フィルター
- 並び替え
## 発展的な機能
- 複数ユーザー対応
- タスクの共有
- 通知機能
- 繰り返しタスク
- 統計・レポート
優先順位をつける
書き出した機能に優先度をつけます。ここではMoSCoW分析での優先度付けの例を紹介します。
| 分類 | 意味 | 例(タスク管理) |
|---|---|---|
| Must | 必須。これがないと成り立たない | 追加、一覧、完了切替 |
| Should | 重要。できれば実装したい | 編集、削除、期限設定 |
| Could | あると嬉しい。時間があれば | 検索、カテゴリ分け |
| Won’t | 今回は見送り | 複数ユーザー、通知 |
優先度の分析ができたら最初はMustだけに集中しましょう。動くものができてから機能を追加する方が、確実に前に進めます。
画面を洗い出す
機能が決まったら、必要な画面を整理します。
# タスク管理アプリの画面構成
1. タスク一覧画面(メイン)
- タスクの一覧表示
- 完了/未完了の切り替え
- 新規追加ボタン
2. タスク追加画面(またはモーダル)
- タイトル入力
- 期限入力(任意)
- 保存ボタン
3. タスク編集画面
- 既存データの編集
- 削除ボタン
シンプルに始めましょう。画面数は少ない方が開発しやすいです。
データ構造を考える
どんなデータを扱うか整理します。これがデータベース設計の基礎になります。
// タスクのデータ構造
interface Task {
id: string; // 一意のID
title: string; // タスク名(必須)
completed: boolean; // 完了状態
dueDate?: string; // 期限(任意)
createdAt: string; // 作成日時
updatedAt: string; // 更新日時
}
TypeScriptの型定義で表現すると、どんなフィールドが必要か、どれが必須でどれが任意かが明確になります。
APIエンドポイントを設計する
REST APIの設計も要件の一部です。Honoで実装することを想定して設計しましょう。
GET /api/tasks # タスク一覧取得
POST /api/tasks # タスク作成
GET /api/tasks/:id # タスク詳細取得
PUT /api/tasks/:id # タスク更新
DELETE /api/tasks/:id # タスク削除
PATCH /api/tasks/:id/toggle # 完了状態の切り替え
開発アプローチを選ぶ
同じ機能でも、作り方には選択肢があります。自分の学習スタイルに合ったアプローチを選びましょう。
パターンA: 効率重視アプローチ
特徴:
- UIライブラリを活用(shadcn/ui、Chakra UIなど)
- 既存テンプレートやボイラープレートを活用
- 素早く形にして、動くものを見ながら学ぶ
向いている人:
- とにかく完成させたい
- 動くものを見てモチベーションが上がる
- 後から仕組みを理解したい
パターンB: 理解重視アプローチ
特徴:
- 自分で一から実装
- 外部ライブラリを最小限に抑える
- じっくり仕組みを理解しながら進む
向いている人:
- 基礎をしっかり固めたい
- なぜそう動くのか理解したい
- 応用力をつけたい
どちらのアプローチも正解です。大切なのは完成させること。途中で行き詰まったら、アプローチを切り替えても構いません。
効率重視で素早く作る → 動くものを見て理解が深まる
理解重視でじっくり作る → 基礎が身について応用できる
両方のアプローチを組み合わせることも可能です。例えば「UIはライブラリを使うが、APIロジックは自分で書く」など、部分ごとに使い分けるのも良い方法です。
アプリアイデア例
参考として、いくつかのアプリアイデアを紹介します。
初級:タスク管理アプリ
概要: シンプルなToDoリスト
対象: 自分用
機能(Must):
- タスクの追加・削除
- 完了/未完了の切り替え
- 一覧表示
学べること:
- CRUD操作の基本
- 状態管理
- フォームの扱い
初級:メモアプリ
概要: Markdownで書けるシンプルなメモ帳
対象: 自分用
機能(Must):
- メモの作成・編集・削除
- メモ一覧表示
- 検索機能
学べること:
- テキストエリアの扱い
- 検索・フィルター処理
- ローカルストレージ or データベース
中級:経費管理アプリ
概要: 経費の入力と月次集計
対象: 自分またはチーム用
機能(Must):
- 経費の登録(日付、金額、カテゴリ、メモ)
- 月別一覧表示
- カテゴリ別集計
機能(Should):
- CSV出力
- カテゴリの追加・編集
- レシート画像の添付
学べること:
- 日付の扱い
- 集計処理
- ファイルのアップロード
中級:在庫管理アプリ
概要: 備品や商品の在庫を管理
対象: 小規模チーム用
機能(Must):
- 商品の登録・編集・削除
- 在庫数の増減
- 在庫一覧表示
機能(Should):
- 在庫アラート(残り少ない商品を強調)
- 入出庫履歴
- バーコード読み取り
学べること:
- 数値の増減処理
- 履歴管理
- 条件付き表示
中級:予約管理システム
概要: 会議室や設備の予約を管理
対象: チーム用
機能(Must):
- 予約の作成・編集・削除
- カレンダー形式での表示
- 重複チェック
機能(Should):
- 繰り返し予約
- メール通知
- 承認フロー
学べること:
- 日時のバリデーション
- 重複チェックのロジック
- カレンダーUIの扱い
上級:申請ワークフロー
概要: 申請 → 承認 → 完了 のフローを管理
対象: 組織用
機能(Must):
- 申請フォーム
- 承認者への通知
- ステータス管理(申請中、承認済み、却下)
機能(Should):
- 複数段階の承認
- コメント機能
- 申請履歴
学べること:
- ワークフローの状態管理
- 権限管理
- メール送信
やってみよう!
以下のテンプレートを使って、自分のプロジェクトの要件を整理してみましょう。
要件定義テンプレート
# プロジェクト名
## 概要
(一言で何ができるアプリか)
## 背景・目的
(なぜ作るのか、どんな課題を解決するのか)
## 対象ユーザー
(誰が使うのか)
## 機能一覧
### Must(必須)
- [ ] 機能A
- [ ] 機能B
- [ ] 機能C
### Should(重要)
- [ ] 機能D
- [ ] 機能E
### Could(あれば嬉しい)
- [ ] 機能F
- [ ] 機能G
### Won't(今回は見送り)
- 機能H
- 機能I
## 画面構成
1. 画面名:概要
2. 画面名:概要
3. 画面名:概要
## データ構造
(主要なデータの型定義)
## APIエンドポイント
(REST APIの設計)
## 技術選定
- フレームワーク:Hono + React
- スタイリング:(選択)
- データベース:(選択)
## 開発アプローチ
(効率重視 / 理解重視 / ハイブリッド)
## 備考
(その他、気になる点や相談したいこと)
ポイント
- 間違えよう: 完璧を目指さず、とりあえず書いてみる、修正は後回し
- プランB歓迎: 作り始めてから変わることも多い。最初の計画に縛られすぎない
- 自分の言葉で説明してみよう: 他の人に説明してみると理解が深まる