Эволюционно продуктовый подход к разработке ПО опирается на гибкие подходы (Agile), самые распространенные из которых во многом базируются на бережливых подходах в разработке (Lean Development).
Особую популярность бережливый подход к разработке получил благодаря книге «Бизнес с нуля. Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели» Эрика Риса.
Бережливый подход базируется на концепции бережливого производства (Lean Production), которая стала переосмыслением производственной системы Toyota (Toyota Production System, TPS). На рис. 2.1. представлена схема эволюционной связи производственных подходов.
Рис. 2.1. Связь производственных подходов
Основные идеи бережливого производства – это минимизация отходов и принципы ориентации на максимальную ценность для потребителя.
Отходы (muda) – очень большая и важная тема в бережливом производстве, включающая в себя не только прямые отходы, такие как остатки материалов или брак, но и процессы, которые не добавляют ценности конечному потребителю.
В бережливом производстве выделяют семь видов отходов:
1. Потери из-за перепроизводства.
2. Потери времени из-за ожидания.
3. Потери при ненужной транспортировке.
4. Потери из-за лишних этапов обработки.
5. Потери из-за лишних запасов.
6. Потери из-за ненужных перемещений.
7. Потери из-за выпуска дефектной продукции.
Каждый из этих типов имеет свое проявление и в разработке цифрового обеспечения.
В реальном производстве можно столкнуться с «затовариванием», когда готовая продукция или, что еще страшнее, ее компоненты заполняют складское пространство. Завод в этом случае сталкивается со следующими издержками:
1. Амортизация складской инфраструктуры.
2. Оплата труда персонала.
3. Учет и инвентаризация.
4. Простой капитала – «замороженные расходы» в производственных компонентах, не утилизированные в виде готовой продукции.
Распространенная стратегия оптимизации производства – это минимизация загрузки складов за счет точной по времени поставки исходного сырья и своевременной отгрузки.
Несмотря на то что в цифровом производстве нет складов, расходы на перепроизводство активно присутствуют:
1. Создание потенциально невостребованных артефактов. Избыточная документация – разработчики затрачивают часы на то, что не добавляет ценности продукту и не факт, что будет востребовано в будущем.
2. «Замороженные расходы» в промежуточных артефактах. Дизайн-макеты будущей функциональности, пока не будут утилизированы в виде поставки, остаются «замороженными» человеко-часами, которые потратила компания.
3. Нагрузка на инфраструктуру хранения. Промежуточные артефакты не только занимают место в облачном хранилище, они еще и порождают огромное количество переписки в почте, чатах, движений в таск-трекерах, что добавляет хранимого объема, а самое главное – отвлекает внимание и затрудняет поиск.
4. Учет движения перепроизведенных «полуфабрикатов» оттягивает внимание всех участников процесса.
Тут у физического и цифрового производства много общего – час простоя сотрудника и/или производственной инфраструктуры безвозвратно утерян. В реальном производстве производственные цепочки выстраиваются таким образом, чтобы задержки между звеньями были минимальны. В цифровом производстве достаточно сложно достоверно прогнозировать длительность производства, поэтому прибегают к следующим тактикам для минимизации простоя:
1. Дробление артефактов. Большое улучшение внутри продукта разбивается на ряд «микроулучшений», разработку которых проще оценивать и прогнозировать. Более подробно об этом в главе про декомпозицию (5.2.2.7 Прояснение бэклога ⁄ Декомпозиция элементов продуктового бэклога).
2. Кросс-функциональность разработчиков. Знания в смежных предметных областях позволяют приступить к разработке, не дожидаясь бутылочного горлышка[6] – участия узкоспециализированного эксперта. (Подробнее об этом см. в п. 3.2.)
3. Утилизация технического долга. В процессе разработки в коде накапливается неоптимальность, которая не может быть разрешена в момент поставки в связи с временными ограничениями. В этом случае разработчики фиксируют необходимые доработки для того, чтобы вернуться к ним позже – накапливают техдолг. Утилизация техдолга в процессе простоя – не очень хорошая практика, но лучше, чем пустая потеря времени. (Подробнее о техдолге и других нефункциональных требованиях см. в п. 3.3.)
В промышленном производстве под отходами на ненужную транспортировку подразумеваются все виды ресурсных расходов, осуществляемых при транспортировке компонентов готовой продукции и финальных изделий. Сюда включены:
1. Расходы на транспортную инфраструктуру
2. ФОТ обслуживающего персонала.
Для минимизации отходов при транспортировке сокращается пространство между производственными операциями.
В цифровом производстве отходом при перемещении может быть потеря времени при переносе артефакта из одной системы в другую. Например, ручной перенос кода между окружениями развертывания[7] ПО.
Для минимизации таких отходов следует использовать инструменты непрерывной интеграции ⁄ доставки (CI/CD)[8].
В жизни мы часто сталкиваемся с ситуацией, когда дальнейшая «полировка якоря» уже не добавляет ценности продукту. К такого вида расходам можно отнести:
1. Дополнительные операции, например дополнительная полировка.
2. Дополнительное время обработки, например излишнее время закаливания.
3. Дополнительные ресурсы, например больший расход лака на покрытие.
Часто хватает здравого смысла, чтобы определить, какие операции или ресурсы избыточны, но иногда соотношение затрат и полученного результата не столь очевидно.
Для выявления ценности каждой операции проводятся лабораторные эксперименты, когда выявляются зависимости между стоимостью производства и потребительскими характеристиками, например тесты на прочность или стойкость к коррозии.
В цифровом производстве с потерями от лишней обработки борются похожим способом.
Улучшение качества проработки функции разделяется на этапы, и каждый этап тестируется на ограниченной выборке пользователей.
Результаты сравниваются с другой выборкой, у которой нет данного решения. Если эффект от улучшения есть, то «полировка» продолжается. Такой способ тестирования называется А/В-тестирование. (Подробнее об этом см. в п. 4.3.8.2.)
Этот вид потерь очень похож на потери при перепроизводстве, но тут речь идет о резервных складских запасах исходного сырья. Высокоэффективные производства держат только необходимый минимум запасов, перекладывая функцию резервирования на логистические компании.
В цифровом производстве мы сталкиваемся с потерями из-за лишних запасов в случае предварительной закупки или аренды неиспользуемой инфраструктуры.
Одно из решений проблемы – на моменте старта и масштабирования продукта использовать облачную инфраструктуру. Многие поставщики таких услуг, как правило, используют гибкую систему ценообразования, когда оплата производится в зависимости от актуального потребления ресурсов.
Этот вид потерь можно сравнить с потерями на транспортировку, но речь идет о временных затратах на перемещение компонентов/изделий и инструментов внутри производственной ячейки[9]. Например, перемещение рабочего от изделия к ящику с инструментами и назад.
Для минимизации отходов при перемещении создается среда, где не нужно тянуться за инструментами и тратить время на поиски.
В цифровом производстве отходом при перемещении может быть перемещение внутри рабочего места. Например, когда дизайн-макет переносится в приложение электронной почты для последующей пересылки.
Для минимизации таких отходов следует использовать:
1. Инструменты, объединяющие в себе несколько производственных этапов, например создание дизайн-макетов, их анимация и подготовка для верстки.
2. Инструменты с автоматической доставкой артефактов, например плагин для экспорта графического макета в хранилище компонентов для фронтенд[10]-части продукта.
Потери из-за дефектной продукции включают:
1. Расходы на возврат дефектного продукта или партии.
2. Расходы на утилизацию дефектного продукта.
3. Расходы в связи со снижением спроса.
Во избежание таких потерь внедряются системы контроля качества.
Подобный подход применяется и в разработке цифровых продуктов в нескольких видах:
1. Ручное тестирование, осуществляемое QA[11]-инженерами.
2. Автоматическое тестирование – когда создается ПО, имитирующее взаимодействие с пользователями.
3. Автоматическое модульное тестирование (auto unit-test) – специальный код, создаваемый самими разработчиками для проверки созданной функциональности.
Также при разработке цифровых продуктов встречаются подходы, которые трудно реализовать в физическом производстве:
1. Переключатели фич (feature toggling) – позволяют дистанционно отключать функциональность у определенных групп пользователей, если обнаруживаются проблемы.
2. Прогрессивная раскатка (progressive rollout) – позволяет открывать функциональность постепенно на всю аудиторию, например по 10 % в неделю, и следить за возникающими проблемами.
3. Автоматический откат (automatic rollback) – в случае возникновения проблем функциональность приложения автоматически откатывается к предыдущей стабильной версии.
На уровне инженерных практик в процессе разработки вводятся критерии стабильности и критерии производительности для приемки разрабатываемого программного обеспечения. Например: «Время недоступности системы за последние 48 часов < 1 %», «Доля доступных функций за последние 48 часов > 99 %» и др. Более подробно критерии приемки, относящиеся к качеству разработки, мы рассмотрим в и. 3.3.
Принципы бережливого производства меняются со временем и в зависимости от автора. Ключевой идеей является ориентация на максимальную ценность для потребителя, опираясь на которую строятся все производственные этапы. Авторы Джеймс Вомак и Дэниел Джонс, которые одни из первых дали определение термину «бережливое производство», в книге «Бережливое производство: как избавиться от потерь и добиться процветания вашей компании» выделяют следующие производственные этапы:
1. Value – определить ценность продукта.
2. Value Stream – определить поток ценности.
3. Flow – обеспечить свободное течение потока ценности.
4. Pull – втягивание вместо выталкивания.
5. Perfection – стремиться к совершенству.
Разберем эти принципы подробнее и проведем параллель с разработкой цифровых продуктов.
Под ценностью, как правило, понимаются свойства продукта, за которые потребитель готов платить. Очевидно, что если потребитель не будет платить, то поточное производство такого продукта станет невозможным. А значит, нет смысла говорить об организации производства, оптимизации издержек и внутренней культуре, пока не будет определена ценность продукта.
В цифровом производстве действуют абсолютно такие же законы. Необходимо определить, в чем ценность цифрового продукта для пользователя. Несмотря на то что определенные сегменты пользователей не всегда расплачиваются деньгами, деньги на каком-то этапе должны появиться в цепочке представления ценности.
Например:
1. Фримиум-модель подразумевает, что в определенный момент пользователь дорастет до потребления платных свойств продукта.
2. Модель использования в обмен на просмотр рекламы подразумевает, что оплачивать развитие функциональности будет другой сегмент потребителей – рекламодатели, которые, в свою очередь, должны увидеть в этом ценность.
3. Использование в обмен на создание контента подразумевает, что расплачиваться будут потребители контента (например, просмотром рекламы).
Не менее важно вспомнить о сроке расплаты. То, как происходит оплата – моментально, с задержкой или, например, равными долевыми платежами, – влияет на производство.
Тут стоит подумать о жизнеспособности продукта – ресурсы, которыми расплачивается пользователь, и время этой расплаты должны покрывать расходы на производство продукта. При этом следует учитывать, что срок окупаемости одной поставки имеет значение – длительный период окупаемости требует больших инвестиций и ставит под вопрос жизнеспособность всего производства. В связи с этим дадим определение.
Ценность жизнеспособного продукта – это набор характеристик, за которые потребитель готов платить в объемах и в сроки, достаточные для окупаемости поставки продукта.
На первом этапе производства необходимо определить ценность жизнеспособного продукта, до этого момента переходить к следующим этапам бессмысленно.
Для определения ценности в классическом производстве прибегали к следующим мероприятиям:
1. Организация предварительных исследований с участием потребителей и фокус-групп.
2. Создание прототипа будущего продукта для сбора предзаказов.
3. Выпуск пробной партии.
4. Тестовая продажа пробной партии.
Аналогично в цифровом производстве проводятся следующие мероприятия:
1. Интервью с потенциальными пользователями. Например, по методикам Customer Development, глубинные интервью, интервью в подходе «работы, которые должны быть выполнены» и многие другие. (Подробнее об исследованиях на этом этапе см. в п. 4.2.1.2.)
2. Исследование с применением прототипов. Применяется широкий диапазон прототипов различной степени приближенности к финальному продукту:
а. Вайрфрейм[12] – эскизное описание интерфейса продукта, которое используется для объяснения будущего поведения продукта.
b. Фальшивая дверь (fake door) – до начала разработки продукта создается рекламная кампания, нацеленная на потенциальных пользователей, в рамках которой предлагается оформить предзаказ на якобы уже существующий продукт.
c. Волшебник страны Оз. Вариант прототипирования, когда часть функций выполняется вручную. Например, часть операций вместо диалогового бота на старте может выполнять человек.
d. Функциональный прототип. Продукт, в котором реализована часть основной функциональности для демонстрации потенциальным покупателям, детальной проработки функциональности, направленной на масштабирование. Например, система восстановления пароля, капча, инфраструктура нагрузки, юзабилити и эстетика пользовательского интерфейса. Чаще такой прототип используется для демонстрации потенциальным инвесторам в хард-тек[13]-компаний.
3. Закрытое бета-тестирование. Бесплатное или оплачиваемое для пользователей ограниченной группы тестирование. Позволяет выявить проблемы в пользовательском опыте[14], минимизировать риски, связанные с перегрузкой инфраструктуры, информационной безопасностью и репутацией.
4. Бета-тестирование. Открытие платной версии продукта для ограниченной группы пользователей. Позволяет оценить, насколько люди готовы платить поставленную цену за предложенную ценность.
Только после того, как удалось подтвердить ценность продукта, осуществляется переход к следующему этапу организации производства – определение потока ценности.
Мы обнаружили, что потребители находят наш продукт ценным. Теперь нужно организовать поток ценности. Как сделать так, чтобы потребители максимально быстро начали использовать продукт с минимальными для нас потерями?
Для физических продуктов нам нужно спланировать, как будет организовано производство с минимальными потерями. Основной критерий эффективности процесса поставки – ее скорость.
В цифровом производстве составляется карта потока ценности, на которой создание продукта разделяется на этапы от идеации[15] до производства. При этом на каждом этапе минимизируются отходы за счет внедрения практик, описанных в п. 2.1. Например, применение инструментов CI/CD (непрерывной интеграции и поставки) для автоматизации развертывания доработок в средах разработки или автоматическое модульное тестирование.
Важно понимать, что мы не сможем сразу добиться максимального сокращения расходов. Если на этапе создания ценности нужно было обеспечить минимальную жизнеспособность продукта, то на этапе формирования потока – минимально жизнеспособную поставку.
К сожалению, достаточно часто можно увидеть распространенную ошибку, когда команды, не доказав ценности продукта, начинают тратить ресурсы на оптимизацию производства, вводя дорогостоящие процессы и инструменты. В результате получается очень эффективная фабрика по производству отходов.
Совет по формированию потока ценности: не нужно начинать оптимизировать жизнеспособность поставки, пока не доказана жизнеспособность продукта.
Определив процесс единоразовой поставки ценности, нужно организовать эффективную цикличность этого процесса. Процесс доставки ценности должен воспроизводиться с минимальными издержками.
В реальности производство разбивается на этапы, на каждом из которых элементы готового продукта создаются непрерывно, итерационно, и в конце каждой итерации передаются на следующий этап. Таким образом формируется материальный поток[16]