Ревизия кода

индекс
156,78

20 причин проводить обзоры кода

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

Я затвитил эту статью о 5 причинах проводить обзоры кода на CIO.com на прошлой неделе и понял, что на самом деле причин гораздо больше, чем те пять, о которых там написано. Так что к концу дня у меня их было уже больше 20. Это коллекция тех твитов с некоторыми подробностями, описанными здесь.

Причина №1. Достаточно быстрая ответная реакция, чтобы подстегнуть разработчика.
Так как обзор кода производится после кодирования и перед интеграционными и системными тестами, разработчикам не надо ждать столько же, сколько и ответа от отдела по качеству кода (QA). Обеспечив конкретный, своевременный ответ, разработчики могут подстраивать свои навыки кодирования для избежания общих ошибок.

Причина №2. Находит больше ошибок, чем при применении одного тестирования.
Это очевидно: тестирование находит ошибки. Обзор кода находит другие ошибки. Примененные вместе, они находят больше ошибок, чем можно было бы найти перед отправкой продукта клиентам.

Причина №3. У миллиона обезьян иногда получается валидный синтаксис, даже если он ничего не означает. Компиляторы не могут это отследить.
Иногда вы совершаете синтаксическую ошибку, состоящую из валидного кода, так что компилятор не может ее отследить. Классическая подобная ошибка в C — это = (присвоение) и == (оператор булевого равенства); в этом случае большинство компиляторов могут выдать предупреждение, но есть также и другие примеры. Обзор кода быстро выявит такую ошибку, тогда как найти ее с помощью тестирования может быть достаточно тяжело.

Причина №4. Найди и уничтожь ошибки там, где они живут, вместо поиска гнезда по их дерьму экскрементам.
Когда вы получаете отчеты об ошибках из обзора кода, у вас уже есть на руках точный номер строки и описание проблемы. Когда вы получаете отчеты от системного тестирования или (о, ужас!) от пользователя, у вас есть — в лучшем случае — набор шагов для воспроизведения ошибки. Затем только от вас зависит, сможете ли вы найти саму ошибку в коде, что занимает обычно довольно много времени, особенно, если код был написан неделями или месяцами ранее. (см. причину №1.)

Причина №5. Обучайте нубов.
Обзоры кода — это эффективный обучающий инструмент. Сначала, новички-программисты, участвующие в обзорах кода, получают доступ к коду других программистов и, таким образом, могут «прочувствовать» стандарт кодирования и стиль документации. Далее, неопытные программисты получат оценку их кода перед тем, как у них будет шанс заразить систему своим низкопробным кодом. (Потому что мы все знаем, что код, который мы писали 10 лет назад, возможно, ужасен — только если ему не посчастливилось пройти обзор у более старших разработчиков. Если вы программируете менее нескольких лет, помните, что все, что вы пишите сегодня, возможно, ужасно, но вы не сможете этого оценить еще в течение нескольких лет; см. причину №6.)

Причина №6. С самого начала используется эго разработчика для форсирования качества кода.
Теория здесь такая: зная, что код будет публично и внимательно исследован группой коллег, разработчики будут работать более тщательно, чтобы избежать стыда при нахождении всевозможных ошибок в их коде.
Комментарий от гостя @kyletolle: Причина №7. Разъяснение кода гарантирует его понимание. Убираются пометки типа «Нуу, я всегда это так делал...».
После того, как вам придется ответить несколько раз на один и тот же вопрос во время обзора, возможно, вы зададитесь вопросом и во время кодирования. (см. причину №6.)

Причина №8. Ускоряет тестирование. Черт, да всю разработку ускоряет!
Есть несколько основных причин для этого. Во-первых, так как обзор кода обнаруживает и исправляет дефекты прямо на его месте (см. причину №4), соответственно, тратится меньше времени на его исправление. Во-вторых, тестеры находят меньше ошибок, поэтому они проводят меньше времени над составлением вопросов, над которыми потом корячится отдел разработки. В-третьих, тестерам не надо перезапускать регрессионные тесты так много раз, потому что будет меньше релиз-кандидатов продукта… Ну и в-последних, тестеры будут меньше простаивать, ожидая исправлений ошибок.

