Как использовать метрику потока 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')}")
ссылка на оригинал статьи https://habr.com/ru/articles/940882/
Добавить комментарий