Слогер Создать блог
Разработка

Как ревьюить pull request и не отпугнуть контрибьютора: ярлык против разбора

Комментарий «похоже, это писал ИИ» и разбор диффа по существу занимают одинаковое время. Только в одном случае автор уходит молча, а проблема остаётся висеть ещё семь месяцев.

Пяти секунд хватает, чтобы отбить у человека желание присылать что-либо в открытый проект. Столько занимает комментарий вида «похоже, это сгенерировал ИИ, не будем тратить время на ерунду». Формально ревьюер ничего не нарушил: обязательств перед автором у него нет, лишних рук у проекта тоже, объясняться он не должен. Беда в том, что та же фраза одинаково хорошо работает и на том, кто второй день учится делать коммиты из терминала.

Разберём одну закрытую заявку на слияние по шагам: что лежало в диффе, что ответили, чем дело кончилось и что стоило написать вместо метки.

Что случилось

В конце февраля 2026 года контрибьютор открыл merge request в проекте, который в исходном разборе назван SkyRelay. Это открытая сеть волонтёрских наземных станций спутниковой связи — название изменено, потому что люди, поддерживающие проект, делают полезную работу и не заслуживают публичной порки. Запрос ускорял одну из самых нагруженных страниц.

Мейнтейнер пометил его как черновик. Комментарий: быстрая проверка показала признаки ИИ-генерации, заявка откладывается, «чтобы не тратить время ревью на ИИ-ерунду».

Дальше, справедливости ради, в том же комментарии было извинение на случай ошибки и просьбы: описать план оптимизации в issue, убедиться, что ничего работающего не сломалось, и прогнать проверки пайплайна локально.

На следующий день автор закрыл merge request сам. Заодно закрыл второй, куда меньший фикс, открытый в тот же день и не вызвавший ни у кого вопросов. Больше он в проект ничего не присылал.

Что на самом деле было в изменении

Автор исходного разбора прошёл дифф файл за файлом. Там лежал настоящий фикс настоящей проблемы: страница тянула данные из списка спутников, делая отдельный запрос к базе на каждый спутник — только чтобы проверить один флаг. Изменение заменяло тысячи запросов одним. Плюс большая таблица начинала подгружать строки по мере надобности вместо того, чтобы собирать их все сразу.

Шума вокруг тоже хватало:

  • правило стиля кода отключили вместо того, чтобы подогнать новый код под него;
  • в lock-файле появились записи, к изменению не относящиеся;
  • пайплайн упал;
  • способ загрузки страницы поменяли, не согласовав подход в issue.

Всё это заслуживает комментария на ревью. И ничего необычного в этом нет — так выглядит merge request человека, который работает быстро, у себя на машине и никого не спросил заранее. «Это надо доработать» — нормальная фраза. «Это ерунда» — совсем другая.

А потом выяснилось то, чего беглая проверка показать не могла: автор не новичок. У него больше двадцати смердженных контрибуций в организациях проекта несколькими годами ранее, включая более раннее ускорение этой самой страницы. Быстрый взгляд этого не видит. Видит только внимательный.

У моего запроса тоже были признаки

Этот merge request автор разбора узнал, потому что присылал похожий.

На той же неделе он заканчивал правку документации в GitLab. Учился работать с Git из командной строки и вёл три задачи параллельно. Изменения из соседних задач раз за разом просачивались в текущий merge request. Из терминала этого не видно — только в диффе, уже после пуша. Так вышло три пуша подряд.

Отдельно редактор Zed молча переформатировал строки, которых автор не трогал, при каждом сохранении файла с документацией. Пришлось самому разбираться, откуда берутся лишние правки.

При беглом взгляде признаки были и там: посторонние файлы, форматированный шум, грязная история. Ревьюер посмотрел мимо них. Остался вежливым, дождался финальной версии, хотя терпение его, судя по всему, истончилось — и злиться на это глупо. В итоге автор сам закрыл запрос и открыл новый, только с той правкой, которую и собирался внести. Через несколько дней её смерджили, в GitLab 18.10 изменение попало.

Разница между этой историей и историей контрибьютора SkyRelay ровно одна: что ревьюер сделал с признаками. В первом случае прочитал их как человека, который ещё учится. Во втором — как повод перестать читать.

Когда дверь остаётся открытой

Несколькими неделями позже случился обратный опыт, и в куда более сложном месте. Автор добавлял поддержку Kroki в провайдер GitLab для Terraform, чтобы команды, управляющие GitLab как кодом, могли включать рендеринг диаграмм конфигом, а не руками. Провайдер написан на Go, в котором автор ещё осваивался, и понадобилось три merge request, чтобы всё получилось.

