~5m24:34
Yegor Bugayenko

Принципы, от которых нам пришлось отказаться

21 окт. 2026 г.

Read: ~5m · You save: 20 min

Принципы, от которых нам пришлось отказаться

Агенты заваливают GitHub кодом, и старые правила перестают работать. Узнайте, почему отказываются от комментариев, диффов и стабильной master-ветки.

Опубликовано: 2026-10-21

Докладчик утверждает, что за последние месяцы оказались опровергнуты многие принципы, на которых держалась практика разработки программного обеспечения. Он связывает это с резким ростом объёма кода. Он представляет семь принципов, которые пересмотрели он и его команда, а также замены, которые они приняли. Он характеризует большинство замен как не прошедшие проверку и говорит, что их обоснованность может измениться в течение нескольких месяцев.

Причина: рост объёма кода

За последний год количество коммитов, отправленных на GitHub, выросло в пятнадцать раз. Число программистов при этом осталось прежним. Докладчик связывает большую часть новых коммитов не с людьми, а с автоматизированными агентами. Он описывает получившийся объём кода как лавину, которая вытеснила многие существующие правила. По его мнению, теперь именно объём определяет рабочие правила разработки программного обеспечения.

Сводка пересмотренных принципов

№Прежний принципПересмотренный принцип
1Код должен быть понятным и сопровождаться комментариями.Код должен быть минимальным и точным. В ключевых проектах комментарии запрещены.
2Старый код считается устаревшим и переписывается или отбрасывается.Устаревшего кода не существует. Старые репозитории возрождаются с помощью агентов.
3Сопровождающие лично сортируют отчёты об ошибках и проверяют pull request'ы.Агенты сортируют отчёты об ошибках и выполняют слияние pull request'ов.
4С участниками нужно обращаться вежливо, чтобы защитить проект.Жёсткое отклонение допустимо, поскольку за изменением не стоит человек-автор.
5Pull request'ы должны быть короткими, с мягким ограничением примерно в 100–200 строк.Автоматические проверки отклоняют pull request'ы с более чем 200 изменёнными строками.
6Люди проверяют диффы кода.Люди проверяют визуальные артефакты и метрики влияния.
7Непрерывная интеграция обеспечивает стабильность главной ветки.Скорость приоритетнее. Предполагается, что главная ветка большую часть времени сломана.

1. Комментарии заменяются минимальным кодом

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

Его команда теперь запрещает комментарии в скриптах сборки. Команда запрещает все комментарии в проектах на Haskell и JavaScript. В проектах на Java команда движется к полному запрету. Исходный код в проектах команды не содержит комментариев.

2. Легаси-код возрождается

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

  • Статический анализатор. Спикер создал статический анализатор для Java 10–12 лет назад. Проект широко использовался, но его поддержка стала дорогостоящей. За 10 лет в бэклоге накопилось более 400 тикетов. Весной он попросил Claude Code исправить все 400 ошибок, восстановить кодовую базу, обновить её, обновить зависимости и преобразовать её в чистый современный проект. Работа заняла около недели. По его словам, код он не редактировал вручную. В результате проект восстановлен, бэклог очищен, а дефектов осталось всего несколько.
  • Второй проект. Спикер ссылается на безымянного автора, который потратил полтора года на похожую задачу. Затем этот автор завершил восстановление за три недели и потратил на это несколько тысяч долларов.

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

3. Агенты заменяют ручную сортировку и ревью

Ранее докладчик придерживался мнения, что основные обязанности мейнтейнера таковы:

  1. Сортировка (triage): определение того, является ли поступивший отчёт дефектом, и либо направление его в бэклог, либо отклонение.
  2. Ревью: оценка диффов в запросах на изменение и решение о том, принимать ли их.

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

  • Около 1 500 звёзд.
  • Около 100 новых отчётов об ошибках каждое утро.
  • Около 10 активных репозиториев такого рода, что в сумме составляет около 1 000 отчётов об ошибках в день.

Он заявляет, что не может обрабатывать такой объём вручную.

