需求工程與 User Story

是什麼?

需求工程(Requirements Engineering)是「探索、釐清、記錄、排序、驗證」軟體需求的一整套活動。它要回答三個問題:使用者真正的問題是什麼? 我們要做什麼來解決它? 做到什麼程度才算完成?

對資深 C# 開發者來說,這件事的價值在於:寫錯的程式可以重構,但「做錯的需求」會讓你重構了一個根本沒人要的功能。需求的成本最低、影響最大,越早釐清越省錢。

ℹ️需求 vs 規格 vs 設計

**需求(Requirement)**是「使用者要解決的問題」,**規格(Specification)**是「我們承諾交付的行為」,**設計(Design)**是「我們打算怎麼實作」。User Story 屬於需求層,驗收條件介於需求與規格之間,技術架構才是設計。三者不要混為一談。

User Story 怎麼產生(需求來源 + Epic→Feature→Story 拆解)

需求不是 PM 憑空想出來的,而是從多個來源「挖掘」出來的:

收集到的原始需求過於龐大,需要分層拆解,由粗到細:

Epic 大型目標
拆成多個
Feature 功能群
拆成多個
User Story 使用者故事
拆成多個
Task 開發任務

💡粒度判斷

如果一個 Story 一個 Sprint 做不完,它其實是 Feature,要再拆。如果一個 Story 小到無法對使用者交付價值(例如「建一張資料表」),那它是 Task,不該是 Story。

深入:數據指標與利害關係人

用數據反推需求:留存率與漏斗

最誠實的需求來源是真實使用數據,兩個最常用的指標:

💡數據先於直覺

與其在會議室爭論「使用者應該想要什麼」,不如看漏斗哪一段流失最嚴重、哪個世代留存掉最快。數據指出的痛點,比猜測更值得做。

利害關係人(Stakeholders)分析

需求不是只來自使用者。利害關係人是任何「會影響專案、或被專案影響」的角色:出錢的主管、法務/資安、維運團隊、客服、合作廠商、最終使用者。漏掉某個利害關係人,往往等於漏掉一整類需求(例如資安要求「通過滲透測試」、法務要求「符合個資法」),這些常常在上線前才爆出來。

實務上用兩個工具管理他們:

User Story 的標準格式與 INVEST 原則

User Story 的經典格式(Connextra 模板):

身為一個 <角色>,
我想要 <目標>,
以便 <效益>。

As a <role>, I want <goal>, so that <benefit>.

重點在「以便」這一段 —— 它說明為什麼要做,讓團隊能在實作時做出合理取捨,甚至發現「其實有更好的解法」。例如:

身為一個回購客戶,我想要一鍵重新下單上次的訂單,以便省去重複挑選商品的時間

一個好的 User Story 應符合 INVEST 原則:

驗收條件 Acceptance Criteria(Given-When-Then / Gherkin)

驗收條件(Acceptance Criteria, AC)定義「這個 Story 做到什麼程度才算完成」。它是 INVEST 中 Testable 的具體落地,也是 QA、PO、開發三方的共同合約。

業界常用 Given-When-Then 結構(Gherkin 語法),描述「前提 → 動作 → 預期結果」:

gherkin
Feature: 會員登入
 
  Scenario: 使用正確帳號密碼登入成功
    Given 使用者已註冊且帳號為 "alice@example.com"
    When 使用者輸入正確的密碼並點擊登入
    Then 系統導向會員首頁
    And 顯示歡迎訊息 "歡迎回來,Alice"
 
  Scenario: 密碼錯誤三次後鎖定帳號
    Given 使用者連續輸入錯誤密碼 2 次
    When 使用者第 3 次輸入錯誤密碼
    Then 系統鎖定帳號 15 分鐘
    And 顯示提示 "帳號已暫時鎖定"

ℹ️AC 不是只寫快樂路徑

新手只寫「登入成功」,資深工程師會把邊界與失敗情境也寫進 AC:密碼錯誤、帳號鎖定、網路逾時、空值輸入。這些往往才是真正的需求與 Bug 來源。每個 Scenario 對應一條可自動化的 BDD 測試。

AC 該涵蓋哪些場景(檢查表)

「失敗、邊界、權限」只是最低標,不是全部。寫 AC 時拿這張表逐項問「這個 Story 在這類情境下該怎樣?」,不適用的明確標註 N/A,而不是默默略過:

