Термин “бережливого производства” (Lean) в настоящее время на слуху. Мы все знаем результаты применения данной идеи в компании Toyota, которые позволили выпускать малые партии комплектующих точно в срок (Just-In-Time, JIT).
В книге “Microsoft Secrets” (1995 года) авторы (Кузумано и Ричард Селби) описали подходы контроля качества схожие с Lean применяемым в Toyota.
Выпуск малыми партиями как нельзя лучше подходит для разработки программных продуктов. Однако идея Lean еще не сильно распространена среди разработчиков ПО, можно предположить, что обычно команды разработчиков довольно крупные, а нагрузка не велика.
В нашем случае было все наоборот: небольшая команда из 5 разработчиков разного уровня, сокращенные сроки и многоэтапная задача внедрения нового программного продукта в крупной организации.
После завершения основного блока разработки, в процессе тестовой эксплуатации, а затем опытной, мы столкнулись с рядом проблем. Перегруз разработчиков, большое количество повторных доработок уже реализованных задач, превышение длительности проекта, сложность прогнозирования сроков этапов разработки.
Также сказался разный уровень опыта разработчиков, кто-то выполнял поставленные задачи быстро, кто-то медленно, периодически возникали простои в разработке у более опытных сотрудников.
Влияние оказал размер и инфраструктура заказчика — корпорация, содержащая большое число крупных удаленных подразделений с собственными особенностями бизнес-процессов. Заказчик использует в работе множество учетных систем и сервисов, с которыми необходимо было обеспечить “бесшовную” интеграцию. Все процессы согласования и принятия управленческих решений выполнялись в рамках внедряемой системы.
Решили стабилизировать существующую ситуацию. Полноценный Lean внедрять уже было поздно, да и не было такого опыта. Решили адаптировать элементы Agile-Lean в текущий процесс управления проектом, и вот что из этого получилось.
Отправная точка
Изначально в команде применялась несколько упрощенная методология Scrum. Ниже приведу ее описание.
Набор артефактов:
Project backlog — журнал требований, реализуемых в рамках проекта, обнаруженные в процессе эксплуатации инциденты. Обычно требования оформляются в виде User Story. В качестве инструмента для верхнеуровневого планирования использовали Excel. Там же, для удобства, чтобы все было в одном месте, на отдельной странице сделали диаграмму Ганта и диаграмму сгорания.
Sprint backlog — журнал требований и инцидентов реализуемых за спринт.
Scrum-доска. В качестве инструмента использовали доску Trello с расширением Plus For Trello для контроля трудоемкости.
Роли в команде:
Руководитель проекта — сотрудник, который планирует процесс реализации требований, координирует действия всех участников, вплоть до завершения проекта.
Scrum-мастер — обычно тимлид группы разработки, занимается управлением процесса разработки, несет ответственность за конечный результат работы разработчиков.
Команда разработчиков — состоит из опытных разработчиков и новичков, которые повышают свои компетенции в процессе участия на проекте.
Команда консультантов — сотрудники погруженные в бизнес-процессы заказчика. Занимаются подготовкой требований, взаимодействием по требованиям и бизнес-процессам с конечными пользователями, консультируют конечных пользователей, тестируют разработанную функциональность.
Совещания:
Ежедневный митинг команды.
Ретроспектива в конце спринта.
Ежеквартальные ретроспективы.
Параметры спринта:
Продолжительность: 1 месяц.
Ежедневные обновления продуктивной системы по итогам завершения работ по блокам задач.
Данный подход использовался на большинстве проектов, динамика при использовании была положительная.
Во время локдауна подход дал сбой. Удаленная работа наложила свой отпечаток на эффективность работы команды, столкнулись со сложностями, которые необходимо было решить.
“Хьюстон, у нас проблемы”
Явные проблемы заметили на втором месяце этапа ОПЭ (опытно-промышленной эксплуатации), когда новые требования по дефектам начали закрывать время затраченное на запланированные дефекты и пожелания. Фактически мы стояли на месте. Вероятность успеха сделать все вовремя стремилась к 0.
![](https://habrastorage.org/getpro/habr/upload_files/e2c/09a/f06/e2c09af06117091932e923dafaa6d944.png)
Для исправления ситуации было решено провести экстренную ретроспективу и собрать все существующие проблемы.
Удалось выявить следующие точки улучшения:
Сильный перегруз разработчиков. Стабильное превышение 8-часового рабочего дня, выход на работу в выходные. Снижена мотивация, нарастает напряжение в команде.
Недостаточное качество итогового кода, требуется повысить контроль качества.
Много задач возвращается на доработку, в процессе тестирования выявляются не зафиксированные требования в описании задачи. Необходимо улучшить описание требований.
Разные направления работ выполняют разные группы разработчиков, недостаточно взаимодействия по реализованной функциональности. Необходимо отказаться от разделения.
Много времени уходит на разработку и доработку, консультанты простаивают.
Недостаточная компетентность разработчиков в администрировании и настройке ОС, тестовых стендов, стендов разработки. Системные инженеры не всегда могут быстро переключиться с других проектов. Необходимо повышать компетенции разработчиков.
А что думает заказчик? Заказчик недоволен динамикой реализации требований. Но готов рассмотреть вариант с четким и прогнозируемым планом.
Именно в этот момент появилась идея использовать подход JIT для улучшения текущей ситуации.
Какие преимущества Agile-Lean мы попробуем использовать в нашем проекте
Основываясь на описании бережливого производства, можно выделить не только сильные, но и слабые стороны для “бережливой разработки”.
Сильные стороны:
Получение результата в ограниченное время.
Устранение ненужных действий, которые могут снизить стоимость.
Расширение прав и возможностей команды разработчиков, помогающих им принимать решения.
Гибкость проекта, возможность его корректировки под требования заказчика.
Слабые стороны:
Большие требования к вовлеченности команды в процесс.
Строгая документация, что несколько противоречит принципам Agile, когда продукт важнее документации.
Необходимость детального планирования перед каждым спринтом.
Необходимо выделять сотрудников, которые будут следить за процессом, при этом не будут участвовать в производстве, что ослабит команду.
Продолжительность процесса разработки может вырасти, необходимо быть к этому готовым.
В процессе адаптации к текущему проекту мы постарались минимизировать слабые стороны за счет более простого документирования (мини-техпроекты, создаваемые разработчиками), упрощенного планирования с небольшим числом участников, договорились с заказчиком работать на результат.
Адаптируем 7 принципов Lean
Согласно методологии Lean для разработки программных продуктов, выделяется 7 основных принципов:
Исключение потерь. Потерями считается все, что не добавляет ценности для потребителя: излишняя функциональность; ожидание (паузы) в процессе разработки; нечеткие требования; бюрократизация; медленное внутреннее сообщение.
Акцент на обучении. Короткие циклы разработки, раннее тестирование, частая обратная связь с заказчиком.
Предельно отсроченное принятие решений. Решение следует принимать не на основе предположений и прогнозов, а после открытия существенных фактов.
Предельно быстрая доставка заказчику. Короткие итерации.
Мотивация команды. Нельзя рассматривать людей исключительно как ресурс. Людям нужно нечто большее, чем просто список заданий.
Интегрирование. Передать целостную информацию заказчику. Стремиться к целостной архитектуре. Рефакторинг.
Целостное видение. Стандартизация, установление отношений между разработчиками. Разделение разработчиками принципов бережливости. «Мыслить широко, делать быстро, ошибаться мало; учиться стремительно».
Проанализировав принципы, сформировали 7 своих, которые подошли к нашей текущей ситуации и должны были помочь закрыть существующие проблемы:
![](https://habrastorage.org/getpro/habr/upload_files/fd1/e4e/0be/fd1e4e0be7519c84e20b98e4f98dfbf7.png)
1. Убрать ненужное
Под ненужным будем понимать следующее:
Все, что не приносит пользы конечным пользователям. Сюда относятся непонятные и несрочные требования, редко проявляющиеся дефекты. Мы их откладываем или отказываемся вовсе после согласования с заказчиком.
Ненужный код, дублирование кода.
Нечеткие цели и требования. Если есть такие задачи, то их отправляем на проработку и исключаем из Backlog. После детальной проработки задача может быть снова помещена в Backlog.
Программные дефекты. Любые дефекты появляются, когда код не проходит достаточную проверку качества.
Переключение разработчика между задачами. Задача не должна быть слишком маленькой или слишком большой. Большие задачи приводят к низкому качеству проверки, маленькие увеличивают количество переключений, что в итоге сказывается на производительности.
Что мы сделали, чтобы решить задачу:
Детальная проработка требований и согласование описания требований с тимлидом разработки, дополнительная расшифровка требований тимлидом на понятный для разработчиков язык.
Ввели отдельную колонку в Trello “Техдолг”, в которую помещаются задачи с приоритетом, для устранения дублированного кода, для доработки найденных в процессе разработки потенциально сбойных участков и задачи с не оптимальным кодом.
Повышение взаимодействия разработчиков, консультантов и тимлида. Регулярные встречи 1:1, еженедельные встречи для мини-обучения и небольших вебинаров, еженедельная упрощенная ретроспектива для обсуждения и решения на месте текущих сложностей.
Формирование задач из набора требований в рамках одного реализуемого процесса. Расчет: разработчик загружен на одну задачу не менее 8 часов.
2. Создавать знания и обмениваться ими
Процесс разработки сам по себе порождает новые знания, которые необходимо зафиксировать и распространить. Было решено для каждой задачи выделять дополнительное время на проектирование, чтобы разработчик успел детально зафиксировать вносимые изменения.
Эта информация распространяется по команде разработки, консультанты используют ее, чтобы кроме основного требования протестировать функциональность, которая была затронута при выполнении разработки.
3. Повышение качества кода
Любые дефекты, несоответствия полученной функциональности требованиям появляются, когда код не проходит достаточную проверку качества.
Для повышения качества были приняты следующие предложения:
Парное программирование. Непосредственное взаимодействие тимлида с разработчиками, совместный анализ требований, проектирование, решение сложных задач.
Степень готовности (Definition of Done, DoD). Задача считается завершенной только в том случае, когда разработчик обсудил реализацию с тимлидом и провел демонстрацию разработанной функциональности консультанту, который закреплен за данной задачей.
Максимальное количество задач в работе (Work In Progress, WIP) каждого разработчика. У разработчика в работе и в тестировании суммарно не может быть больше 3-ех задач. Если разработчик отправил на тестирование все 3 задачи, то он обязан довести эти задачи до публикации в продуктивную систему, для этого активно взаимодействует с консультантами, отвечает на возникающие вопросы, помогает в процессе тестирования.
4. Сокращение спринтов
Принципы гибкой разработки прежде всего ориентированы на быструю реализацию требований. Ускорение разработки становится проще, когда организован стабильный рабочий процесс, конкретные сроки разработки и публикации.
Поэтому решили сделать ряд ограничений на спринт:
Спринт длится 1 рабочую неделю.
На спринт планируется трудоемкость, которую сможет закрыть команда разработки (на основе собранной статистики за предыдущие cпринты). Дополнительно закладывается время на устранение критических дефектов.
Все реализованные доработки тестируются на специальной копии продуктивной системы с продуктивными данными (PreProd), и только после успешной проверки публикуются на продуктивную среду (Prod).
Публикация на продуктивный стенд выполняется только один раз в последний день спринта.
После каждого спринта собирается сокращенная ретроспектива на 30 минут для сбора фидбека с команды.
5. Расширение полномочий команды
Данный принцип основывается на том, что все участники команды проекта должны уважать друг друга. Когда дела идут плохо или не по плану, необходимо сосредоточить внимание на выявлении пробелов в рабочем процессе, которые могут приводить к конфликтам и проблемам. Мнение каждого участника процесса важно и должно быть принято во внимание другими участниками процесса.
При выявлении проблемной ситуации у одного участника, эта ситуация не должна быть только его проблемой. Такая ситуация должна считаться общей проблемой и решаться совместно.
Для реализации данного принципа проводятся встречи ответственных лиц проекта 1 на 1 с каждым участником команды, выявляются конфликтные ситуации, и затем выносятся на очередную ретроспективу, как общая точка улучшения.
6. Не торопиться с принятием решений
Если следовать принципам бережливого производства, необходимо понимать, что принятие решения с опозданием — это нормальная ситуация. Фактически у команды появляется больше времени на сбор и анализ данных по текущей проблеме.
Решение принятое под воздействием эмоций может привести к большому числу проблем.
7. Регулярная оптимизация процесса
Регулярные ретроспективы по итогам каждого спринта и сбор фидбека со всех участников команды проекта позволяют наметить шаги улучшения.
Для улучшения процесса разработки необходимо выделить роль, которая будет этим заниматься.
Для реализации данного принципа с тимлида команды разработки были сняты все задачи по разработке и переданы команде, объем задач на спринт был сокращен, т.к. команда разработки фактически ослабла.
Тимлид команды теперь выступает в качестве наставника:
Организует периодическое обучение, разбор сложных ситуаций.
Инициирует передачу опыта между разработчиками.
Помогает консультантам в формировании требований, а разработчикам в реализации этих требований.
Занимается развитием разработчиков и расширением их компетенций.
Занимается подбором и развитием инструментария, повышающего эффективность процесса разработки.
Для исключения “бутылочного горлышка” из наиболее опытных разработчиков был выделен помощник тимлида (саблид, sublead), который также подключается к этим задачам, если тимлид уже занят.
Основная проблема бережливого производства — отодвигание сроков
Принципы бережливого производства позволяют минимизировать многие отрицательные факторы влияющие на процесс разработки, повышают мотивированность команды и качество реализуемых требований. Но необходимо учитывать, что Lean ориентирован на непрерывное улучшение в течение продолжительного времени, эффекты появятся не сразу.
Нельзя забывать, что проект имеет определенные сроки, превышение которых может привести как к штрафным санкциям, так и к разрыву контракта. Это необходимо учитывать, если вы планируете внедрять Lean в текущий проект.
Самый правильный вариант — помнить о перспективе внедрения “бережливой разработки” на этапе планирования проекта и закладывать дополнительное время на выстраивание процесса. В нашем случае помогло то, что заказчик был готов пойти на встречу, ему был важен конечный результат.
Итоги
Процесс выстраивания “бережливой разработки” занял примерно месяц, принятые улучшения позволили решить существующие проблемы. Со стороны заказчика получили положительный фидбек. Сроки разработки удалось вернуть к заявленному плану, за счет исключения ряда несущественных требований. Нагрузка разработчиков была снижена до норматива, появилось время на реализацию задач “техдолга”.
Методология Lean Agile представляет собой ориентированную на клиента, адаптированную и гибкую систему, не предлагает жестких правил, которые потребуется выполнять. Всегда потребуется адаптировать эту методологию к своим существующим процессам, требованиям проекта, особенностям заказчика.
Но в любом случае необходимо взрастить эксперта среди ваших сотрудников. Он будет сосредоточен на улучшении процесса разработки и мотивирован в повышении своих навыков и навыков команды разработки.
“Бережливая разработка” построена на взаимодействии. Очень важно выстраивать доверительное общение внутри команды, чтобы все участники понимали, что всегда могут получить помощь, их требования будут услышаны и приняты к обсуждению. Для команды, работающей удаленно, необходимо выстраивать взаимодействие:
Обеспечить единую общую среду общения и обмена знаниями.
Организовывать совместные видеоконференции, желательно с камерой, чтобы видеть эмоции участников.
Не пренебрегать неформальным общением.
Немаловажно обеспечивать канал связи между командой разработки и командой внедрения со стороны заказчика. Заказчику необходимо понимать ваш процесс разработки и публикации, понимать сроки реализации требований. Для клиента важны и качество и скорость разработки, поэтому необходимо находить с ним точки соприкосновения, совместно планировать предстоящий спринт.
По итогам внедрения Lean получили следующие количественные изменения:
Скорость разработки стала прогнозируемой и составила примерно 4 крупные задачи (до 6 часов на задачу в среднем) на сотрудника в неделю, ранее мощность команды в среднем составляла до 2-3 завершенных задач в неделю на сотрудника. Да, задачи крупные и это не совсем по Agile, но это помогло в нашей ситуации.
Сократилось количество публикаций примерно вдвое. На самом деле это существенная экономия времени, поскольку процесс публикации многоэтапный и затрагивает большое множество сотрудников.
Уменьшилось вдвое количество задач, возвращаемых на доработку.
Еженедельно закрывалось по 3 крупные задачи из “техдолга”.
Втрое уменьшилось количество дефектов, фиксируемых конечными пользователями.
Данный опыт планируется транслировать на другие проекты компании.
Спасибо за внимание, коллеги! Хотелось бы увидеть в комментариях ваш опыт использования Agile-Lean (или их адаптации) на ваших проектах.