Причина №9. Чем меньше количество рассерженных пользователей, тем счастливее ваша служба тех. поддержки..
Доказательство: Меньшее количество багов в продукте (см. причину №2). Т.к. баги не так часто досаждают пользователям, то последние реже становятся злыми. Поэтому когда пользователи наконец позвонят, они будут воспевать вам хвалу. (Ладно, возможно та часть про песни не совсем правда, но, думаю, общий смысл вы уловили.) Доказательство с другой стороны: если вы тратите меньше времени на исправление багов, вы можете тратить больше времени на разработку новых возможностей, о которых так просят ваши пользователи.

Причина №10. (Анти-причина) Придется платить больше комиссионных из-за большего количества продаж… эй, это ж здорово!
Когда пользователи поют хвалу стабильности вашему продукту, его легче продать как новым пользователям так и увеличить объемы продаж уже существующим. Конечно, комиссионные продажникам пойдут вверх, но я еще ни разу не слышал, чтобы кто-то об этом жаловался слишком уж громко.

Причина №11. Есть инструменты, уменьшающие раздражающий фактор «классических» процессов обзора.
(прим. перев. Список инструментов был позже приведен в этой совсем короткой статье, я решил вставить его прямо в это правило, дабы собрать всю информацию в одном месте).
Вот список инструментов обзора, без какого-либо определенного порядка. Я не пробовал их все, так что они даны без сравнения. Если вы знаете еще какие-либо инструменты, оставляйте комментарии и я дополню список.

Codestriker — Открытое (опенсорс) веб-решение, кажется, написанное на Perl.
Code Collaborator — Платный продукт.
Review Board — Открытое (опенсорс) веб-решение, кажется, написанное на python/Django.
Rietveld — Открытое(опенсорс) решение от Google. Попытка №2 Гвидо ван Россума по инструментам обзора. Отгадайте с 3-х раз, на чем оно написано…
Crucible — Платный продукт от компании Atlassian.
Итог: не пытайтесь делать это вручную, вы потратите кучу времени пересылая патчи и отслеживая дефекты, в то время как инструменты могут автомагически это сделать за вас.

Причина №12. Риск нулевой. Даже не-такие-уж-супер-эффективные обзоры бьют тестирование.
Если бы я потратил немного времени, то мог бы откопать несколько опубликованных исследований для обоснования этой причины. Но по моему личному опыту, обзоры кода примерно в 4 раза эффективнее чем юнит-тесты. Поэтому, даже если я провожу обзор без особого энтузиазма, я все еще более эффективен, чем тестирование. (См. причины №2 и №4, также помните про причину №5, которая не дает мгновенно измеримый эффект.) Также скорее всего должны быть и данные, говорящие что обзоры кода — это трата времени. Также возможно и некоторое количество летающих оленей. (прим. перев. Стив Макконнелл в своей книге «Совершенный код» действительно приводит довольно много результатов исследований, подтверждающих эффективность обзоров кода перед тестированием, а также говорит о том, что при применение обеих этих техник дает результат гораздо лучший, чем использование какой-либо одной из них.)

Причина №13. (Анти-причина) Тестеры будут скучать, из-за того что не смогут найти много ошибок… Ах, да! Они смогут сосредоточиться на стресс/нагрузочном тестировании. Хотел бы я иметь такую проблему…

Причина №14. Проведение обзоров — это хорошая практика для проведения обзоров. Вы становитесь лучше.
Эффективность проведения обзоров в вашей команде будет улучшаться со временем. Это означает что долгосрочный риск ошибок даже меньше, чем краткосрочный (см. причину №12 почему риск ошибки равен или очень близок к нулю).

Причина №15. Это отличный способ составить действительно полезный контрольный список для проведения обзоров.
Ну, это немного сомнительно, контрольный список для проведения обзоров вообще-то мало волнует пользователя (Мне, наверное, стоило придумать еще пару причин для объяснения «искусственных заполнителей»… Эй, я твитил это во время напряга в 3 часа дня перед полдником!)

