Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

プロジェクト企画と要件定義

いよいよ自分のプロジェクトを始める段階です。ここまで学んできたHono、React、TypeScriptなどの知識を活かして、実際に動くアプリケーションを作っていきましょう。

この章では、何を作るかを決め、必要な機能を整理する方法を学びます。企画段階でしっかり考えておくと、開発がスムーズに進みます。

学習目標

  • 自分が作りたいアプリケーションのテーマを決められる
  • 機能を整理して要件として書き出せる
  • 自分に合った開発アプローチを選べる

プロジェクトテーマを決める

実用ツール系アプリを作ろう

具体的には以下のようなイメージです。

カテゴリ
管理画面タスク管理、共同購入の精算管理、在庫管理、顧客管理
フォーム申請、アンケート、予約システム
データ処理集計、検索

CRUD操作、API設計、バリデーションなど学んだ技術を活かして実用ツールを作ってみましょう。

テーマを見つける3つの視点

1. 自分の困りごとから

日常で「これ、自動化できたらな」「管理が面倒だな」と思うことはありませんか?

例:
- 毎月の経費精算が面倒 → 経費管理アプリ
- 読んだ本を忘れる → 読書記録アプリ
- チームの予定がわかりにくい → スケジュール共有ツール

2. 既存ツールの不満から

普段使っているツールに「この機能があればな」と思うことはありませんか?

例:
- Excelでの管理が限界 → 専用の管理画面
- 複数のサービスを行き来するのが面倒 → 統合ツール
- 入力項目が多すぎる → シンプルなフォーム

3. 学びたい技術から

「この技術を使ってみたい」という動機も立派なテーマになります。

例:
- zodでバリデーションを極めたい → フォーム中心のアプリ
- RPCの型安全を体験したい → API多めの管理画面
- SQLを書きたい → データ検索・集計ツール

テーマ選びのチェックリスト

以下の質問に答えられるか確認してみましょう。

  • 誰が使う?:自分だけ?チーム?一般公開?
  • 何ができる?:一言で説明できる?
  • なぜ作る?:既存のツールではダメな理由は?
  • どこまで作る?:最低限動くために必要な機能は?

要件を整理する

テーマが決まったら、具体的な機能を整理していきます。

機能を書き出す

まずは思いつく機能を全部書き出しましょう。この段階では取捨選択せず、自由に発想します。

# タスク管理アプリの機能アイデア

## 基本機能

- タスクの追加
- タスクの一覧表示
- タスクの編集
- タスクの削除
- タスクの完了/未完了切り替え

## あると便利な機能

- 期限の設定
- 優先度の設定
- カテゴリ分け
- 検索・フィルター
- 並び替え

## 発展的な機能

- 複数ユーザー対応
- タスクの共有
- 通知機能
- 繰り返しタスク
- 統計・レポート

優先順位をつける

書き出した機能に優先度をつけます。ここでは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; // 更新日時
}

Zodスキーマで書くとバリデーションも兼ねられます。

import { z } from "zod";

const TaskSchema = z.object({
  id: z.string().uuid(),
  title: z.string().min(1, "タイトルは必須です").max(100),
  completed: z.boolean().default(false),
  dueDate: z.string().datetime().optional(),
  createdAt: z.string().datetime(),
  updatedAt: z.string().datetime(),
});

// 新規作成時のスキーマ(idや日時は自動生成)
const CreateTaskSchema = TaskSchema.pick({
  title: true,
  dueDate: true,
});

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ライブラリを活用
  • 既存テンプレートやボイラープレートを活用

パターンB: 理解重視アプローチ

  • 自分で一から実装
  • 外部ライブラリを最小限

どちらのアプローチも正解です。大切なのは完成させること。途中で行き詰まったら、アプローチを切り替えても構いません。

効率重視で素早く作る → 動くものを見て理解が深まる
理解重視でじっくり作る → 基礎が身について応用できる

両方のアプローチを組み合わせることも可能です。例えば「UIはライブラリを使うが、バリデーションは自分で書く」など、部分ごとに使い分けるのも良い方法です。

アプリアイデア例

参考として、実用ツール系のアプリアイデアをいくつか紹介します。

初級:タスク管理アプリ

概要: シンプルな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の設計)

## 技術選定

- フレームワーク:HonoX
- バリデーション:Zod
- スタイリング:(選択)
- データベース:(選択)

## 開発アプローチ

(効率重視 / 理解重視 / ハイブリッド)

## 備考

(その他、気になる点や相談したいこと)

作成のコツ

  1. まずは雑でいい:完璧を目指さず、とりあえず書き出す
  2. 人に説明する:他の人に説明してみると、曖昧な点が見えてくる
  3. 変更してOK:作り始めてから変わることも多い。最初の計画に縛られすぎない

ポイント

この章で学んだことをまとめます。

テーマ選び

  • 自分の困りごと、既存ツールの不満、学びたい技術から発想する
  • 「誰が」「何を」「なぜ」「どこまで」を明確にする

要件整理

  • 機能は思いつく限り書き出す
  • MoSCoW法で優先順位をつける(Must → Should → Could → Won’t)
  • 最初はMustだけに集中する
  • 画面、データ構造、APIを整理する

開発アプローチ

  • 効率重視:UIライブラリ活用、テンプレート活用、素早く完成
  • 理解重視:自分で実装、仕組みを深く理解、基礎固め
  • どちらも正解。組み合わせてもOK

大切なこと

  • 完成させることが最優先
  • 小さく始めて、動くものを作る
  • 計画は変わっていい。柔軟に進める

次の章では、要件をもとにサンプルアプリケーションを分析し、実装のイメージを固めていきます。