Самым трудным оказался не код. Ноутбук на тот момент — 8 ГБ оперативной памяти. Docker его ронял, WSL не запускался, а документацию в проекте положено не писать руками, а генерировать инструментом. Попытка написать вручную привела к падению пайплайна, что логично.

Так об этом и было сказано прямо в merge request: вот ограничения машины, вот что реализация, по мнению автора, готова, а можно ли кто-нибудь прогонит шаг генерации или подскажет другой путь.

Сделали и то и другое. Один мейнтейнер объяснил, что для шага с документацией Docker вообще не нужен, и указал команду, которую положено выполнять до открытия запроса. Второй прогнал её сам, запушил результат и посоветовал на будущее удалённое окружение для разработки. Позже, когда диффы стали выглядеть странно, попросили прогнать форматтер Go — потому что табы и пробелы перемешались. Форматирование, опять.

С этой помощью нашлась и починилась проблема дрейфа состояния, которую показывали приёмочные тесты, добавилась небольшая проверка безопасности, а последнее падение пайплайна объяснилось несовпадением имени файла в конфиге CI. В апреле 2026 года изменение поставили в очередь на слияние и смерджили. Запросу на эту функцию было больше двух лет.

Аккуратно там не было ничего. Три попытки, красный пайплайн, перемешанное форматирование и честное признание, что инструменты проекта не запускаются на своей машине. При беглом взгляде признаков тут больше, чем в двух других историях. Но было и другое: прозрачность в обе стороны. Автор честно сказал о своих ограничениях, мейнтейнеры честно сказали, что нужно доделать.

Цепочка последствий в одной заявке

Быстрая проверка подменяет ревью. Мейнтейнеров заваливает потоком, и скорый фильтр — способ самозащиты. Но быстрая проверка — это классификатор, а у любого классификатора есть ложные срабатывания. Признаки, которые он ловит (шум, посторонние файлы, упавший пайплайн), ровно так же выглядят у человека, который учится, спешит, работает на слабом железе или не ожидал, что инструмент сам поменяет строки.

Метка достаётся человеку, а не коду. «Надо доработать» говорит, что исправлять. «ИИ-ерунда» говорит, что ревьюер думает о вас. Действовать можно только по первому.

Человек уходит молча. Никто не спорил и не жаловался. Заявку просто закрыли, и нигде не записано, что рабочий фикс вышел за дверь.

Проблема остаётся и позже стоит дороже. В октябре 2026 года, семь месяцев спустя, другой мейнтейнер открыл новый merge request про ту же медленную загрузку. Работа аккуратная, с замерами. Одна из причин, которые в ней названы, — тот самый запрос на каждый спутник. А часть, пока не покрытая, указана как следующий шаг и измерена в более чем девять секунд на данных продакшн-размера. В закрытой заявке ответ на этот запрос уже лежал.

Вход сужается. Каждый, кто прочитает ту ветку комментариев, узнаёт что-то до того, как напишет первую строку: первым ответом тут может быть метка. Автор разбора это прочитал и решил в проект не контрибьютить.

Ни на одном шаге этой цепочки никому не нужно было злых намерений. Каждый шаг по отдельности выглядит разумно. Ровно поэтому их стоит записывать.

«Нет ресурсов» — это полный ответ

Мейнтейнеров можно понять. Многие работают бесплатно или тянут кода больше, чем должен один человек. Нормально разобрать большое изменение — это часы. Никто никому этих часов не должен.

Поэтому просьба маленькая: если ресурсов на ревью нет — так и сказать. Это честно. И это законченный ответ.

Сейчас у нас нет ресурсов на ревью изменения такого размера. Опишите, пожалуйста, план в issue, чтобы мы согласовали подход до того, как вы потратите на это ещё время.

Такой ответ занимает те же секунды, что и метка. Он сохраняет и человека, и фикс. В комментарии SkyRelay, к слову, вторая половина была почти такой: если бы три просьбы составляли весь комментарий, разбора бы не понадобилось.

Политика работает лучше ярлыка

Позже SkyRelay опубликовал политику по ИИ для контрибьюторов. Там прямо сказано: проконтролировать, как именно написан merge request, проект не может, поэтому и не пытается. ИИ-ассистированные контрибуции разрешены — при условии, что человек понимает изменение и берёт за него полную ответственность. Про повторяющиеся некачественные присылки формулировка жёсткая, и это разумно.

