Переосмысление пулл-реквестов: почему code review должен учить, а не только ловить баги
Перевод статьи Bernard Kolobara (Lubeno) о том, почему пулл-реквесты нужно не хоронить, а переизобрести. Стековые PR, приоритет файлов, единая страница ревью.
Это перевод с адаптацией статьи Bernard Kolobara, автора платформы Lubeno.
Пулл-реквесты задумывались как инструмент для совместной работы над кодом. На практике они превратились в бюрократическую процедуру: гигантские диффы, комментарии в разных вкладках, коллапсированные «outdated»-ветки обсуждений. Bernard Kolobara считает, что проблема не в самой идее code review, а в инструментах — и предлагает конкретные решения.
Ключевые выводы
- Comprehension debt (долг понимания) — главная проблема, которую должен решать code review, а не только ловля багов
- Стековые пулл-реквесты: разбиение изменений на мелкие самодостаточные коммиты, которые ревьюятся независимо
- Приоритет файлов: тесты и зависимости показываются первыми в диффе через .gitattributes
- Всё на одной странице: код и обсуждение вместе, без вкладок
- ИИ не убил code review — он обнажил хрупкость инструментов, которые не справляются с растущим объёмом кода
Comprehension debt: долг понимания кода
Addy Osmani описал comprehension debt как разрыв между объёмом кода в проекте и тем, сколько из этого кода команда реально понимает. Чем больше разрыв — тем медленнее работа. Проектировать систему, которую полностью понимаешь, проще, чем ту, которую «примерно знаешь». С появлением ИИ-агентов в рабочих процессах этот разрыв значительно вырос.
Paul Graham в эссе о великой работе пишет, что лучшие идеи приходят вне клавиатуры — на прогулке, в душе, перед сном. Но для этого «фонового процессинга» нужно, чтобы контекст проекта уже был в голове. Сначала нужна осознанная работа с кодом.
Code review — идеальный момент для сокращения этого разрыва. Каждый ревью — возможность узнать, как кодовая база развивается, каковы её границы и ограничения. Не обязательно проверять каждую строку дифа — достаточно понять ключевые части, чтобы обновить ментальную модель. Ловля багов — лишь одна часть ценности ревью.
Как сократить разрыв: конкретные решения
Стековые пулл-реквесты
Разбить большой PR на маленькие — самый эффективный способ помочь ревьюеру. В теории для этого подходят коммиты: каждый — самодостаточная единица, рассказывающая историю. На практике это не работает из-за Git.
Git заточен под append-only workflow. Вернуться в старый коммит и отредактировать его — мучительно. Даже если вы аккуратно структурировали историю, рано или поздно появляется серия коммитов «fix», «actual fix», «ok now really fix». Когда смотришь на отдельный коммит, не видишь полной картины — правки могут быть размазаны по нескольким коммитам дальше по истории.
Bernard и его коллега Luísa решают эту проблему с помощью Jujutsu — VCS, которая позволяет прыгнуть в любой коммит и отредактировать его на месте, а затем автоматически пропагирует изменения через всю историю. Это позволяет «вылепить» идеальную историю коммитов.
В Lubeno стековые PR детектятся автоматически. Каждый PR показывается как дифф относительно родительского PR — ревью и одобрение идут независимо. Автор не ждёт, пока предыдущий PR смёржат, и может продолжать работу.
Приоритет файлов в диффе
При ревью автор первым делом смотрит тесты: были ли изменены существующие, тестируют ли новые что-то полезное. Затем — зависимости: добавляется ли новая и зачем. Но все платформы для code review показывают файлы в алфавитном порядке — важные изменения легко пропустить в большом диффе.
Lubeno использует кастомный атрибут priority в .gitattributes (это не стандартный атрибут Git, а расширение Lubeno):
Файлы с высоким приоритетом показываются первыми на странице PR. Простое решение, но оно гарантирует, что самые важные изменения вы увидите сразу.
Всё на одной странице
Почти все платформы для code review разносят комментарии, коммиты и код по разным вкладкам. Автор признаётся: «Я нажимал на вкладку Commits только по ошибке — ни разу намеренно». Обсуждение тесно связано с кодом, но чтобы следить за ним, приходится постоянно скроллить наверх, переключать вкладки и искать нужный фрагмент.
В Lubeno нет вкладок на странице PR. Код и обсуждение живут в одном месте.
Эволюция кода в рамках PR
PR — не статичная сущность. Это место для обсуждения и итераций. Знакомая ситуация: вы оставили комментарий, вернулись — и обнаружили несколько новых коммитов, а все ваши комментарии свёрнуты как «outdated». Непонятно, учтены ли ваши замечания, что изменилось с момента вашего последнего просмотра.
Lubeno отслеживает комментарии к коду и наложение interdiff (разницу между версиями файла в рамках PR): если код был изменён более поздним коммитом (или force push), разница видна прямо в контексте комментария. Не нужно переключаться между вкладками, чтобы понять, что произошло.
Будущее пулл-реквестов
Некоторые называют PR «реликтом прошлого» и призывают от них отказаться. Автор не согласен: процесс ревью кода сегодня ценнее, чем когда-либо. ИИ не убил code review — он обнажил хрупкость инструментов. Больше строк кода просто сделали их непригодными.
Code review находится в идеальной точке жизненного цикла: после всей творческой работы и прямо перед продакшном. Это последний шанс разобраться, что именно поедет к пользователям. Если вы хотите создавать продукт, который радует пользователей, вам нужно понимать, что происходит в коде.
Часто задаваемые вопросы
Что такое comprehension debt?
Comprehension debt (долг понимания) — разрыв между объёмом кода в проекте и тем, сколько из этого кода команда реально понимает. Термин популяризировал Addy Osmani. Чем больше этот разрыв, тем медленнее разработка и тем больше багов. Code review — один из главных инструментов для его сокращения.
Что такое стековые пулл-реквесты?
Стековые (stacked) пулл-реквесты — подход, при котором большое изменение разбивается на цепочку маленьких PR, каждый из которых строится поверх предыдущего. Каждый PR ревьюится и одобряется независимо. Это позволяет автору не ждать мёрж предыдущего PR, а ревьюеру — разбираться в маленьких, понятных диффах.
Что такое Jujutsu и зачем он нужен?
Jujutsu (jj) — система контроля версий, совместимая с Git-репозиториями, которая позволяет редактировать любой коммит в истории на месте и автоматически пропагирует изменения через всю цепочку. Это решает главную проблему Git — невозможность удобно редактировать уже созданные коммиты без rebase-боли.
Зачем нужен приоритет файлов в диффе?
Платформы для code review показывают файлы в алфавитном порядке. Из-за этого важные изменения (тесты, зависимости, конфигурация) теряются среди десятков файлов. Атрибут priority в .gitattributes позволяет задать порядок показа: файлы с высоким приоритетом отображаются первыми на странице PR.
ИИ-агенты пишут всё больше кода — зачем тогда code review?
Именно поэтому code review важнее, чем когда-либо. ИИ увеличивает объём кода, но не увеличивает понимание этого кода командой. Без ревью comprehension debt растёт лавинообразно. Code review — единственная точка в процессе, где разработчик осознанно изучает, что именно попадёт в продакшн.
Выводы
Статья Bernard Kolobara — не абстрактные размышления, а описание конкретных решений, реализованных в Lubeno. Даже если вы не планируете переходить с GitHub — идеи стековых PR, приоритета файлов и unified-страницы ревью стоит примерить к своему workflow.
Ключевой тезис: code review — не бюрократия, а инструмент обучения. Каждый ревью должен делать команду чуть умнее, а не просто ставить галочку.