Sử dụng StoryPoint để tính tăng trưởng do AI tạo nên được hay không?
Nếu được thì mất bao lâu?
Một trong những công ty mình từng làm áp dụng AI rất nhiều trong suốt quá trình Software Development Life Cycle (SDLC), bạn biết đó sử dụng AI nhiều cũng là một dạng đầu tư, nên sếp tổng mới yêu cầu là năng suất công việc phải tốt hơn 10% sau mỗi quý, hiện tại năng suất công việc của công ty cho phía R&D (Research and Development) được đo bằng (SP). Chúng ta sẽ không nói về việc sử dụng SP đo năng suất công việc là đúng hay sai trong bài này, giả sử là nó đúng. Câu hỏi là “Tăng trưởng 10% năng suất qua từng quý” có được hay không?
Velocity và các tính toán cơ bản
Nói về năng suất trong ngành phần mềm, từ “năng suất” sẽ thường được sử dụng tương đồng với từ “ (vận tốc)”, velocity được đo bằng số lượng SP hoàn thành trong một . Năng suất trong một quý, nhiều Sprint, làm cho nó không còn là một số cứng, mà là một chuỗi sô.
Ghi lại trong Quý 1 có chuỗi Velocity như sau:
38 45 31 42 36 48 Vậy chúng ta có thể trích xuất được thông tin gì từ chuỗi này?
Trung bình SP của Quý 1 là nhưng không có Sprint nào là 40 cả, chênh lệch giữa Sprint năng suất cao nhất và thấp nhất là SP trong khi không có gì bên ngoài thực sự thay đổi, vẫn những con người đó, codebase đó trên cùng một cách thức làm việc.
Một sự thật đầu tiên phải chấp nhận là velocity sẽ dao động kể cả khi không có chuyện gì xảy ra. Ý ở đây là một thay đổi thực sự lớn, nhưng vẫn thay đổi nhỏ như một người nghỉ ốm, một Story làm dễ hơn dự tính hoặc khó hơn dự tính,…vv.
Có thể tính ra độ dao động này từ công thức tính , với và chuỗi như trên chúng ta sẽ có , với là . Hơi nhiều con số đúng không :vvv, cơ bản có thể nói là, dù không có gì thực sự lớn xảy ra, velocity của một Sprint có thể bị lệch khỏi trung bình 6.23 point..
Với dữ liệu trên chúng ta có thể tính ra thêm được một con số có ý nghĩa khác, , . Ý nghĩa của số này nói là, dao động điển hình của đội này bằng khoảng 15.6% so với mức trung bình, đây có thể được xem là một đội ổn định.
So sánh hai chuỗi số
Câu hỏi cuối cùng không phải là những con số bên trên, nhưng tin mình đi chúng khá quan trọng đó, mà là so sánh hai chuỗi số.
Ví dụ sau quý hai, log lại chúng ta có hai chuỗi velocity như sau
Quý 1: 38 45 31 42 36 48 → avg: 40.0
Quý 2: 41 49 36 47 40 51 → avg: 44.0 Trung bình của Quý 2 nhiều hơn quý Quý 1 4 point, đúng 10%, ăn mừng được rồi chứ?
Tất nhiên là nên ăn mừng trước rồi :vvv, nhưng liệu nếu không có bất kỳ thứ gì tác động vào kể cả AI, thì chênh lệch 4 point này có thể xảy ra không?
Cách thông thường để so sánh hai chuỗi số là so sánh trung bình, như cách chúng ta làm, trung bình cũng có sai số của riêng nó, gọi là , , con số này nói lên điều gì, nó nói là, nếu bạn có quyền năng chạy lại Quý 1 trong một dòng không thời gian khác với cùng team, cùng điều kiện, thì con số trung bình (40) có thể sai lệch đi 2.54 điểm là chuyện bình thường.
Vậy nếu chúng ta có quyền năng chạy lại hai quý ở một chiều không thời gian khác, thì trung bình Quý 2 và Quý 1 có thể sai khác nhau là bao nhiểu?
Bạn đã chạy lại 8 lần, trong một thế giới mà không có gì thay đổi cả — không AI, không cải tiến, không gì hết. 2 lần trong số đó cho chênh lệch từ +4 point trở lên.
Với
Điều này có thể cho ra một kết luận, nếu không có gì thay đổi cả, trung bình hai quý có thể lệch nhau 3.49 point là bình thường. Chênh lệch chúng ta quan sát được là 4 point, mà ở đây nhiễu có thể làm cho lệch nhau tới 3.5 point, điều này có thể dẫn tới kết luận nhanh là, không đủ điều kiện để kết luận liệu AI có thật sự tác động tốt đến năng suất hay không vì gần như nó không khác với nhiễu là mấy.
Vậy cần bao nhiêu để có thể phát hiện và kết luận được?
OK, trước khi đi vào tính toán cho cái này, cần hiểu thêm một chút về số mà chúng ta đã tính bên trên, số này cũng là độ rộng của hình chuông phân bố nhiễu. Sao nhỉ, như bên trên chúng ta tưởng tượng có khả năng chạy lại cả hai quý ở chiều không thời gian khác, nếu chúng ta làm vậy vô số lần thì sẽ khoảng 70% số lần chênh lệch sẽ nằm trong khoảng -3.49 tới 3.49 point.
Để có thể phát hiện và kết luận được, chúng ta trước hết phải đề phòng hai loại sai.
Sai loại I
là “báo động giả”, không có gì thay đổi hết, nhưng nhiễu vô tình tạo ra chênh lệch vượt quá chênh lệch bình thường mà chúng ta vừa tính ban nãy (3.49), để phòng chống loại sai này, chúng ta muốn chỉ 5% khả năng các nhiễu vượt ngưỡng, với hình chuông, giá trị đó nằm xa tâm 1.96 lần độ rộng. Nên giá trị đó sẽ là , điều này có nghĩa là, nếu chênh lệch dưới 7 vẫn chưa thể kết luận gì.
Sai loại II
là “bỏ lỡ”, tức là có cải thiện thật, nhưng nhiễu kéo cho con số xuống dưới ngưỡng bình thường dẫn tới kết luận “bình thường”. Cụ thể, nếu sự cải thiện đúng bằng ngưỡng 7 điểm chúng ta đã tính bên trên, thì trong vô số lần đó chỉ có 50% số lần bắt được, 50% còn lại bị nhiễu kéo xuống. Nếu muốn mức bắt được này lên tới 80% thì cải thiện thật phải hơn 7 một khoảng nữa, với hình chuông, đẩy tâm lên 0.84 lần độ rộng thì 80% phân phối sẽ nằm bên phải ngưỡng.
Vậy cần có
Vậy cần có chênh lệch ít nhất 10 point mới có thể xem là có cải thiện.
Nếu cải thiện thật đúng bằng 6.8 point, thì trong vô số lần chạy lại, bạn sẽ kết luận được 'có cải thiện' khoảng 50% số lần. Phần tô là chỗ đó.
Vậy cần bao lâu?
Đặt lại câu hỏi một chút, chúng ta đã tính được, để có thể xác định là “có cải thiện” hay không thì phải có chênh lệch ít nhất là 10 point, với mẫu thu thập được cho mỗi quý, câu hỏi mới là “Cần bao nhiêu Sprint (N) để có thể kết luận là đội đã cải thiện 10%”.
Tổng quát SE
Khi nãy chúng ta đã tính được chênh lệch so sánh của hai chuỗi với bên trên là , đây là một con số cụ thể, không phải công thức tổng quát so sánh. Giả sử luôn so sánh hai chuỗi có cùng độ dài, công thức tổng quát có thể được viết lại như sau:
Với
Ngưỡng phát hiện cải thiện tính ngược lại
Khi nãy chúng ta cũng tính được , thì mới xem là có cải thiện, ráp lại vào công thức tính cho thì sẽ có bất đẳng thức như sau
Có nghĩa là, cải thiện thật phải lớn hơn hoặc bằng 2.8 lần độ ồn nhiễu của phép so sánh.
OK, tới đây cần phải biến đổi bất đẳng thức để có thể tìm ra công thức của .
Đã có công thức của nhưng ý nghĩa hiện tại của nó không phải là “phần trăm”, để có thể có ý nghĩa đó, phải chia cả tử số và mẫu số cho (bình phương trung bình của chuỗi)
Chúng ta có hệ số biến thiên của đội nhóm. Vậy công thức trên nói lên điều gì?
Tử số nói là đội này đem lại bao nhiêu phần trăm nhiễu, mẫu số nói là muốn bắt được bao nhiêu phần trăm cải thiện.
Với gộp được tính lại cho cả hai Quý là và mong muốn bắt được 10% cải thiện, tức , thì phải
Kiểm tra lại một tí
Thay vào công thức tính SE ta sẽ có: Từ đó suy ra , mà . Yeah, vậy là tính toán đã đúng.
Vậy cần ít nhất phải theo dõi 33 Sprint mỗi nhánh, tức là 66 Sprint mới có thể bắt được liệu một tác nhân nào đó có thể giúp tăng năng suất lên 10% hay không.
Kết luận
Quay lại câu hỏi của sếp tổng: “năng suất phải tốt hơn 10% sau mỗi quý”. Trả lời cho câu hỏi này không phải “được” hay “không được”, mà là một trả lời khó chịu hơn: với dữ liệu của một quý, câu hỏi đó không có câu trả lời.
Ba con số của bài này xếp cạnh nhau đã nói:
- Đội này cơ bản dao động sẵn 15% quanh mức trung bình của chính nó kể cả khi không có gì xảy ra cả.
- Chênh lệch cần đạt là 4 point còn nhiễu của phép so sánh là 3.49 point. Cái cần đo gần như không khác với nhiễu thuần túy là mấy.
- Muốn phân biệt được hai thứ đó, cần 33 Sprint mỗi nhánh, với Sprint hai tuần, đó là hai năm rưỡi dữ liệu cho một lần kết luận.
Nghịch lý nằm ở chỗ này: chu kỳ đánh giá là một quý, sáu Sprint, trong khi chính thước đo được dùng để đánh giá cần gấp mười lần chừng đó mới có thể kết luận được. Yêu cầu “10% mỗi quý” không sai về mặt kỳ vọng. Nó chỉ không kiểm chứng được bằng StoryPoint và một yêu cầu không kiểm chứng được thì mỗi quý sẽ được trả lời bằng cảm tính, bằng một con số vô tình đẹp hoặc bằng một buổi họp mà ai to tiếng hơn thì đúng.
Nếu vẫn muốn đo, chúng ta có công thức cho ba núm vặn để xoay:
- Giảm , bớt nhiễu đi: tỉ lệ với , nên đội nào có dao động càng nhỏ thì thời gian đo sẽ cần càng ít, ví dụ kéo từ 15% xuống 7.5% thì thời gian cần thiết rút xuống chỉ còn một phần tư. Story cần được chia nhỏ, đều tay, ước lượng nhất quán, đừng đổi thang điểm giữa chừng. Hoá ra đây mới là việc đáng làm nhất và nó chẳng liên quan gì tới AI là mấy.
- Chấp nhận mục tiêu lớn hơn: tỉ lệ nghịch với , đi tìm mức cải thiện 20% thì chỉ tốn một phần tư thời gian so với đi tìm 10%. Một tác động thật sự lớn thì dễ chứng minh hơn đòi bằng chứng cho một tác động nhỏ.
- Kéo dài cửa sổ quan sát: Đừng hỏi “quý này có tăng 10% không”, hỏi “sau một năm rưỡi, xu hướng có chuyển đổi không”.
Và điều cuối, cũng là điều quan trọng nhất, những con số bên trên không kết luận AI vô dụng hay không. Chúng nói StoryPoint không đủ nhạy để làm bằng chứng cho câu hỏi đang được hỏi. Đó là hai chuyện hoàn toàn khác nhau nhưng trong một buổi review cuối quý, chúng rất hay bị đánh đồng làm một.
số Sprint cần theo dõi cho mỗi nhánh
| độ dao động | 7.5% | 10% | 15% | 20% |
|---|---|---|---|---|
| 5% | 36 | 63 | 142 | 251 |
| 10% | 9 | 16 | 36 | 63 |
| 20% | 3 | 4 | 9 | 16 |
Đội của bạn dao động 14.4% quanh trung bình. Chênh lệch quan sát được là +4.0 point, trong khi ngưỡng kết luận là 9.8 point — chưa đủ để nói gì cả. Muốn bắt được mức bạn chọn, cần 33 Sprint mỗi nhánh, tức khoảng 30 tháng.
Có thể tính được tác động tích cực từ AI thông qua StoryPoint không? Nếu tính được thì bao lâu?
Thuật ngữ
được đánh dấu trong bài- độ lệch chuẩn mẫu danh từ · thống kê
- Một quan sát đơn lẻ thường lệch khỏi trung bình bao xa, tính bằng đúng đơn vị của các quan sát.
- hệ số biến thiên danh từ · thống kê
- Độ lệch chuẩn tính theo tỉ lệ phần trăm của trung bình — độ phân tán đã bỏ đơn vị đi, nên hai thứ đo bằng thang khác nhau vẫn so được.
- phân phối chuẩn danh từ · thống kê
- Hình chuông mà các giá trị trung bình có xu hướng tiến về — đối xứng, và được mô tả trọn vẹn bằng một tâm và một độ rộng.
- phương sai mẫu danh từ · thống kê
- Trung bình bình phương khoảng cách tới giá trị trung bình, chia cho n−1 thay vì n, vì chính giá trị trung bình cũng được ước lượng từ dữ liệu đó.
- sai loại I danh từ · thống kê
- Báo động giả — kết luận là có thay đổi thật trong khi chẳng có gì xảy ra, chỉ là nhiễu vô tình rơi cao.
- sai loại II danh từ · thống kê
- Bỏ lỡ — cải thiện là thật, nhưng rơi xuống dưới ngưỡng vì nhiễu tình cờ kéo nó xuống.
- sai số chuẩn của trung bình danh từ · thống kê
- Giá trị *trung bình* của một mẫu thường lệch khỏi trung bình thật bao xa — độ lệch chuẩn chia cho căn bậc hai của cỡ mẫu.
- Sprint danh từ · agile
- Cửa sổ thời gian cố định mà đội lên kế hoạch và bàn giao trong đó — đơn vị biến công việc thành một chuỗi đếm được.
- StoryPoint danh từ · agile
- Đơn vị ước lượng công sức, do đội tự thống nhất chứ không đo được — kích cỡ tương đối, không phải số giờ.
- velocity danh từ · agile
- Số story point một đội hoàn thành trong một Sprint — một tốc độ, nên nó là một chuỗi số chứ không phải một con số.
Nguồn tham khảo
được trích dẫn trong bài- 01 The generalization of 'Student's' problem when several different population variances are involved Bài báo
Phép hiệu chỉnh mà phần ghi chú bên lề dựa vào. Kiểm định t của Student giả định hai nhóm có cùng độ phân tán; Welch bỏ giả định đó đi và trả giá bằng bậc tự do lẻ, tính ra từ hai phương sai chứ không đếm từ hai cỡ mẫu. Đây là lựa chọn trung thực mỗi khi hai mẫu đều nhỏ và không có lý do gì để tin rằng chúng tản mát như nhau — chẳng hạn hai quý Sprint của một đội.
Có gì ở đây làm bạn nghĩ khác đi về vấn đề không?