Почему метрика — это выбор поведения
Руководителю, у которого сроки и бюджет, безопасность обычно является не как процесс, а как сбой планирования. Посреди спринта срабатывает сканер, перед релизом приезжает аудит, в ленте зависимостей появляется бюллетень — и план недели переделывается. Отсюда и запрос «метрики безопасности разработки»: раз работу не видно, её надо измерить и встроить в обычный ритм.
Инстинкт правильный, но у метрики есть свойство, о котором забывают в момент выбора: команда оптимизирует то, что измеряют. Не в плохом смысле — в буквальном. Повесите число — получите поведение, которое это число улучшает. Поэтому вопрос «какую метрику безопасности выбрать» — это, в сущности, вопрос «какое поведение мы покупаем».
И ещё одно, без чего выбирать не из чего. Незапланированная работа оплачивается по аварийному тарифу, и складывается он не из часов на сам фикс — часов там примерно столько же, — а из выброшенного плана, переключения контекста, замороженного релиза и решений, принятых в спешке. Планируемая работа того же содержания оплачивается по обычному тарифу. Метрика покупает не безопасность как таковую — она переводит работу из одного режима в другой. Это аргумент для бюджета, а не для паники.
Подвох в том, что с безопасностью всё сложнее, чем с поставкой. Скорость поставки измеряет собственную работу команды. Почти любая «метрика безопасности», лежащая на поверхности, измеряет чей-то чужой труд: сканера, аудитора, того, кто ведёт перечень зависимостей. Пока это не проговорено, любая таблица метрик будет красивой и бесполезной.
Тупик: считать находки
Первое, что вешают на команду, — количество уязвимостей: открытых на релиз, найденных за месяц, критических в бэклоге. Выглядит здраво. Безопасность про дефекты — значит, мерить надо дефекты.
Не работает, и это видно из устройства системы, без всяких замеров. Находок столько, сколько находит инструмент, — функция его покрытия и конфигурации. Столько, сколько позволяет поверхность, — список зависимостей и стек, который команда чаще унаследовала, чем выбрала. И столько, сколько команда честно решила не игнорировать. Из трёх сомножителей команда контролирует один — честность, и метрика бьёт именно по нему. Купите инструмент пошире — счётчик поползёт вверх в тот самый момент, когда всё стало лучше. Начните смотреть внимательнее — то же самое. Единственный способ улучшить цифру — смотреть меньше или закрывать находки на бумаге. Оба пути метрика поощряет, и оба меняют качество работы ровно в обратную сторону.
У эффекта есть имя — закон Гудхарта, — но имя не главное. Главное: счётчик находок — это запас, а не поток. Запасы измеряют мир вокруг команды, потоки измеряют саму команду.
Рядом — второй соблазн, «ноль инцидентов». Тоже мимо, по другой причине: инциденты редки и отстают от поведения, на горизонте планирования такой индикатор измеряет скорее удачу и честность журнала, чем что-то, чем команда управляет. Нормированные варианты — уязвимостей на релиз, на объём кода — не спасают: нормировка меняет масштаб, а измеряется всё тот же приток находок, не поведение. Третий из той же серии — часы тренингов — хотя бы безобиден: он измеряет присутствие, и только.
Что считать: время петли
Если дефекты неизбежны, а их количество от команды почти не зависит, измерять надо не наличие дефектов, а цену обращения с ними. Петля — это путь от момента, когда находка стала известна, до момента, когда с ней что-то сделали: починили в проде или осознанно отклонили. Посчитанная по каждой находке и свёрнутая в медиану, эта величина отвечает ровно на вопрос руководителя: когда найдётся следующее, сколько времени это займёт по обычному ходу вещей.
Почему медиана, а не среднее: одна зависшая аудиторская позиция тянет среднее куда угодно, и после взгляда на него непонятно ничего про типичный случай. Медиана — про типичный.
Считать лучше с разбивкой по источнику. Находки, которые команда нашла сама — сканером, ревью, чек-листом, — измеряют рутину. Принесённые снаружи — пентестом, аудитором, исследователем — измеряют худший случай. Часы у них разные по природе, и, свалив всё в одну кучу, вы получите число, на которое невозможно опереться.
Есть и выбор часов. Строгий вариант считает петлю от публикации бюллетеня и включает задержку на чтение перечня; мягкий — от попадания в трекер, и эту задержку прячет. Мягкий удобен для сравнения команд, строгий честен про систему в целом. Выберите один и не смешивайте в одном ряду — этого достаточно, чтобы начать.
Внутри петли полезно различать задержки, потому что у них разные владельцы. От публикации бюллетеня до попадания в трекер — про то, читает ли кто-нибудь перечень вообще; об этом у нас есть отдельный материал про цепочку поставок, и метрика времени хорошо его дополняет: непрочитанные бюллетени копятся в начале петли и молчат. От трекера до принятия в работу — про приоритеты и очередь. От принятия до прода — про обычную поставку. Когда медиана растёт, разложение подсказывает, куда смотреть, вместо гадания.
Дальше — защита от игры. Скорость сама по себе приглашает к косметике: закрыть «не будем чинить», заплатить точечно, не убрав класс, заглушить правило. Поэтому медиану времени нужно носить в паре с повторяемостью: возвращается ли тот же класс дефекта в пределах окна, которое выберете вы. Возвращается — значит, петля не закрывается, а циклится. Пара «медиана плюс повторяемость» закрывает обе крайности: медленно, но честно; быстро, но косметично.
Отдельно — про законный выход. Петля не должна требовать чинить всё подряд. «Осознанно не чиним» — тоже разрешение находки, но с двумя условиями: у отказа есть имя того, кто его подписал, и у него есть дата пересмотра. Без имени и даты «приемлемый риск» превращается в мусорное ведро для неудобного, и мы возвращаемся в тупик со счётчиком находков, только с другой стороны.
И про унаследованный долг. Команда, которая тянет старый код, начинает с горы находок, которых не создавала. Если валить в одну медиану старый бэклог и новые поступления, цифра честно покажет цену очереди — это тоже полезно, но про другое. Старый долг — проект с собственным планом; медиана по новым поступлениям — устоявшийся режим команды. Считать их надо раздельно, иначе спор о справедливости метрики съест саму метрику.
Что метрика меняет в разговоре. Число времени петли — язык, на котором руководитель и безопасники обходятся без переводчика: не «вы небезопасны», а «петля длинная, вот где она длинная, вот что её укорачивает». Метрика перестаёт быть моральной оценкой и становится входом планирования, а наказывать имеет смысл только за то, что команда контролирует.
Позиция редакции
Мы считаем, что безопасность имеет смысл вешать на команду ровно в одном виде: время петли в паре с повторяемостью класса. Счётчики находок и счётчики инцидентов — метрики системы, а не команды. Это не значит, что они бесполезны: приток находок, состояние перечня зависимостей, разборы инцидентов нужны — но их владелец тот, кто распоряжается системой целиком, выбирает инструменты и распределяет долг. Команде достаётся то, что она может изменить собственным поведением.
Руководителю это даёт главное: безопасность перестаёт быть серией ЧП и становится строкой стоимости владения кодом — предсказуемой и торгуемой со спринтом на равных. Про то, что в этой стоимости считать и что игнорировать, у нас есть отдельный разбор; здесь достаточно сказать, что время петли — та статья расходов, которую нельзя «не считать», можно только не заметить.
Наша позиция неверна, если команда сама распоряжается тем, что сканирует и на чём стоит: свой стек, свои зависимости, свой конфиг инструмента. Тогда поток находок — её собственное поведение, и считать находки справедливо. Есть и вырожденный случай: если находок так мало, что медиане не из чего складываться, метрика петли не работает — придётся мерить прохождение чек-листа или долю изменений, идущих через защитный контур, и честно называть это метрикой процесса, а не результата.
С чего начать в понедельник
Без дашборда. Возьмите последние закрытые находки, сколько их есть, и у каждой две даты: когда стала известна и когда с ней разобрались. Отсортируйте, посмотрите на середину. Это число, с которым можно идти в планирование.
Повторяемость проверяется рядом: поищите среди свежих находок похожие на уже закрытые. Найдутся — либо окно слишком широкое, либо закрытие было косметикой.
Если дат нет, это и есть первая находка: петля не записана, значит, ею не управляют. Всё остальное вторично.