Сравнение методик обзора кода

в 19:02, , рубрики: code review, обзор кода, Программирование, разработка, Совершенный код, метки: ,

Думаю, многие разработки знакомы с понятием code review или обзор кода по-русски (также данный термин переводят как просмотр кода, инспектирование кода или рецензирование кода – далее, для единообразия, будет использоваться вариант «обзор кода»). Недавно я столкнулся с необходимостью «разложить по полочкам» и классифицировать знания по этой теме. Результат – данная статья. Надеюсь, она окажется полезной, а также поможет внедрить обзоры кода в свой производственный процесс тем, кто только об этом задумывается.
wtf per minute
Обзор кода является одним из наиболее эффективных методов поиска и устранения дефектов программы. Обзоры проводятся человеком, что позволяет находить широкий класс ошибок, в том числе с трудом детектируемых или вообще не детектируемых автоматическими средствами. Безусловно, обзор кода, не отменяет использование анализаторов кода или других методик обнаружения ошибок, например, unit-тестирования. К сожалению, не существует метода, который один обеспечил бы обнаружение всех дефектов программы (в исследованиях эффективность обзора кода обычно оценивается как 30-50% обнаруженных ошибок в приложении).

Поиск ошибок не единственная задача обзора кода. Помимо этого, обзор кода имеет еще несколько положительных свойств:

  • Улучшается архитектура приложения за счет того, что каждую часть системы продумали как минимум 2 человека.
  • Программист изначально мотивируется писать более качественный код, зная, что его будут просматривать.
  • Распространяются знания о проекте среди команды.
  • Происходит обмен программистским опытом.
  • Вырабатывается единый стиль кодирования в команде.

За все это приходится платить временем, которое могло быть потрачено на кодирование. Тем не менее, на проектах, рассчитанных хоть на какую-либо перспективу, затраченное время в будущем вернется сторицей за счет создания изначально качественного продукта, вместо судорожной «допилки» позже.

Можно выделить следующие виды обзоров кода:

  • Формальная инспекция кода.
  • Неформальная инспекция кода (другое название – анализ кода).
  • Чтение кода.
  • Парное программирование.

Рассмотрим каждый вариант по-отдельности.

Формальная инспекция кода

Формальная инспекция кода представляет собой как следует из названия формализированную процедуру просмотра кода. По МакКоннеллу она выглядит примерно так.

Координатор инспекции назначает дату инспекционного собрания и инспекторов, которые должны до собрания самостоятельно изучить инспектируемый фрагмент кода. В назначенное время собираются координатор инспекции, секретарь, автор кода и инспекторы. Кто-то из инспекторов или руководитель начинают читать код строчку за строчкой (для удобства желательно его заранее распечатать вместе с номерами строк). Инспектора указывают на найденные ими проблемы, автор кода отвечает на вопросы инспекторов – если все соглашаются, что ошибка действительно имеется, то секретарь ее записывает. Координатор инспекции следит за процессом в целом, например, за тем, чтобы обсуждения одной ошибки не затягивались. По окончании инспекции составляется отчет с ее результатами.

Более подробный пример формальной инспекции можно найти здесь.

Достоинства:

  • Очень высокая эффективность.
  • Благодаря составляемому списку ошибок легко проверить их устранение.
  • Инспекционные отчеты можно использовать в дальнейшем, например, для анализа характерных проблем.

Недостатки:

  • Сложная формальная процедура, требующая времени.
  • Отвлечение как минимум 3-х человек (координатор, автор кода и инспектор) от их основной работы.
  • Большое психологическое давление на автора кода.

Неформальная инспекция кода

Неформальная инспекция в отличие от формальной не имеет четких правил. Например, это может происходить так: автор кода, перед его публикацией, подзывает первого попавшегося разработчика за свой компьютер, где показывает и рассказывает то, что написал. Проверяющий пытается вникнуть в написанное, задает вопросы и высказывает свои соображения. Безусловно, при таком способе эффективность будет не сильно высокая, зато такая инспекция отнимает мало времени.

Достоинства:

  • Малые затраты времени.
  • Простой процесс не требующий формальных процедур.

Недостатки:

  • Невысокая эффективность за счет поверхностного знакомства проверяющего с кодом.
  • Для проверки приходится отвлекать кого-нибудь от основной работы, что может сильно раздражать.
  • Критика кода может плохо восприниматься автором, причем как обоснованно (например, из-за незначащих придирок проверяющего), так и необоснованно (например, автору трудно признавать свои ошибки).

Чтение кода

Чтение кода – это самостоятельное изучение разработчиком чужого кода без присутствия автора. Данная практика является самой простой и распространенной из описанных здесь – думаю, любому разработчику так или иначе приходило читать чужой код. Не говоря уж про мир Open Source, где это зачастую единственный доступный метод обзора кода.

Достоинства:

  • Простота.
  • Высокая доступность – не требуется синхронизация во времени и пространстве.

Недостатки:

  • Медленная обратная связь – могут потребоваться дополнительные комментарии к коду, которые нельзя быстро получить, а иногда даже быстрее самому исправить дефект, чем сообщить об этом автору.

Парное программирование

