跳到主要內容

規格書撰寫 - HOW 怎麼寫?

無標記

結合 Scrum 的 Epic / Feature / Backlog / User Story,搭配 Product Roadmap 與 MVP,以 HRM SaaS 為例說明如何把產品想法轉寫成可被開發的規格。

更新於 2026/06/25

規格範例

以下為目前擬定的規格範例,以目前在進行的 Side Project DutyMate 為例。

正式班表頁面

來源:project-requirement-document.md §7.1 正式班表頁面
參考畫面:正式班表頁面 Prototype

目標

  • 提供用戶查看值日生班表的界面,讓值日生可以清楚知道自己出勤的狀況
  • 可根據用戶篩選值日生班表的功能,讓值日生在查看班表時,只需要專注自己出勤的部分,提升使用體驗
  • *申請換班:提供值日生申請換班的界面,讓值日生可以在有事時,請其他同仁幫忙值日生(不需要經過管理員審核,只要其他該同仁同意即可)
  • 工作任務設定頁面:提供排班負責人設定值日生的工作任務,並以備註形式顯示在班表上,以利各值日生清楚自己要完成的工作內容
小技巧

撰寫訣竅:先回答「為什麼要做這個功能?解決了誰的什麼痛點?」,目標是後續所有規格、卡控、驗收標準的指北針,遇到爭議時都要回頭對齊目標。

MUST 寫

  • 用「動詞 + 對象 + 目的」描述每一條目標,例如「提供 X 讓 Y 可以 Z」
  • 對應到具體角色(誰受益),避免「提升使用體驗」這種無主詞、無對象的空話
  • 標註尚未確認的目標(可用斜體 + * 標記),保留討論彈性

MUST NOT 寫

  • 不寫實作細節(那是「規格」段的事),這裡只談「要達成什麼」
  • 不寫無法被驗證的形容詞(「更好用」、「更直覺」),改用可量化或可觀察的結果
  • 不把「待釐清的問題」混進來,應該移到「待釐清」段以投票形式呈現

使用角色

小技巧

撰寫訣竅:權限是規格書的「政治體制」,誰能看、誰能改、誰能刪一旦寫錯,後面整份規格的卡控、驗收、UI 條件都會跟著錯。建議用 CRUD(或 RCED)矩陣明確列出,避免用「管理者」「使用者」這種模糊詞。

MUST 寫

  • 每個角色都對應到 R/C/E/D 的明確權限組合
  • 角色名稱用站內詞彙連結(例如 排班負責人),維持全文一致
  • 若有「自己 vs 他人」的差異(如只能編輯自己的資料),要特別點出

MUST NOT 寫

  • 不寫尚未定義的角色,未定義就先列在「待釐清」
  • 不用「Admin / User」這種通用詞代替業務角色
  • 不把功能說明混進來(例如「排班負責人可以排班」),那是規格段的責任

規格

  • 日曆介面
    • 提供月視圖,讓用戶可以更靈活地查看和選擇時間段
    • 在日曆天上顯示當天的排班人員名稱,讓值日生可以一目了然地看到自己出勤的狀況和需要完成的工作內容
    • 可以切換月份,讓用戶可以查看過去與未來幾個月的班表
    • 根據活動設定,顯示當天的活動類型與註記,並且限制停班日狀態為 Disabled,無法被排入值日生的班表中
    • 根據活動設定,顯示當天的活動類型與註記,並且開放調整上班日狀態為 Enabled,可以被排入值日生的班表中
    • 根據活動設定,若當天為停班日,但已排入值日生,則將該名值日生標記為無法出勤的狀態
  • 篩選功能
    • 提供篩選值日生的功能,讓值日生在查看班表時,只需要專注自己出勤的部分
  • 編輯功能
    • 排班負責人可以點擊編輯按鈕,讓正式班表進入編輯模式
    • 在編輯模式下,排班負責人設定班表時,無法針對活動類型為停班日的日子進行排班,這些日子在日曆上會顯示為 Disabled 狀態,無法被選取
    • 在編輯模式下,排班負責人設定班表時,可以針對活動類型為調整上班日的日子進行排班,這些日子在日曆上會顯示為 Enabled 狀態,可以被選取
    • 在編輯模式下,排班負責人可以針對正式班表進行調整,直接在日曆上點擊某一天,選擇要排入的值日生,選單需排除當天無法排班的值日生
    • 在編輯模式下,排班負責人可以直接在日曆上點擊某一天,移除已經排入的值日生,以利調整班表的彈性
    • 調整時會聯動人員排班統計功能,讓排班負責人可以實時參考每個值日生的排班次數,避免某些值日生被過度排班或過少排班
  • 人員排班統計功能
  • 保存功能
    • 排班負責人在調整完班表後,點擊保存按鈕,將資料提交到後端進行存儲
    • 保存後的資料能夠正確存儲在系統中並且呈現在當前介面
