需求定義聽起來可能很難,但本質其實非常單純。
「滿足讓委託方覺得『這樣就 OK』的條件」
在開始實作之前,讓開發團隊與委託方共享「同一個願景」的過程,就是需求定義。
如果在沒有需求定義的情況下就開始實作,會發生以下情況:
如果需求定義做得好:
在抵達「委託方覺得 OK 的規格」之前,總會遇到以下限制。
制約說明例實作者的技能團隊內的技術能力無法實現的需求「使用 AI 的自動分類功能」→ 沒有機器學習專家現代技術現有技術無法對應的新需求「即時 10 萬人同時連線」→ 沒有成熟解法期間無法在排程內完成的需求「3 個月內實作 100 個功能」→ 物理上不可能預算在預算內無法實作的需求「在雲端實現高可用性」→ 基礎架構費用龐大人力無法確保所需資源的需求「iOS 與 Android 版並行開發」→ 人力不足
重要觀念
不存在完美無缺的需求。理解限制之後,判斷要優先什麼才是重點。
需求定義不是一次就完成,而是反覆來回很多次的過程。
需求(C) → 要求(C) → 檢討(M) → 提案(M) → 檢討(C)
↑ ↓
←─────── 重複這個迴圈 ←────
C = Client(委託方)
M = Me(實作團隊)
這個循環本身就是需求定義。 不是一次就能做出完美規格書,而是透過多次來回逐步整理成形。
❌ 壞例子(沒有來回)
委託方:「我想要好用的 UI」
開發團隊:「了解,那我們就開始實作」
↓
實作完成後...
委託方:「這不是我要的!跟想像不一樣」
✅ 好例子(有來回)
委託方:「我想要好用的 UI」
開發團隊:「具體來說,您希望是什麼樣的操作方式?」
委託方:「希望就算是新手也能直覺操作,並且在 3 分鐘內了解基本功能」
開發團隊:「那我們提案將畫面縮減為 3 個選單,請您確認」
委託方:「這個版面還需要再調整一下」
開發團隊:「了解,那麼這樣改如何呢」
↓
最後做出雙方都滿意的規格
所有需求都可歸類為以下其中之一。
「使用者會看到什麼,以及怎麼操作」
具體例子
商品列表畫面要配置以下元件:
- 搜尋表單(上方)
- 商品清單(中央)
- 分頁器(下方)
「使用者操作時,系統要做什麼」
具體例子
對於「點擊商品搜尋按鈕」這個操作,
系統提供「用輸入的關鍵字搜尋資料庫,
並回傳符合條件的商品」這個功能
「系統要保存什麼,以及如何管理」
具體例子
商品資訊資料表:商品 ID、商品名稱、價格、庫存數量
庫存鎖定:下單時暫時鎖定庫存
在實作前,為了統一團隊內的理解,依序整理以下 6 件事。
目的:「要實現什麼」要先明確化
委託方:「希望新增功能」
↓
開發團隊:「那麼,這會實現什麼成果呢?」
檢查清單
具體例子
❌ 不好的企劃案
「做一套新的庫存管理系統」
✅ 好的企劃案
「讓店員在每天早會時,能在 5 分鐘內確認庫存不足狀況,
進而減少下單失誤,並將每月銷售損失降低 3%」
目的:共享大方向的理解
簡單畫成圖來看。
外部系統 A
↓(資料串接)
[我們的系統] ← 使用者操作
↓(結果通知)
外部系統 B
開發所需資訊
目的:劃清「要做什麼」與「不做什麼」
如果這點不明確,後面就會一直出現「不然再加這個吧……」,最後導致時程超過。
要決定的項目
具體例子
【線上商店系統】
◎ 第一階段實作:
- 商品搜尋與顯示
- 購物車功能
- 訂單處理
△ 第二階段評估:
- 評論功能
- 願望清單
- 點數系統
✗ 不實作:
- 庫存自動補貨(以人工處理)
- SNS 串接(初期不需要)
目的:確認技術上是否可行
依團隊內的技術程度來選擇很重要。太先進的技術,如果沒有人會做,就會變成負債。
要決定的項目
系統架構
各部分的實作技術
具體例子
❌ 危險的選擇
「因為想用最新技術棧,所以用 Rust + GraphQL + Kubernetes 來做」
→ 如果團隊裡沒有人有經驗,開發效率會下降,最後變成負債
✅ 適當的選擇
「因為團隊內很多人有 React 與 Node.js 經驗,所以採用這個技術棧」
目的:從「看得見的想做事項」中,抽出「真正應該實現的內容」
委託方的「需求」與「本質需求」有時不一樣。
流程
具體例子
需求:「想要從範本一鍵大量建立」
↓ 為什麼需要?
本質:「節省手動作業時間」「降低人為錯誤」
結論:
不只是單純的「大量建立功能」
→ 真正目的其實是「提升效率」與「確保品質」
→ 也可能用其他方法達成
例如:
- 自動輸入功能(不使用範本功能)
- 顯示檢查清單(避免錯誤)
等,也都可以列為候選方案
目的:想像系統實際會怎麼被使用
具體寫出「什麼時候、誰、要做什麼」。
情境中要包含的要素
要素說明例時機什麼時候使用每天早上 8:30、每月初等理由為什麼使用銷售記錄、庫存確認等具體工作要達成什麼「決定明天的備料數量」情境範例
【早會時的庫存確認】
時間:每天早上 8:30
使用者:店鋪經理
流程:
1. 登入系統
2. 確認前一天的銷售
3. 確認庫存不足的商品
4. 通知總部追加下單
應實現的功能:
- 登入功能
- 銷售顯示(含篩選功能)
- 庫存警示(將不足項目醒目顯示)
- 訂單範本(郵件草稿功能)
透過準備多個情境,可以找出原本沒注意到的需求。
概念確立後,就把使用者介面具體化。
先大致決定各畫面要顯示的主要元件。
【商品列表畫面】
- 搜尋表單
- 商品清單
- 分頁器
- 詳細資訊按鈕
用圖示表示「使用者會怎麼切換畫面」。
登入畫面
↓
選單畫面
├→ 商品列表 → 商品詳細 → 購買畫面 → 完成畫面
├→ 訂單歷史 → 訂單詳細
└→ 設定畫面
針對各元件明確寫出「這是什麼」與「會顯示什麼」。
要素說明輸入/顯示補充搜尋表單用關鍵字搜尋商品輸入可用多個關鍵字 AND 搜尋商品清單顯示符合條件的商品顯示每 10 筆分頁器詳細按鈕前往所選商品的詳細頁動作點擊後進入詳細畫面---
UI 整理完成後,再將各功能具體化。
分析「從哪個畫面到哪個畫面」,抽出必要功能。
例如:如果有「商品列表 → 詳細 → 購買」這種流程
需要的功能:
- 商品搜尋功能
- 商品取得功能
- 購買處理功能
畫面要顯示什麼,就決定功能應該輸出什麼。
【商品詳細畫面顯示的資訊】
↓
輸出:商品 ID、商品名稱、說明、價格、庫存狀態、評論
使用者在前一個畫面輸入的內容,就是這個功能的輸入。
【搜尋表單中使用者輸入】
輸入:關鍵字、分類篩選、排序方式
【接收這些內容的功能被決定】
功能:商品搜尋(根據關鍵字、分類篩選、排序方式回傳結果)
複雜的處理,透過樹狀結構整理後,實作會更明確。
【訂單處理】
├─ 訂單資訊輸入
│ ├─ 選擇送貨地址
│ └─ 選擇付款方式
├─ 保留庫存
│ ├─ 確認庫存
│ ├─ 扣減庫存數量
│ └─ 保留鎖定
└─ 付款處理
├─ 傳送至付款閘道
├─ 確認結果
└─ 發生錯誤時回復
這個樹狀圖可以直接用於實作時的模組切分。
大型功能要拆成數個小功能。
【大型功能】
「訂單處理」
【拆分後的功能】
① 訂單資訊驗證
② 確認庫存
③ 執行付款
④ 記錄訂單
⑤ 寄送完成通知信
拆分的優點:
功能整理完成後,再詳細設計資料結構。
把企劃、UI、功能各階段出現的「資料」全部彙整。
從 UI 得到的資訊:商品名稱、價格、庫存數量
從功能得到的資訊:商品 ID、說明、評論、庫存鎖定
從情境得到的資訊:銷售日期時間、銷售數量
設計有效率的資料表。這個階段不需要完整正規化,實作時再最佳化即可。
【products 資料表】
- product_id(主鍵)
- product_name
- description
- unit_price
【inventory 資料表】
- inventory_id(主鍵)
- product_id(參照 products 資料表)
- stock_quantity
- updated_at
【sales 資料表】
- sales_id(主鍵)
- product_id(參照 products 資料表)
- quantity_sold
- sales_date
以下介紹在進行需求定義時很常犯的錯誤。
❌ 壞例子
「要用 AWS RDS 實作 PostgreSQL 資料庫」
✅ 好例子
「需要一個可支援多使用者同時存取的
可擴充資料庫」
重點
在需求定義階段,要聚焦在「要什麼」。至於「怎麼做」,留到實作階段決定。
❌ 壞例子
「需要好用的 UI」
「動作要快」
「操作要簡單」
✅ 好例子
「從搜尋到顯示結果需在 3 秒內完成」
「新手可在 3 分鐘內完成基本操作」
「100 筆資料可在 1 秒內載入」
重點
❌ 壞例子
「在庫存資料表中新增庫存數量欄位」
✅ 好例子
「店員能在早上的短時間內
快速確認庫存不足的商品」
重點
請確認需求定義是否足夠,以下項目都檢查過了嗎。
需求定義結束、準備進入開發前,請做以下最終確認。
委託方與開發團隊是否擁有相同願景
是否確認過沒有認知落差?
要做什麼、不做什麼,界線是否不模糊
階段切分是否清楚?
技術上的課題是否都已列出
預算上的課題是否都已列出
時間上的課題是否都已列出
在有限制的情況下,優先要做什麼是否已決定
第一階段的最小功能是否已決定
如果以上都確認完成,就表示已經準備好進入開發階段。
需求定義就是「滿足讓委託方點頭的條件」
認知限制是必要的
要不斷來回反覆
從 UI、功能、資料三個觀點檢討
別忘了使用者視角
這一週(Day 1-2)
下週(Day 3-5)
第二週(Day 6-10)
第三週以後
以上就是給開發成員初學者的需求定義指南。
需求定義不是「做出完美的規格書」,而是「建立團隊所有人朝向同一目標前進的狀態」,這才是最重要的。
透過委託方與開發團隊的對話,需求才會真正被磨練成形。不要害怕提問、確認,然後一起往前進。
株式会社xincere 正在招募沒有實務經驗的工程師與學生工程師實習生,並與他們一起工作。
※ 關於シンシア的工作樣貌,請見這裡
在シンシア,每年大約會有 100 位沒有實務經驗的人申請並接受技術面試。
透過這些經驗,這裡會介紹希望實務未經驗者一定要具備的技術能力(語法)。