Причина №16. Гипотетически: меньшая текучка кадров из-за того, что разработчики проводят меньше времени исправляя раздражающие ошибки.
Не знаю как другие, но я остался на работе, которая в других отношениях была не такой уж классной, из-за качества команды, в которой я работал и окружающих меня людей. Здорово ощущать себя частью хорошо смазанной машины. Это мотивирует приходить на работу каждый день, зная, что ты произведешь высококачественный продукт и твои коллеги будут рядом, чтобы прикрыть тебя.

Причина №17. Уменьшается риск выбиться из графика, потому что качество продукта растет с каждой завершенной фазой проекта.
Ваши тестеры не будут простаивать (см. причину №8) и тестирование не затянется. Т.к. вы получите ответную реакцию достаточно быстро относительно графика (см. причину №1), вам легко удастся определить сколько времени займет тестирование.

Причина №18. Ответная реакция (особенно от коллег) на уровне исходного кода означает, что вы прекратите совершать одни и те же ошибки снова и снова (см. причину №6).
Это исходит из того факта, что каждый разработчик будет иметь на руках данные о типах ошибок, которые он совершает и, таким образом, сможет найти способы для предотвращения этих ошибок. И вот где действительно начинается магия: когда вы начинаете думать о предотвращении целого класса ошибок.

Причина №19. Улучшение качества документации / комментариев, как и самого кода.
(См. причину №7) Разработчики будут лучше комментировать код, чтобы избежать ответов на большее количество вопросов от аудиторов. Если аудиторы ищут несоответствия между комментариями и кодом, это дополнительная мотивация к тому, чтобы поддерживать документацию в обновленном состоянии. В конечном счете, я подозреваю что чересчур замудренный код станет дефицитом, т.к. будет изучен и опрошен больше раз, чем обычный код.

Причина №20. Пользователи найдут не так много жуков в своем супе.
Эта причина может показаться ненужной в связи с причиной №9, но помощь пользователям это ведь смысл нашей работы, так ведь? Поэтому пусть она остается и — как я говорил выше — я поработаю над еще парочкой причин для добавления в список.

P.S. Перенёс в блог «Ревизия кода».
+40
18 марта 2010, 21:35
75

комментарии (26)

+1
adrobnych #
Можно обыграть как отдельную «причину» также обоснование включения рефакторинга в беклог итерации (Пример в подходе Скрам).

Если продукт долго растет, в нем накапливаются косяки, в том числе архитектурные. Наступает момент конфликта, когда программисты понимают, что следующий прирост функционала нельзя строить на плохом фундаменте, но Владелец продукта (Product Owner) требует все время итерации потратить на новые функциональные фичи.

Здесь очень кстати сделать обзор кода и соорудить хорошо оформленный документ, описать драматичные моменты… Помогает договориться.
+3
conf #
Все-таки здесь немного о другом. Вы говорите о рефакторинге всей системы в целом, т.е. все собираются и думают, что мы такого написали и как с этим жить дальше. В обзоре же кода есть автор кода и аудиторы, которые проверяют его код и делают ценные замечания, т.е. здесь все расписано по ролям.
В любом случае, спасибо за комментарий.
+1
sse #
Не знаю, насколько вам будет интересна следующая история: в компании, где я работаю, процесса code review не было. Когда я начинал его вводить, дела шли с ужасными тормозами — все, включая начальство, то ли боялись, то ли стеснялись.
А рядовые разработчики и вовсе воспринимали код как что-то личное или интимное — не давали никому туда лазать, даже смотреть на него, а за то, что я делал code review и указывал на баги, и вовсе ругались и хотели сломать лицо. Пришлось, правда, слегка автоматизировать этот процесс — мы используем TFS, так что я написал плагин к нему, который по каждому коммиту создает еще один таск типа «make code review, you bastard!», связанный с коммитом, и отправляет его ревьюерам проекта; так что разработчики теперь просто не могут закоммититься, не подав коммит на ревью. Получилось неплохо :)

