Почему бизнесу выгодно автоматизировать обзоры кода
Автоматизация обзоров кода возможна с помощью инструментов статического анализа. В статье разбираются 5 основных причин, почему эти инструменты полезны бизнесу, связанному с разработкой программного обеспечения. Статья поможет принять решение, стоит ли познакомиться с инструментами анализа кода и внедрить их в ваш процесс разработки.
Сразу отметим, что под автоматизацией процесса обзора кода могут пониматься две разные сущности: 1) Инструменты, которые изучают код и выдают предупреждения о тех фрагментах, которые с большой вероятностью содержат ошибки. В этой статье мы рассмотрим как раз этот вариант. 2) Инструменты, которые помогают программистам организовать обзор кода. Эти инструменты востребованы, например, в распределённых командах. Данная тема рассматриваться не будет.
Автоматизированный обзор кода
Обзор кода (рецензирование кода) — это процесс совместного просмотра кода разработчиками с целью выявления в нём ошибок, дефектов безопасности, неэффективных алгоритмов и так далее. Эта полезная устоявшаяся практика, у которой, к сожалению, есть три недостатка:
- Она дорога в плане времени и трудозатрат. Необходимо отвлекать коллег от их задач, тем самым сокращая их рабочее время, а также прерывая их работу в потоке.
- Люди плохо замечают некоторые разновидности ошибок — например, опечатки.
- Быстрая утомляемость участников и потеря внимания. Уже через полчаса чтения кода снижается качество проверки бизнес-логики. Иногда обзор может просто завершиться фразой «кажется, дальше нормально».
Для компенсации этих недостатков можно использовать автоматизированный обзор кода. Речь идёт об использовании статических анализаторов кода. Статический анализатор станет ещё одним «членом команды», который выполняет обзор кода прежде, чем этим займутся коллеги.
Анализатор выдаст предупреждения об аномалиях в коде. Изучив эти предупреждения, разработчик может устранить ряд ошибок и потенциальных уязвимостей, улучшить оформление кода. Таким образом, статический анализатор берёт на себя часть рутинной работы по обнаружению багов. Благодаря этому программисты на обзоре кода могут уделять больше внимания не выискиванию опечаток, а поиску более высокоуровневых ошибок и обсуждению архитектурных решений.
Польза внедрения статического анализа кода
Статический анализ требует времени на внедрение и использование, как и любая другая методология тестирования. Например, юнит-тесты тоже требуют времени на их написание и дальнейшее сопровождение.
Выигрышем от использования статического анализа, как и от написания юнит-тестов, является экономия ресурсов команды на сопровождение и развитие программного проекта.
Существует пять причин, почему статический анализ окажет положительное воздействие на процесс разработки ПО с точки зрения бизнеса:
- Сокращение времени и стоимости исправления ошибок;
- Раннее обнаружение потенциальных уязвимостей;
- Высвобождение ресурсов для решения бизнес-задач;
- Контроль качества;
- Поддержка различных стандартов кодирования.
Рассмотрим каждую из них подробнее.
1. Сокращение времени и стоимости исправления ошибок
Чем раньше ошибка обнаружена, тем меньше стоимость её исправления. Статический анализ может выполняться ещё на этапе написания кода, а это самый ранний момент, когда можно выявить ошибку.
Согласно книге С. Макконнелла «Совершенный Код», средняя стоимость выявления и исправления ошибки на этапе тестирования уже в 10 раз выше, чем её исправление на этапе написания кода. Если ошибка обнаружена после выпуска программы, то стоимость исправления может вырасти ещё больше.
2. Раннее обнаружение потенциальных уязвимостей
Ситуация ещё более критична, если говорить не об ошибках, а об уязвимостях нулевого дня. Компания может понести большие репутационные и финансовые потери, если злоумышленник обнаружит уязвимости в её сервисах. На графике показаны средние затраты на устранение дефектов безопасности, обнаруженных на различных этапах жизненного цикла программного обеспечения.
Статические анализаторы, проверяющие код на наличие потенциальных уязвимостей, называются SAST-решениями (Static Application Security Testing). Примером такого инструмента является PVS-Studio.
3. Высвобождение ресурсов для решения бизнес-задач
Автоматизированное выявление части ошибок на этапе написания кода с помощью анализаторов высвободит больше ресурсов на решение бизнес-задач.
Цитата из книги Дэвида Андерсона «Канбан. Альтернативный путь в Agile»: «Кейперс Джонс сообщает, что в 2000 году во время пузыря доткомов он оценивал качество программ для североамериканских команд, и оно колебалось от шести ошибок на одну функциональную точку до менее чем трех ошибок на 100 функциональных точек — 200 к одному. Серединой будет примерно одна ошибка на 0,6–1,0 функциональной точки. Таким образом, для команд вполне типично тратить более 90% своих усилий на устранение ошибок. Есть и прямое тому свидетельство: в конце 2007 года Аарон Сандерс, один из первых последователей Канбана, написал на листе рассылки Kanbandev, что команда, с которой он работал, тратила 90% доступной производительности на исправление ошибок. Стремление к изначально высокому качеству окажет серьезное влияние на производительность и пропускную способность команд, имеющих большую долю ошибок. Можно ожидать увеличения пропускной способности в два-четыре раза. Если команда изначально отстающая, то концентрация на качестве позволяет увеличить этот показатель вдесятеро».
Один из способов снижения плотности ошибок в коде заключается в регулярном использовании статического анализа. Анализаторы находят ошибки, а их предупреждения помогают писать более простой и лаконичный код. Понятный код легче сопровождать, а при его изменении меньше вероятность внесения новых ошибок.
4. Контроль качества
Менеджерам может быть интересно получить ответы на вопросы следующего типа:
- В этом году команда пополнилась большим количеством новых сотрудников. Не повлияло ли это на качество кода в худшую сторону?
- Мы планируем внедрить X. Как узнать, скажется ли это положительно на качестве кода?
Ответы на эти вопросы могут дать графики плотности предупреждений, построенные на основе результатов статического анализа. Если количество предупреждений в пересчёте на 1000 строк кода становится всё больше, значит качество падает. Визуализировать состояние проекта помогут такие системы отслеживания ошибок, как DefectDojo.
5. Поддержка различных стандартов кодирования
Создаваемый код должен отвечать стандартам, принятым в соответствующей индустрии. Например, при разработке систем, для которых важны безопасность и отказоустойчивость, применяют стандарты MISRA C, MISRA C++, AUTOSAR C++14 Coding Guidelines.
Контролировать вручную, что код соответствует заданным правилам написания, является крайне утомительным и непродуктивным занятием. Эту работу могут взять на себя статические анализаторы, которые проверят код на соответствие требуемым критериям.
Важность внедрения в процесс разработки
Просто использовать статический анализатор недостаточно. Разработчики допускают ошибку, запуская анализатор кода от случая к случаю. Но это непродуктивный подход. Анализатор следует использовать на регулярной основе — именно тогда многие ошибки будут выявлены на раннем этапе.
Важно сделать автоматизированную проверку кода частью процесса разработки. Идеально, если проверка запускается сразу после компиляции кода. Можно запускать анализ при закладывании кода в системы контроля версий (GitHub, GitLab, BitBucket и т.д.). Можно запускать анализ ночью на сервере. Существуют и другие сценарии. Самое главное, что это регулярные процессы!
Эта тема хорошо раскрыта в статье «Внедряйте статический анализ в процесс, а не ищите с его помощью баги».
Использование продвинутых инструментов сканирования кода
Помимо регулярного использования, очень важно выбрать подходящий инструмент статического анализа. Тут нет универсальных советов для всех. Разным командам могут подойти разные инструменты. Их много, и всегда можно подобрать что-то удобное именно вам.
Несмотря на то, что однозначных советов дать нельзя, рекомендую в первую очередь обращать внимание на известные коммерческие решения. Как правило, они предоставляют большой набор функциональности, который удовлетворит многим сценариям использования. Также такие инструменты, как правило, осуществят более глубокий и качественный анализ кода. В качестве одного из вариантов предлагаем рассмотреть SAST-решение PVS-Studio.
PVS-Studio
PVS-Studio — это статический анализатор кода для поиска ошибок и потенциальных уязвимостей в коде программ, написанных на языке C, C++, C#, Java. Представляет собой инструмент автоматического обзора кода, который помогает команде в поиске фрагментов, содержащих опечатки, логические ошибки, уязвимости, неопределённое поведение и так далее.
Поддерживаемые операционные системы: Windows, Linux, macOS.
Входит в реестр отечественного ПО: N 9837. Можно использовать по требованию ФСТЭК без сертификации в проектах до 4-го уровня доверия включительно.
Параметры лицензирования: по количеству пользователей.
Для читателей CNews предоставляется промокод CNEWS для получения триала на один месяц.
Преимущества продукта перед конкурентами:
- Глубокий анализ, благодаря технологиям: анализ потока данных, символьное выполнение taint-анализ, сопоставление с шаблоном, межпроцедурный анализ, межмодульный анализ, автоматическое аннотирование функций, SCA.
- Проработанные сценарии для интеграции и регулярного использования.
- Быстрая и качественная поддержка от разработчиков анализатора.
- Регулярные релизы — каждые 2 месяца.
- Возможность работать в полностью закрытом контуре.
Заключение
Внедрив статический анализ, вы получите дополнительные возможности по обеспечению высокого уровня качества, надёжности и безопасности кода ваших программных проектов.
Наша команда имеет большой опыт помощи компаниям во внедрении статического анализа в их процесс разработки. Напишите нам, если у вас есть вопросы по тематике статического анализа. Надеюсь, мы сможем помочь вам улучшить процессы создания программных решений.
Об авторе
Андрей Карпов более 15 лет занимается темой статического анализа кода и качества программного обеспечения. Автор большого количества статей, посвящённых написанию качественного кода на языке C++. Один из основателей проекта PVS-Studio. Долгое время являлся CTO компании и занимался разработкой С++ ядра анализатора. Основная деятельность на данный момент — управление командами, обучение сотрудников и DevRel деятельность.
Андрей Карпов
Полный текст статьи читайте на CNews