183. Сроки и люди: бригада, опоздание, оценка по трём точкам
Прошивка отличается от кода на компьютере тем, что её нельзя выпустить «частично»: плата либо работает у заказчика, либо нет. Поэтому сроки здесь считают, а не назначают. Раздел — про три вещи, которые ломают любой план: связь внутри бригады, помощь опаздывающему проекту и однобокая оценка «сколько это займёт».
Числа — модель _verify/soft183/schedule.py с явными допущениями;
случайность есть только в прогоне графика, и она закреплена зерном, так
что прогон повторяется числом в число.
Как это называется в документации
Оригинал Перевод effort, man-hours трудоёмкость, человеко-часы communication overhead накладные расходы на связь ramp-up выход новичка на полную отдачу critical path критический путь three-point estimate оценка по трём точкам optimistic / most likely / pessimistic оптимистичная, вероятная, пессимистичная оценка Monte-Carlo simulation прогон со случайными длительностями merge bias потеря от схождения путей percentile, P90 процентиль, срок с запасом 90 % milestone контрольная точка
183.1 Почему бригада не складывается
Допущение: каждый человек даёт 30 полезных часов в неделю, а каждая
пара людей тратит 4 часа в неделю на согласование — созвоны, обсуждения,
разбор чужого кода. Пар в бригаде из n человек ровно n(n−1)/2:
P(n) = 30·n − 4·n(n−1)/2
| Человек | Полезных часов в неделю | На человека |
|---|---|---|
| 1 | 30 | 30,0 |
| 2 | 56 | 28,0 |
| 3 | 78 | 26,0 |
| 4 | 96 | 24,0 |
| 6 | 120 | 20,0 |
| 8 | 128 | 16,0 |
| 10 | 120 | 12,0 |
| 12 | 96 | 8,0 |
Максимум — 8 человек, 128 часов в неделю. Девятый и десятый человек не добавляют ничего, а двенадцатый отбрасывает бригаду к уровню четырёх. Числа зависят от допущений, но форма кривой — нет: линейный рост минус квадратичные потери всегда даёт горб.
Практический вывод не «работать в одиночку», а резать связи: если бригада делится на две группы по четыре человека с одним согласованным стыком между ними, то пар внутри групп 6 + 6 вместо 28. Для прошивки такие стыки естественны: границы модулей, формат кадра, карта регистров.
183.2 Помощь опаздывающему проекту
Допущения: осталось 2400 полезных часов работы, в бригаде 6 человек, новичок выходит на полную отдачу за 4 недели (первую неделю даёт четверть своей нормы) и всё это время забирает у наставника 8 часов в неделю.
| Что сделали на 8-й неделе | Срок |
|---|---|
| ничего не меняли | 20 недель |
| добавили 2 человек | 21 неделя |
| добавили 3 человек | 22 недели |
| добавили 6 человек | 27 недель |
Каждая добавка отодвигает окончание. После обучения два новичка действительно ускоряют бригаду — 128 часов в неделю против 120, три — уже только до 126, а шесть замедляют её навсегда: 12 человек дают 96 часов (183.1). Потери обучения и новые каналы связи съедают больше, чем приносит прибавка, и чем ближе к концу добавляют людей, тем меньше остаётся времени отбить вложение.
Что работает вместо добавления людей: урезать объём (какие требования переносятся в следующую версию), снять с бригады всё, что не ведёт к сдаче, и признать новый срок — то есть ровно то, что делают неохотно.
183.3 Оценка по трём точкам
Одно число «две недели» — это обещание, у которого нет вероятности.
Оценка по трём точкам даёт оптимистичную о, вероятную м и
пессимистичную п; дальше длительность считается распределённой
треугольником со средним (о + м + п) / 3 и дисперсией
(о² + м² + п² − о·м − о·п − м·п) / 18.
| Задача | о | м | п | Среднее |
|---|---|---|---|---|
| требования | 1 | 2 | 4 | 2,33 |
| схемотехника | 4 | 5 | 8 | 5,67 |
| плата | 3 | 4 | 6 | 4,33 |
| скелет прошивки | 1 | 2 | 3 | 2,00 |
| драйверы | 3 | 5 | 9 | 5,67 |
| стенд и тесты | 4 | 5 | 8 | 5,67 |
| интеграция | 1 | 2 | 5 | 2,67 |
| приёмка | 1 | 2 | 4 | 2,33 |
Важна не только середина, но и разброс: у драйверов от 3 до 9 недель, а у скелета — от 1 до 3. Задача с широким разбросом опасна, даже если её среднее невелико.
183.4 Три цепочки и срок 15 недель
В нашем проекте до сдачи ведут три цепочки:
| Цепочка | Среднее | Разброс | В срок 15 недель |
|---|---|---|---|
| требования → скелет → драйверы → интеграция → приёмка | 15,0 | ±1,8 | 50 % |
| требования → скелет → стенд и тесты → интеграция → приёмка | 15,0 | ±1,5 | 50 % |
| схемотехника → плата → интеграция → приёмка | 15,0 | ±1,5 | 50 % |
Каждая по отдельности успевает в половине случаев. Но сдача требует, чтобы успели все три сразу, а прогон всего графика 200 000 раз (зерно 2026) даёт другую картину:
| Величина | Значение |
|---|---|
| среднее окончание | 16,0 недели |
| медиана | 15,9 недели |
| срок с запасом 90 % | 17,9 недели |
| доля прогонов в срок 15 недель | 25,7 % |
Это и есть потеря от схождения путей: проект ждёт самую медленную из цепочек, поэтому его срок хуже, чем у каждой из них. Средний срок проекта — 16,0 недели, хотя у каждой цепочки среднее ровно 15,0.
Отсюда рабочий приём: обещать не среднее, а процентиль. Если нужен срок, который выдержим в девяти случаях из десяти, это 17,9 недели, а не 15. Разница в три недели складывается из двух частей. Большая — разброс самих задач: даже одна цепочка с разбросом ±1,8 на уровне 90 % даёт 17,4 недели. Остальные 0,5 недели — цена того, что путей три; к среднему схождение добавляет целую неделю — 16,0 против 15,0. Поэтому процентиль обещают и тогда, когда путь один.
183.5 Что с этим делать
- Резать связи, а не набирать людей. Две группы по четыре человека с одним согласованным стыком тратят на связь 12 пар вместо 28.
- Сокращать объём, а не срок. Урезанное требование экономит часы честно, а обещанный срок без часов — нет.
- Держать разброс на виду. Задача «драйверы: от 3 до 9 недель» требует ранней проверки: сделать скелет драйвера на первой неделе, чтобы сузить оценку.
- Считать критический путь заново каждую неделю. Цепочка, которая была не критической, становится ею после первой же задержки — в модели все три цепочки равны, и лидер меняется от прогона к прогону.
- Обещать процентиль. «17,9 недели с вероятностью 90 %» — это обещание, которое можно выполнить; «15 недель» при тех же задачах выполняется в четверти случаев.
183.6 Грабли
«Добавим людей — нагоним». Модель даёт 21 неделю вместо 20 при двух новичках и 27 при шести. Помощь помогает в начале проекта, а не перед сдачей.
Оценку даёт тот, кто не будет делать работу. Тогда это не оценка, а пожелание; трёх точек у такой оценки нет.
Сумма средних выдаётся за срок проекта. У схождения путей своя цена: три цепочки по 15,0 недели дают проект со средним 16,0 и вероятностью успеть к 15-й неделе 25,7 %.
Резерв прячут внутрь задач. Спрятанный запас расходуется всегда (работа занимает всё отведённое время), а общий резерв в конце — только по необходимости.
План не пересчитывают. График, который не обновляли после первой задержки, показывает прошлое, а не будущее.
183.7 Итоги
- Потери на связь растут как
n(n−1)/2: при 30 часах с человека и 4 часах на пару максимум бригады — 8 человек и 128 часов в неделю, а 12 человек дают столько же, сколько 4. - Добавление людей в опаздывающий проект отодвигает срок: 21 и 27 недель вместо 20 при двух и шести новичках.
- Оценка по трём точкам даёт среднее и разброс; задачи с широким разбросом проверяют раньше остальных.
- Схождение путей дороже, чем кажется: три цепочки по 15,0 недели дают 25,7 % вероятности успеть к 15-й неделе и 17,9 недели на уровне 90 % — против 17,4 у одной цепочки; процентиль обещают и при одном пути.
Дальше: раздел 184 «Тестирование прошивки: уровни, покрытие, мутации, санитайзеры».