среда, 1 января 2014 г.

Оценка времени выполнения составной задачи по оценкам ее подзадач

С Новым Годом, дорогие друзья! Сегодня я расскажу о методе для оценки времени выполнения сложной задачи (состоящей из нескольких подзадач). Его можно использовать для предварительной оценки проектных задач или при планировании спринтов в SCRUM.

Итак, пусть задача T разбита на подзадачи T1, T2, ... Tn и требуется получить интервал, в который с заданной вероятностью α попадет общее время, затраченное на выполнение задачи T (т.е. сформулировать оценку вида: на выполнение этой задачи уйдет от 85 до 110 часов с вероятностью 95%). Пусть каждую задачу оценивают несколько (для данного метода требуется не менее 2) экспертов (вспомним, например planning poker в SCRUM). Чтобы получить итоговую оценку, делаем следующее:

1) Для каждой задачи Tk подсчитываем среднее значение:

Ek = (ek1 + ek2 + ... + ekm)/mk

и несмещенную дисперсию:

sk = ((ek1 - Ek)2 + (ek2 - Ek)2 + ... + (ekm - Ek)2)/(mk - 1)

Где ek1, ek2, ... ekm - оценки подзадачи Tk, полученные от разных экспертов, а mk - количество экспертов, оценивших эту подзадачу

2) Для итоговой задачи считаем:

cреднее значение: E = E1 + E2 + ... + En

дисперсию: s = s1 + s2 + ... + sn

и стандартное отклонение: σ = s1/2

3) Согласно центральной предельной теореме распределение времени выполнения задачи при больших n приближается нормальным распределением со средним E и стандартным отклонением σ.

Поэтому в качестве оценки для времени выполнения задачи T с вероятностью α можно взять интервал (E - U(1+α)/2*σ, E + U(1+α)/2*σ), где U(1+α)/2 это (1+α)/2 - квантиль стандартного нормального распределения. В частности для 95% вероятности, т.е α = 0.95: U0.975 ≈ 1.959963985.

Значения квантилей нормального распределения можно опредедить по таблицам, часто прилагающимся к учебникам по теории вероятностей и математической статистике или воспользоваться Excel-функцией NORM.INV, т.е U(1+α)/2 в Excel записывается как =NORM.INV((1+α)/2,0,1)


Пример: Требуется оценить объем работ в человеко-часах сложной задачи, которая состоит из 14 подзадач. Оценить подзадачи дали 4 программистам и получили следующие оценки в часах:


№ подзадачи Программист 1 Программист 2 Программист 3 Программист 4
1 2 3 5 2
2 3 4 3
3 5 8 4 6
4 5 3 4 6
5 5 3 3 6
6 8 12 16
7 4 2 2 3
8 3 4 6
9 6 8 6 12
10 5 3 6
11 3 6 5
12 2 3 5 4
13 6 4 5
14 2 3 2 4

Пропуски значений означают отсутствие оценки - вполне обычная ситуация, когда человек слабо знаком с предметной областью и не может сказать, сколько времени займет сделать подзадачу.

Расчеты:

Для первой подзадачи:
среднее: E1 = (2 + 3 + 5 + 2)/4 = 3
дисперсия: s1 = ((2 - 3)2 + (3 - 3)2 + (5 - 3)2 + (2 - 3)2)/(4 - 1) = 2

Для второй подзадачи:
среднее: E2 = (3 + 4 + 3)/3 = 3.333333333
дисперсия: s2 = ((3 - 3.333333333)2 + (4 - 3.333333333)2 + (3 - 3.333333333)2)/(3 - 1) = 0.333333333

Аналогично для последующих подзадач. Итоговая таблица со значениями средних и дисперсий для каждой подзадачи, а также средним и дисперсией для всей задачи:

№ подзадачи Программист 1 Программист 2 Программист 3 Программист 4 Среднее Дисперсия
1 2 3 5 2 3 2
2 3 4 3 3.333333333 0.333333333
3 5 8 4 6 5.75 2.916666667
4 5 3 4 6 4.5 1.666666667
5 5 3 3 6 4.25 2.25
6 8 12 16 12 16
7 4 2 2 3 2.75 0.916666667
8 3 4 6 4.333333333 2.333333333
9 6 8 6 12 8 8
10 5 3 6 4.666666667 2.333333333
11 3 6 5 4.666666667 2.333333333
12 2 3 5 4 3.5 1.666666667
13 6 4 5 5 1
14 2 3 2 4 2.75 0.916666667
Итого: 68.5 44.66666667


Среднеквадратичное отклонение для всей задачи: σ = 44.666666671/2 = 6.683312552
Интервал для объема работ:
от E - U(1+α)/2*σ = 68.5 - 6.683312552*1.959963985 = 55.4009481 до E + U(1+α)/2*σ = 68.5 + 6.683312552*1.959963985 = 81.5990519

Таким образом, можно с 95% вероятностью утверждать, что затраты времени на задачу составляют от 55.4 до 81.6 человеко-часов.

P.S. Для удобства конечно лучше автоматизировать подобные вычисления. Поэтому я создал простой Excel-документ, в котором проводил все эти расчеты. Можно скачать отсюда. Поддерживается до 10 оценок каждой подзадачи (столбцы от F до K, которые я скрыл для удобства демонстрации примера выше) и до 30 подзадач (просто копируем формулы, если нужно больше). Можно изменять степень доверия (столбец Confidence). Границы интервала автоматически пересчитываются при добавлении задач и оценок.