Всем доброе утро!
На связи вновь Крылов Александр, и сегодня я решил поделиться мыслями о том, как можно применить опыт DevOps Governance в Enterprise, который я ранее описывал в этой статье на примере компании, разрабатывающей собственный продукт. Прошло время, и опыт был переиспользован для разработки продукта на примере компании Bimeister. И началось это еще в августе 2023 года.
![Эволюция компании Эволюция компании](https://habrastorage.org/getpro/habr/upload_files/975/87b/ec6/97587bec6178354d8203bdd045de028f.png)
Что хотелось бы отметить - в этой статье не будет детальной расшифровки с уточнениями доклада с DevOops 2023, с которым так же можно ознакомиться по ссылке выше. В данной статье я расскажу о ряде отличий Governance в Enterprise и о том, как он может выглядеть в компании-разработчике своего продукта. Помимо этого я также расскажу, какие работы удалось провести за год в компании, а какие - нет и почему.
![Слишком быстрый рост Слишком быстрый рост](https://habrastorage.org/getpro/habr/upload_files/e22/671/60b/e2267160b35fa66ad7a2e94fa272fcb7.png)
Одной из основных предпосылок внедрения DevOps Governance стал стремительный рост компании. Процессы перестали успевать в своей эволюции, а поэтому нужны были некоторые изменения. Обо всех из них я сейчас рассказывать не буду, на это отведём другие статьи, но об одном мы поговорим.
Начнём, традиционно, с небольшой исторической справки. На момент внедрения и по сей день есть ряд особенностей компании:
Нам 6 лет;
У нас есть CTO;
Есть постоянные заказчики;
Могут быть TOP — down решения, но не всегда;
Внедряется – cost center vs profit center;
В наличии build vs buy-решения;
Есть процесс согласование ресурсов на активности, который сейчас на стадии трансформации;
У нас есть transparency meetups - процесс прямого общения с сотрудниками всех топов компании, в начале в форме монолога, а потом в форме вопросов-ответов.
Мы также позиционируем себя как ИТ компания:
Прививаем DevOps-культуру и DevOps as a Service (сервисный подход);
В наличии гильдии DevOps и DevSecOps, где мы общаемся с нашими стейкхолдерами о том, что у кого болит, обмениваемся обратной связью и новостями;
Мы используем подходы Agile, Scrum, релизимся по спринтам, в наличии Kanban практики и зачатки westrum культуры;
У нас есть внутренняя разработка, мы не работаем с подрядными организациями;
У нас проходят демо продуктов каждый спринт и инкремент, и это прекрасно. С примером того, как проходят наши демо, можно ознакомиться на страницах соц сетей нашего CTO по этой ссылочке. Там тепло и лампово про то, как и что мы делаем в каждом спринте.
В разработке наших продуктов мы используем новейшие технологии и стараемся быть в тренде по этому вопросу вокруг всего цикла разработки - как на уровне методик и процессов, так и с инфраструктурными элементами CI/CD;
Нас 500 человек, и все они - ИТ;
У нас есть свой процесс безопасной разработки (SAST), чтобы сделать наш продукт лучше.
Докинем немного терминологии, помимо того, что было выше, чтобы мы писали и читали на одном языке.
Команды Alfa-Omega. У нас есть свои команды разработки, каждая из которых пилит свой отдельный компонент продукта или цельный продукт. И тут речь не только про разделение на back и front, но и на бизнесовые и технические компоненты продукта.
Мы имеем 3-хнедельные спринты, которые в кварталах складываются в мощнейшие инкременты.
У нас есть кураторы проведения работ, но в отличие от enterprise, где за это могут отвечать сами DevOps, техруки систем, владельцы продуктов или CTO, в нашем случае это лиды направлений, вроде TL DevOps и TL Dev.
Поскольку у нас есть продукты, есть и их владельцы, а раз есть владельцы и много команд, а живём мы по scrum-у, есть свои scrum-мастера, которые помогают достигать намеченных результатов и быть командам в одном информационном поле. И для этого у нас организованы еженедельные SOS или Scrum of Scrum - процесс по синхронизации и обмену последней информацией, в том числе по проблемам и вариантам их решения между CTO и scrum-мастерами с целью максимально быстрых поисков решений по возникающим вопросам.
Да, одна из основных предпосылок была озвучена выше, но она, самом собой, была не одна. Что же было ещё?
Отсутствие аудита и реаудита систем;
Отсутствие плана/контроля развития технической архитектуры продукта;
Недостаточно прозрачные процессы разработки;
Недостаточно прозрачное понимание ценообразования проектов.
Прежде, чем взять данное решение, мы так же посмотрели те практики, которые можно переиспользовать, что дальше позволило нам модифицировать матрицу зрелости, реализованную мной ранее, но не будем забегать вперёд и не будем перечислять всё, а только отличия от Enterprise и предыдущей реализации.
Начнём с того, что за это время эволюционировали метрики DORA capabilities, которые развили полёт фантазии. И если раньше всё было весьма упрощено в таком виде
![Old Dora capabilities Old Dora capabilities](https://habrastorage.org/getpro/habr/upload_files/7aa/5bd/a55/7aa5bda5544be16e37405b838bb02381.png)
То теперь DORA расцвела во всей красе и стала выглядеть так:
![DORA capabilities 2024 slim model DORA capabilities 2024 slim model](https://habrastorage.org/getpro/habr/upload_files/e80/fd0/5fa/e80fd05fa88d079966a97a5938d2bd3b.png)
![DORA capabilities 2024 v2 DORA capabilities 2024 v2](https://habrastorage.org/getpro/habr/upload_files/b0c/db2/842/b0cdb28427f7352c671f9ddef7787f94.png)
Как мы с Вами можем наблюдать, теперь внимание уделяется большему количеству критериев, что в свою очередь перекладывается на технические метрики под таким соусом, который можно увидеть на рисунке ниже.
![DORA CORE MODEL v2 DORA CORE MODEL v2](https://habrastorage.org/getpro/habr/upload_files/500/323/6f0/5003236f02abfb27e085dc33caa55b82.png)
Я сейчас подробно не буду рассматривать все метрики и отличие между версиями моделей, но мы обязательно к этому вернёмся в будущих статьях. А прежде, чем мы перейдём дальше, я порекомендую ознакомиться со статьёй коллеги, где хорошо описан один из вариантов применения этих метрик. А мы идём дальше.
Одно из привлекательных решений, которое стоит упомянуть и которое пересекается с предыдущим опытом - это DevOps Maturity model от компании Accenture, построенная на базе подхода Governance.
![DevOps Maturity model DevOps Maturity model](https://habrastorage.org/getpro/habr/upload_files/d7d/33c/d77/d7d33cd77bd280dbed2a5e1f852074c1.png)
Эту модель они используют при аудите процессов разработки, но по факту, это пресловутая Maturity model, скрещенная с DevOps Governance от небезызвестных ребят из Gartner. Да, выступление ребят с её презентацией было ни много, ни мало в 2016 году, но очень многое актуально и по сей день. Кстати, тут можно ознакомиться с видео выступления с DevOps enterprice summit, что, поверьте мне, не будет лишним для копилки ваших знаний, поэтому я оставлю это тут.
А тут можно ознакомиться и с самой презентацией с выступления. К сожалению, работает только из под VPN. А мы идём дальше.
Мы переиспользуем «матрицу зрелости систем» на базе существующего опыта для внедрения матрицы зрелости продукта с поправками на вышеописанные моменты. Теперь предлагаю дать обновлённое определение - что же такое матрица зрелости продукта.
Матрица зрелости продукта – прозрачный процесс аудита и реаудита продуктов компании с использованием:
практик гибкой разработки;
культуры и практик DevOps;
подходов DORA, DASA, DevOps maturity в том числе в части контроля производства с использованием метрик;
современных подходов к автоматизации;
современных инструментов CI/CD.
© Крылов Александр
Перейдём к этапам внедрения процесса. В отличие от матрицы зрелости для Enterprise, где их было 12, у нас их будет 11. Своё название изменили этапы 3, 4, 6 и 11, а 7 этап, где мы осуществляли "Приоритизацию работ по системам", мы убираем, т.к. мы не будем разбивать матрицу по продуктам, а будем аудировать продукт и процессы его разработки как единое целое. Вот какие у нас получились этапы:
Сбор списка продуктов
Определение ресурсов команды
Мутация блоков и методологии
Мутация глоссария
Согласование количества уровней зрелости
Пересмотр первичных метрик
Аудит по согласованным метрикам
Планирование и согласование работ
Реализация
Контроль работ
Реаудит раз в квант времени
Раскроем каждый из этапов с учётом особенностей и изменений.
Начнём с 1 этапа - сбора списка продуктов:
4 продукта (как один);
Аудируем их как одну платформу, без разделений;
Перечень команд по продуктам от Alfa до Omega (11 команд).
Тут всё просто, собрали информацию и переходим к следующему этапу 2 - Определению ресурсов команды. И вот тут сразу могут начаться проблемы и появиться вопросы:
Какие ресурсы у нас могут быть использованы?
DevOps, внутренние команды (аналитика, разработка, тестирование), но у каких команд эти ресурсы есть?
Идёт продуктовая разработка, у PM всё расписано по ресурсам разработки и тестирования на спринты вперёд, и что же нам делать?
Одним из самых оптимальных решений является выделение квоты в 10% на техдолг команд. В рамках него могут быть задачи техдолга, вроде рефакторинга или избавления от легаси, а так же согласование ваших работ в рамках процесса по работе с матрицей. Да, согласовать это будет не так просто, как может показаться, но в случае успеха, у вас появятся какие-то плавающие ресурсы, которые можно будет использовать в рамках работ. Например, мы согласовали на ежеспринтовой основе квоту команды тестирования для тестирования задач DevOps там, где это необходимо, где возможно влияние на продукт в виде 2 дней от 3-хнедельного спринта, а далее мы можем распоряжаться этим ресурсом, как захотим. Как говорится в перефразированной поговорке - "язык до Рима доведёт". Поэтому надо уметь договариваться и выбивать хотя бы минимальное количество ресурсов, иначе дальнейший ход работ будет попросту невозможен. А доказав профит от результата первично проделанных работ минимальными ресурсами, уже можно будет требовать их больше спустя некоторое время. А для этого нам потребуются графики и метрики. Но едим слона по частям, а значит переходим к следующему этапу.
Производим в рамках 3 этапа мутацию блоков и методологии на базе ранее существующей и выложенной тут матрицы зрелости в папочке System и *мутируем под себя. В результате вот что у нас выходит по блокам.
Практики разработки:
кодирование;
модульное/интеграционное тестирование;
статический анализ;
сборка;
CI/CD.
Тестирование:
методология;
инструменты;
команда.
Сопровождение:
инфраструктура;
логирование;
мониторинг.
И новый блок - Безопасность (в момент внедрения было 4 подблока, сейчас их стало больше):
Сборка;
Доставка;
Управление секретами;
Управление дефектами;
Управление и анализ зависимостей;
Анализ архитектуры;
Требования безопасности;
Безопасная разработка (SAST, SCA);
DAST;
Тестирование на проникновение;
Безопасность конфигурации (харденинг);
Обновление продукта;
Обновление зависимостей продукта.
В принципе, для начала вполне достаточно разделов - SAST, сборка, доставка и безопасность конфигурации, а далее уже можно внедрять постепенно всё остальное.
Перейдём к 4 этапу - мутация глоссария.
Терминология для команд (общий язык);
Описание процессов (обязано быть);
Описание инструментов (должно быть);
Описание методологии (что должно быть и чего не должно).
![Пример глоссария Пример глоссария](https://habrastorage.org/getpro/habr/upload_files/c2c/487/aa5/c2c487aa5306ab2e1c8d96c561150359.png)
Более подробно наш глоссарий раскрыт тут в папочке Product.
После успешной мутации перейдём к 5 этапу - Согласование количества уровней зрелости.
Тут мы также используем 5-уровневую CMMI, с небольшой поправкой на ветер.
![Example CMMI Example CMMI](https://habrastorage.org/getpro/habr/upload_files/806/d88/da3/806d88da3daf8fa0c1a21a298706832b.png)
Мы переименуем уровни и начнём не с 1, а с 0. Зачем мы это делаем? Затем, что 0 уровень у нас будет индикатором того, чего нет от слова совсем. В предыдущем примере enterprise в нашем аудите систем не было полностью отсутствующих критериев, поэтому у нас и был сразу 1 уровень, а тут это уместно, поэтому реализовано именно так.
Каждому уровню мы дали название и получилось так:
Нулевой;
Базовый;
Средний;
Продвинутый;
Максимальный.
![Пример уровней матрицы зрелости Пример уровней матрицы зрелости](https://habrastorage.org/getpro/habr/upload_files/61a/f04/752/61af04752962fda0288a724236236f24.png)
Переходим к 6 этапу - Пересмотр первичных метрик.
Берём коктейль из DORA core model v2, миксуем с ранее известными метриками, и нежно добавляем russia state of devops 2023 и 2024, отбирая самое вкусное для себя. Самое главное - это не делать слишком много на старте, лучше потом волнами добавлять метрики, а с начала выбрать только самое необходимое. Также можно добавить цветовую градацию по тому, что реализовано, а что - нет, и это так же является новшеством. Да - это рюшка, но она удобна для визуального восприятия.
Зеленый – реализовано;
Жёлтый – в процессе;
Красный – не реализовано.
![Пример градации уровней матрицы по цветам Пример градации уровней матрицы по цветам](https://habrastorage.org/getpro/habr/upload_files/2f1/796/f36/2f1796f36533e1f2186576222970d226.png)
А в общей картине это может выглядеть так
![Пример градации уровней матрицы по цветам на примере раздела кодирования в разработке Пример градации уровней матрицы по цветам на примере раздела кодирования в разработке](https://habrastorage.org/getpro/habr/upload_files/0cd/e46/76f/0cde4676f5ed34b74585e3bd20e5dea5.png)
То, как могут выглядеть первичные метрики, я описал в таблице ниже. Обращу внимание, что изначально мы не добавляем метрики безопасности, это сделано намерено, на мой взгляд и по опыту, их лучше добавлять второй волной.
Название практики |
Название метрики |
Модульное тестирование |
% покрытия модульными тестами |
CI/CD |
время на сборку при непрерывной интеграции |
% успешных сборок непрерывной интеграции | |
время на поставку | |
% успешных поставок | |
Методология тестирования |
время на прохождение смок-тестов |
время на прохождение регресс-тестов | |
% автоматизации тестовых сценариев | |
% ложных срабатываний у автотестов | |
% пропущенных дефектов в интеграционные среды | |
% успешно пройденных тестов | |
Инфраструктура |
время на подготовку нового окружения |
Переходим к 7 этапу внедрения - Аудит по согласованным метрикам.
![Сопротивление неизбежно Сопротивление неизбежно](https://habrastorage.org/getpro/habr/upload_files/c96/f9a/a98/c96f9aa986b370398115f44d202fe959.png)
Сразу подсвечу один момент - если дойдя до этого этапа вам ещё не удалось согласовать ресурсы, про которые я говорил в рамках 2 этапа, то будьте готовы, что первичный аудит вы будете делать самостоятельно. Это может быть по причине отсутствия на данном этапе поддержки от C-уровня, и, как следствие, невозможности использования полноценного Top-Down подхода. В этом ничего страшного нет, с миру по нитке.
![](https://habrastorage.org/getpro/habr/upload_files/673/02d/a12/67302da12f025cab30547f6038744200.png)
С какими вопросами можно столкнуться?
Зачем нам это надо?
Что это такое?
У нас нет ресурсов! Кто их согласует для этих работ?
Согласуйте ресурсы! Вы согласовали их с владельцем?
Руководство согласовало и спустило это сверху?
Чья это инициатива и кто это согласовал?
Какой будет профит?
Как это может выглядеть на старте в части ресурсов?
Этап |
Статус |
Продукт |
Framework |
Потребность в реализации |
Задача |
Ответственный |
1 |
Аудит |
Bimeister |
.Net |
Что-то |
DevOps-XXX |
TL DevOps |
2 |
2024 |
|
|
|
|
|
|
Целевой |
|
|
|
|
|
Пример того, что может получиться, взят у блока разработки и представлен в таблице ниже.
Статус |
Разработка |
|||||
Кодирование |
Модульное тестирование |
Статический анализ |
Сборка |
Анализ кода на уязвимости по ИБ |
CI/CD |
|
08.2023 |
1,5 |
1 |
0 |
1,5 |
1 |
1,5 |
2024 |
2 |
1,5 |
1 |
2 |
2 |
2 |
Целевой |
3 |
3 |
3 |
3 |
3 |
3 |
Тут сразу идём по ранее согласованной шкале от 0 до 4. Вот такие могут быть роли участников работ и объёмы ресурсов.
Роли |
Служба DevOps |
Тестирование |
Продукт |
Инженеры DevOps |
Y FTE |
Х FTE |
1,5 FTE |
Тестировщики |
1 FTE |
||
Разработчики |
6 FTE |
Кто потенциально может помочь и кого вы можете затянуть в свою лодку?
Разработчики;
Тестировщики;
Архитектура;
Лиды направлений.
Но будьте готовы к сопротивлению, и если бы не появившаяся квота ресурсов тестирования позднее, то работы по матрице в этом направлении вообще бы не велись. Учитывайте особенность процессов согласования ресурсов в вашей компании и идите по этому пути. Ибо - таков был путь ;) Ну а мы переходим к 8 этапу - Планирование и согласование работ.
Планируем по следующим критериям:
Тип работ;
Скоуп работ;
Объём ресурсов команд;
Согласование ресурсов;
Согласование сроков.
Я не буду дублировать вариант того, как это возможно реализовать, т.к. это уже было сделано в этой статье, на базе которой создана эта, но ряд моментов, которые можно подсветить, озвучу.
С точки зрения чек-листа того, что может потребоваться для согласования, можно составить такой список:
Собираем и описываем фактуру по ограничениям в текущих процессах и технологиях и их влияние на развитие продукта;
Готовим slide decks по результатам раннего исследования в формате презентации и доски в miro или аналогах;
Описываем постановку задач на первичное проведение работ по улучшениям;
Описываем технику/автоматизацию/процессы на понятном бизнесу языке;
Описываем потенциальные или реальные преимущества как краткосрочные, так и долгосрочные от описанных выше изменений;
Таймлайн внедрения;
Согласование ресурсов.
Варианты описания преимуществ от автоматизации и проведения работ:
Уменьшить расходы на релизный цикл;
Cократить негативное влияние человеческого фактора за счёт автоматизации и отказа от мануальных действий;
Повысить чистоту и качество кода, снизив количество дефектов;
Уменьшить T2M;
Уменьшить время сборки и, как следствие, сократить трудозатраты на процессы, где она используется;
Уменьшить время на траблшутинг команд тестирования и разработки;
Ускорить устранение сбоев.
Пример таймлайна внедрения.
![Пример таймлайна внедрения Пример таймлайна внедрения](https://habrastorage.org/getpro/habr/upload_files/38c/ca3/2ae/38cca32aed27017b020068ffc8a43ce0.png)
Еще лучше показать диаграмму Ганта, например, на базе gunt structure jira:
![Пример таймлайна на базе jira gant structure Пример таймлайна на базе jira gant structure](https://habrastorage.org/getpro/habr/upload_files/096/fc2/a21/096fc2a21766d3440fb3f0944621597d.png)
А вот так может выглядеть пример формата запроса на ресурсы:
![](https://habrastorage.org/getpro/habr/upload_files/dd1/a0b/67f/dd1a0b67f683e15b549011a1d2d7aa5d.png)
Да, в Ганте бы это выглядело более наглядно, но тут мы в это углубляться не будем. Более подробно с описанием 8 этапа можно ознакомиться в видео ниже, начиная с 43 минуты.
А мы переходим к 9 этапу - Реализация. В нашем случае это заняло 1,5 месяца. И тут кроме тех нюансов, что были описаны выше в части сопротивления и согласования ресурсов, добавить больше нечего.
На 10 этапе - Контроль работ мы *этим самым и занимаемся. Промежуточные статусы осуществляем раз в месяц, глобальное планирование актуализируем раз в квартал. Планирование лучше делать, если это возможно, на год вперёд, если нет, то на квартал с разбивкой по месяцам, больше мельчить нет смысла. В рамках контроля ещё можно проводить:
Статусы с product owner;
Уточнение по срокам работ;
Ведение работ;
Контроль исполнителей;
Выделение куратора работ от службы DevOps.
После чего переходим к 11 этапу - Реаудит раз в квант времени. Квант у всех может быть разный, мельчить меньше полугода нет смысла, по опыту, лучше - раз в год.
Что у нас получилось реализовать, если кратко:
внедрена матрица зрелости продуктов;
сформированы точки контроля и временные срезы;
реализован прозрачный контроль за развитием продукта;
понятен и реализован процесс снижения T2M.
Что же нам дало внедрение данного подхода?
Есть единый прозрачный процесс контроля развития технической части продукта и взаимодействия всех участников цикла разработки;
Более прозрачные метрики зрелости разработки для бизнеса с пониманием, что на что влияет. Тут важно сказать, что ещё много планов по тому, что предстоит сделать, но начало положено в виде цифрового профиля разработчика;
За счёт доп автоматизации:
- больше фич в sprint текущими ресурсами;
- повышение качества тестирования спринтов;
- повышение чистоты кода.
А вот теперь самое интересное, что можно назвать послесловием.
Да, многое можно сказать на словах, но реальный профит в некоторых случаях оказалось оценить и посчитать намного сложнее, чем думалось изначально, т.к. к моменту внедрения либо не была реализована процедура снятия метрик для понимания результатов, либо было не понятно, как эти метрики собирать. Что также является проблемой, которую мы ещё решаем.
Сейчас я расскажу ряд реальных реализаций и профита, а вот полноценные детали с цифрами уже будут в отдельной будущей статье, т.к. ещё предстоит не мало работы по созданию и рефакторингу этих самых метрик.
Начнём коротко и по существу.
Стэк, на котором будет осуществляться сбор и вывод метрик, - надо выбрать, и подробно об этом будет рассказано в будущей статье. Но с этого надо начинать, ибо описано не мало как кастомных реализаций, так и коробочных решений.
Измерить время сборки, время деплоя и вывести это - не так сложно, но если вы хотите снимать метрики коммитов разработчиков за период времени, считать среднее время на коммит и количества закрываем задач за релиз или спринт, то тут уже придётся подумать, как это лучше делать. Почему? Потому что инструментов CI/CD много, и у каждого по разному реализовано API, что надо учитывать, поэтому одну прямую реализацию переиспользовать даже на том же стеке один в один не выйдет, потому что архитектура пайпов у всех построена по-разному.
Если мы хотим собирать метрики перехода по статусной модели flow issuetype jira и соотносить их с исполнителем, то тут надо подумать над реализацией - как лучше и менее ресурсонагрузочно на сервер - через запросы в БД или api jira.
И последнее, что я также хочу сказать - если вы хотите собирать метрики по репозиториям, мейнтейнерам, коммитам, MR/PR, то исходите из вашего процесса разработки. И для того, чтобы некоторые метрики появились, возможно, в процессе разработки придётся что-то изменить, не факт, что это будет так, но такое возможно. Например, начать использовать ребейзы вместо сквошей формирования MR/PR.
Безусловно, всего я тут не опишу и процесс формирования метрик ещё находится в разработке, в том числе для доказательств профита от работ, которые сейчас из-за их отсутствия попросту сделать невозможно.
И это будет заключительным выводом - планируйте реализацию метрик не постфактум проведения работ в рамках матрицы, а заранее или во время этих работ, а ещё лучше - до работ, чтобы можно было сравнить результат до работ и после, при этом храните всю историю метрик, чтобы можно было их в последствии анализировать.
А продолжение с детализацией метрик и какие работы на что повлияли будет в будущих статья, а на сегодня всё.
С вами был Крылов Александр, до новых встреч!