結論先講

工時估算不是算命,是風險管理。你不需要估得準(也不可能),你需要的是:(1) 讓團隊對工作量有共識 (2) 讓利害關係人知道不確定性有多大 (3) 用歷史數據不斷校準。別再跟 PM 說「大概兩天」然後做了兩週——這篇教你怎麼估得合理、溝通得體面。


為什麼我們永遠低估

1. 樂觀偏誤(Optimism Bias)

人類天生樂觀。當你聽到「做一個登入功能」,你腦中想的是最順利的路徑:寫個表單、打個 API、存個 token,完成。

你沒想到的:

  • OAuth 整合要先申請 API key,等審核要三天
  • 密碼規則要跟資安確認
  • 忘記密碼流程、email 驗證
  • Session 管理、token refresh
  • 前端表單驗證、錯誤訊息
  • 跨裝置測試
  • Code review 來回修改

2. 忽略「看不見的時間」

工程師估的通常是「純寫 code」的時間。但實際上:

活動佔比
理解需求、問問題10-15%
寫 code30-40%
寫測試15-20%
Debug10-15%
Code Review(自己改 + review 別人)10-15%
開會、溝通、等待10-15%

你以為你一天有 8 小時寫 code,實際上能專注寫 code 的時間大概 4-5 小時。

3. Unknown Unknowns

你不知道你不知道的東西。第三方 API 文件寫的跟實際行為不一樣、某個套件升級後有 breaking change、staging 環境的設定跟 production 不同——這些都是你在估算時不可能知道的。


Story Points vs 時數

這是永恆的辯論。先講結論:兩個都有用,看場景。

Story Points時數
衡量什麼相對複雜度絕對時間
適合場景Sprint planning、跨 sprint 比較客戶報價、deadline 承諾
優點不受個人能力影響、避免「你說兩天就兩天」的壓力直觀、利害關係人聽得懂
缺點新團隊很難校準、外行人聽不懂容易變成 deadline 壓力、忽略複雜度差異

Story Points 怎麼用

用 Fibonacci 數列:1, 2, 3, 5, 8, 13, 21

  • 1 SP:改一個按鈕文字、加一個環境變數
  • 2 SP:加一個簡單的 CRUD endpoint
  • 3 SP:有一些邏輯的功能,像是表單驗證
  • 5 SP:跨前後端的完整功能
  • 8 SP:需要串接外部服務或做複雜計算
  • 13 SP:需要架構設計或技術探索
  • 21 SP:太大了,該拆

重點是「相對比較」。如果上次那個串接金流是 8 SP,這次的串接物流跟它差不多複雜,那也是 8 SP。


Planning Poker 實戰

Planning Poker 不只是投票,是逼團隊把隱性知識說出來。

流程

  1. PM 念 User Story 和 Acceptance Criteria
  2. 團隊問問題(限時 5 分鐘)
  3. 每個人同時出牌(Fibonacci 數字)
  4. 如果差異在 2 以內(例如 3 和 5),取大的
  5. 如果差異大(例如 2 和 13),讓最高和最低的人解釋
  6. 再投一次
  7. 最多投三次,還沒共識就取中位數

為什麼差異本身有價值

最有價值的時刻是出現巨大差異的時候。

小明出 3:「不就是加一個欄位嗎?」 小華出 13:「你知道這要改 schema 然後跑 migration 吧?還要更新三個 API 的 response。」

這個對話本身比最後的數字更重要——它暴露了理解差異和潛在風險。


T-shirt Sizing:粗估的好朋友

在專案早期,你連需求都不清楚,算 SP 太精確了。這時候用 T-shirt sizing:

Size說明大約時間
XS改設定、改文字< 半天
S簡單功能、小修改1-2 天
M標準功能開發3-5 天
L跨系統整合1-2 週
XL新模組或架構變更2-4 週
XXL需要先拆才能估不要估,先拆

T-shirt sizing 適合用在:

  • Roadmap 規劃
  • 新專案的初步評估
  • 跟業務部門溝通粗估

Cone of Uncertainty

專案越早期,估算的誤差越大。這叫做 Cone of Uncertainty(不確定性錐):

專案階段估算誤差
初始概念0.25x - 4x
需求確認後0.5x - 2x
設計完成後0.67x - 1.5x
開發進行中0.8x - 1.25x

意思是:在專案初期你估 1 個月,實際可能是 1 週到 4 個月。不是你估得爛,是這個階段本來就不可能估準。

怎麼跟 PM 溝通

別說「要一個月」,說:

