Как использовать метрику потока Throughput и реалистично прогнозировать на основе симуляции Монте-Карло. Разберем динамику Throughput (пропускной способности) за значимые периоды времени, насколько она вариативна, посмотрим на кластеризацию по типам работы).
Преамбула
Заходишь убитый в пятницу в бар. Заказываешь пивной сет. Официант обдумывает в голове: "За последний час я у нас было приготовлено 12 заказов, сейчас в работе 4 заказа, новый сет будет пятый в очереди", а потом информирует нас: "Ваш заказ подадут через 20-25 минут."

Никаких субъективных оценок сложности, просто прикинул исторические данные и сделал прогноз. Голубая мечта - чтобы IT-команда планировала так же просто, честно и (относительно) предсказуемо. Мы можем попробовать приблизиться к таким прогнозам.
Вот и пост максимально практический, с паттернами и примерами. Цель не показать метрику и прогнозирование на его основе его как ультимативный silver-bullet, а дать понимание что можно и так. Тема довольно актуальная, так как сейчас в США и Европе расцвет прогнозирования на основе именно метрик потока и появляется много плагинов с Монте-Карло (но не все из них доступны в РФ).
Throughput (пропускная способность) - одна из главных метрик потока

Throughput — количество завершённых задач за период времени. Если команда закрыла 8 задач за неделю, throughput = 8 задач/неделю. Очень просто, объективно, невозможно подделать (но при желании всегда можно хакнуть).
Или вот: команда завершила 15 user stories за 2 недели → throughput = 7.5 историй/неделю.
Другие метрики потока - Cycle Time, Lead Time.
Три среза, через которые мы анализируем Throughput
Временные периоды
Важно понимать, какой временной период для вас значим и достаточно ли его для анализа.
Мы с вами часто считаем Velocity на уровне спринта. Будь то количество готовых элементов или пресловутых Story Points. Считать Velocity в спринте статистически недостаточно. Это всего лишь 26 точек данных в год (если у вас двухнедельные спринты) - самый минимум для базового анализа. Но на таком масштабе не видно внутренних паттернов.
Зато если замерять
Ежедневно: 260 точек/год — становятся видны паттерны по дням недели
Еженедельно: 52 точки/год — достаточно для трендов


Пример паттернов внутри недели:
Понедельник: 0 задач (планирование)
Вторник: 1 задача (разгон)
Среда: 3 задачи (пик продуктивности)
Четверг: 2 задачи (код-ревью)
Пятница: 2 задачи (релиз)
Интерактивный пример с демо-данными можно посмотреть здесь - как меняются паттерны на масштабе.
Скажу очевидное: у Throughput может - может расти, может снижаться. На то могут быть разные причины, от роста команды до декомиссии сервиса или продукта. Но для предсказуемости нам важен другой аспект: стабильность.
Variance: математический индикатор стабильности

Нам нужна команда, по работе которой можно делать прогнозы. Соответственно, для предсказуемости нам важнее смотреть на Коэффициент Вариации. Ведь если скорость скачет - наш прогноз будет ненадежен.
Variance (коэффициент вариации) = (Стандартное отклонение* / Среднее*) × 100%
*за последние 4-8 периодов. В идеале
Коэффициент Вариации показывает стабильность throughput:
< 15% — очень стабильно
15-30% — достаточно стабильно
30-50% — требует внимания
> 50% — критическая нестабильность
То есть в последнем случае, наша команда запилит X задач +-50%. Не очень надежно.
Примеры разной вариативности: "Американские горки" (Variance 87%)
Недели: 15 → 2 → 18 → 1 → 16 задач
Признак неконтролируемого процесса.
"Высокая предсказуемость" (Variance 12%)
Недели: 7 → 8 → 6 → 7 → 8 задач
Хорошая прогнозируемость
Распределение по типам работы
Очевидно, что типы работы влияют на количество завершенных элементов. Если вы завершаете 4-5 сторей побольше, или 10-15 багов поменьше. Поэтому, мы смотрим не только на временные тренды Throughput, но и на распределение по типам задач.

Метрика не говорит что команда "хорошая" или "плохая"
Самое главное — понимать, достигает ли команда поставленных целей. Потому что у вас все метрики могут выглядеть прекрасно и предсказуемо, а делать вы будете не то.