Счас, правда, все гладко; однако плохо то, что я уверен, что они смирились, а не пошли навстречу и признали пользу :/
+3
conf #
Да уж, тяжелый случай :)
а за то, что я делал code review и указывал на баги, и вовсе ругались и хотели сломать лицо
это и вовсе говорит о непрофессионализме.
А с какими-нибудь программами из списка в статье пробовали работать?
В моей компании, к сожалению (или к счастью?), всего 2 разработчика, включая меня, так что обзор кода идет спонтанно и довольно часто :)
0
sse #
Только Code Collab, и то не на основной работе, а на дополнительной удаленной :) Правда, быстро перестали, но по причинам, не связанным с потребительскими качествами collab — он вполне удобен, хоть десктопный клиент и на java написан
0
ParadiseCracked #
Наша история код ревью начиналась с простого просмотра файликов друг друга (нас тогда двое в этом деле участвовало) в блокноте. Потом перешли на Word, чтобы можно было выделять негативные куски. Затем поставили Atlassian Crucible и стали практиковать code review уже в своей команде в целом. После того как я скинул ссылку на наш Crucible разработчику из другой команды, то он проникся этим делом и ввел у себя такую же практику. Далее к нам подключились остальные команды подразделения. После ввода Scrum'а проведенье code review стало обязательной практикой. Устраиваем team и pear. Задача закрывается только тогда, когда код проходит просмотр, оценку, и все косяки исправляются.
0
conf #
Задача закрывается только тогда, когда код проходит просмотр, оценку, и все косяки исправляются.

Вот, кстати, интересно, процесс из-за этого сильно тормозится?
0
ParadiseCracked #
У ревью есть модератор, который должен следить за процессом работы над кодом: пинать ревьюиров при необходимости и т.п. А потом еще и автора, чтобы отрабатывал комментарии. Вообще, приоритетной задачей является просмотр кода, а потом уже дальнейшая работа. В интересах автора побыстрее все исправить, чтобы задача не висела. Одни человеческие факторы, если посмотреть внимательнее. Личное мнение: конечно, процесс немного тормозится, но не критично в силу обоснованности причин. Получается более качественный код и продукт в целом, что, определенно, стоит подобных задержек.
0
conf #
Спасибо.
0
anr #
>№14… Вы становитесь лучше.
как же без этого -)
+1
SunexDevelopment #
Тут еще есть определенная война авторитетов. Все мужики — лидеры. Если кто-то не лидер в душе — это лузер. Соответственно, есть люди, которые в себе самоуверены настолько что чужое мнение слушают только чтобы «не зудел под ухом», но на самом деле просто продумывают как сказать ответ. Здесь начинаются холивары. У меня и был в команде и есть такой разработчик, с ними очень сложно.
0
rimmer #
Хех, я, к сожалению, пока не могу себя заставить целенаправленно делать ревью кода, это все-таки утомительно. Да и делая ревью какого-то определенного участка, часто не замечаю каких-то вещей.

Ревью обычно получается спонтанно, когда еще раз по каким-либо причинам просматриваешь свой код, пытаясь исправить баг №какой-то, и находишь еще десяток ошибок, опечаток и возможностей к оптимизации.

Найди и уничтожь ошибки там, где они живут, вместо поиска гнезда по их дерьму экскрементам.

не всегда это так эффективно, как тут написано. ревью само по себе занимает много времени. а уже отловленный кем-то баг — это практически указатель, где ошибка. воспроизводим баг, смотрим бектрейс, делаем микроревью — и все, вот она, ошибка. то есть исправление несложного бага быстрее, чем ревью кучи кода.
хотя конечно, в каждом конкретном случае — свое.
+3
conf #
то есть исправление несложного бага быстрее, чем ревью кучи кода.

Здесь вы, разумеется, правы, автор скорее имел в виду что ошибки, сообщаемые аудиторами при обзоре кода, будут описаны точнее и исправить их будет проще, чем ошибки сообщаемые пользователями. Понятно, что даже затраты по времени на исправление несложного бага будут меньше, чем проведение полноценного обзора. С другой стороны, вы исправите только этот баг, тогда как обзор возможно найдет и другие.
–1
Gorthauer87 #
В общем то ещё хорошо помогает натаскивание компилятора, чтобы он на любые потенциальные ошибки лаял, а чтобы их исправляли быстрее делаем так, чтобы при возникновении предупреждения он прекращал компиляцию.
0
sse #
Хе хе, не верите вы в людей :)
+1
nzeemin #
Это уже не ревью, а статическое тестирование, для которого есть масса средств и кроме компилятора.
+1
nzeemin #
Во-первых, хочу сказать переводчику — пользуйтесь общепринятой терминологией, не выдумывайте свою. «Обзоры» в среде программистов не говорят. Говорят «ревью кода» или «ревизии кода».