Парное программирование является экстремальным методом обзора кода – обзор, осуществляемый постоянно: два разработчика за одним компьютером, за одним комплектом мыши и клавиатуры, вместе решают одну задачу. Широкое распространение парное программирование получило после появления методологии экстремального программирования, хотя активно использовалось и до этого. Часто парное программирование используется спонтанно: думаю, многим приходилось подходить к другому разработчику за компьютер, чтобы помочь решить сложную задачу.

Достоинства:

  • Высокая эффективность, особенно в плане обмена опыта и распространения знания о проекте.
  • Высокая концентрация на работе – работая в паре, разработчики гораздо меньше отвлекаются на посторонние вещи.
  • Естественное ограничение количества одновременно разрабатываемых командой задач – сконцентрированность на меньшем количестве задаче обеспечивает более качественную и быструю их реализацию, что позволяет непрерывно поставлять новые версии продукта.
  • Нет психологических вопросов присущих инспекциям – оба авторы кода, и оба одновременно его же инспекторы, предложения по улучшению воспринимаются именно как предложения, а не критика.
  • Повышение командного духа – успехи, достигнутые в паре, больше объединяют людей, чем индивидуальные достижения.
  • Отлично подходит для обучения новичков.

Недостатки:

  • Падение общей производительности, два программиста заняты одной задачей, вместо разработки двух задач – данное утверждение достаточно спорное, согласно ряду исследований, программисты, работающие в паре, имеют всего на 15% процентов меньшую производительность, чем два программиста работающих по отдельности.
  • Требуется синхронизация рабочего графика – трудно работать в паре, когда партнеры в разное время ходят на обед или приходят на работу.
  • Повешенная утомляемость за счет постоянной высокой концентрации на работе – для программистов, работающих в паре, даже может иметь смысл делать рабочий день меньше стандартных 8-ми часов.
  • Не все люди совместимы, а некоторые даже вообще не способны работать с кем-то вместе. На самом деле, таких людей достаточно немного и большую часть проблем взаимодействия в паре можно преодолеть, выполняя ряд правил (например), а также с накоплением опыта работы в паре.
  • Неэффективно для выполнения рутинных задач – в этом случае разработчик, не владеющий клавиатурой, будет просто скучать.
  • Трудно синхронизировать темп разработчиков уровень опыта и знаний которых сильно различается – для эффективной работы от более опытного разработчика требуются терпение и некоторые наставнические навыки.

Хочется добавить несколько слов к вышенаписанному. Как можно заметить некоторые недостатки вытекают из достоинств. В этом нет ничего удивительного – парное программирование методика достаточно не простая, как может показаться с первого взгляда, и не все ее свойства очевидны. Поэтому, начав работать в парах, не стоит ожидать моментальных результатов. Только после получения некоторого опыта парное программирование начнет приносить плоды, и более того – можно будет добиться минимизации некоторых негативных эффектов.

Что выбрать?

Теперь можно попробовать определиться какой метод и в каком случае стоит использовать.

  • Если вы решили делать обзоры кода, но не хотите сильно на этом заморачиваться, то для команды расположенной в одном месте неформальные инспекции будут лучшим выбором.
  • Для распределенной команды практически единственный доступный метод обзора это чтение кода. Несмотря на то, что существуют системы для удаленного парного программирования, чисто по психологическим причинам, они не так комфортны как программирование за одним компьютером. Кроме того, чтение кода можно практиковать и в нераспределенных командах, но когда стоит выбор гадать над назначением какого-то куска кода или поинтересоваться об этом у автора, я бы выбрал последнее.
  • Формальные инспекции отлично подходят для обзора сложных или критичных участков кода – в этом случае временные затраты с лихвой окупятся результатом. Некоторые практикуют постоянное использование формальных инспекций, но мне трудно представить, как можно формальными инспекциями провести обзор всего имеющегося кода.
  • Парное программирование не зря является одним из принципов экстремального программирования. Его высокая эффективность и дополнительные бонусы, присущие только этому виду обзора кода, действительно позволяют его рекомендовать как основной способ разработки в команде (за исключением простейших или рутинных задач). Оптимизма добавляет и то, что с большей частью недостатков можно успешно бороться. Самой большой проблемой может стать попытка уговорить менеджмент использовать такой расточительный, по их мнению, метод – тут вам в помощь книги и статьи практиков экстремального программирования.

Как видите, вариантов достаточно – можно выбрать наиболее подходящий для себя способ. Кроме того, никто не запрещает комбинировать методики (например, одна часть команды работает в парах, другая часть – в одиночку, но код, написанный ими, обязательно инспектируется). Можно начинать с более простых методик и постепенно переходить к сложным – главное начать, а положительные эффекты, думаю, не заставят себя ждать.

Литература

  1. Совершенный код (Code complete). Стив МакКоннелл (Steve McConnell). Глава 21. Совместное конструирование.
  2. Экстремальное программирование: постановка процесса. С первых шагов и до победного конца (Extreme Programming Applied: playing to win). Кен Ауэр, Рой Миллер (Ken Auer, Roy Miller). Глава 14. Прекращаем работать в одиночку.

Автор: agosteev

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js