小技巧

撰寫訣竅:規格是把「目標」轉成可被開發的功能清單。建議「宏觀 → 微觀」兩段式拆解:

  • 宏觀:用心智圖或魚骨圖切出大項(例:正式班表 → 日曆介面、篩選、編輯、統計、保存)
  • 微觀:對每個大項用 5W + 1H 展開細節,並從「功能面」和「資料面」兩個角度各跑一次

MUST 寫 — 功能面 5W1H

  • WHAT:是什麼功能
  • WHO:誰可以用(對齊「使用角色」段的權限)
  • WHERE:在哪個介面 / 頁面下可以使用
  • WHEN:什麼情況下會用到(時間、狀態、前置條件)
  • HOW:怎麼運作,作法要回扣「目標」

MUST 寫 — 資料面 5W1H

  • WHAT:是什麼資料
  • WHO:誰可以讀寫(對齊權限)
  • WHERE:資料從哪來、存到哪
  • WHEN:更新週期、是否需要實時
  • HOW:如何處理、轉換、呈現

MUST 寫 — 資料敏感度:每個欄位都要交代型別細節,否則就是在把決策丟給工程師。

型別必須明確的細節
數字最大 / 最小、可否負值、可否小數、小數位數、進位 / 捨去 / 四捨五入
日期格式、一週從星期幾開始、是否含時間、時間維度(分 / 秒 / 毫秒)、時區
布林是 / 否的語意,預設值
文字長度上下限、允許的字元、free typing 的風險揭露
多媒體支援格式、檔案大小上限、保留期限、冷 / 熱儲存策略
Enum單選 / 多選、可否自訂新項目、預設值

MUST NOT 寫

  • 不寫實作技術(資料表名稱、API path、framework),那是技術設計文件的範疇
  • 不寫沒有對應目標的功能(沒有 WHY 的功能就是 over-engineering)
  • 不寫「之後再決定」的欄位細節(型別、長度、格式),有疑慮移到「待釐清」
  • 不寫無 WHO 的功能(沒指定角色等於所有人都能用,幾乎都是漏洞)

卡控機制

小技巧

撰寫訣竅:卡控是「不能做什麼 / 系統會擋什麼」的明確規則,是工程師寫驗證邏輯與 QA 設計反向測試案例的依據。每條卡控都應該能對映到一條驗收標準。

MUST 寫

  • 用「條件 → 結果」格式描述,例如「同一天已有人 → 無法再選第二位」
  • 列出資料合法性限制(必填、格式、長度、範圍、唯一性)
  • 列出狀態流轉限制(例如已保存的班表不能被刪除)
  • 與「驗收標準」表中的反向情境互相對照,確認每條卡控都有測試覆蓋

MUST NOT 寫

  • 不寫「應該要擋」這種模糊語氣,要寫死「無法選取」「按鈕 Disabled」「跳出錯誤訊息 X」
  • 不把 UI 行為(顏色、動畫)寫進來,那屬於規格 / 設計稿
  • 不重複「規格」段已寫過的功能描述,卡控只列「限制與例外」

邊界情況

  • 日曆介面
    • 當月沒有任何排班資料時,日曆每一格皆顯示為空,但月視圖本身仍正常呈現(不可整頁空白)
    • 跨月顯示:日曆上若顯示上 / 下月的補滿日(灰色日期),這些日子不可被排班、也不計入當月統計
    • 跨年切換:從 12 月切到 1 月、或從 1 月切回 12 月,月份與年份需同步切換
    • 當月所有日子皆為停班日時,整月日曆皆為 Disabled,編輯模式下無任何可點擊的日子
    • 今日 / 過去日 / 未來日的視覺需可區分,且依待釐清 Q1 決定過去日是否可編輯
  • 篩選功能
    • 篩選的值日生在當月完全沒有排班 → 顯示空狀態提示,不可讓畫面變空白無回饋
    • 篩選的值日生已被刪除或停用 → 自動從篩選器中移除,並回退到「全部」
  • 編輯功能
    • 進入編輯模式後尚未儲存就切換月份 / 離開頁面 → 需提示「未儲存變更將遺失」
    • 某一天所有值日生都因排除時段無法被排 → 點擊該日的選單顯示「無可選人員」,而非空白下拉
    • 已排入的值日生後續被加入排除時段 → 標記為無法出勤,但保留原排班紀錄供排班負責人決定是否替換
    • 已排入的日子後續被改為停班日 → 同上,標記為無法出勤,不自動清除
  • 人員排班統計功能
    • 系統中沒有任何值日生時 → 統計區顯示空狀態,而非 0 筆資料的空表格
    • 值日生被刪除但歷史班表仍有其紀錄 → 統計仍需呈現該筆歷史,並標註「已停用」
  • 保存功能
    • 點擊保存時網路中斷 / 後端錯誤 → 保留編輯中的狀態,顯示錯誤訊息與重試按鈕,不可直接丟失變更
    • 兩位排班負責人同時編輯同一個月 → 後保存者需被告知有衝突(依[待釐清]決定覆寫策略 or 拒絕)
    • 連點保存按鈕 → 需防呆(按鈕 Disabled 或 debounce),避免重複送出
