EnglishРусский Map

Claude - не компилятор

title
Claude - не компилятор
type
summary
summary
Снайдер отвергает аналогию с компилятором: ценность агента - сквозная работа по слоям, что показано созданием распределённого DNS-сервера exe.dev за неделю
tags
agentic-coding, software-engineering, vibe-coding
created
2026-07-21
updated
2026-07-29
lang
ru
source_updated
2026-07-29
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Июльская статья 2026 года Джоша Бличера Снайдера (Josh Bleecher Snyder) на blog.exe.dev, где он возвращается к вопросу, оставленному открытым в начале 2025 года на commaok.xyz ("Является ли Claude компилятором?", ответ на тот момент: "не знаю"). Теперь ответ таков: сам вопрос был некорректен - "это категориальная ошибка, он лучше компилятора".

Почему аналогия с компилятором была соблазнительной

Программы точны; в процессоре нет инструкции "помахать руками". Высокоуровневые цели противоположны - они принципиально недоопределены. В привычной упрощённой картине ПО строится слоями, каждый из которых добавляет конкретики и скрывает детали: от видения к стратегии, от продуктовых планов к планам разработки, от кода к бинарникам, с отдельной ролью на каждом шаге (руководитель, вице-президент, продакт-менеджер, архитектор, инженер, компилятор).

Каждый из этих шагов - это принятие решений, потому что уточнение спецификации и есть принятие решений. Он попутно отмечает: именно поэтому один из двух его критериев найма инженеров - здравый смысл и рассудительность (второй - уживчивость).

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

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

Почему эта картина неверна

Абстракции протекают, слои конфликтуют друг с другом, и мы сами пробиваем в них бреши, даже когда они герметичны. Сквозная работа между слоями ценна; mechanical sympathy имеет значение.

В качестве примера он приводит Эмпайр-стейт-билдинг: его построили меньше чем за год и уложились в бюджет во многом благодаря систематическому игнорированию границ между слоями. По вопросу облицовки из хромоникелевой стали никто из участников не чувствовал себя достаточно компетентным, чтобы решить в одиночку. Поэтому собрали одну общую встречу: заказчик, архитекторы, строители, субподрядчики по прокату стали, рабочие по её обработке, монтажники и инспекторы. На словах это кажется очевидным, но на практике мы регулярно этого не делаем: отчасти из-за непонимания, о чём вообще стоит спросить, отчасти из-за снобизма ("что мне может подсказать обычный рабочий?"), но главным образом из-за коммуникационных и организационных накладных расходов. Слои существуют не просто так - сокрытие информации позволяет организациям масштабироваться.

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

DNS-сервер

Практический пример взят из собственной инфраструктуры exe.dev, и за развитием этой цепочки интересно наблюдать, потому что каждое исправление порождало следующую проблему.

Виртуальные машины exe.dev получают имена вида vm-name.exe.xyz, то есть при создании VM нужно добавлять CNAME-записи. Но их VM запускались настолько быстро, что пользователям приходилось ждать распространения DNS - иногда по несколько минут. Поэтому они написали собственный DNS-сервер, который всегда оставался строго синхронизированным с источником истины. Затем из-за задержек пришлось добавить регионы, и DNS снова стал узким местом, так как всё раздавалось из Орегона; к тому же развёртывания приводили к кратковременным сбоям DNS. Теперь им требовался географически распределённый, но абсолютно консистентный DNS-сервер.

Верхний уровень стека люди спроектировали сами: DNS-сервер общего назначения с нужными им надстройками поведения, топология hub-and-spoke, append-only репликация, персистентность на edge-узлах.

Всё, что лежало ниже, отдали агентам, и сам процесс здесь интереснее всего - общий метод описан на странице differential-spec-analysis. Снайдер поручил LLM изучить типовые архитектуры распределённых DNS, объяснить ему внутреннее устройство и тонкости DNS, вытащить исторические проблемы безопасности, разобрать альтернативы (AXFR/IXFR - "нет уж, спасибо"), сделать обзор open source решений, просчитать сценарии отказов и спланировать тестирование. Затем он запустил несколько параллельных агентских циклов, чтобы с нуля собрать всю систему целиком, включая тесты и adversarial review. Агенты задавали вопросы на всех уровнях, от архитектуры до отдельных строк кода; ответы на них (и откат неудачных решений) оформились в ёмкие письменные инструкции.

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

