Процесс ревью кода в HH.RU
Мне на глаза попался документ с правилами и рекомендациями по процессу ревью кода внутри компании. Я решил, что такой полезной информацией надо поделиться с внешним миром. С благословения автора [1] я публикую работу

Большинство указанных правил носят рекомендательный характер и надо руководствоваться в первую очередь здравым смыслом, а не слепым соблюдением.
Общие положения
- В HH.RU ревью проходит в формате пулл-реквестов [10] на Гитхабе.
- Ревью и пулл-реквесты обязательны, даже если в рамках задачи меняется одна строчка или один символ в коде.
- У каждой задачи должен быть, как минимум, один ответственный ревьюер, он указывается в задаче в качестве ревьюера и несёт ответственность за код, как и автор. Не запрещено и приветствуется участие в ревью других людей.
- Ответственность провести задачу через ревью лежит на авторе задачи.
- Любые изменения после ревью, например, правки во время тестирования, точно так же должны быть проревьюены.
Цели ревью
- Распространение опыта и знаний между разработчиками.
- Поддержка принципа — изменения не должны ухудшать уже существующий код, они должны его улучшать.
- Исправление ошибок в логике и ошибок связанных с безопасностью, корректную обработку исключений.
- Улучшение качества кода, maintainability и архитектуры проекта.
- Улучшение читабельности кода.
- Улучшение покрытия тестами и тестирование на нужном уровне.
- Улучшение документации.
- Соответствие изменений требованиям в задаче.
- Предотвращение появления технического долга [11] или технического налога.
- Продуманный дизайн API, где API — это любой модуль с внешним интерфейсом. Например, что ресурс в сервисе имеет продуманный URL, удобный формат JSON, корректные коды ответов в разных случаях и так далее.
- Корректная история коммитов в Гите, с отражающими суть сообщениями, без временных коммитов.
Подготовка к ревью
- Перед публикацией пулл-реквеста 2-3 раза прочитайте свой код: с большой вероятностью вы сами найдёте там ошибки, что сэкономит время ревьюеру. Проверьте, что нет ошибок, которые могут быть выявлены автоматически — ошибки в стиле кода, упавшие тесты. Удостоверьтесь, что в коде нет временных комментариев и отладочного кода, а также проверьте соответствие вашего кода принятым стайл-гайдам.
- Если создаёте пулл-реквест в процессе работы над задачей, пропишите в заголовке пометку «[WIP]» и поставьте метку «work in progress». Когда работа закончена, уберите метки и проинформируйте об этом отдельным комментарием, чтобы заинтересованные лица узнали, что код можно смотреть.
- Будьте готовы показать ревьюеру мини-демо по задаче.
- Отдавайте на ревью небольшие порции кода. 200-300 строк изменений — предел для эффективного ревью.
- Оформляйте независимые изменения отдельными коммитами.
- Описывайте коммиты короткими и информативными сообщениями.
- Рефакторинг делайте отдельным коммитом, так легче увидеть изменения в логике, суть задачи.
- Форматирование кода делайте отдельным коммитом до основных изменений, или даже отдельным пулл-реквестом.
- Не коммитьте незначащие изменения. Например, добавление переносов строк в файле, в котором вы больше ничего не меняли.
- В заголовке пулл-реквеста коротко и информативно опишите суть изменений.
- Опишите в пулл-реквесте проблему и решение. Опишите альтернативные варианты решения и почему выбрано текущее решение. Если изменения касаются интерфейса, приложите скриншоты «до» и «после».
- В пулл-реквесте дайте ссылку на задачу, а в задаче ссылку на пулл-реквест.
- Иногда полезно обсудить выбранное решение с ревьюером до написания кода. Это поможет найти оптимальный вариант решения задачи и упростит процесс ревью.
Выбор ревьюера
- Отдавайте задачу на ревью специалисту из соответствующей области.
- Если с каким-то кодом работает несколько команд, то полезно для распространения знаний выбирать ревьювера из другой команды.
- Сотрудник на испытательном сроке не может быть ответственным ревьюером, но может участвовать в процессе ревью.
- Не отдавайте все ваши задачи на ревью одним и тем же людям — просите ревью у разных людей.
- Если в задаче затронут нетривиальный участок кода, в котором разбирается определённый человек, покажите изменения ему, независимо от того, кто ответственный ревьюер. Также помните, что у каждого репозитория есть меинтейнеры, они больше других знают об этом коде и курируют разработку.
- В остальном ревьюер выбирается произвольно, по обоюдному согласию сторон. Для помощи в выборе используйте рекомендации на Гитхабе [12], основанные на «блейме» затронутого кода.
- После выбора ревьюера укажите его в качестве Assignee [13] в пулл-реквесте. Список [14] всех пулл-реквестов, которые на вас назначены.
Процесс ревью, общие положения
Относится как к автору кода, так и к ревьюеру.
- Весь код общий, нет таких понятий как «мой код» или «твой код». Это значит, что за любую строчку кода отвечает каждый разработчик, а не только тот, кто эту строчку написал.
- Создавайте атмосферу взаимопонимания, будьте вежливы и дружелюбны, цените и уважайте друг друга, не навязывайте своё мнение. Прислушивайтесь к мнению оппонента и не стойте на своём из принципа. Не превращайте ревью в отрицательный опыт для коллег.
- Задавайте вопросы, если что-то не понятно. Аргументируйте и конкретизируйте вопросы и ответы. Автору кода может быть не очевидно, что подразумевается под вопросом «почему так?», а ревьюверу непонятна аргументация ответа «не согласен».
- Не растягивайте процесс ревью, экономьте время, оперативно реагируйте на комментарии, обсуждайте устно, не провоцируйте длинные дискуссии и не разводите «холиваров». Если вы не можете быстро прийти к консенсусу обратитесь за помощью к коллегам, к меинтейнеру или руководителю функционального направления.
- Если задача не на пару строк, потратьте с ревьюером 10-15 минут на совместный просмотр кода, полезно сделать это даже до создания пулл-реквеста. Обсудите суть задачи и решения, посмотрите как было и стало в работающем окружении. Это поможет ревьюеру лучше погрузиться в контекст задачи. Большинство комментариев останутся ненаписанными, что сэкономит всем время.
- После устного обсуждения всегда описывайте принятое решение и доводы в пользу него в пулл-реквесте. Ответственность за описание лежит на авторе кода.
- Если в коде встречаются однотипные ошибки, ревьюеру следует акцентировать на этом внимание автора кода в первом или втором комментарии, не комментируя каждое вхождение, а автору анализировать код на предмет однотипных ошибок перед публикацией исправления.
- Хвалите за удачные решения автора и предложения ревьювера.
- Оставляйте комментарии к изменениям в самом пулл-реквесте, а не к отдельным коммитам. Таким образом, вся переписка будет в одном месте, в том числе после ребейза.
- Отвечайте на комментарии в тех же ветках обсуждений, где они начаты. Если комментарий относится ко всему пулл-реквесту или в одной ветке несколько комментариев, цитируйте комментируемое сообщение. Чтобы из письма перейти на устаревшую ветку обсуждения вместо ссылки «view it on GitHub» используйте ссылку «in path/to/file».
- Если в процессе ревью приняты какие-либо кардинальные решения с точки зрения стандартов кодирования или иных оформленных договорённостей, на автора кода возлагается обязанность записать эти решения в соответствующих документах.
- Ревью не только про код, а про задачу целиком. Не относитесь к требованиям в задаче или макетам как к истине в последней инстанции — все совершают ошибки и никто не может учесть все нюансы. Свежий взгляд и дельные предложения только пойдут продукту на пользу.
Процесс ревью со стороны автора кода
- Задача не завершена, пока не прошла ревью, тестирование и выпуск на «прод».
- Отвечайте на все комментарии ревьюера, не оставляйте комментарии без ответа, независимо от того приняли вы их или нет.
- Задумывайтесь над вопросами, которые возникают или могут возникнуть во время ревью. Возможно, участку кода не хватает комментария или код лучше написать более явно.
- Не исправляйте существующие коммиты «амендом» (git commit --amend), вместо этого вносите изменения отдельными коммитами, по одному на каждое исправление. Исправление существующих коммитов сильно затрудняет процесс ревью, так как приходится смотреть весь код заново.
- После добавления нового коммита к пулл-реквесту, напишите отдельным комментарием сводку об изменениях, чтобы заинтересованные лица были в курсе. Это касается как исправлений во время ревью, так и исправлений во время тестирования.
- После ревью, перед тем, как отправить задачу в тестирование, перепишите историю [15] коммитов (git rebase --interactive), внеся в отдельные коммиты соответствующие исправления и удалив временные коммиты. Обратите внимание на опцию --autosquash для упрощения процесса.
Процесс ревью со стороны ревьюера
- Если в момент просьбы поревьюить вы заняты, сообщите когда именно вы приступите к ревью.
- Не требуйте, а предлагайте внести изменения.
- Комментируйте код, а не человека, который его написал.
- Вы берёте на себя ответственность за написанный код, подходите к ревью соответствующе, но это не значит, что автор кода должен неукоснительно выполнять все ваши требования. Помните, многие вещи можно сделать по-разному.
- Преследуйте цели ревью [3] и предлагайте правки по существу. Не настаивайте на некритичных изменениях. Указывайте важность исправлений в комментарии.
- Если вы нашли серьёзную проблему, приостановите ревью и дождитесь, пока автор её исправит. Вероятнее всего, после исправления всё равно потребуется ревьюить заново.
- Обращайте внимание не только на то, что было изменено, но и на то, что не было изменено. Поищите и покажите автору код, который должен был быть изменён, но не был (забытые импорты или неиспользуемые классы, использование отрефакторенного кода в другом месте и прочее).
- После внесения изменений автором кода проревьюйте исправления и повторно просмотрите весь пулл-реквест. Возможно, с учётом исправлений у вас появятся новые замечания или вопросы.
- Не тратьте время на ревью кода, который не менялся в рамках задачи. Выделение части кода в функцию считается за изменение. Перенос кода «как есть» за изменение не считается. Реформат кода в затронутом файле на усмотрение автора.
- Ревьюер не правит самостоятельно код в ветке, потому что ему так хочется или проще. Изменения вносит автор кода.
- Если взялись ревьюить, старайтесь не затягивать и не переключаться на другие задачи в ущерб текущей
Использованные материалы и ссылки по теме
P. S. Делитесь в комментариях своими правилами, рекомендациями и полезными юзкейсами по процессу ревью
Автор: shurik2533
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/291647
Ссылки в тексте:
[1] автора: https://habr.com/users/Splurov/
[2] Общие положения: #a1
[3] Цели ревью: #a2
[4] Подготовка к ревью: #a3
[5] Выбор ревьюера: #a4
[6] Процесс ревью, общие положения: #a5
[7] Процесс ревью со стороны автора кода: #a6
[8] Процесс ревью со стороны ревьюера: #a7
[9] Использованные материалы и ссылки по теме: #a8
[10] пулл-реквестов: https://help.github.com/articles/about-pull-requests/
[11] технического долга: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B4%D0%BE%D0%BB%D0%B3
[12] рекомендации на Гитхабе: https://help.github.com/articles/requesting-a-pull-request-review/
[13] Assignee: https://help.github.com/articles/assigning-issues-and-pull-requests-to-other-github-users/
[14] Список: https://github.com/pulls/assigned
[15] перепишите историю: https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History
[16] Code Review Best Practices: http://kevinlondon.com/2015/05/05/code-review-best-practices.html
[17] Why code review matters?: https://medium.com/@isnifer/why-code-review-matters-3e4ad5a9d978
[18] Code Reviews Can Make or Break Your Team: https://medium.com/swlh/code-reviews-can-make-or-break-your-team-a3cfdcc15de1
[19] The Ethics of Code Reviews: http://www.marcotroisi.com/the-ethics-of-code-reviews/
[20] Effective Code Reviews Without the Pain: http://www.developer.com/tech/article.php/3579756/Effective-Code-Reviews-Without-the-Pain.htm
[21] MDN — Code Review FAQ: https://developer.mozilla.org/en-US/docs/Code_Review_FAQ
[22] How to create a good pull request: https://blog.alphasmanifesto.com/2016/07/11/how-to-create-a-good-pull-request/
[23] How to perform a good code review: https://blog.alphasmanifesto.com/2016/11/17/how-to-perform-a-good-code-review/
[24] Top ten pull request review mistakes: https://blog.scottnonnenberg.com/top-ten-pull-request-review-mistakes/
[25] Code review in remote teams: https://web.hypothes.is/blog/code-review-in-remote-teams/
[26] May the Code Review be with you: https://habrahabr.ru/company/avito/blog/330846/
[27] Как я научился делать мир лучше в HeadHunter: https://habrahabr.ru/company/hh/blog/258933/
[28] Источник: https://habr.com/post/422399/?utm_campaign=422399
Нажмите здесь для печати.