小技巧

撰寫訣竅:邊界情況是「合法但極端」的場景——資料量爆量、時區、跨月跨年、空集合、最大/最小值、並發操作、網路中斷後重試。和「卡控」的差別是:卡控擋掉非法行為,邊界情況處理合法但容易被忽略的極端狀況。

MUST 寫

  • 空狀態(沒有任何值日生、班表為空時頁面長什麼樣)
  • 極值(一個月排 30 天都同一人、單人排班次數為 0)
  • 時間相關(跨月、跨年、夏令時間、不同時區、月底 31 號)
  • 並發(兩個排班負責人同時編輯時誰先寫入)
  • 資料載入失敗 / 網路中斷時的 fallback

MUST NOT 寫

  • 不寫「應該要處理一下」這種沒有結論的記錄,要寫死預期行為
  • 不把「卡控」的內容(非法輸入)重複寫進來
  • 不把實作層細節(DB transaction、lock 機制)寫進來,邊界情況只談「使用者看到什麼結果」

驗收標準

ScenarioGivenWhenThen
成功調整正式班表排班負責人產生了正式班表排班負責人調整正式班表,將特定日期指派的值日生更換為其他人成功調整正式班表,並且在調整的同時,能夠同步每個值日生的實際排班次數
無法調整活動類型為停班日的日子排班負責人產生了正式班表排班負責人嘗試在活動類型為停班日的日子進行排班活動類型為停班日的日子無法被選取,並且顯示為 Disabled 狀態
允許調整活動類型為調整上班日的日子排班負責人產生了正式班表排班負責人嘗試在活動類型為調整上班日的日子進行排班活動類型為調整上班日的日子可以被選取,並且顯示為 Enabled 狀態
排班時無法選擇排除時段的值日生排班負責人產生了正式班表排班負責人嘗試選擇排除時段的值日生排除時段的值日生不會顯示在可選列表中
無法同一天排兩位值日生排班負責人產生了正式班表排班負責人嘗試在同一天排入兩位值日生同一天只能排一位值日生,無法選取第二位值日生
成功儲存正式班表排班負責人調整完正式班表後點擊保存按鈕成功保存調整後的正式班表,這些資料能夠正確存儲在系統中並且呈現在當前介面
小技巧

撰寫訣竅:驗收標準用 Given / When / Then(BDD)格式,是 PM、工程師、QA 三方對「做完了沒」的共同契約。每一條「目標」、「規格」、「卡控」、「邊界情況」理論上都應該至少有一條對應的 Scenario。

MUST 寫

  • 正向情境(happy path):使用者照預期操作能達成目標
  • 反向情境(卡控觸發):使用者違反規則時系統的回應
  • 邊界情境:極值、空狀態、跨期等的預期結果
  • 每個 Scenario 都用「使用者語言」寫,不寫 SQL、API、code

MUST NOT 寫

  • Given/When/Then 不要寫實作(不要寫「呼叫 POST /api/schedule」),改寫「點擊保存按鈕」
  • 不寫沒有 Then 的 Scenario(沒有預期結果就無法驗收)
  • 不寫一個 Scenario 包含多個 When(一條只驗一件事,多步驟拆成多條)
  • 不在 Then 中寫「應該要正常運作」這種不可驗證的描述

待釐清

Q1. 能不能修改今日以前的時間?

  • 可以
  • 不可以
  • 其他(請說明)

Q2. 正式班表頁面:正式班表檢視中的篩選值日生功能,只能篩選單個人員,還是可以多選人員進行篩選?

  • 單選
  • 複選
  • 其他(請說明)
讀完這篇了嗎?
建立於 2026/06/24 規格書撰寫-how-怎麼寫.mdx