Во-вторых, причины какие-то надуманные. Скорее, это всё возможные следствия хорошо организованного ревью. Основное, что получаем от ревью — повышение качества кода.
+1
conf #
Вы угадали, я долго думал над этим термином и не мог найти «официального» устоявшегося перевода, ваши варианты меня также не устроили: «ревью кода» это уж слишком банальная калька с английского, а «ревизия кода» больше пересекается с отдельной ревизией кода в системе контроля версий (VCS). Также, вроде бы, термин «обзоры кода» я встречал в «Совершенном коде» Макконнелла, но точно сказать не могу, т.к. книги сейчас под рукой нет. Скорее всего, «рецензирование кода» будет наиболее подходящим вариантом, в следующий раз буду использовать его :)
На счет причин, такое ощущение, что автор выжимал из себя максимум, чтобы набрать 20 причин для круглого числа. Действительно хороши где-то первые 10, остальные уже поскольку постольку.
+4
Tomcat #
У меня создалось впечатление, что меня хотят «заболтать».
ИМХО, слишком много воды, за которой иногда теряется суть:

Ревью необходим для
1. Обучения «молодых»
2. Универсализации стиля
3. Нахождение «мелких» ошибок в коде
4. В идеале — нахождение архитектурных проблем в момент, когда они ещё не успели «пустить корни»

Причём, именно в таком порядке по убыванию вероятности обнаружения.

Всё остальное — следствия, причём, очень часто, повторяющиеся.

0
Elfyskaya #
Один момент у нас в компании (компания большая и неповоротливая) у некоторых людей появилась мысль проводить обзор кода. Но т.к. не было специалистов, которые бы обладали знаниями по этой теме, а начальство не очень приветствовало идеи снизу, которые ломают привычные процедуры, то идея умерла не дойдя до реализации. Код до сих пор поставляем отвратный — с тучей ошибок.
Может кто-нибудь поделится ссылкой, типа «Ревью кода для чайников», чтобы понять с чего начать и как этот процесс провести.
+1
conf #
ответил вам ниже, промазал с комментарием :)
+1
conf #
Присмотритесь к Code Collaborator, он указан в статье. Хоть это и платный продукт, им можно пользоваться бесплатно в течение 30 дней. По ссылке есть довольно много материала и даже 2 достаточно наглядных демо.
Также они бесплатно высылают книгу «Best Kept Secrets of Peer Code Review», но, к сожалению, для очень ограниченного числа стран, России там нет.
Для более полного погружения в тему, почитайте главу «Совершенного кода» Макконнелла (я уже раз в 5 его рекомендую наверное в этом топике :)), посвященную обзорам, а также обратите внимание на список литературы по теме в конце главы. Взять книгу можно, например, здесь. На stackoverflow.com рекомендуют также вот эту книгу.
0
Elfyskaya #
Большое спасибо! Обязательно ознакомлюсь и постараюсь протолкнуть процесс ещё раз.
0
davojan #
Шутите? Вы цены видели: smartbear.com/codecollab-buy.php? Это неадекватно дорого. ReviewBoard при таком раскладе куда оправданнее.
0
conf #
Ну вопрос был в том, с чего начать, и этот продукт мне показался удобным, тем более там много материала. Разобравшись с процессом можно найти что-либо более оптимальное по цене/качеству.
0
acerv #
макконел писал, что формальные инспекции кода предоставляют 55% эффективность в нахождении дефектов, что очень круто.

по своим годам опыта вот что могу сказать — если есть возможность зачекинить код, пропустив этап инспекции, разработчик будет пользоваться этой возможностью. особенно у нас в сраной рашке(тм)

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

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.