Его текущая система использует агентов, которые запускаются каждое утро или несколько раз в день. Агенты:

  • Проверяют поступающие отчёты об ошибках, принимают те, что описывают реальные ошибки, и принимают их от его имени.
  • Проверяют pull request'ы и автоматически сливают их.

Он сообщает, что 40–50 pull request'ов ежедневно попадают в кодовую базу без его ревью. Он описывает проект как активный, находящийся в продакшене и используемый.

Агент передаёт на ручную проверку изменения, которые слишком сложны или слишком радикальны. В таких случаях он не сливает pull request, а назначает докладчика ревьюером. Докладчик сообщает, что таких случаев возникает несколько в день и что он проверяет их вручную.

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

4. Жёсткий отказ вместо вежливости

Ранее докладчик учил студентов, что с участниками open source следует обращаться вежливо. Он советовал при отклонении вкладов использовать вежливые формулировки, например «спасибо», «пожалуйста» и «извините». Он отмечал, что участники проекта — ценный ресурс и могут вернуться с новыми изменениями.

Теперь он заявляет, что пул-реквесты поступают от автоматизированных инструментов, которыми управляют люди, тратящие около 15 минут на их генерацию. Он утверждает, что такие операторы не занимаются программированием и не реагируют на тон отказа. Он делает вывод, что общение с ними не имеет ценности. Он рекомендует следующий подход:

  • Отклонять изменения, не соответствующие направлению проекта, без переговоров.
  • Использовать для этого инструменты автоматического отклонения.

Он утверждает, что никто не будет обижен, так как, по его мнению, программиста на другой стороне нет.

5. Автоматические ограничения на размер запросов на слияние

Ранее команда придерживалась мнения, что запросы на слияние (pull requests) должны быть короткими. Изменения объёмом от 100 до 200 строк считались приемлемыми. Запросы на слияние объёмом 1000 строк и более считались по своей природе плохими. Члены команды спорили о том, нужно ли разбивать большие функции. Некоторые утверждали, что большую функцию невозможно разделить на пять запросов на слияние и что необходим один запрос объёмом 1000 строк.

За шесть месяцев до доклада команда добавила автоматическую проверку на свою платформу GitHub. Проверка применяется к каждому запросу на слияние:

  • Если запрос на слияние добавляет или удаляет более 200 строк в сумме, CI помечает его красным, и проверка завершается с ошибкой.
  • Автор не может оспорить результат в ходе обсуждения.
  • Автор обязан разбить изменение на два или три более мелких запроса на слияние и отправить их отдельно.

Докладчик заявляет, что команда планирует добавить новые автоматические средства контроля, чтобы достичь нулевой терпимости к некачественным изменениям.

6. Читаемые человеком тестовые артефакты и метрики воздействия

Дизайн тестов

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

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

  • Прежний подход: Большое количество тестов на Java, каждый из которых содержал входной блок кода и ожидаемый XML-вывод, и сравнивал их.
  • Текущий подход: Команда оставила один тест и большое количество YAML-файлов, называемых тестовыми фикстурами. Каждый файл содержит фрагмент кода для разбора и XML-фрагмент, который из него должен получиться.

Когда поступает pull request, докладчик просматривает изменения в YAML. Он не читает изменения в коде, которые, по его словам, больше не может понимать, в том числе код, написанный его агентами. Он сообщает, что читает YAML-диф, проверяет пары входных и выходных данных и принимает изменение, если результат верен. Он отклоняет изменения, если вывод неверен.

Докладчик утверждает, что код трудно читать, а YAML читается легче. Он описывает текстовые файлы как следы выполнения тестов. Тесты либо генерируют эти файлы, либо читают их как источник.

Он говорит, что десяток изменений в YAML в день можно быстро проверить. Он описывает это как решение проблемы объема.

Замена проверки диффов метриками воздействия

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

На протяжении последних 50 лет рецензенты использовали диффы, чтобы судить, хорошо ли изменение, опираясь на знание архитектуры. Докладчик утверждает, что его команда больше не читает диффы, за исключением отдельных случаев. Он добавляет, что, по его мнению, диффы могут исчезнуть из GitHub в течение нескольких месяцев. Он говорит это с признанной долей преувеличения.