「根據目前的資訊,我的估算是 3-6 週。等需求確認後,我可以把範圍縮小到正負兩天。」

給一個範圍,而不是一個數字。這才是專業。


Buffer 策略

經驗法則

  • 你有做過類似的:加 20% buffer
  • 你沒做過但技術熟悉:加 30-50% buffer
  • 全新技術或外部依賴:加 50-100% buffer

怎麼加 Buffer 不會被砍

不要說「我加了 buffer」。把 buffer 變成具體的項目:

原始估算Buffer 項目化
「功能開發 5 天,我加 2 天 buffer」「功能開發 5 天 + 整合測試 1 天 + Code Review 修改 1 天」

把 buffer 拆成看得見的工作,PM 就砍不掉了。


用歷史 Velocity 校準

Velocity 是團隊每個 sprint 完成的 SP 數。追蹤三個 sprint 以上就有參考價值。

範例

Sprint承諾 SP完成 SP
Sprint 13022
Sprint 22825
Sprint 32524
Sprint 42526

平均 velocity:24 SP / sprint

下一個 sprint 就承諾 24 SP 左右,不要好高騖遠。

注意事項

  • Velocity 是「描述」不是「目標」——不要把它當 KPI 來逼
  • 不同團隊的 SP 不能互相比較
  • 成員異動、技術棧變更都會影響 velocity

什麼時候該說「我估不了」

有些情況下,誠實說「我現在無法估算」比亂估一個數字好得多:

  1. 需求不明確:「你說的『推薦系統』是指什麼?規則型的還是 ML 的?」
  2. 技術未知:「我沒用過這個第三方服務,需要先做 spike(技術調研)」
  3. 依賴未確認:「這需要等設計稿,沒有設計稿我不知道前端工時」

Spike 的概念

Spike 是一個時間限定的技術調研。例如:

「我花兩天做一個 spike,驗證金流 SDK 能不能支援我們的需求。spike 結束後我再估整個功能的工時。」

這比亂猜「大概兩週」然後做到一半發現 SDK 不支援要好太多了。


估算溝通模板

當 PM 問「這個要多久」,用這個模板回答:

功能:[簡述] 估算範圍:[樂觀] - [悲觀](最可能 [中間值]) 前提假設

  • [假設 1]
  • [假設 2] 風險
  • [風險 1]:如果發生,可能增加 [時間] 需要確認
  • [問題 1]
  • [問題 2]

範例

功能:信用卡付款 估算範圍:3-7 天(最可能 5 天) 前提假設

  • 使用綠界 SDK,不做自建金流
  • 設計稿在本週五前提供 風險
  • 綠界測試環境不穩定,可能增加 1-2 天 需要確認
  • 要不要支援分期付款?
  • 退款流程是否包含在這個版本?

FAQ

Q1:Story Points 到底要不要對應到時間?

理論上不要,因為 SP 衡量的是複雜度,不是時間。但實務上,大多數團隊心裡都有一個隱性的對應(例如 1 SP ≈ 半天)。這沒問題,只要別把它公開變成承諾。SP 的價值在於「相對比較」和「追蹤 velocity」,不是精確到小時。

Q2:PM 一直砍我的估算怎麼辦?

先問為什麼砍。如果是因為 deadline 壓力,那要討論的是 scope(砍功能),不是壓縮工時。如果是因為覺得你估太高,把估算拆開來看——哪個部分他覺得太高?用具體的項目來討論,而不是爭論一個總數。

Q3:估算會越來越準嗎?

對同類型的工作會。如果你的團隊一直在做 CRUD 功能,估算會越來越準。但如果每個 sprint 都在做全新的東西,估算就永遠不會太準——這時候更重要的是管理不確定性,而不是追求精確。

Q4:遠端團隊怎麼做 Planning Poker?

用線上工具:Scrumpoker.online、PlanITpoker 或 Linear 內建的估算功能都行。重點不是工具,是「同時出牌」這個機制——避免錨定效應(第一個出價的人影響其他人)。

Q5:接案的時候怎麼報價?

接案報價跟內部估算不一樣。接案要加更多 buffer(50-100%),因為需求變更的風險更高。建議用時數估算乘以時薪,再加上「溝通成本」(通常是開發時間的 20-30%)。永遠不要報一個 fixed price 給不確定的需求——改用分階段報價。


系列導航

篇章主題
01需求拆分
→ 02工時估算(本篇)
03Agile 實戰
04Backlog 管理
05Sprint Planning
06專案追蹤
07向上管理
08Retro & Postmortem