類別要驗證什麼
✅ 快樂路徑 Happy Path一切正常時的成功流程
🔀 替代路徑 Alternate同一目標的其他合法走法
❌ 失敗/錯誤 Failure輸入錯誤、外部服務掛掉、逾時
📏 邊界 Boundary最大/最小值、剛好臨界(0、上限 +1)
🔐 權限 Authorization未登入、角色不足、跨租戶存取他人資料
⬜ 空/初始狀態 Empty沒資料、第一次使用、清單為空
🔁 併發/重複 Concurrency同時操作、重複提交(冪等性 idempotency)
🧮 資料驗證 Validation格式、必填、長度、特殊字元
⚡ 效能約束「在 N 筆資料下 X 秒內完成」
🌐 在地化/無障礙多語系、時區、可存取性(視場景)

⚠️最常被漏掉的三類

新手只寫快樂路徑;進階者會補失敗/邊界/權限;但空狀態、併發重複提交、資料驗證才是實務上最常出包卻最常被略過的 —— 尤其「重複提交」在金流系統是災難級漏洞。

需求規格怎麼寫成文件(PRD / SRS + 功能 vs 非功能需求)

User Story 適合敏捷的迭代溝通,但在較正式或跨團隊的專案中,仍需要書面規格:

需求分兩大類,兩者都要寫清楚:

一份精簡的 PRD/SRS 文件骨架:

markdown
# 文件標題與版本
1. 背景與問題(要解決什麼、為什麼現在做)
2. 目標與成功指標(KPI / 北極星指標)
3. 範圍(In Scope / Out of Scope)
4. 使用者與角色(Persona)
5. 功能需求(以 User Story + 驗收條件條列)
6. 非功能需求(效能 / 安全 / 可用性 / 可維護性)
7. 流程與線框圖(User Flow / Wireframe)
8. 相依與限制(外部系統、法規、技術約束)
9. 風險與未決問題(Open Questions)
10. 里程碑與發布計畫

SRS 完整章節(IEEE 830 / ISO 29148)

一份正式 SRS 的標準骨架如下。敏捷團隊常以「Backlog + User Story + AC」取代,但受規範產業(醫療、金融、政府)仍需完整 SRS:

text
1. 介紹 Introduction
   1.1 目的 Purpose
   1.2 範圍 Scope(做什麼、不做什麼)
   1.3 名詞定義與縮寫 Glossary
   1.4 參考文件 References
2. 整體描述 Overall Description
   2.1 產品背景/願景 Product Perspective
   2.2 產品功能摘要 Product Functions
   2.3 使用者類別與特性 User Classes
   2.4 運行環境 Operating Environment
   2.5 設計與實作限制 Constraints(法規、技術棧、相容性)
   2.6 假設與相依 Assumptions and Dependencies
3. 具體需求 Specific Requirements
   3.1 功能需求 Functional(逐條可追溯編號 FR-001…)
   3.2 外部介面需求 External Interfaces(UI / API / 硬體 / 其他系統)
   3.3 非功能需求 Non-Functional(見下)
   3.4 資料需求 Data Requirements
4. 驗收條件 Acceptance Criteria
5. 附錄 Appendix(線框圖、流程圖)

每條需求的三個鐵則:可追溯(有唯一編號)、可驗證、無歧義

非功能需求:業界標準 ISO/IEC 25010 八大特性

前面列的「效能/安全/可用性/可維護性」只是常見的四個。業界品質標準 ISO/IEC 25010 定義了八大特性,寫 NFR 時可逐項檢視有沒有遺漏:

#特性白話
1功能適切性 Functional Suitability功能對不對、完不完整
2效能效率 Performance Efficiency回應時間、吞吐量、資源使用
3相容性 Compatibility能否與其他系統共存/互通
4易用性 Usability好不好學、好不好用、無障礙
5可靠性 Reliability可用率、容錯、復原能力
6資安 Security機密性、完整性、認證、不可否認
7可維護性 Maintainability好不好改、模組化、可測試性
8可移植性 Portability能否搬到別的環境/平台

另外常見但不在這八項內的還有可擴展性(Scalability)、可觀測性(Observability)、法規遵循(Compliance)

