Инженерная практика
Давать и принимать ревью без трения
Диего, две недели в новой команде, открывает свой первый PR и получает комментарий, в котором лишь: «Почему это Map?» Он час переписывает на объект, пушит заново и получает: «Нет, Map был норм — я спрашивал, почему не Set». Ревьюер имел в виду мысль, а не правку; Диего прочитал это как блокер. По коридору Лена получает «весь этот подход неверен» без альтернативы на PR, который она выкатила под дедлайн, и тихо перестаёт просить у этого ревьюера ранний фидбэк. Ни один комментарий не был злонамеренным. Оба были двусмысленны в двух вещах, на которые каждый комментарий обязан отвечать: насколько это важно и что ты хочешь, чтобы я сделал?
Каждый комментарий несёт неявную важность — сделай её явной
Главный источник трения в ревью — непомеченная важность. Ревьюер бросает «подумай о выносе этого», а автор не может понять, жёсткий это блокер, предложение или праздное размышление — так что он либо переусердствует (перепишет то, что было норм), либо недоусердствует (проигнорирует реальную проблему). Лекарство — крошечная, долговечная конвенция: префикси каждый комментарий его весом. Conventional Comments это формализует — метки вроде nit:, suggestion:, issue:, question:, praise:, thought:, опционально помеченные (blocking) или (non-blocking). Метка — это контракт: nit: явно отбрасываемый, issue: (blocking) обязан быть решён до мёржа, question: хочет ответа, а не правки. Руководство Google приходит туда же: префикси настоящие нитпики «Nit:», чтобы автор знал — это полировка, а не гейт.
Это важно, потому что две вещи, на которые комментарий обязан отвечать — насколько важно и что делать — это ровно то, что ревьюеры оставляют неявным под давлением времени. Пометка важности делает первое явным; делание комментария действенным делает явным второе. «Это запутанно» — это вердикт; «вынеси validateOrder, чтобы путь раннего возврата стал очевиден — могу спарить, если полезно» — это то, на что автор может действовать без круга правок. Когда обоснование не очевидно, назови его: «это аллоцирует на каждый запрос; закешируй на модуле» учит, где «не аллоцируй тут» просто командует.
| Метка | Означает | Автор должен | Блокирует мёрж? |
|---|---|---|---|
issue: (blocking) | Настоящий дефект / корректность / безопасность | Починить или обсудить до мёржа | Да |
suggestion: | Конкретно лучший вариант | Рассмотреть; применить, если улучшает здоровье | Обычно нет |
question: | Ревьюер пока не понимает | Ответить — может не нужна правка кода | До ответа |
nit: | Тривиальная полировка, вкус ревьюера | Взять или оставить | Нет |
praise: | Действительно хорошая работа | Ничего — это сигнал | Нет |
Бей по коду, а не по автору — и подготовка автора бьёт любого ревьюера
Ревью — социальный акт, и его провалы социальны. «Весь этот подход неверен» атакует суждение человека; «этот подход ломается при конкурентных записях — вот гонка» атакует код и вручает факт. Разница — не театр вежливости; это то, может ли автор взаимодействовать с сутью или сначала вынужден защищать свою компетентность. Психологическая безопасность несущая: когда люди боятся, что PR — это экзамен на компетентность, они выкатывают меньше, прячут неуверенность и перестают просить ранний фидбэк, ловящий крупнейшие ошибки — ровно то, что случилось с Леной. Ревьюер, блокирующий, чтобы утвердить статус, а не улучшить код (биклшеддинг Паркинсона — двенадцать комментариев об имени переменной, пока дефект дизайна уезжает нетронутым), вывернул цель наизнанку.
Самый недооценённый результат исследования SmartBear переворачивает обычный фокус с ревьюера на автора. Подготовка автора — аннотирование собственного диффа пояснениями до того, как кто-то его ревьюит — дала драматический эффект: по всем ревью хотя бы с одним комментарием подготовки автора плотность дефектов никогда не превышала 30, а чаще всего была нулём. Механизм в том, что объяснение своего изменения вынуждает переосмыслить его, и вы ловите собственные баги в момент их обоснования — ценность ревью начинается до прихода ревьюера. Связанный эффект эго усиливает это: знание, что коллега прочитает ваш код, заставляет писать чище с самого начала. Так что самая рычажная привычка со стороны ревьюера (ясные, помеченные, действенные комментарии) уравновешивается привычкой со стороны автора (аннотировать дифф, проговаривать неочевидные решения), находящей дефекты, которых не видит ни один ревьюер.
Почему это работает
Хорошо принимать ревью — это навык, а не черта характера, и это другая половина петли. Предполагайте добрый умысел, отделяйте эго от диффа и относитесь к каждому комментарию как к информации о коде, а не вердикту о вас. Возражайте, когда не согласны — «я выбрал Map, потому что доминируют lookup’ы; Set теряет значение» — потому что ревью это разговор, а не проверка на соответствие. Но выбирайте холм: перетягивание nit: сжигает добрую волю, которая понадобится, когда issue: (blocking) действительно неверен. Быстрее всех растут авторы, добывающие из комментариев ревью модель за ними, а не только построчную правку.
Разрешай разногласия на фактах, эскалируй на суждении
Большинство тредов ревью тихо умирают, когда обе стороны заземляют обсуждение в коде: бенчмарк, падающий тест, конкретная гонка. «Я думаю, так чище» против «я думаю, у меня чище» неразрешимо и разъедающе; «вот тест, падающий на твоей версии» это завершает. Когда тред нельзя решить фактами — это настоящий вопрос суждения о направлении дизайна — сеньорский ход эскалировать, а не окапываться: подтянуть третье мнение или владельца области, ограничить дебаты по времени и дать изменению приземлиться, если оно улучшает здоровье. Стандарт Google явно гласит: «не идеально» никогда не повод блокировать; «делает кодовую базу хуже» — повод. Ревьюер, держащий PR в заложниках из-за вкуса, оптимизирует «быть правым» над поставкой командой.
Цена этой ошибки в пропускной способности измерима. Избыточный нитпикинг — непомеченные, недейственные, вкусовые комментарии — по оценкам вызывает потери скорости в 20–40%, и хуже того, он затмевает серьёзные проблемы, хороня один блокирующий комментарий под десятью косметическими. Так что дисциплина — не только доброта; это гигиена сигнала. Помечай важность, чтобы автор мог триажить. Делай комментарии действенными, чтобы они не отскакивали. Хвали реальную работу, чтобы канал не был чистым негативом. И держи человеческое внимание — своё и автора — направленным на дизайн, корректность и замысел, ведь это единственное, для чего ревью вообще существует.
Вы ревьюите PR с одним настоящим багом конкурентности и несколькими стилевыми/вкусовыми предпочтениями. Как написать ревью?
Почему префиксование комментариев метками важности (nit/suggestion/issue/question) снижает трение в ревью?
Что исследование SmartBear нашло о подготовке автора (аннотировании собственного диффа)?
Упорядочьте обмен ревью с малым трением, держащий внимание на сути:
- 1 Автор аннотирует дифф, проговаривая неочевидные решения до запроса ревью
- 2 Ревьюер помечает важность каждого комментария (issue/suggestion/nit) и делает его действенным
- 3 Ревьюер атакует код конкретным фактом, а не суждение автора
- 4 Автор триажит: чинит блокеры, отвечает на вопросы, берёт-или-оставляет нитпики, возражает фактами
- 5 Настоящий раскол суждения эскалируется к третьему мнению, а не окапывается
- 01Ревьюер пишет «подумай о выносе этого» на функции, и автор не понимает, обязательно ли это. На какие две вещи каждый комментарий должен отвечать явно, и как их закодировать?
- 02Что SmartBear нашёл о роли автора в детекте дефектов, и почему психологическая безопасность важна для ревью?
Трение ревью — в основном провал коммуникации, и две вопроса чинят большую его часть: насколько важен этот комментарий и что ты хочешь, чтобы я сделал. Помечай важность малой долговечной конвенцией — nit, suggestion, issue, question, praise, опционально blocking или non-blocking — чтобы автор триажил вместо догадок, и делай каждый комментарий действенным с приложенным обоснованием, чтобы он не отскакивал кругом правок. Целься в код, а не в автора: «это ломается при конкурентных записях, вот гонка» даёт автору взаимодействовать с фактом, где «весь этот подход неверен» заставляет защищать компетентность и тихо перестать искать ранний фидбэк, ловящий крупнейшие ошибки. Самый недооценённый рычаг живёт на стороне автора — исследование SmartBear нашло, что аннотирование собственного диффа свело плотность дефектов почти к нулю, потому что объяснение изменения вынуждает пересмотреть его, а эффект эго означает, что вы пишете чище уже от знания, что это прочитают. Разрешай разногласия на фактах, эскалируй настоящие расколы суждения вместо окапывания, никогда не блокируй из-за вкуса и держи канал чистым — помеченным, действенным, с реальной похвалой — чтобы один серьёзный комментарий не утонул под десятью косметическими. Сделанное так, ревью распространяет знание и поднимает bus factor вместо превращения в игру статусов.