Он рекомендует настроить CI так, чтобы каждый pull request сообщал о своем воздействии. Отчет должен включать:

  • Изменения производительности.
  • Изменения визуальных артефактов.
  • Изменения объема кода.
  • Изменения других измеримых показателей качества.

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

7. Скорость вытесняет стабильность в непрерывной интеграции

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

Команда перешла на предварительную сборку (preflight build). В этом процессе робот сборки, а не ИИ-агент, сливает ветку в master, запускает сборку и отправляет изменения в master только в том случае, если код компилируется.

Докладчик утверждает, что для команды этот подход больше не работает:

  • Команда получает около 100 pull request в день.
  • Каждая сборка занимает около 10 минут.
  • Поскольку каждый принятый pull request меняет master, последующие pull request необходимо пересобирать после него. Сборки, таким образом, выполняются последовательно, что в сумме составляет около 1 000 минут в день.
  • GitHub Actions считает любое изменение master недействительным для открытых pull request, поскольку их результаты CI относятся к предыдущему состоянию master. Авторам тогда приходится выполнять операцию обновления ветки.
  • GitHub не позволяет запускать такое количество одновременных сборок, которое требуется при данной нагрузке.

Команда попыталась сократить время сборки, разделив проект. Докладчик утверждает, что 10 минут — это минимум для кодовой базы в 100 000 строк.

Докладчик делает вывод, что стабильность при таком объёме недостижима и что объём будет продолжать расти. Он говорит, что теперь команда исходит из того, что master сломан. Master ломается примерно два раза в день. Команда использует следующую процедуру:

  1. Скрипты отслеживают master и определяют момент, когда он становится красным.
  2. Когда появляется сбой, немедленно запускается Claude Code.
  3. Claude Code исправляет дефект и отправляет новый pull request.
  4. Команда принимает исправление, и разработка продолжается.

Докладчик утверждает, что в новой реальности master почти всё время сломан. Он говорит, что не знает другого способа справляться с этим состоянием. По его словам, команда пришла к выводу, что стабильность — это идея прошлого, а текущий приоритет — скорость. Код должен быстро попадать в master, даже ценой стабильности.

Пример 1: Комментарии и читаемость

Комментарии и читаемость кода для людей больше не имеют ценности, потому что код читают агенты, а не люди; докладчик запрещает комментарии в скриптах сборки, Haskell и JavaScript и движется к их запрету в Java.

  • За последний год количество коммитов на GitHub выросло в пятнадцать раз, при этом число программистов не изменилось.
  • Исследование (примерно двухлетней давности) показывает, что комментарии могут сбивать роботов, когда расходятся с исходным кодом.
  • В проектах со скриптами сборки, Haskell и JavaScript комментарии запрещены; Java движется к запрету комментариев.
  • Цель — код, который минимален, упрощён и точен, а не читаем для людей.

Пример 2: Возрождение устаревшего кода

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

  • Статический анализатор Java докладчика, которому было 10–12 лет, имел более 400 задач в бэклоге.
  • Claude Code попросили исправить все 400 ошибок, восстановить проект, обновить зависимости и модернизировать кодовую базу; это заняло около недели без ручных правок кода.
  • По сообщениям, автор статьи потратил три недели и несколько тысяч долларов вместо полутора лет, чтобы восстановить проект.
  • Термин «legacy» уходит из употребления; код просто ещё не дошёл до агента.

Пример 3: автоматизация триажа и ревью

Мейнтейнеры не должны лично сортировать баг-репорты или проверять pull-запросы; агенты должны автоматически принимать баг-репорты и сливать pull-запросы, передавая на ручную проверку только сложные или радикальные изменения.

  • У репозитория автора около 1 500 звёзд, и он получает примерно 100 баг-репортов ежедневно; автор поддерживает около десяти таких активных репозиториев, то есть примерно 1 000 репортов в день.
  • Агент запускается каждое утро или несколько раз в день, чтобы сортировать баг-репорты и автоматически сливать pull-запросы.
  • Примерно 40–50 pull-запросов в день сливаются без ручного участия.
  • Слишком сложные или радикальные изменения оставляются для ручной проверки, при этом мейнтейнер назначается ревьюером; таких случаев возникает несколько в день.

