The Principles of Product Development Flow, пост 7 — очереди и capacity utilization

🔬 Это пост с разбором очередной части книги Дона Рейнертсена The Principles of Product Development Flow. Книга рассказывает, как правильно принимать решения при разработке продуктов и не помереть раньше времени. Все посты — по тегу pdflow.

Цитата из предыдущего поста:

Рейнертсен считает, что очереди — одна из главных причин задержек в продуктовой разработке, а работать с ними мало кто умеет.

Рассмотрим два первых принципа — про то, почему очереди вредны и почему с ними никто не борется.

Q1: The Principle of Invisible Inventory: Product development inventory is physically and financially invisible

Очереди в продуктовой разработке невидимы.

На физическом производстве очереди заметны: если перед станком скопились детали на обработку — что-то идет не так. Если партия станков не завершена — это есть в отчетах, и финдиректор может сказать, сколько всего на заводе «незавершенки» (WIP — Work In Progress).

В разработке физических деталей нет. Работа ведется над информацией — схемами, чертежами, спецификациями, тасками, юзер-сторями и прочими эпиками. О том, сколько таких артефактов распихано по джирам и фигмам — финансовому директору точно неведомо. Артефакты такого рода Дон называет DIP — Design In Progress.

Такая физическая и финансовая невидимость артефактов проектирования не позволяет привычным образом оценить, а сколько же их у нас в работе и в какие очереди они выстроились. Не умея их обнаружить, мы не можем вычислить их влияние на экономику разрабатываемого продукта.

Q2: The Principle of Queueing Waste: Queues are the root cause of the majority of economic waste in product development

Здесь и далее я буду переводить термин «waste» из бережливого менеджмента как «непродуктивные затраты». Такой перевод излишне длинный, зато более конкретный, чем «потери».

Дон рубит сплеча: очереди — основной источник потерь и непродуктивных затрат в продуктовой разработке.

Во-первых, очереди в разработке продуктов гораздо длиннее очередей в производстве. Горизонты в производстве — часы и дни, в разработке — месяцы и годы. Заготовка или деталь точно будут обработаны если не завтра, то через пару дней — а дизайн-артефакт может два месяца ждать, пока конструкторский отдел до него доберется в списке своих работ.

Из Q1 мы знаем, что очереди в разработке продуктов невидимы — а значит, никто за ними не следит и никто не старается сократить. Более того, в компаниях, занимающихся разработкой, иногда принято хвалиться размерами своего бэклога — «у нас до следующего января отдел разработки занят».

Во-вторых, очереди создают много непродуктивных затрат.
Источники затрат:

  • Увеличение цикла разработки: чем длиннее очередь — тем дольше рабочий продукт будет ждать, пока за него возьмутся. Если мы знаем про очереди, мы можем придумать, как спрогнозировать и посчитать потери от ожидания.
  • Рост рисков: этапы обработки рабочих продуктов разделены длительным временем ожидания, поэтому растут риски. Чем дольше мы ждем — тем выше вероятность, что могут произойти нежелательные изменения на рынке, у конкурентов или в используемых технологиях.
  • Увеличение вариабельности: когда мы сильно нагружаем наши мощности по разработке, сильно растет вариабельность.
  • Увеличение накладных расходов: чем больше РП сидит в очередях — тем длиннее очереди, больше встреч и отчетов.
  • Снижение качества: из-за очередей мы получаем фидбек о сделанной работе позже. Если программист начал писать код исходя из неверных предпосылок и получил фидбек на следующий день — можно быстро откатиться и исправить. Если фидбек придет только через неделю, то придется выкинуть результаты нескольких дней работы.
  • Снижение мотивации: нет необходимости торопиться и пилить дизайны для приложения за день или два, если продакт сможет посмотреть их только через неделю.

В конце этой главы Дон подчеркивает, что мнение «очереди вне критического пути не стоят компании денег» — ошибочное. Вышеописанные источники проблем показывают, что это не так: лишь один из них — увеличение времени цикла, — удлиняет критический путь и повышает стоимость задержки; остальные пять источников проблем вполне могут касаться процессов, не лежащих на критическом пути, но способных сильно навредить.

Поведение очередей

Дальше Дон предлагает обсудить, как загрузка мощностей и вариабельность влияют на размер очередей.