Конкретный случай: догон репликации запрашивает все записи начиная с последней известной, а затем переходит в long-polling. Откаты баз данных случаются редко, но бывают, и они нарушают append-only гарантии. Это заметили все агенты, и каждый решил проблему по-своему. В итоговом варианте каждой строке присваивается случайное поле timeline ("в какой временной шкале ты живёшь?"), и каждый запрос "записи после строки N" передаёт значение timeline для N, известное edge-серверу. Несовпадение означает, что история изменилась, и edge-узел уходит в полную чистую повторную синхронизацию.

Были и стилистические различия. И Claude, и Codex сошлись во мнении, что система у Claude получилась элегантнее, а у Codex - основательнее.

Он разобрал расхождения, поэкспериментировал, дополнил инструкции и повторил весь цикл ещё дважды - цитируя Брукса ("планируйте выбросить одну версию; вы всё равно её выбросите") и замечание Крейга Зеруни ("если вы планируете выбросить одну, вы выбросите две"). В итоге сформировался документ из рубцовой ткани (scar-tissue document): эмпирически выверенный набор инструкций, позволяющий провести агента по всем важным решениям - от целей и архитектуры до таких деталей, как точный тип данных для высоконагруженного конкурентного кэша.

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

Проверка надёжности была скорее социальной и эксплуатационной, чем метрической. Перед уходом в отпуск он презентовал систему команде, получил шквал вопросов в духе "как работает X, что будет при условии Y" и уверенно ответил на каждый. Он ушёл в отпуск. Число инцидентов с DNS за следующий месяц: ноль.

Vibe-coding против vibe-engineering

Различие, которое он проводит, касается того, кто принимает решения, а не того, сколько кода вы читаете. Отдать задачу и позволить агенту довести её до реализации - это vibe-coding. В данном же случае Claude работал как "вертикально интегрированный ресурс, мультикомпилятор", ускоряя принятие решений человеком на каждом уровне - включая метарешение о том, какие именно решения существенны. Большинство отдельных строк кода в эту категорию не попадают. Он называет это vibe-engineering; концепция подробно описана на vibe-engineering.

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

Заключительный вопрос

"Что именно инженеры-программисты должны понимать в системах, над которыми работают?"

Его ответ: удачно выбранные слои дают понимание, и именно это служит критерием выживания. Фундаментальная физика более всеобъемлюща, чем классическая механика, но хуже объясняет, почему при аварии лучше оказаться в автобусе, а не в машине. Слои, созданные лишь ради удобства, отмирают - он с сожалением называет Tailwind. Слои, позволяющие понятно выражать важные решения, останутся.

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

Место в контексте

Это конструктивное дополнение к agent-principal-agent-problem от той же компании: Крошоу диагностировал причины кризиса код-ревью и описал компенсаторные механизмы абстрактно; эта статья - полноценный практический пример применения таких механизмов на реальной системе с чётко названным артефактом (документом из рубцовой ткани).

В вопросе чтения кода позиция близка к control-the-ideas-not-the-code - antirez тоже полностью контролирует архитектуру и пропускает построчное ревью, - но механизм другой. antirez расспрашивает одну модель о её дизайне, проверяя собственную ментальную модель; Блихер Снайдер получает ту же информацию, собирая систему несколько раз параллельно и сравнивая результаты через diff. Обеим позициям противостоят reviewing-ai-code и cult-of-vibe-coding, а danluu-ai-coding-testing занимает третью сторону (исчерпывающее тестирование заменяет ревью).

Связанные страницы

  • vibe-engineering - концепция и её границы по отношению к vibe-coding
  • differential-spec-analysis - сборка N раз, diff, кодификация; повторно используемый метод
  • exe-dev-blog, crawshaw-blog - блог компании и личный блог сооснователя
  • agent-principal-agent-problem - проблема, практическим ответом на которую служит этот опыт
  • control-the-ideas-not-the-code, reviewing-ai-code, danluu-ai-coding-testing - три позиции по поводу ревью кода от агентов
  • peril-of-laziness-lost - противовес безудержной генерации кода
  • starling-desktop - применение этого метода в масштабе, который никто не замерял: Linux-десктоп на 335 тысяч строк, созданный одним человеком за полгода без описанного здесь ритуала валидации