Пример 4: Строгость по отношению к участникам

Вежливость по отношению к участникам не нужна, когда отправитель — оператор робота; предпочтительно строгое, лишённое эмоций отклонение, поддерживаемое автоматическими инструментами отклонения.

  • Ранее участникам open source предписывалось проявлять уважение с помощью вежливых формулировок, таких как «спасибо», «пожалуйста» и «извините».
  • Отправитель pull request теперь рассматривается как курьер, который запустил агента и сам не программировал.
  • Отклонения должны быть автоматическими и строгими, без возможности оспорить их через CI.

Пример 5: Ограничение размера Pull Request

Размер pull request ограничен автоматически: PR с более чем 200 изменёнными строками (добавленными плюс удалёнными) не проходит CI, что вынуждает разделять изменения.

  • Раньше команды спорили о том, должны ли PR быть короткими; предел составлял 100–200 строк, а более 1000 строк считалось плохим.
  • Примерно за шесть месяцев до доклада был добавлен скрипт CI GitHub, который помечает PR с более чем 200 изменёнными строками как неуспешные.
  • Ожидается, что роботы будут разделять крупные изменения на два или три более мелких pull request.
  • Докладчик говорит, что цель — нулевая терпимость к низкому качеству за счёт большего количества автоматизированных проверок.

Пример 6: Визуальные тестовые фикстуры

Модульные тесты теперь предназначены для машин, поэтому тесты следует писать как YAML-фикстуры, которые люди могут визуально проверять вместо чтения диффов кода.

  • Докладчик за последний год и в этом году написал двухтомную книгу о модульном тестировании.
  • В проекте парсера исходного кода многие Java-тесты были заменены одним тестом и множеством YAML-файлов фикстур, содержащих входной код и ожидаемый XML-вывод.
  • Рецензенты проверяют изменения в YAML визуально: если изменение неприемлемо, они его отклоняют, если приемлемо, принимают.
  • Код трудно читать, а YAML легче, поэтому код должен создавать визуально понятные текстовые артефакты.

Пример 7: метрики влияния вместо диффов

Чтение диффов и исходного кода больше не является способом проверки изменений; вместо этого CI должен сообщать о влиянии каждого пull request в виде метрик.

  • Роберт Мартин сказал летом, что он больше не читает исходный код, и докладчик с этим согласен.
  • Диффы были методом ревью в течение последних 50 лет; докладчик считает, что через несколько месяцев они устареют.
  • Каждый pull request должен сообщать о своем влиянии: изменение производительности, изменения визуальных артефактов, объем кода, ширина кода и качество, в виде понятной человеку сводки или отчета.
  • Цель состоит в том, чтобы понимать направление развития проекта без чтения кода, устранив узкое место в виде ревью, выполняемого человеком.

Пример 8: Отказ от стабильного CI

Стабильная ветка master отброшена: при 100 PR в день и 10-минутных сборках сломанный master принимается, и агенты исправляют его сразу, как только он краснеет.

  • Исходная идея непрерывной интеграции заключалась в том, чтобы master всегда собирался; шутка про «шапку позора» иллюстрирует поиск виноватых за поломку сборки.
  • Робот предварительной сборки сливает изменения в master только после успешной полной сборки; сейчас этот подход считается мёртвым.
  • Каждая сборка занимает около 10 минут; 100 pull request в день нельзя собрать последовательно, а GitHub Actions аннулирует остальные PR при изменении master.
  • Сборка не может быть короче 10 минут для примерно 100 тысяч строк кода.
  • Новая норма: сломанный master большую часть времени; агентов запускают для немедленного исправления поломок, и скорость ставится выше стабильности.