Что такое Capacity Utilization

Capacity utilization здесь и далее я буду называть «загрузкой мощностей». Прежде, чем перейти к принципу Q3, который полностью про загрузку мощностей, нужно бы определиться, о каких таких мощностях идет речь.

Сам Рейнертсен не дает определения, разве что вскользь упоминает:

...capacity utilization is the ratio of two factors, demand and capacity, that are individually hard to estimate.

Мощность, или capacity — это некоторый показатель того, сколько полезной работы ресурс сможет проделать в единицу времени.
Скажем, у программиста в рабочем дне восемь часов; из них час уходит на синки, два часа — на созвоны и встречи, оставшиеся пять часов посвящены работе над продуктовыми задачами. Значит, мощность/капасити программиста — 5 часов. Если он все пять часов работает над одним продуктом, то загрузка его мощности будет 100%.
Если у нас не один программист, а отдел из 10 человек, и 8 из них постоянно заняты в разработке — мы можем сказать, что загрузка мощностей составляет 80%.

В статье Six Myths Of Product Development (HBR, 2012) Рейнертсен и его соавтор Штефан Томске в качестве первого мифа приводят следующий:

  1. High utilization of resources will make the department more efficient.

Поскольку это миф, то читаем наоборот: полная загрузка мощностей отдела не улучшит, а ухудшит общий результат компании.
Вот те раз.

Дон и Штефан объясняют это следующим: продуктовая разработка — это деятельность с высокой степенью неопределенности (высокой вариабельностью). На старте проекта непонятно, какие задачи потребуется решить, сколько времени займет их решение и как с ними справится команда. Если команда занята на сто процентов, свежеприбыашая задача встанет в очередь на ожидание.
В разработке задачи прибывают из разных источников, не всегда предсказуемо, среди них могут быть срочные и важные. Держать их в очереди рискованно: может быть упущено оптимальное временное окно и задача утратит смысл, не получится улучшить продуктовую экономику.

Да, некоторым менеджерам будет невыносимо видеть, что двое из десяти разработчиков заняты ерундой вместо разработки — спеки причесывают или код рефакторят. И на уровне подразделения, изолированного от остальных отделов компании, эти два программиста испортят статистику. Зато они готовы будут подхватить срочную и важную задачу, когда она внезапно прилетит — и не провалить проект в целом, что скажется на результатах всей компании. Их нужно воспринимать как буферный запас, который работает на глобальный оптимум в ущерб локальному.

Правило, однако, не звучит как «всегда держите Х% мощности в резерве». Правило звучит так:

С помощью экономического фреймворка следует сопоставить стоимость очереди и стоимость неиспользуемых мощностей, чтобы найти правильный баланс.

Загрузка мощностей (capacity utilisation) обозначается буквой «ро» — ρ и вычисляется следующим образом:

ρ = λ / μ

где λ — интенсивность поступления задач (например, количество задач в единицу времени), а μ — интенсивность обработки задач (пропускная способность ресурса, например, количество задач, которые система может обработать в единицу времени).

Пример 1: Оператор в кол-центре

  • Один оператор может обслужить 10 звонков в час (μ = 10).
  • В среднем поступает 8 звонков в час (λ = 8).
  • Загрузка: ρ = 8/10 = 0,8 (80%)

Ресурс работает с 80%-й загрузкой, что считается безопасным уровнем.

Пример 2: Конвейерная линия

  • Линия может обрабатывать 100 деталей в час (μ = 100 ).
  • Поступает 120 деталей в час (λ = 120 ).
  • Загрузка: ρ = 120/100 = 1,2 (120%)

Система перегружена, что приводит к появлению очередей.

Про детальные правила расчета можно почитать, например, в курсе ШСМ «Рациональная работа» по ссылке.

При разработке продукта сложно оценить загрузку мощностей с достаточной точностью. Сложность эта возникает потому, что загрузка мощностей — это соотношение двух факторов, спроса и запаса мощностей, каждый из которых сложно оценить.
«Спрос» в данном случае — это работы, которые необходимо выполнить для решения задачи. Эти работы раньше не выполнялись, они для сотрудника новые. С оценкой трудоемкости таких работ легко можно промахнуться, скажем, на 10%.
«Мощности» в данном случае — это производительность сотрудника в решении поставленной задачи, которую он никогда не выполнял ранее. При ее оценке тоже запросто можно ошибиться на 10%.