Стабильный или растущий Throughput сам по себе не указывает на положительные или отрицательные характеристики команды. И наоборот, колебания Throughput не обязательно говорят о нестабильности.
Поэтому метрики без балансирующих индикаторов не стоит засовывать в цели команде.
Throughput служит лишь входной точкой для анализа и оптимизации, если возникает такая потребность. Для полноценной оценки важно учитывать также WIP, различные показатели Cycle Time и выходить за рамки процессных метрик — анализировать сбои системы, за которую отвечает команда.
Потому что все метрики связаны законом Литтла.
Закон Литтла - универсальная закономерность в метриках потока
В метриках потока показатели связаны и на них надо смотреть вместе. Наш с вам пост сегодня затронул только Throughput, без Lead Time и WIP. Но работая с одной метрикой вы влияете на другие. Закон Литтла - это фундаментальная теорема теории очередей.
Lead Time = WIP / Throughput
WIP — незавершенные задачи в работе одновременно
Throughput — количество завершенных элементов
Lead Time — время от принятия обязательств до доступности ценности для клиента

Важно: все расчёты throughput, анализа потока и любые симуляции Монте-Карло работают только при наличии ограничения на количество одновременно выполняемых задач — WIP-лимита, хотя бы по верхнему пределу. Если WIP не ограничен (и вы можете напихивать бесконечное количество задач в работу), система становится хаотичной, поток нельзя анализировать, а любые прогнозы становятся ненадежными.
Monte Carlo Simulation для вероятностных прогнозов
Когда мы говорим про прогнозы, мы всегда учитываем три фактора:
Вероятность
Разброс
Предположение, что в будущем мы делаем примерно такую же работу.
Поэтому некорректно было бы делать прогнозы в стиле "Этот эпик (в 10 задач) сделаем ровно за 6 недель". А корректнее было бы сказать "10 задач за 5-7 недель*"
5 недель = 50% всех симуляций заканчивалось за это время или раньше
7 недель = 85% всех симуляций заканчивалось за это время или раньше
Как вообще работает Monte Carlo Simulation?
Берём историю throughput:
Симулируем 1,000 - 10,000 сценариев
Получаем распределение вероятностей

Например, для 10 задач:
50% вероятность: 39 дней
85% вероятность: 50 дней
95% вероятность: 58 дней

