Команда просит 3 месяца на новую функцию, хотя год назад похожая заняла 2 недели. Один разработчик говорит, что код в порядке, другой советует переписать всё с нуля, а у собственника нет способа проверить ни того, ни другого. Rule 90 проводит аудит кода для владельцев, которым продукт достался от прежней команды или которые ведут его своими силами и хотят понять, в каком он состоянии. Проверяем архитектуру, качество кода, безопасность и готовность к росту нагрузки, считаем, во что обойдётся развитие сейчас и после исправления критичного, и отдаём план работ с приоритетами. Если продукт стало дорого и рискованно менять, берём на себя и рефакторинг.
Код-ревью проверяет изменение, аудит — всю систему
Код-ревью (code review) — проверка одного изменения. Разработчик сделал доработку, коллега читает её до того, как она попадёт в общий код, и так команда держит качество каждый день. Аудит — разовая проверка всей системы внешней командой, и итог у него другой: отчёт для владельца о том, что в продукте есть, чем он рискует и сколько стоит его развивать. Подробнее о ревью как о практике — в справочнике о код-ревью.
Что проверяем при аудите кода
Начинаем с архитектуры и качества кода. Смотрим, как разделены части системы, можно ли поменять одну, не задев остальные, есть ли тесты и документация. Потом сборку, то есть получится ли у нового человека собрать и выпустить продукт по репозиторию, не звоня тому, кто писал его раньше. Затем нагрузку: где узкие места и что сломается первым, если пользователей станет вдвое больше.
Безопасность смотрим в коде: права доступа, пароли и ключи, оставленные в репозитории, устаревшие библиотеки с известными уязвимостями, хранение данных пользователей. Проверка прав стоит в этом списке первой не случайно. В OWASP Top 10 (это открытый перечень самых частых уязвимостей веб-приложений) на первом месте ошибка, при которой пользователь видит или меняет то, что ему не положено.
Какой получится отчёт
Каждая находка в отчёте описана так, чтобы её понял руководитель без технического образования. Несколько строк для примера, условных:
| Что нашли | Чем грозит | Что сделать | Когда |
|---|---|---|---|
| Пароль от базы данных лежит в коде | каждый, у кого есть доступ к репозиторию, видит данные клиентов | вынести пароль из кода и сменить его | сразу |
| Заказ открывается по номеру без проверки владельца | клиент может увидеть чужой заказ | проверять права на сервере | сразу |
| На оплату нет ни одного теста | любая правка может незаметно сломать оплату | покрыть тестами путь оплаты | до новых функций |
| Библиотеки не обновлялись несколько лет | в них могут быть известные уязвимости | обновить по плану | по плану работ |
Кроме находок, в отчёте две оценки развития: сколько будут стоить следующие доработки в нынешнем коде и сколько после исправления критичного. Мартин Фаулер, автор книги о рефакторинге, называет эту разницу процентами по техническому долгу: функция, которая в понятном коде заняла бы 4 дня, в запутанном занимает 6. Положив две оценки рядом, собственник видит, сколько переплачивает за каждую доработку и через сколько доработок исправление вернёт вложенное.
Разберёмся в задаче и предложим, как решить её эффективно.
Рефакторинг без остановки продукта
Рефакторинг кода меняет его устройство так, чтобы код было проще понимать и дешевле менять, а пользователь разницы не замечает. Мы ускоряем медленные участки, обновляем устаревшие технологии, добавляем тесты на важные пути и выпускаем изменения небольшими частями, поэтому продукт всё это время обслуживает клиентов. Берёмся за рефакторинг, когда у него есть причина, которую видно бизнесу: доработки дорожают, после каждой правки что-то ломается или ожидается рост нагрузки. Что такое рефакторинг и чем он отличается от переписывания, объяснено в справочнике о рефакторинге.
«Может, проще переписать с нуля?»
Иногда да, и аудит покажет это в деньгах. Рядом ложатся две сметы, на доработку того, что есть, и на новую разработку. В первой видно, какие части можно сохранить, во второй — сколько стоит заново сделать то, что уже работает и проверено пользователями. Решение остаётся за вами, но принимается по числам, а не по мнению одного разработчика.
Доступы, NDA и цена аудита
Для начала нужны доступ к репозиторию и серверам, документация, если она есть, и по возможности разговор с теми, кто писал код. Работаем под NDA. Цену аудита называем, когда увидим репозиторий, потому что она зависит от объёма кода, числа сервисов и интеграций. План работ остаётся у вас, и исправлять найденное может ваша команда или мы.
Вопросы об аудите кода
Аудит безопасности кода — это то же, что пентест?
Нет. Мы проверяем код и настройки на типовые уязвимости. Тест на проникновение и аттестацию информационной системы мы не проводим, а часть работ по защите информации требует лицензии. Их делает профильный партнёр, и для него мы готовим код и описание архитектуры.
Можно ли провести аудит, если документации нет?
Можно. Устройство системы восстанавливаем по коду, настройкам серверов и базе данных, и схема системы становится частью отчёта.
Что делать, если подрядчик ушёл и продукт надо развивать дальше?
Начать с аудита, а потом решать, кто и как будет достраивать. Как мы принимаем такие проекты, рассказано на странице о доработке чужого проекта.