Две ошибки по 10% каждая дают нам в комбинации возможный диапазон загрузки мощностей от 55 до 95%. То есть наш сотрудник то ли наполовину свободен, то ли полностью занят. Если мы будем вычислять очереди исходя из такого широкого диапазона, разница между крайними значениями может составить до 25 раз.

Результат будет точнее, если измерять размер очереди и работу в процессе (WIP). Об этом в следующих постах.

Q3: The Principle of Queueing Capacity Utilization: Capacity utilization increases queues exponentially

С увеличением загрузки мощностей очереди растут экспоненциально.

Высокую загрузку мощностей Дон называет главной причиной роста очередей. За тринадцать лет преподавания он вывел, что средняя компания-разработчик загружает свои мощности примерно на 98,5%.

Кривая зависимости времени цикла от загрузки мощностей для очередей типа M/M/1/∞ выглядит так:

При уменьшении доступных мощностей в два раза очередь тоже растет примерно в два раза. Когда мы увеличиваем загрузку мощностей с 60 до 80 процентов — очереди удваиваются (с 2 до 4), после увеличения загрузки с 80 процентов до 90 — еще раз удваиваются, с 4 до 9.

Отделы продуктовой разработки склонны загружать мощности до уровня, допустимого в детерминистических процессах (= практически лишенных вариабельности). Это означает, что любая новая задача — важная, срочная, большая или малая, — гарантированно встает в очередь.

Зная загрузку мощностей ρ для процессов с очередями типа M/M/1/∞, мы можем предсказать следующее:

  1. В каком проценте случаев новая работа встанет в очередь из-за загруженного ресурса: 1 − ρ
  2. Среднее количество элементов в очереди: ρ² / (1 − ρ)
  3. Среднее количество элементов в системе: ρ / (1 − ρ)
  4. Какую долю длительности цикла занимает время нахождения элемента в очереди: ρ
  5. Отношение времени цикла к времени создания добавленной стоимости: 1 / (1 − ρ)

Простые формулы, которые приводят к удивительным инсайтам: если мы загрузили отдел на 95% — то любая задача 95% времени цикла проведет в очереди.

Q4: The Principle of High-Queue States: Most of the damage done by a queue is caused by high-queue states

Этот принцип — про местных черных лебедей: наибольший ущерб наносят длинные очереди, появление которых маловероятно.

Вероятность того, что мы найдем очередь в определенном количественном состоянии, является функцией от загрузки мощностей. Состояния с малыми очередями более вероятны, чем состояния с большими очередями, однако последние обычно более важны.

В таблице представлены вероятности разных состояний очереди M/M/1/∞ при загрузке мощностей 75%.

Вероятность вычисляется по формуле (1 − ρ)ρⁿ

Мы можем увидеть, что вероятность нахождения в очереди двух объектов составляет 75% от вероятности нахождения в очереди одного объекта (14,1% и 18,8% соответственно). При этом нахождение в очереди двух объектов создает двойную стоимость задержки и экономический ущерб от очереди из двух объектов составит 150% ущерба от очереди с одним объектом. Вывод: чем длиннее очередь — тем сильнее увеличивается время цикла и выше ущерб.

Подытожим

Очереди важны: они создают предпосылки для большого количества проблем в продуктовой разработке. Работать с ними умеют не все, поэтому в продуктовой разработке решения по сокращению затрат могут приниматься неоптимально.

Что важно знать про поведение очередей:

  1. Высокая загрузка мощностей (выше 80%) экспоненциально увеличивает очереди. Проще: очередь удваивается при сокращении свободных мощностей вдвое. Нужно считать затраты на очередь и затраты на содержание неизрасходованной мощности, выбирать оптимальную пропорцию.
  2. Наибольший ущерб наносят «черные лебеди» — длинные очереди, появление которых маловероятно. Нужно вовремя прогнозировать появление таких очередей. Мониторь, измеряй, вмешивайся.

В следующем посте: влияние вариабельности на очереди; последовательные очеред (когда выход одной очереди становится входом для другой); оптимальная конфигурация очереди (аэропортовские оптимальнее супермаркетовых).

Отправить
Поделиться
Запинить