Это правильный ответ. Вопрос смещается с «как это написано» на «понимаете ли вы это и готовы ли отвечать». На второй вопрос человек как раз может ответить.

Что даёт разбор

Ревью говорит правду о коде. Метка — о вас.

Для тех, кто учится так же — самоучкой, вне найма, выстраивая собственную практику на виду, — первые merge request почти всегда шумные. Этот шум и есть то, как выглядит обучение снаружи. Если первым ответом на него идёт метка, первыми уходят те, кому этот опыт нужнее всего.

Что ревьюер действительно может проверить: работает ли изменение и способен ли автор объяснить, что и зачем он поменял. Был ли замешан инструмент — из диффа не видно никому, и это никогда не было самым полезным вопросом.

Реакция на merge requestЧто узнаёт авторЧто делать дальшеЧем заканчивается
Метка «похоже на ИИ»Догадку о себе, а не о кодеНепонятноФикс уходит вместе с автором, проблема остаётся
«Нет ресурсов, опишите план в issue»Что проект не отказывается, а просит порядокСогласовать подход до работыЧеловек либо возвращается с планом, либо не тратит время зря
Разбор диффа с замечаниямиЧто именно не так и какие требования у проектаПрогнать проверки локально, ответить в issue, поправить кодФикс дорабатывается и попадает в код
Ярлык плюс извинение и три просьбыСмешанный сигналНеясно, что важнее — требования или оценкаРовно случай SkyRelay: автор закрывает и заявку, и второй, непричёмный фикс

Проверка изменения вместо проверки человека — не бесплатная и не эффектная штука. Просто это самый дешёвый известный способ держать дверь открытой: для следующего контрибьютора и для тех, кто будет сопровождать эти проекты, когда сегодняшние мейнтейнеры отойдут в сторону. Метка же не экономит ни секунды — она просто переносит расходы на потом, на того, кто вернётся к той же медленной странице через семь месяцев.

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.

Карьера

Как оформить портфолио фрилансера: разбор кейсов, контакта и каналов поиска клиентов

Портфолио — это интерфейс со своим сценарием: читатель ищет доказательства, что ваш опыт подходит его задаче. Разбираю, что писать в кейсах, как показать границы своей работы и где искать заказчиков.

Слогер 07.10.2026 ▲ 0
Карьера

Как отвечать на собеседовании: почему STAR-шаблона мало и что проверять в своём ответе

Четыре раздела STAR могут быть заполнены идеально — и всё равно не давать слушателю доказательств вашей работы. Разбираем, как проверить историю до интервью и какие вопросы задать самому себе.

Слогер 07.10.2026 ▲ 0
Разработка

Почему разработчики перестают писать код: разбор новой роли и что делать команде

Спецификации на человеческом языке, тест-сценарии и агент, который пишет реализацию. Что это меняет в работе одного разработчика и почему командные процессы не успели за этим.

Слогер 06.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Личный опыт

Имплант, мост или съёмный протез: чем отличаются и как выбрать

Три способа заменить зуб решают одну задачу по-разному, и разница проявляется через годы, а не в день оплаты. Разбираем, что подойдёт именно в вашем случае и о чём спрашивать врача заранее.

Слогер 05.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru
Разработка

Как японские принципы управления делают код чище и экономнее

5S, канбан, дзидока и ваби-саби родились на производстве, но отлично объясняют, почему один софт летает на слабом железе, а другой тормозит на ровном месте. Разбираем, как эти практики выглядят в репозитории и в голове разработчика.

Слогер 05.10.2026 ▲ 0
Образование

Как закончить бесплатный курс Microsoft по AI: разбор плана обучения и бейджа

Microsoft Learn собрал бесплатный самостоятельный трек по искусственному интеллекту — с модулями, проверками знаний и цифровым бейджем на финише. Разбираем, что внутри и как не бросить на середине.

Слогер 05.10.2026 ▲ 0
Разработка

Как переписать личное портфолио с Angular 12 на Angular 22: разбор прыжка через десять версий

Личный сайт на Angular 12, продакшен на Angular 19 — и решение переписать всё сразу на 22. Что даёт чистая переписка вместо цепочки миграций, и почему инфраструктура и SVG-математика важнее списка логотипов в резюме.

Слогер 04.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Как выбрать тренажёр для mock-интервью: разбор AI-сервисов, живых интервьюеров и банков задач с ценами

Собеседование проверяет не только код, но и умение объяснять. Разбираем, какие сервисы для репетиции интервью стоят своих денег, а какие путают с тренажёрами.

Слогер 04.10.2026 ▲ 0