⚠️NFR 一定要可量化

不要寫「系統要快」,要寫「95% 的請求在 200ms 內回應」。不可量化的 NFR 等於沒寫 —— 無法驗收,也無法當架構依據。

KPI 與北極星指標

在需求文件中的用途:把每個 Epic/Feature 連到它要影響的指標,回答「我們為什麼做這個?做了怎麼算成功?」。沒有成功指標的需求,是無法驗證價值、也無法排序的需求。

User Flow 與 Wireframe

把文字需求變成可討論的具體畫面,減少「想的跟做的不一樣」:

優先排序方法論(MoSCoW、User Story Mapping、Job Stories 簡介)

需求永遠多於資源,排序是核心能力:

💡和 DDD 統一語言對齊

撰寫 User Story 與 AC 時,角色、動作、名詞都應使用團隊的 Ubiquitous Language(統一語言)。如果需求文件叫「會員」,程式碼卻叫 UserCustomerAccount 三種,需求與實作就會慢慢失準。好的需求語言就是好的程式碼命名來源。

常見誤區

⚠️需求工程的常見地雷

誤區一:把解法當需求。 「我要一個下拉選單」是解法,「我要快速從 200 個國家中選出我的國家」才是需求。寫死解法會扼殺更好的設計。

誤區二:只寫快樂路徑。 沒有失敗、邊界、權限情境的 AC,等於把 Bug 留到上線後才發現。

誤區三:忽略非功能需求。 功能都對,但回應要 8 秒、無法擴展、密碼明碼存 —— 架構往往因此整個重做。NFR 要在需求階段就講清楚。

誤區四:Story 過大估不出來。 估不出工時通常代表需求沒釐清,硬估只會讓 Sprint 失準。先拆小、先問清楚。

誤區五:需求一寫完就凍結。 需求是活的,應隨回饋持續修訂;但每次變更都要更新 AC 與相關文件,否則文件與系統脫節。

實戰補充(Q&A)

Q:敏捷不是強調「可運作的軟體勝過詳盡的文件」嗎?那還需要寫 PRD/SRS 嗎? A:敏捷反對的是「為文件而文件」,不是反對溝通。小團隊、快速迭代用 User Story + AC 即可;但跨團隊、受法規約束(金融、醫療)、或外包驗收的專案,仍需要正式 SRS 作為合約依據。原則是「文件量要剛好足以讓團隊正確前進」。

Q:User Story 和驗收條件分別由誰寫? A:Story 通常由 PO/PM 主筆,但 AC 最好由 PO、開發、QA「三方共同確認(Three Amigos)」。開發者最懂技術邊界,QA 最懂異常情境,三方一起寫的 AC 漏洞最少。

Q:身為資深開發者,我在需求階段能貢獻什麼? A:三件事 —— 一是挑戰需求的「以便」段,問清楚真正目的,常能找到更省成本的解法;二是補上技術可行性與非功能需求(效能、安全、相容性);三是把過大的 Story 協助拆成 Independent、Estimable 的小塊。

理解測驗

🤔 下列哪一個最符合一個「好的 User Story」格式?

🤔 INVEST 原則中的「N」代表什麼,意義為何?

🤔 關於驗收條件(Acceptance Criteria)的描述,何者正確?

重點整理

💡一句話記住

User Story 講「誰、要什麼、為什麼」,驗收條件講「做到什麼程度算完成」,而 INVEST 與優先排序確保你做的是「正確、可交付、值得先做」的事。

概念核心問題關鍵重點
需求來源需求從哪來訪談、觀察、競品、數據、利害關係人
拆解層級粒度多大Epic → Feature → Story → Task
User Story要做什麼身為〈角色〉,我想要〈目標〉,以便〈效益〉
INVESTStory 夠不夠好獨立、可協商、有價值、可估算、夠小、可測試
驗收條件何時算完成Given-When-Then,涵蓋失敗與邊界
需求文件怎麼記錄PRD/SRS;功能需求 + 非功能需求
優先排序先做哪個MoSCoW、Story Mapping、Job Stories
統一語言用什麼術語與 DDD Ubiquitous Language 對齊

你可能也想看

SDLC 軟體開發生命週期總覽敏捷方法論:Scrum vs Kanban

按 ← → 鍵切換課程