Практические приёмы проведения Code review. Конспект
26 февраля 2019
На Temlead Conf Владимир Романько из Лаборатории Касперского рассказывал про Code Review. Я попробовал записать конспект по ходу доклада. Вот что получилось.
На code review жалуются:
- Не лучший способ для поиска алгоритмических багов.
- Бесполезно потому как выявляются только мелочи.
- Тормозит и удорожает разработку.
- Демотивирует. Это инструмент для самоутверждения ревьювера, который докапывается.
- Плохой инструмент для обмена знаниями.
Неужели всё плохо? Нет! Это мифы в том смысле, что пункты выше не обязаны быть частью ревью и от них можно избавиться.
Не лучший способ для поиска алгоритмических багов
Баги должны обнаруживаться с помощью тестов. Но есть классы алгоритмов которые можно обнаружить только на Code Review:
- Уязвимости. Конечно, есть множество инструментов: сканеры, fuzzing-сканеры и статический анализ кода. Но они обнаруживают только если повезёт или работают с сильно специфическими уязвимостями. Ручные тестировщики редко обнаруживают такие баги. Pentest слишком дорог и долог. К тому же, пентестеры начинают всегда с того же code review.
- Утечки ресурсов. Автоматизированные тесты не обнаруживают такие ошибки. Ручные тестировщики тоже. Можно гонять нагрузочные тесты, но это долго.
- Производительность. Похоже на утечки ресурсов. Медленно и дорого. Как следствие — плохое покрытие. Пример — сброс кеша для всех данных вместо сброса для конкретного ресурса. Найти такое сложно. Найдётся, скорее всего, уже в проде.
- Race conditions. Опять же, или review или прод. На проде очень и очень сложно понять, в чём дело. Не воспроизводится.
- Все другие ошибки в сложных и трудно-воспроизводимых сценариях.
Бесполезно потому как выявляются только мелочи
- Часто проблемы при Code review отражают глубинные проблемы. Если не находится почти ничего — bus factor = 1. Решение — шарить экспертизу.
- Программисты не умеют декомпозировать задачи. Жирные куски тяжко ревьюить. Решение — бить на мелкие части.
Тормозит и удорожает разработку
- Ревью превращаются в чаты с гигантскими задержками. Решение — два варианта действий:
- Устно договориться, фиксировать договорённости.
- Молча поправить.
- В pull request вообще не те решения архитектурно. Решение: дизайн-ревью (сначала обдумать и обсудить) + короткие циклы обратной связи. Если и потеряем время, то не слишком много.
- Обязательные ревьюверы — бутылочное горлышко. Решение: peer review. Сами разработчики инспектируют друг друга, а лид модерирует:
- Следит чтобы была внятная аннотация (как и почему решил задачу). Это помогает быстрее разобраться.
- Следит за токсичностью. Не допускает.
- Добавляет ревьюверов.
- В крайнем случае может сам заводить баги.
Демотивирует
- Сводить к минимуму общение в виде текста.
- Не допускать комментов с наездами, не использовать повелительное наклонение.
- Если очень плохой код — не заваливать дефектами. Код нужно сделать достаточно пригодным для master. Слишком много комментов триггерят защитное поведение.
- Не комментим стилистические дефекты.
- Заводим баги на чужой код.
- Критикуешь — предлагай.
- Вкусовщину не допускаем. Большинство программистов уверены что они программируют лучше коллег. Решение автора должно всегда побеждать.
- Холивары нужно откладывать. Через какое-то время проще договориться.
- Демократия для незначительных вопросов. Выносим мелочи на голосование.
Плохой инструмент для обмена знаниями
Нет. Code review:
- Переносит культуру написания кода.
- Помогает распространять информацию об изменениях в коде.
- Позволяет получить навык применения теоретических знаний в боевых условиях с учётом конкретной команды.
Выводы
Да, проблемы есть, но они решаемы.
Комментарии RSS по email OK
Все проблемы вытекают с психологической стороны этого вопроса. Да, ситуация с "я пишу лучше, чем он" - поголовная. Где-то это действительно так, но где-то просто дело вкуса. К примеру, был человек, который в PHP использовал
is_null()
вместо=== null
. Мы просто договорились, что будем везде использовать=== null
.С технической стороны code review очень полезен, т.к., есть возможность подправить решения или архитектурно важные стороны задачи. Допустим, человек решил написать свой кусок кода вместо того, чтобы использовать какой-то уже готовый функционал. Или использовал не самый удачный подход в решении вопроса, который явно в будущем выльется в проблему.
Code review требует деликатного подхода. Чтобы он был успешен следует уделить много времени психологии. ИМХО.