Nền tảng Trung bình 7 phút đọc

Ước lượng phần mềm: three-point, reference class, T-shirt

Cách ước lượng việc phần mềm mà không tự lừa: three-point estimation, reference class forecasting, T-shirt sizing, và khi nào planning poker đáng thời gian.

Mục lục
  1. Khi nào ước lượng thật sự cần phải chính xác?
  2. Cái giá của việc ước lượng kém là gì?
  3. Bộ công cụ ước lượng tối thiểu trông thế nào?
  4. Three-point estimation chạy thực tế ra sao?
  5. Log reference class cụ thể là gì?
  6. Ước lượng ở quy mô đa team thì khác ra sao?
  7. Ước lượng có thể tạo ra những kiểu lỗi nào?
  8. Khi nào ước lượng chi tiết là lãng phí thời gian?
  9. Đi tiếp từ đây như thế nào?

Câu hỏi khó nhất mà một tech lead phải trả lời - "việc này mất bao lâu?" - không có lời đáp trung thực dưới dạng một con số đơn lẻ. Câu trả lời trung thực luôn là một khoảng kèm mức tin cậy. Chương này dạy bốn kỹ thuật để cho ra một khoảng đủ vững để bảo vệ, hướng dẫn khi nào nên dùng cái nào, và cách giữ cho team trung thực với chính mình về việc hiệu chỉnh ước lượng theo thời gian.

Khi nào ước lượng thật sự cần phải chính xác?

Có ba tình huống cần độ chính xác cao. Còn lại, sai số ở mức bậc cường độ là đã đủ.

Cam kết ràng buộc với bên ngoài. Một deadline pháp lý, một hợp đồng có điều khoản phạt với khách hàng, hay một chiến dịch marketing đã gắn vào ngân sách quảng cáo. Doanh nghiệp phải chi tiền dựa trên ước lượng, vì vậy ước lượng phải đi kèm khoảng tin cậy chứ không thể là phỏng đoán mơ hồ.

Lập kế hoạch quý. Tổ chức cần biết quý này sẽ làm xong những gì để sắp xếp dependency giữa các team. Ước lượng kém ở khâu này gây xáo trộn dây chuyền tới nhiều team khác.

Quyết định build vs buy. Lựa chọn giữa "tự xây" và "license SaaS" xoay quanh chi phí. Khi đó, ước lượng cho phương án build phải đủ chắc chắn để bảo vệ được trước hội đồng.

Còn lại - các sprint thông thường, các spike khám phá, các công cụ nội bộ - thì "size sơ bộ" là đủ. Ước lượng quá kỹ cũng là một loại chi phí.

Cái giá của việc ước lượng kém là gì?

Có ba kiểu lỗi thường lộ ra về sau.

Sprint hành quân kiểu tử thần. Dự án cam kết một ngày dựa trên ước lượng số đơn lẻ trong trường hợp lạc quan. Khi thực tế ập đến, team phải làm cuối tuần để kịp ngày. Chất lượng đi xuống, tỉ lệ nghỉ việc đi lên.

Pad ước lượng quá tay. Team học được bài học từ lần hành quân tử thần trước đó và bắt đầu nhân ba mọi ước lượng cho chắc. Bây giờ, ước lượng thật sự là 6 tuần nhưng họ báo 18 tuần; lãnh đạo dần dần mất niềm tin vào con số.

Tê liệt khi ra quyết định. "Chưa quyết được build hay buy đến khi nào ước lượng được phương án build." Việc ước lượng kéo dài cả một tháng. Đến lúc đó, phương án buy đã đổi giá rồi.

Bộ công cụ ước lượng tối thiểu trông thế nào?

Có bốn kỹ thuật, tăng dần về độ chi tiết và độ chính xác:

flowchart LR
    TS[T-Shirt sizing<br/>S/M/L/XL<br/>5 phút] --> RC[Reference class<br/>3-5 dự án cũ<br/>30 phút]
    RC --> TP[Three-point<br/>best/likely/worst<br/>1 giờ mỗi item]
    TP --> PP[Planning poker<br/>cả team<br/>2 giờ mỗi backlog]

Mỗi kỹ thuật phù hợp với một giai đoạn khác nhau. T-shirt dùng ở giai đoạn ý tưởng; reference class dùng ở kickoff; three-point dùng khi planning chi tiết; planning poker dùng khi backlog đã được chia thành story. Phần lớn team nhảy thẳng vào planning poker và bỏ qua các kỹ thuật ở thượng nguồn - vốn là chỗ bắt được những lỗi sai về bậc cường độ.

Three-point estimation chạy thực tế ra sao?

Với mỗi task, hãy hỏi ba con số:

Sau đó tính ước lượng theo PERT và độ lệch chuẩn:

estimate = (B + 4M + W) / 6
stddev   = (W - B) / 6
range    = estimate ± 2 * stddev   (95% tin cậy)

Ví dụ: một task có B=2 ngày, M=4 ngày, W=10 ngày sẽ cho ra estimate = (2 + 16 + 10) / 6 = 4.67 ngày, stddev = 1.33 ngày, khoảng tin cậy 95% = 2-7 ngày. Khi báo, hãy báo khoảng chứ đừng báo điểm.

