В этой статье я расскажу о ситуации, когда необходимо дать оценку для scope задач, при условии, что есть оценка для каждой из них и есть данные, по которым понятно, как предыдущие оценки соотносятся с реально затраченным временем.
Примеры, когда это может пригодиться:
- Задачи оценены в story point-ах, а требуется оценить сколько это будет в часах
- Есть оценки в задач часах, но предыдущие данные показывают, что такие оценки расходятся с реально потраченным временем и хотелось бы получить более точную оценку
Теперь сам метод. Итак, пусть у нас есть:
1) Исторические данные по задачам, где для каждой задачи есть:
hei - её оценка
hti - реально затраченное время
Оценка и затраченное время могут быть как в разных единицах (например story point-ы и часы), так и в одинаковых (часы)
2) Некоторое множество задач, каждая из которых оценена в тех же единицах, что и в предыдущем пункте.
Мы попробуем получить интервальную оценку затраченного времени (интервал, в который с заданной вероятностью попадет суммарное время на выполнение этих задач)
Шаг 1. Вначале сгруппируем и упорядочим исторические данные по значению оценки. Т.е получится несколько групп задач:
задачи с оценкой he1,
задачи с оценкой he2,
...
задачи с оценкой heK
hei < hei+1, 1 <= i < K
Шаг 2. Если есть группы, в которых меньше двух задач, объединим их со следующими в списке группами.
В результате получится такая структура групп задач:
G1 - задачи у которых оценка лежит в пределах от a1 до b1
G2 - задачи у которых оценка лежит в пределах от a1 до b2
...
GM - задачи у которых оценка лежит в пределах от aM до bM
bi < ai+1, 1 <= i < M
Шаг 3. Для каждой группы по множеству значений реально потраченного времени посчитаем 3 показателя:
Количество: mi
Среднее: Xi
Несмещенную выборочную дисперсию (экселевская функция VAR.S): Si2
Пример группировки, чтобы было понятно о чем я. Пусть есть таблица оценок задач и реальных значений времени выполнения:
Есть 4 строки, в которых количество значений меньше 2 (строки с оценкой 4, 5, 8 и 10). Начиная с начала таблицы, объединим такие строки со следующими в списке, чтобы это исправить:
Теперь посчитаем среднее и несмещенную дисперсию:
Вернемся к теоретической части.
Шаг 4. Сгруппируем оценки новых задач по значению самой оценки. Т.е. получим данные такого типа:
k1 задач с оценкой e1
k2 задач с оценкой e2
...
kL задач с оценкой eL
ei < ei+1, 1 <= i < K
Шаг 5. Чтобы получить итоговую оценку соотнесем оценки новых задач с историческими данными. Для каждой группы новых задач из предыдущего шага находим группу из исторических данных (из шага 2), в которую попадает ее оценка. Если такой группы нет, то берем самую первую группу, у которой оценка больше (лучше переоценить задачу, чем недооценить). Если оценка выше, чем самая высокая оценка в таблице, отнесем ее к последней группе. В примере выше задачу с оценкой 3 отнесем ко второй группе, задачу с оценкой 3.5 - к третьей, задачу с оценкой 13 - к последней.
В результате этой процедуры получим N групп задач, которые нам нужно оценить, соотнесенное с историческими данными:
n1 задач, относящихся к группе из m1 исторических задач, в которой среднее X1 и дисперсия S12
n2 задач, относящихся к группе из m2 исторических задач, в которой среднее X2 и дисперсия S22
...
nN задач, относящихся к группе из mN исторических задач, в которой среднее XN и дисперсия SN2
тогда распределение суммарного времени E для этих задач будет приближенно описываться таким законом:
Примеры, когда это может пригодиться:
- Задачи оценены в story point-ах, а требуется оценить сколько это будет в часах
- Есть оценки в задач часах, но предыдущие данные показывают, что такие оценки расходятся с реально потраченным временем и хотелось бы получить более точную оценку
Теперь сам метод. Итак, пусть у нас есть:
1) Исторические данные по задачам, где для каждой задачи есть:
hei - её оценка
hti - реально затраченное время
Оценка и затраченное время могут быть как в разных единицах (например story point-ы и часы), так и в одинаковых (часы)
2) Некоторое множество задач, каждая из которых оценена в тех же единицах, что и в предыдущем пункте.
Мы попробуем получить интервальную оценку затраченного времени (интервал, в который с заданной вероятностью попадет суммарное время на выполнение этих задач)
Шаг 1. Вначале сгруппируем и упорядочим исторические данные по значению оценки. Т.е получится несколько групп задач:
задачи с оценкой he1,
задачи с оценкой he2,
...
задачи с оценкой heK
hei < hei+1, 1 <= i < K
Шаг 2. Если есть группы, в которых меньше двух задач, объединим их со следующими в списке группами.
В результате получится такая структура групп задач:
G1 - задачи у которых оценка лежит в пределах от a1 до b1
G2 - задачи у которых оценка лежит в пределах от a1 до b2
...
GM - задачи у которых оценка лежит в пределах от aM до bM
bi < ai+1, 1 <= i < M
Шаг 3. Для каждой группы по множеству значений реально потраченного времени посчитаем 3 показателя:
Количество: mi
Среднее: Xi
Несмещенную выборочную дисперсию (экселевская функция VAR.S): Si2
Пример группировки, чтобы было понятно о чем я. Пусть есть таблица оценок задач и реальных значений времени выполнения:
Оценка | Реальное значение |
2 | 2.5 |
3 | 3.5 |
2 | 1.5 |
5 | 6 |
8 | 8 |
6 | 5 |
4 | 3 |
6 | 7 |
3 | 2.5 |
10 | 14 |
2 | 3.5 |
Группируем строки по значению оценки:
Оценка | Количество | Реальные значения |
2 | 3 | 2.5, 1.5, 3.5 |
3 | 2 | 3.5, 2.5 |
4 | 1 | 3 |
5 | 1 | 6 |
6 | 2 | 5, 7 |
8 | 1 | 8 |
10 | 1 | 14 |
Есть 4 строки, в которых количество значений меньше 2 (строки с оценкой 4, 5, 8 и 10). Начиная с начала таблицы, объединим такие строки со следующими в списке, чтобы это исправить:
Оценка | Количество | Реальные значения |
2 | 3 | 2.5, 1.5, 3.5 |
3 | 2 | 3.5, 2.5 |
4-5 | 2 | 3, 6 |
6 | 2 | 5, 7 |
8-10 | 2 | 8, 14 |
Теперь посчитаем среднее и несмещенную дисперсию:
Оценка | Количество | Среднее | Несмещенная дисперсия |
2 | 3 | (2.5+1.5+3.5)/3 = 2.5 | ((2.5-2.5)2+(1.5-2.5)2+(3.5-2.5)2)/(3-1) = 1 |
3 | 2 | (3.5+2.5)/2 = 3 | ((3.5-3)2+(2.5-3)2)/(2-1) = 0.5 |
4-5 | 2 | (3+6)/2 = 4.5 | ((3-4.5)2+(6-4.5)2)/(2-1) = 4.5 |
6 | 2 | (5+7)/2 = 6 | ((5-6)2+(7-6)2)/(2-1) = 2 |
8-10 | 2 | (8+14)/2 = 11 | ((8-11)2+(14-11)2)/(2-1) = 18 |
Вернемся к теоретической части.
Шаг 4. Сгруппируем оценки новых задач по значению самой оценки. Т.е. получим данные такого типа:
k1 задач с оценкой e1
k2 задач с оценкой e2
...
kL задач с оценкой eL
ei < ei+1, 1 <= i < K
Шаг 5. Чтобы получить итоговую оценку соотнесем оценки новых задач с историческими данными. Для каждой группы новых задач из предыдущего шага находим группу из исторических данных (из шага 2), в которую попадает ее оценка. Если такой группы нет, то берем самую первую группу, у которой оценка больше (лучше переоценить задачу, чем недооценить). Если оценка выше, чем самая высокая оценка в таблице, отнесем ее к последней группе. В примере выше задачу с оценкой 3 отнесем ко второй группе, задачу с оценкой 3.5 - к третьей, задачу с оценкой 13 - к последней.
В результате этой процедуры получим N групп задач, которые нам нужно оценить, соотнесенное с историческими данными:
n1 задач, относящихся к группе из m1 исторических задач, в которой среднее X1 и дисперсия S12
n2 задач, относящихся к группе из m2 исторических задач, в которой среднее X2 и дисперсия S22
...
nN задач, относящихся к группе из mN исторических задач, в которой среднее XN и дисперсия SN2
тогда распределение суммарного времени E для этих задач будет приближенно описываться таким законом:
Ti(mi-1) - независимые случайные величины, имеющие распределение Стьюдента с mi-1 степенями свободы.
Недостаток этой формулы в том, что сложно дать интервальную оценку времени (т.е оценку типа "с вероятностью 90% на эти задачи уйдет от 100 до 130 часов"). Нужны некоторые навыки программирования, чтобы смоделировать это распределение. Формула может быть полезна программистам, разрабатывающим софт для управления проектами, но для быстрого практического применения ее придется упростить.
Здесь нам помогут 2 фактора:
1) Сумма независимых распределений хорошо приближается нормальным распределением
2) Распределение Стьюдента при увеличении числа степеней свободы сходится к нормальному
Поэтому для приближения заменим каждое из распределений Стьюдента в формуле (X) на нормальное распределение с той же дисперсией. В итоге получим, что распределение оценки приближается нормальным распределением с математическим ожиданием:
и дисперсией:
где
S2n, i - выборочная дисперсия (экселевская функция VAR.P) i-ой соответствующей группы исторических данных. Т.е в упрощенной формуле на шаге 3 будет считаться именно выборочная дисперсия.
Здесь стоит заметить, что распределение Стьюдента с n степенями свободы имеет дисперсию только при n >= 3. Поэтому для работы приближенной формулы необходимо, чтобы количество элементов в каждой группе исторических данных было не менее 4. В этом случае шаг 2 меняется следующим образом:
Если группа содержит меньше 4 элементов, объединяем ее с последующей. Если последняя группа содержит меньше 4 элементов, обїединяем ее с предпоследней. Повторяем до тех пор, пока каждая группа не будет содержать не менее 4 элементов. Очевидно, что эта процедура может быть выполнена, если в исторических данных есть не менее 4 оценок.
Небольшое дополнение, позволяющее автоматизировать расчеты. Если исторические данные хранятся в SQL-базе данных, то группировку можно осуществлять SQL-запросом.
Если например они находятся в таблице HistoricalData со столбцами с именами Estimate и Time,
то предварительные данные для расчета среднего и дисперсии можно получить таким запросом:
При объединении групп (шаг 2) суммируются количества (столбец Count) и суммы (Sum и SumOfSquares).
После этого среднее и дисперсии в i-ой строке таблицы считаются по таким формулам:
Пример расчета оценки с пошаговым разбором
Пусть есть такой набор исторических данных (левая таблица) и набор оценок задач (список справа):
Дадим интервальную оценку времени, которое будет затрачено на выполнение задач справа
Шаг 1. Группируем исторические данные, считая количество сумму и сумму квадратов реальных значений (я здесь воспользовался SQL-запросом (4))
Шаг 2. Идем по таблице сверху вниз и объединяем каждую строку, в которой количество меньше 4 со следующей, при этом суммируя значения в столбцах Количество, Сумма и Сумма квадратов.
Строку с оценкой 7 объединим со строкой с оценкой 8
Строку с оценкой 11 объединим со строкой с оценкой 12
Строку с оценкой 13 объединим со строкой с оценкой 16
В последней строке с оценкой 18 количество тоже меньше 4, но поскольку для нее нет следующей строки, объединим ее с предыдущей:
Шаг 3. Считаем среднее и выборочную дисперсию в каждой группе:
Шаг 4. Группируем оценки новых задач. Напомню список:
4, 4, 3, 5, 4, 5, 15, 5, 12, 3, 4, 2, 3, 1, 4, 4, 8, 4, 3, 1, 2, 3, 8, 8, 3, 8, 8, 4, 8, 1, 1, 16, 5, 3, 5, 6, 2
Если сгруппировать, получится такая таблица:
Шаг 5. Сопоставляем группы исторических данных (слева) и новых задач (справа):
Соответствующие группы выделены одинаковыми цветами
Теперь объединяем соответствующие строки 2 таблиц, группируя строки правой, если нужно (например последние две):
Далее, по формулам (2) и (3) получаем:
M[E] = 239.5180079
Практические выводы из расчетов:
Вывод 1. Формула (3) подтверждает практический совет: при планировании задач ставить буфер в конце цикла, а не локально в каждую задачу/требование.
Вывод 2. Исторические данные естественно лучше обновлять по мере работы над проектом. А именно, сделанные задачи пополняют множество исторических данных. И вот тут полезно использовать таблицу, полученную после первичной группировки на шаге 1. Сделанные задачи обновляют строки этой таблицы (увеличивая количество, сумму или сумму квадратов) или вставляют новые. Таким образом исторические данные могут считаются "кумулятивно", что позволяет не выполнять полную обработку всей истории каждый раз, когда нужно оценить новый набор задач. Достаточно один раз получить небольшую таблицу и обновлять ее по мере накопления исторических данных.
Вывод 3. Задачи с большими оценками вносят значительный вклад в погрешность общей оценки. Из формулы (3) видны 2 причины этого:
Поэтому при оценках больших задач лучше разбивать их на задачи поменьше. Сама процедура разбиения помогает понять, что же нужно сделать в задаче и уточнить оценку просто за счет того, что уменьшается вероятность упустить какую-то часть задачи, на которую не обратили внимание при более поверхностной оценке.
1) Сумма независимых распределений хорошо приближается нормальным распределением
2) Распределение Стьюдента при увеличении числа степеней свободы сходится к нормальному
Поэтому для приближения заменим каждое из распределений Стьюдента в формуле (X) на нормальное распределение с той же дисперсией. В итоге получим, что распределение оценки приближается нормальным распределением с математическим ожиданием:
(2) |
и дисперсией:
(3) |
где
S2n, i - выборочная дисперсия (экселевская функция VAR.P) i-ой соответствующей группы исторических данных. Т.е в упрощенной формуле на шаге 3 будет считаться именно выборочная дисперсия.
Здесь стоит заметить, что распределение Стьюдента с n степенями свободы имеет дисперсию только при n >= 3. Поэтому для работы приближенной формулы необходимо, чтобы количество элементов в каждой группе исторических данных было не менее 4. В этом случае шаг 2 меняется следующим образом:
Если группа содержит меньше 4 элементов, объединяем ее с последующей. Если последняя группа содержит меньше 4 элементов, обїединяем ее с предпоследней. Повторяем до тех пор, пока каждая группа не будет содержать не менее 4 элементов. Очевидно, что эта процедура может быть выполнена, если в исторических данных есть не менее 4 оценок.
Небольшое дополнение, позволяющее автоматизировать расчеты. Если исторические данные хранятся в SQL-базе данных, то группировку можно осуществлять SQL-запросом.
Если например они находятся в таблице HistoricalData со столбцами с именами Estimate и Time,
то предварительные данные для расчета среднего и дисперсии можно получить таким запросом:
SELECT [Estimate], COUNT(1) AS [Count], SUM([Time]) AS [Sum], SUM([Time]* [Time]) AS [SumOfSquares] FROM [HistoricalData] GROUP BY [Estimate] ORDER BY [Estimate] |
(4) |
При объединении групп (шаг 2) суммируются количества (столбец Count) и суммы (Sum и SumOfSquares).
После этого среднее и дисперсии в i-ой строке таблицы считаются по таким формулам:
Xi = Sumi/Counti | (5) |
Sn,i2 = (SumOfSquaresi - Sumi2)/Counti | (6) |
Si2 = (SumOfSquaresi - Sumi2)/(Counti-1) | (7) |
Пример расчета оценки с пошаговым разбором
Пусть есть такой набор исторических данных (левая таблица) и набор оценок задач (список справа):
|
4, 4, 3, 5, 4, 5, 15, 5, 12, 3, 4, 2, 3, 1, 4, 4, 8, 4, 3, 1, 2, 3, 8, 8, 3, 8, 8, 4, 8, 1, 1, 16, 5, 3, 5, 6, 2 |
Дадим интервальную оценку времени, которое будет затрачено на выполнение задач справа
Шаг 1. Группируем исторические данные, считая количество сумму и сумму квадратов реальных значений (я здесь воспользовался SQL-запросом (4))
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 | 1 | 2 | 4 |
8 | 22 | 232.5 | 3229.25 |
10 | 4 | 72.5 | 1610.25 |
11 | 1 | 17.5 | 306.25 |
12 | 9 | 104.5 | 1225.25 |
13 | 3 | 45 | 713 |
16 | 5 | 102 | 2174 |
18 | 1 | 18 | 324 |
Шаг 2. Идем по таблице сверху вниз и объединяем каждую строку, в которой количество меньше 4 со следующей, при этом суммируя значения в столбцах Количество, Сумма и Сумма квадратов.
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 | 1 | 2 | 4 |
8 | 22 | 232.5 | 3229.25 |
10 | 4 | 72.5 | 1610.25 |
11 | 1 | 17.5 | 306.25 |
12 | 9 | 104.5 | 1225.25 |
13 | 3 | 45 | 713 |
16 | 5 | 102 | 2174 |
18 | 1 | 18 | 324 |
Строку с оценкой 7 объединим со строкой с оценкой 8
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 - 8 | 23 | 234.5 | 3233.25 |
10 | 4 | 72.5 | 1610.25 |
11 | 1 | 17.5 | 306.25 |
12 | 9 | 104.5 | 1225.25 |
13 | 3 | 45 | 713 |
16 | 5 | 102 | 2174 |
18 | 1 | 18 | 324 |
Строку с оценкой 11 объединим со строкой с оценкой 12
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 - 8 | 23 | 234.5 | 3233.25 |
10 | 4 | 72.5 | 1610.25 |
11 - 12 | 10 | 122 | 1531.5 |
13 | 3 | 45 | 713 |
16 | 5 | 102 | 2174 |
18 | 1 | 18 | 324 |
Строку с оценкой 13 объединим со строкой с оценкой 16
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 - 8 | 23 | 234.5 | 3233.25 |
10 | 4 | 72.5 | 1610.25 |
11 - 12 | 10 | 122 | 1531.5 |
13 - 16 | 8 | 147 | 2887 |
18 | 1 | 18 | 324 |
В последней строке с оценкой 18 количество тоже меньше 4, но поскольку для нее нет следующей строки, объединим ее с предыдущей:
Оценка | Количество | Сумма | Сумма квадратов |
1 | 20 | 36 | 100 |
2 | 19 | 53.5 | 294.75 |
3 | 25 | 94.5 | 596.25 |
4 | 21 | 104 | 672 |
5 | 13 | 106.5 | 1829.75 |
6 | 19 | 129 | 1453 |
7 - 8 | 23 | 234.5 | 3233.25 |
10 | 4 | 72.5 | 1610.25 |
11 - 12 | 10 | 122 | 1531.5 |
13 - 18 | 9 | 165 | 3211 |
Шаг 3. Считаем среднее и выборочную дисперсию в каждой группе:
Оценка | Количество | Сумма | Сумма квадратов | Среднее | Выборочная дисперсия |
1 | 20 | 36 | 100 | 36/20 = 1.8 | 100/20 - 1.82 = 1.76 |
2 | 19 | 53.5 | 294.75 | 53.5/19 = 2.815789474 | 294.75/19 - 2.8157894742 = 7.584487535 |
3 | 25 | 94.5 | 596.25 | 94.5/25 = 3.78 | 596.25/25 - 3.782 = 9.5616 |
4 | 21 | 104 | 672 | 104/21 = 4.952380952 | 672/21 - 4.9523809522 = 7.473922902 |
5 | 13 | 106.5 | 1829.75 | 106.5/13 = 8.192307692 | 1829.75/13 - 8.1923076922 = 73.63609467 |
6 | 19 | 129 | 1453 | 129/19 = 6.789473684 | 1453/19 - 6.7894736842 = 30.3767313 |
7 - 8 | 23 | 234.5 | 3233.25 | 234.5/23 = 10.19565217 | 3233.25/23 - 10.195652172 = 36.62476371 |
10 | 4 | 72.5 | 1610.25 | 72.5/4 = 18.125 | 1610.25/4 - 18.1252 = 74.046875 |
11 - 12 | 10 | 122 | 1531.5 | 122/10 = 12.2 | 1531.5/10 - 12.22 = 4.31 |
13 - 18 | 9 | 165 | 3211 | 165/9 = 18.33333333 | 3211/9 - 18.333333332 = 20.66666667 |
Шаг 4. Группируем оценки новых задач. Напомню список:
4, 4, 3, 5, 4, 5, 15, 5, 12, 3, 4, 2, 3, 1, 4, 4, 8, 4, 3, 1, 2, 3, 8, 8, 3, 8, 8, 4, 8, 1, 1, 16, 5, 3, 5, 6, 2
Если сгруппировать, получится такая таблица:
Оценка | Количество |
1 | 4 |
2 | 3 |
3 | 7 |
4 | 8 |
5 | 5 |
6 | 1 |
8 | 6 |
12 | 1 |
13 | 1 |
16 | 1 |
Шаг 5. Сопоставляем группы исторических данных (слева) и новых задач (справа):
|
|
Соответствующие группы выделены одинаковыми цветами
Теперь объединяем соответствующие строки 2 таблиц, группируя строки правой, если нужно (например последние две):
Оценка | Количество (mi) | Среднее (Xi) | Выборочная дисперсия (S2n, i) | Количество (ni) |
1 | 20 | 1.8 | 1.76 | 4 |
2 | 19 | 2.815789474 | 7.584487535 | 3 |
3 | 25 | 3.78 | 9.5616 | 7 |
4 | 21 | 4.952380952 | 7.473922902 | 8 |
5 | 13 | 8.192307692 | 73.63609467 | 5 |
6 | 19 | 6.789473684 | 30.3767313 | 1 |
7 - 8 | 23 | 10.19565217 | 36.62476371 | 6 |
11 - 12 | 10 | 12.2 | 4.31 | 1 |
13 - 18 | 9 | 18.33333333 | 20.66666667 | 2 |
Далее, по формулам (2) и (3) получаем:
M[E] = 239.5180079
σ2 = 1336.791715
т.е
σ = 36.56216233
Чтобы получить интервальную оценку, используем таблицу квантилей нормального распределения. С 90% вероятностью значение нормально распределенной случайной величины E лежит в пределах M[E]±1,645σ
Таким образом с вероятностью 90% можно утверждать, что время потраченное на планируемые задачи лежит в пределах от 239.5180079-1,645*36.56216233 ≈ 179.37 до 239.5180079+1,645*36.56216233 ≈ 299.66 часов.
т.е
σ = 36.56216233
Чтобы получить интервальную оценку, используем таблицу квантилей нормального распределения. С 90% вероятностью значение нормально распределенной случайной величины E лежит в пределах M[E]±1,645σ
Таким образом с вероятностью 90% можно утверждать, что время потраченное на планируемые задачи лежит в пределах от 239.5180079-1,645*36.56216233 ≈ 179.37 до 239.5180079+1,645*36.56216233 ≈ 299.66 часов.
Практические выводы из расчетов:
Вывод 1. Формула (3) подтверждает практический совет: при планировании задач ставить буфер в конце цикла, а не локально в каждую задачу/требование.
Вывод 2. Исторические данные естественно лучше обновлять по мере работы над проектом. А именно, сделанные задачи пополняют множество исторических данных. И вот тут полезно использовать таблицу, полученную после первичной группировки на шаге 1. Сделанные задачи обновляют строки этой таблицы (увеличивая количество, сумму или сумму квадратов) или вставляют новые. Таким образом исторические данные могут считаются "кумулятивно", что позволяет не выполнять полную обработку всей истории каждый раз, когда нужно оценить новый набор задач. Достаточно один раз получить небольшую таблицу и обновлять ее по мере накопления исторических данных.
Вывод 3. Задачи с большими оценками вносят значительный вклад в погрешность общей оценки. Из формулы (3) видны 2 причины этого:
- Большое значение S2n, i. Это понятно, так как при оценке больших задач и погрешность оценки больше.
- Небольшое количество таких задач mi в исторических данных
Поэтому при оценках больших задач лучше разбивать их на задачи поменьше. Сама процедура разбиения помогает понять, что же нужно сделать в задаче и уточнить оценку просто за счет того, что уменьшается вероятность упустить какую-то часть задачи, на которую не обратили внимание при более поверхностной оценке.
Комментариев нет:
Отправить комментарий