Embedded HandbookПриложения
Все разделы › XXII. Программная инженерия
STM32F103, STM32F407, STM32G431, STM32L431 · уровень средний · 6 мин чтения
Открыть в интерактивном справочнике

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. Поэтому процентиль обещают и тогда, когда путь один.

Когда закончится проект: 200 000 прогонов графика


183.5 Что с этим делать


183.6 Грабли

«Добавим людей — нагоним». Модель даёт 21 неделю вместо 20 при двух новичках и 27 при шести. Помощь помогает в начале проекта, а не перед сдачей.

Оценку даёт тот, кто не будет делать работу. Тогда это не оценка, а пожелание; трёх точек у такой оценки нет.

Сумма средних выдаётся за срок проекта. У схождения путей своя цена: три цепочки по 15,0 недели дают проект со средним 16,0 и вероятностью успеть к 15-й неделе 25,7 %.

Резерв прячут внутрь задач. Спрятанный запас расходуется всегда (работа занимает всё отведённое время), а общий резерв в конце — только по необходимости.

План не пересчитывают. График, который не обновляли после первой задержки, показывает прошлое, а не будущее.


183.7 Итоги

Дальше: раздел 184 «Тестирование прошивки: уровни, покрытие, мутации, санитайзеры».

Открыть в интерактивном справочнике