Приходим к бизнесу и явно оговариваем, что: "Наш прогноз: 4-6 недель". Если нужно, проясняем.
85pp - более надежный и безопасный прогноз, судя по нашим историческим данным мы почти наверняка закроем работу за это время.
При этом Дэниел Ваканти (автор Actionable Agile Metrics) говорит что в целом планироваться можно и по 50pp (медианной вероятности).
Чем более предсказуемая ваша команда (чем ниже вариация) - тем ближе 50 и 85 перцентили в прогнозах. Тем точнее ваши прогнозы.
На качество прогнозов влияет:
Нарезка задач (предпочтительно, если она вертикальная: end-2-end, включающая в себя все этапы всегда предпочтительнее. Но и с компонентной нарезкой (отдельно FE, BE, QA тоже можно строить прогнозы, просто они хуже по качеству).
Промежуток времени, на основе которого вы строите прогноз.
Не стоит прогнозировать на данных от 6+ месяцев в прошлое. Каждые полгода работа у большинства команд либо существенно меняется, либо могут быть изменения в составе.
Всегда учитывайте в прогнозе дни с нулевым Throughput, это базовый паттерн работы команды.
Прогнозы всегда по календарным дням, а не про рабочим. Благодаря этому мы всегда учитываем праздники/выходные/больничные и все что влияет на результат.
Прогнозы, построенные на симуляциях Монте-Карло, имеют смысл только если команда соблюдает ограничения на количество “висящей” работы (WIP-лимиты).

Ну и не забываем, что нам важнее всего обновлять прогноз каждую неделю-две. В мире слишком много влияющих факторов, чтобы быть уверенным в своем прогнозе пару недель спустя.
"Но Throughput же не репрезентативен, у меня в работе разные типы и разные размеры задач!" - скажете вы.
Ключевое преимущество throughput заключается в том, что эта метрика автоматически учитывает всю гетерогенность типов работы и их размерность через действие Закона Больших Чисел. При достаточном количестве завершённых элементов работы случайная вариабельность от различий в типах задач, их сложности и размерах статистически сглаживается, обеспечивая сходимость к устойчивому среднему значению производительности. IBM Jazz делали подобные исследования на своих датасетах.
Поиграть с симуляцией Монте-Карло на демо-данных можно в соответствующем разделе на predictable.team
Почему Story Points не решают проблем с прогнозируемостью
Давайте обратим, наконец, внимание на слона в команате - зачем это все надо если есть Story Points?
Дело в том, что SP не имеют корреляции с реальным временем выполнения, так как это относительная величина. То есть 5 SP часто делается за время 2 SP, а задачи, оцененные на 8 SP скачут между абсолютным временем.
Об этом пишет, например University College London (PhD Vali Tawosi, 2023): анализ 500,000+ задач показал отсутствие корреляции между story points и реальным временем разработки. У Daniel Vacanti есть похожий кейс в Siemens.

Ну и вишенка на торте, у Vasco Duarte - автора NoEstimates, был эксперимент: "Что произойдет с прогнозами, если убрать всю информацию о стори поинтах? Что будет, если все те двойки, тройки, пятерки, восьмерки, тринадцатки превратить в единицы?" - прогнозы с SP отклонились на 20% от финального результата, а по количеству задач - на 4%. Основной вывод - прогнозирование по количеству рабочих элементов дает качество не хуже или лучше, причем требует меньше ресурсов.
Более того, на опыте больших организаций и финтехов, да и стартапов поменьше, SP обычно использует половина или чуть больше команд. Причем все используют по разному (если только у них нет хороших Scrum Master / Agile Coach ролей, которых высаживать в каждую команду очень дорого).
В итоге
Мы посмотрели на базовую метрику потока "Throughput" (пропускная способность). Подсветили что смотреть на нее надо не в статике, а в динамике и за значимые периоды времени, кластеризуя по типам работы, анализируя вариативность.
Мы не используем метрики для того чтобы тыкать какая команда хорошая, а какая плохая. Это входная точка для дальнейшего анализа.
Но на основе этой метрики можно строить прогнозы методом симуляции Монте Карло двух типов:
Когда команда завершит "Х" задач.
Сколько работы брать в следующие неделю/спринт/месяц.
Но важно, чтобы ваша система была контролируема. Так что должен быть WIP-лимит (хотя бы по верхней планке). Нет лимита — нет управляемости, нет предсказуемости. Буквальная цитата из книжки:
“No WIP limit = no flow, which means no predictability — don’t bother with Monte Carlo simulations if you don’t control WIP”
Daniel Vacanti
Инструменты визуализации
Jira Metrics Plugin - безопасно работающий с данными плагин для хрома. Визуализация Throughput и других метрик прямо в вашей Jira.
Predictable Team - stateless анализатор CSV (выгруженных из jira или youtrack). Визуализация Throughput из файла + симуляция Монте-Карло + рекомендации на основе ваших данных.
Jira Helper от Паши Ахметчанова. Умеет во много метрик, включая Throughput.
TWIG от Actionable Agile. Один из стандартов индустрии, метрики + монте-карло, но без VPN не работает в РФ.
Python example
Небольшой пример от не-программиста, как построить прогноз если у вас уже есть датасет исторических данных по Throughput.
import random
import numpy as np
from datetime import datetime, timedelta
from typing import List, Tuple
def monte_carlo_when_simulation(
historical_throughput: List[int], # Исторические данные пропускной способности (items per week)
target_items: int, # Сколько задач нужно завершить
simulation_count: int = 5000 # Количество симуляций
) -> dict:
"""
Monte Carlo симуляция для ответа на вопрос:
"Когда мы завершим X задач?"
Возвращает количество недель до завершения
"""
results = []
for _ in range(simulation_count):
remaining_items = target_items
weeks_elapsed = 0
while remaining_items > 0:
# Случайно выбираем пропускную способность из исторических данных
weekly_throughput = random.choice(historical_throughput)
# Вычитаем завершенные задачи
remaining_items -= weekly_throughput
weeks_elapsed += 1
# Защита от бесконечного цикла (если пропускная способность очень низкая)
if weeks_elapsed > 200: # ~4 года максимум
break
results.append(weeks_elapsed)
# Вычисляем статистики
results.sort()
return {
'outcomes': results,
'percentiles': {
'p50': np.percentile(results, 50), # 50% вероятность завершить к этому времени
'p85': np.percentile(results, 85), # 85% вероятность
'p95': np.percentile(results, 95), # 95% вероятность
},
'mean': np.mean(results),
'std_dev': np.std(results),
'min': min(results),
'max': max(results)
}
# Пример использования
if __name__ == "__main__":
# Исторические данные: сколько задач команда завершала каждую неделю
historical_throughput = [3, 5, 4, 2, 6, 4, 3, 5, 7, 2, 4, 6, 3, 5, 4, 8, 2, 5, 4, 3]
# Хотим понять: когда завершим 50 задач?
target_items = 50
# Запускаем симуляцию
result = monte_carlo_when_simulation(
historical_throughput=historical_throughput,
target_items=target_items,
simulation_count=5000
)
print(f"Monte Carlo прогноз для завершения {target_items} задач:")
print(f"50% вероятность завершить за: {result['percentiles']['p50']:.1f} недель")
print(f"85% вероятность завершить за: {result['percentiles']['p85']:.1f} недель")
print(f"95% вероятность завершить за: {result['percentiles']['p95']:.1f} недель")
print(f"Среднее время: {result['mean']:.1f} недель")
print(f"Стандартное отклонение: {result['std_dev']:.1f} недель")
print(f"Диапазон: {result['min']} - {result['max']} недель")
# Конвертируем в календарные даты
today = datetime.now()
print(f"\nКалендарные прогнозы (от {today.strftime('%d.%m.%Y')}):")
print(f"50% уверенности: {(today + timedelta(weeks=result['percentiles']['p50'])).strftime('%d.%m.%Y')}")
print(f"85% уверенности: {(today + timedelta(weeks=result['percentiles']['p85'])).strftime('%d.%m.%Y')}")
print(f"95% уверенности: {(today + timedelta(weeks=result['percentiles']['p95'])).strftime('%d.%m.%Y')}")
Комментарии (8)
akakoychenko
02.09.2025 06:19...и, почему-то, мне кажется, что, точно так же, как и на фондовом рынке, коррелируемость задач между собой приведёт к тому, что такая оценка не покроет тяжёлые хвосты.
Поясню проще: в моем опыте главные проколы по срокам возникали не из-за того, что отдельные задачи делались дольше, а из-за того, что по мере реализации вскрывались принципиальные требования к системе, которые невозможно было вскрыть на этапе бизнес-анализа. Соответственно, когда такое событие наступает, то нарастает снежный ком. Критичное непопадание одной задачи в срок ведёт не только к тому, что другие задачи ждут ее, но ещё и к тому, что они теперь тоже потребуют больше времени, ибо та, первая проблемная задача, была сделана сложнее и объёмнее, чем в плане. И так по цепочке
Eskimo Автор
02.09.2025 06:19Это всегда так. Именно поэтому мы обновляем прогноз каждую итерацию (раз в две недели, например). Мы можем построить прогноз на throughput + wip + Lead Time (в predictable.team есть epic forecasting в Monte Carlo, там можно тыкнуть на +1 эпик и наполнить его в соответствии с вашими задачами. Тогда разброс в прогнозе будет учитывать одновременное историческое количество элементов в работе + параллельную работу + Lead Time и 50 и 85 перцентилей). Тогда ваша историческая информация о времени завершения задач будет учитывать и хвосты.
S_A
02.09.2025 06:19Да у вас похоже bootstrap, а не MC.
Eskimo Автор
02.09.2025 06:19это про UI?
S_A
02.09.2025 06:19нет, про статистику.
В целом по статье - мне понравилось:
что не SP, а задачи заходят достаточно,
в целом про интервальные истории. точечные оценки в теории вероятностей имеют вероятность 0 для непрерывнозначащих случайных величин.
random.choice все же больше похож на стат. метод бутстрэп. когда для оценки интервалов статистики используют подвыборки. так, придирка. монте-карлой было бы если бы вы взяли распределение, извлекли бы из выборки его параметры, потом бы сэмплили.
тут все это не сказать что край как принципиально. идейно все ок
Eskimo Автор
02.09.2025 06:19А, я с радостью погуглю и поизучаю, спасибо. Вы первый, кто дал такой коммент :)
MEGA_Nexus
Основная проблема не в угадывании сроков реализации, а в том, что реальные сроки всегда выше, чем ожидания. Всем хочется закончить проект как можно раньше и желательно с минимальными затратами бюджета.
Говоришь, что проект займёт 3 месяца, а в ответ слышишь, что другая компания ему пообещала сделать всё за месяц. В результате проект уходит другой компании, которая делает проект уже полгода с постоянными переносами срока его окончания.
Eskimo Автор
Это если у вас тендеры и аутсорс, наверное? Взаимоотношения между компаниями, предоставляющими и потребляющими услуги всегда разные. Звучит как совсем другая (хоть и очень наболевшая) проблема :)
Но мы тут говорим что прогноз первоначальный всегда надо обновлять, просто есть стат данные в не-аутсорс компаниях что на основе этой метрики считать честнее и корректнее.
А так - всегда есть миллион факторов, которые влияют на прогнозы, потому и обновляем. Также как в метеорологии первоначальные прогнозы никогда не сбываются, и они дают их с уверенностью в 30%.
В АйТи параметров прогноза меньше, но без обновления все равно никуда.