Cộng các estimate và stddev trong toàn dự án (variance có tính chất cộng được) để có khoảng ở cấp dự án. Cú sốc của phần lớn team là phát hiện ra cái khoảng đó rộng đến mức nào khi các con số W cộng dồn lại - và đó chính là điểm cốt yếu: cho lãnh đạo nhìn thấy phép toán bằng chính mắt họ.

Log reference class cụ thể là gì?

Đây là một file yaml đơn giản trong repo của team, được cập nhật sau mỗi retrospective:

reference_class:
  - project: "Admin dashboard cho billing"
    started: "2026-01-15"
    shipped: "2026-03-10"
    elapsed_weeks: 8
    initial_estimate_weeks: 4
    actual_vs_initial: 2.0x
    pattern: "Admin CRUD + 2 report"
    surprises: "rate limit auth provider; QA env unstable 1 tuần"

  - project: "Tích hợp webhook inventory"
    started: "2026-02-20"
    shipped: "2026-04-05"
    elapsed_weeks: 6
    initial_estimate_weeks: 3
    actual_vs_initial: 2.0x
    pattern: "tích hợp API third-party"
    surprises: "edge case không tài liệu của vendor SDK"

  - project: "Pipeline re-index search"
    started: "2026-03-01"
    shipped: "2026-04-10"
    elapsed_weeks: 6
    initial_estimate_weeks: 6
    actual_vs_initial: 1.0x
    pattern: "migration Elasticsearch"
    surprises: "không - đã có dự án trước tương tự"

Có hai điểm đáng chú ý. Một là actual_vs_initial thường xuyên ở mức ~2x với những pattern lần đầu làm và ~1x với những pattern đã lặp lại. Hai là cột surprises ghi lại lý do cụ thể, và đây sẽ trở thành đầu vào cho risk register của quý sau (chương 3).

Ước lượng ở quy mô đa team thì khác ra sao?

Có ba thay đổi khi quy mô vượt 50+ engineer và nhiều team:

Sai lầm lớn nhất ở quy mô này là coi kế hoạch quý như một hợp đồng cố định. Thực ra nó là một dự báo có khoảng tin cậy, và cái khoảng đó sẽ thu hẹp lại theo thời gian.

Ước lượng có thể tạo ra những kiểu lỗi nào?

Khi nào ước lượng chi tiết là lãng phí thời gian?

Có hai trường hợp.

Khám phá có hạn thời gian rõ. "Có hai tuần để xem cái này có khả thi không." Khi đó không cần ước lượng; chỉ cần báo kết quả đúng vào deadline là xong.

Việc thực sự bắt buộc phải làm. Một bản vá bảo mật phải deploy trong tuần này. Việc ước lượng mất bao lâu không thay đổi quyết định bạn có làm hay không. Cứ làm rồi báo.

Kỷ luật ước lượng đáng giá khi lãnh đạo phải cam kết tài nguyên ra bên ngoài dựa trên câu trả lời. Dưới ngưỡng đó, "size sơ bộ + báo cáo thứ Sáu" tốt hơn là một nghi lễ ước lượng phức tạp.

Đi tiếp từ đây như thế nào?

Chương tiếp theo: theo dõi rủi ro và issue

Câu hỏi thường gặp

Vì sao ước lượng phần mềm luôn sai?
Vì bạn đang ước lượng một việc chưa từng làm. Nếu đã làm rồi thì copy là xong. Mọi ước lượng đều là phỏng đoán về thời gian khám phá, các bất ngờ trong khâu tích hợp, và năng lực của team với chính bài toán cụ thể này. Hãy coi ước lượng như một khoảng có mức tin cậy, không phải một con số đơn lẻ. Chương back-of-envelope trong System Design dùng cùng ý tưởng này cho việc capacity.
Reference class forecasting là gì?
Là nhìn lại 3-5 dự án gần nhất có hình dạng tương tự và lấy thời gian thực tế của chúng làm điểm tham chiếu. Ví dụ: 'Lần trước build admin CRUD cho domain tương tự, mất 6 tuần.' Theo nghiên cứu của Flyvbjerg, cách này cho ra ước lượng tốt hơn cách bottom-up khoảng 30-40%, vì nó ngầm bắt được các unknown-unknown mà bottom-up bỏ qua. Hãy duy trì một log nhỏ về thời gian các dự án cũ - đó chính là reference class của bạn.
Khi nào T-shirt sizing tốt hơn story point?
Ở giai đoạn sớm của dự án, trước khi task được phân rã. T-shirt (S, M, L, XL) truyền tải được độ lớn mà không tạo ra cảm giác chính xác giả - 'XL nghĩa là việc này lớn hơn một sprint, nên tách ra'. Story point chỉ phù hợp ở mức sprint, sau khi việc đã được chia nhỏ. Trộn cả hai (kiểu '13 điểm') sẽ tạo ra niềm tin giả vào độ chính xác.
Theo dõi estimate vs actual mà không biến nó thành hình phạt - làm sao?
Theo dõi ở mức team chứ không phải ở mức cá nhân. Câu hỏi cần đo là 'estimate có nằm trong khoảng 50% của actual không' chứ không phải 'estimate của ai sai'. Đưa xu hướng hiệu chỉnh vào retrospective hàng quý, rồi điều chỉnh quy tắc ước lượng theo những gì học được. Nếu cá nhân cảm thấy đang bị chấm điểm, độ chính xác sẽ giảm vì họ sẽ pad.