Таймзоны, коммуникация, документирование решений
В распределённой команде цена одного раунда ревью — не десять минут, а сутки. Всё остальное в этой теме следует из этой арифметики.
Вы научитесь считать стоимость раунда и проектировать процесс так, чтобы раундов было меньше; определять момент, когда переписку надо прекратить и перейти в звонок; и фиксировать решения так, чтобы через год было понятно, почему сделано именно так.
В одном офисе неясность в PR стоит вопроса через стол — минута. При разнице в семь часов вопрос заданный в 18:00 получит ответ в 11:00 следующего дня, и то если адресат начинает день с ревью.
| Разница часовых поясов | Пересечение рабочего дня | Стоимость раунда |
|---|---|---|
| 0–2 часа | 6–8 часов | Минуты |
| 3–5 часов | 3–5 часов | Часы |
| 6–9 часов | 1–2 часа | Сутки |
| 10+ часов | Нет | Сутки и больше |
Отсюда вся стратегия: каждый раунд должен закрывать максимум неясности. Это меняет то, как пишутся и описания PR, и замечания.
Практические следствия:
nit — повторно смотреть не буду».Последний приём недооценён. В распределённой команде повторное ревью мелких правок — чистая потеря суток. Доверие к автору в мелочах дешевле, чем ещё один цикл.
Проверьте себя. Посчитайте пересечение рабочего дня между самыми удалёнными участниками команды. Сколько часов?
Частая ошибка. Оставлять замечания порциями, по мере чтения. В асинхронной команде это самая дорогая привычка.
В офисе описание можно недоделать — спросят. В распределённой команде описание PR — единственный носитель контекста.
Что должно быть, чтобы ревьюер не задавал вопросов:
## Контекст
Пользователи из ЕС жалуются на задержку при оплате (INC-902).
Причина: обращение к антифроду идёт в наш регион, +400 мс на запрос.
## Решение
Кэшируем решение антифрода по паре (карта, сумма) на 5 минут в Redis.
Ключ — хеш, сами данные карты не храним.
## Альтернативы, которые я отверг
1. Реплика антифрода в ЕС — 3 недели работы, обсуждали с платформой,
отложили до Q1.
2. Асинхронная проверка после оплаты — юристы против, нужно решение
до списания.
## Риски
Кэш решения антифрода на 5 минут теоретически позволяет повторить
подозрительную операцию в этом окне. Обсудили с безопасностью,
для сумм до 5000 ₽ приемлемо, выше — не кэшируем.
## Как проверить
Оплата из ЕС дважды подряд: второй раз без обращения к антифроду
(видно в логах по `antifraud.cache_hit`).
## На что смотреть внимательно
Инвалидация при изменении лимитов пользователя — я не уверен,
что покрыл все места.Раздел «альтернативы, которые я отверг» — самый ценный и самый редкий. Без него ревьюер обязательно предложит один из отвергнутых вариантов, и уйдёт раунд — то есть сутки — на объяснение, что это уже обдумано.
Проверьте себя. Откройте свой последний PR и допишите раздел «альтернативы». Сколько вариантов вы обдумали и никому не сообщили?
Частая ошибка. Считать, что описание нужно ревьюеру. Оно нужно и вам через год, когда git blame приведёт сюда.
Асинхронность — не самоцель. Есть ситуации, где переписка стоит дороже звонка на любой разнице в часовых поясах.
Признаки, по которым надо остановиться:
Обязательное условие: результат синхронного разговора фиксируется в PR. Иначе через год решение выглядит немотивированным, а для остальной команды оно вообще не существовало.
> Обсудили голосом с @alice 28.07. Решили не кэшировать суммы
> выше 5000 ₽ — риск повторной подозрительной операции превышает
> выигрыш в 400 мс. Для крупных сумм задержка приемлема.
> Порог вынесен в конфигурацию, чтобы менять без релиза.Три строки, снимающие вопрос «почему так» навсегда.
Отдельный приём для больших разниц во времени — короткая запись экрана вместо созвона. Автор за пять минут проговаривает сложное место, ревьюер смотрит в своё утро. Асинхронно, но с плотностью синхронного разговора.
Проверьте себя. Найдите в репозитории тред длиннее пятнадцати комментариев. Сколько он занял дней и чем закончился?
Частая ошибка. Провести созвон и не записать итог. Решение принято, но для всех, кто не участвовал, его нет.
Для решений, влияющих на систему в целом, отдельного PR недостаточно — его никто не найдёт через год. Работает запись архитектурного решения (ADR): короткий файл в репозитории, один на решение.
# ADR-014: Кэширование решений антифрода
## Статус
Принято, 2026-07-28. Заменяет часть ADR-009.
## Контекст
Задержка оплаты для пользователей ЕС — 400 мс на обращение
к антифроду в другом регионе. INC-902.
## Решение
Кэшируем решение по паре (хеш карты, сумма) на 5 минут для сумм
до 5000 ₽. Порог в конфигурации.
## Альтернативы
- Реплика антифрода в ЕС: отложено до Q1, 3 недели работы.
- Асинхронная проверка: отвергнуто, юридическое требование
проверять до списания.
## Последствия
+ Задержка снижается до 40 мс на повторных операциях.
− Окно 5 минут, в котором можно повторить подозрительную операцию
на сумму до порога. Согласовано с безопасностью.
− Появляется зависимость от доступности Redis в этом пути.Ключевое — раздел «последствия» с минусами. ADR без минусов бесполезен: он не сообщает, чем заплатили, и через год никто не поймёт, можно ли решение отменить.
Хранится рядом с кодом, в docs/adr/. Не в вики: вики не видят при работе с кодом.
Проверьте себя. Назовите три архитектурных решения вашего проекта, причины которых сейчас никто не помнит.
Частая ошибка. Писать ADR на всё. Их пишут для решений, которые дорого отменить, — иначе получается свалка, в которой не найти нужное.
При разнице в часовых поясах естественно возникает схема, при которой ревью движется по кругу вместе с рабочим днём.
Что работает:
Чего избегать: обязательного ревьюера в единственном часовом поясе для критичного пути — это гарантированные сутки ожидания у половины команды. Если такая зависимость есть, второй компетентный человек в другом поясе — задача на квартал, а не пожелание.
Проверьте себя. Есть ли в вашем проекте путь, который может ревьюить только один человек? В каком он часовом поясе?
Частая ошибка. Считать SLA в календарных часах. Считать надо в рабочих часах адресата, иначе метрика бессмысленна.
Автор в Тбилиси, ревьюер в Лиссабоне (разница 3 часа), второй ревьюер в Сан-Франциско (разница 11 часов). Изменение — на 120 строк.
Пн 17:40 (Тбилиси) Автор открывает PR. Описание: «Кеш антифрода, INC-902»
Вт 10:20 (Лиссабон) Ревьюер A: «А зачем кеш? Почему не реплика в ЕС?»
Вт 18:10 (Тбилиси) Автор: «Реплика — 3 недели, обсуждали с платформой»
Ср 09:50 (Лиссабон) Ревьюер A: «Ок. А что с безопасностью? Кеш решения
антифрода выглядит рискованно»
Ср 17:30 (Тбилиси) Автор: «Обсуждал, для мелких сумм ок»
Чт 10:05 (Лиссабон) Ревьюер A: «Где порог? В коде не вижу»
Чт 19:00 (Тбилиси) Автор: «Порога нет, кешируем всё. Добавить?»
Пт 09:30 (Лиссабон) Ревьюер A: «Да, и вынеси в конфиг.
И пусть @bob посмотрит, это его область»
Пт 19:20 (Тбилиси) Автор добавляет порог, запрашивает @bob
Пн 08:15 (Сан-Фран.) Ревьюер B: «Я бы вообще делал асинхронную проверку
после оплаты, зачем блокировать?»
Вт 09:00 (Тбилиси) Автор: «Юристы против, нужно до списания»
Ср 08:40 (Сан-Фран.) Ревьюер B: «Понял. Тогда ок, но добавь метрику
на cache_hit»
Ср 18:00 (Тбилиси) Автор добавляет метрику
Чт 08:30 (Сан-Фран.) Ревьюер B: approve
Чт 10:00 (Лиссабон) Ревьюер A: approveДевять дней, восемь раундов, 120 строк кода. Ни одного конфликта, ни одной грубости, все отвечали в течение своего рабочего утра.
Что произошло. Из восьми раундов содержательными были два: порог для крупных сумм (настоящее замечание) и метрика (полезное дополнение). Остальные шесть — выяснение того, что автор уже знал, но не написал.
Раунды 1 и 2 (реплика в ЕС) и раунд 5 (асинхронная проверка) — это отвергнутые альтернативы. Автор их обдумал, обсудил и не записал. Цена — три раунда, то есть примерно четыре дня.
Раунды 3 и 4 (безопасность, порог) — тоже частично следствие описания: автор согласовал решение с безопасностью, но в PR этого нет, и ревьюер прошёл этот путь заново.
Второй ревьюер подключён только на пятый день, хотя область его — и это было ясно с самого начала. Настроенный CODEOWNERS подключил бы его в первый час, и его раунд шёл бы параллельно, а не последовательно.
Ревьюер A выдавал замечания по одному, а не все сразу. В офисе это нормально; при 3-часовой разнице каждый вопрос — полдня.
Что было бы иначе:
Пн 17:40 Автор открывает PR с полным описанием: контекст, решение,
отвергнутые альтернативы (реплика — 3 недели, асинхронная
проверка — юристы против), риски и согласование с безопасностью.
CODEOWNERS автоматически назначает @bob вместе с ревьюером A.
Вт 10:20 Ревьюер A — все замечания сразу:
major: порога для крупных сумм нет, вынеси в конфиг
nit: имя ключа кеша
«Условно одобряю: если поправишь эти два, повторно не смотрю»
Вт 08:15 Ревьюер B (параллельно): «Альтернативу с асинхронной проверкой
вижу, вопросов нет. major: добавь метрику на cache_hit»
Вт 19:00 Автор вносит все правки одним коммитом
Ср 08:30 Ревьюер B: approve. Автомерж.Полтора дня вместо девяти. Изменилось три вещи: описание содержало отвергнутые альтернативы, ревьюеры были назначены сразу и работали параллельно, замечания выданы пакетом с условным одобрением.
Чем закончилось в реальности. После разбора команда внесла в шаблон PR раздел «альтернативы, которые я отверг», настроила CODEOWNERS и договорилась о двух правилах: замечания выдаются пакетом, мелкие правки не требуют повторного ревью. Медианное время до мержа упало с шести дней до одного.
Отдельно завели docs/adr/ — по этому же случаю выяснилось, что решение про синхронную проверку антифрода принималось дважды и оба раза заново обсуждалось с юристами.
docs/adr/, если решения обсуждаются повторно.СТОИМОСТЬ известно пересечение рабочего дня и цена одного раунда
ОПИСАНИЕ контекст, решение, отвергнутые альтернативы, риски, «смотреть внимательно»
ПАКЕТ замечания выдаются все сразу, а не по мере чтения
УСЛОВНОЕ мелкие правки не требуют повторного цикла
НАЗНАЧЕНИЕ все нужные ревьюеры подключены сразу и работают параллельно
ПЕРЕХОД после 3–4 сообщений без сдвига — синхронный разговор
ФИКСАЦИЯ итог созвона записан в PR; крупные решения — в ADR
ADR есть раздел «последствия» с минусами
SLA считается в рабочих часах адресата
ЗАВИСИМОСТЬ нет критичного пути с единственным ревьюером в одном поясеКак передаются знания, чтобы не оставалось единственного компетентного человека, — Передача знаний. Что делать, когда несогласие не разрешается перепиской, — Разрешение конфликтов. Настройка автоматического назначения — Инструменты и интеграции.
Ключевая мысль: в распределённой команде оптимизируют не скорость ответа, а число раундов. Ответ через час на восьмом раунде хуже, чем ответ через сутки на первом.
Далее: Передача знаний через review