Ассистент дописывает функцию раньше, чем вы успели дойти до закрывающей скобки. Вы принимаете подсказку одним табом — и день как будто пошёл быстрее. Потом тикет закрывается в тот же срок, что и без помощника, и остаётся вопрос: куда делась скорость.
Отвечать на него чужими замерами бесполезно: чужие цифры посчитаны на чужой работе. Поэтому готовых чисел здесь не будет. Будет арифметика, в которую вы подставите свои значения: одна доля, пара членов суммы и одно правило про спецификацию.
Куда уходит день
Возьмите последнюю законченную задачу и прикиньте, сколько в ней вышло часов от «взялся» до «сделано». Разложите эти часы на кучки:
- набор нового кода — руки на клавиатуре, вы производите текст, которого раньше не существовало;
- чтение — чужой код, свой старый, документация, логи;
- обдумывание — что вообще строить и как;
- отладка;
- ожидание — сборки, тесты, ревью, деплой;
- коммуникация — тикеты, обсуждения, созвоны.
Точность не нужна, нужна грубая доля каждой кучки. Оценка на глаз по календарю и истории задач не ломает вывод; ломает его только отказ оценивать вовсе. Кучки, конечно, перетекают друг в друга — чтение чужого кода незаметно превращается в обдумывание. Неважно. Важно, что «набор нового кода» спутать ни с чем нельзя: это единственная кучка, где создаётся новый текст.
Долю часов набора обозначьте f. Она пойдёт во все формулы дальше.
Арифметика узкого места
По устройству ассистент в редакторе ускоряет производство текста: подсказка в момент набора, чат, генерация куска по описанию. Пусть на кучке набора он даёт ускорение в k раз. Тогда время задачи:
T_новое = T × (f/k + (1 − f))
а ускорение всей работы:
S = 1 / (f/k + 1 − f)
Это закон Амдала, и первое следствие неприятно для любого демо: даже если k уходит в бесконечность, суммарное ускорение упирается в потолок 1/(1 − f). Производитель показывает k. Ваша неделя живёт в 1 − f.
При этом k — не свойство инструмента, а свойство пары «инструмент и ваш код»: в бойлерплете он высокий, в вашем доменном — неизвестно. Честный способ узнать один — часы в кучках до и после, о них в конце.
Отсюда уже видно, почему «день ускорился» и «тикет не сдвинулся» не противоречат друг другу. Ощущение скорости рождается в кучке набора; срок задачи держат остальные кучки. И заметьте, каких кучек формула вообще не касается: ожидание и коммуникация не делятся на k — ассистент их не трогает.
Цена проверки
Генерация мгновенна и бесплатна. Проверка — нет: она ваша, она последовательна и не распараллеливается. У каждой принятой подсказки есть баланс:
выигрыш = t_набора − t_вычитки − t_правок − t_переключения
t_набора — сколько вы печатали бы это сами. t_вычитки — сколько читаете и подтверждаете. t_правок — сколько чините после. t_переключения — цена выхода из режима «сочиняю» в режим «ревьюю»: это разные виды внимания, и переход между ними не бесплатен.
Из баланса следует асимметрия, которая объясняет почти всё остальное. Код, который вы могли бы написать сами, вы проверяете дёшево. Код, который написать не могли, — дорого. Чем умнее выглядит подсказка, тем ниже ваша квалификация как её ревьюера, а ошибки в таком коде — ровно те, что не видны при чтении: граничные случаи, сломанные инварианты, уверенно вызванная не та функция.
Отсюда рабочее правило: принимайте подсказку, если можете до её чтения сформулировать, что в ней должно быть. Спецификация выхода у вас в голове — вычитка сводится к сравнению с ней и стоит копейки. Сформулировать не можете — вы не проверите код, вы ему кивнёте. Разница между «проверил» и «кивнул» — вечер отладки.
Кстати, отсюда же понятно, почему демо выглядят волшебно: в демо зритель всегда компетентен в проверке, задача простая, вычитка мгновенная. В вашем репозитории задача сложнее вашей компетенции — и баланс переворачивается.
И побочный эффект, о котором говорят реже. Когда проверка становится узким местом, вы начинаете писать код, который дёшево проверять: меньше хитрости, больше очевидности. Это не ускорение, а сдвиг стиля, и не всегда хороший — иногда хитрый код и есть правильный.
Тупик: делегировать максимум
Первое, что пробуют, когда хотят выжать из ассистента скорость: дать ему писать как можно больше. Принимать всё, что предлагают, отправлять в чат целые задачи, успех мерить объёмом сгенерированного. Логика напрашивается сама — демо именно это и показывает: машина пишет быстрее человека, значит, чем больше она пишет, тем быстрее вы.
Почему это не работает, видно из уже написанных формул, механизм за механизмом.
Первый: принятия концентрируются там, где модель уверена, — в бойлерплейте и коде известной формы. А там f крошечная. Вы максимизируете k на кучке, которая почти не входит в сумму; по закону Амдала общий срок от этого почти не двигается. Сгенерированного текста больше, знаменатель стоит.
Второй: вместе с объёмом генерации линейно растёт объём проверки, а проверка — ваша, последовательная и не делится на k. Делегируя больше, вы переносите работу из кучки, которую инструмент ускоряет, в кучку, которую не ускоряет никто. В пределе вы перестаёте быть автором и становитесь ревьюером чужого пул-реквеста — а ревью кода без спецификации в голове, как видно из прошлого раздела, самая дорогая вычитка из возможных. Баланс уходит в минус задолго до предела.
Третий, самый коварный: тупик подмигивает метриками. Доля принятых подсказок светится в углу редактора, не требует сборки и растёт по мере того, как вы соглашаетесь чаще. Она измеряет согласие между вашими руками и моделью, а не время до результата — и растёт именно тогда, когда вы идёте глубже в тупик. Дашборд поднимается, дата релиза не двигается.
Та же ловушка, но крупнее: сравнить в трекере скорость задач «с ИИ» и «без ИИ». Инструмент первым берут те, кто и так быстрее всех, и берут его на лёгкие задачи — смещение выбора съедает сравнение целиком.
Выход из тупика — не «генерировать меньше», а выбирать, что генерировать: то, для чего спецификация уже есть у вас в голове. Объём — не цель и не метрика. Критерий отбора один — цена вычитки.
Что ускорилось, а что — нет
Теперь по кучкам, честно.
Ускорилось — там, где спецификация у вас уже есть, а набор длинный:
- Код известной формы: тесты к только что написанному модулю (поведение вы сами только что определили), миграции, конфиги, одноразовые скрипты. Вычитка — сравнение со свежей спецификацией.
- Механика по многим файлам: переименование с последствиями, правка вызовов после смены сигнатуры. Раньше — sed и молитва; теперь — предложение, которое всё равно надо вычитать, но ожидаемый диф известен заранее.
- Перевод между форматами: запрос в код, JSON в типы, прототип с одного языка на другой.
- Навигация по незнакомому репозиторию: чат с контекстом кода отвечает «где это обрабатывается» быстрее цепочки поисков. С оговоркой: ответ проверять переходом к файлу — модель уверенно называет похожее на правильное.
- Черновики текстов вокруг кода: описание задачи, комментарий к пул-реквесту, README к модулю. Тоже текст известной формы.
- Микротрение: имена, импорты, сигнатуры. Экономия тут не в секундах набора, а в переключении внимания: вы не отрываете взгляд от кода, чтобы вспомнить точное имя типа. В формулу это не лезет, к вечеру — реально.
Не ускорилось — то, где узкое место не в производстве текста:
- Решение, что строить. Это суждение; правдоподобный вариант дизайна модель выдаёт с той же уверенностью, что и абсурдный.
- Отладка живых систем. Узкое место — информация, которой у вас ещё нет: логи, воспроизведение, состояние продакшна. Модель этого состояния не видит; её гипотезы — частые причины из общего опыта, у всех с одинаковой уверенностью в голосе. Как генератор чек-листа гипотез — полезно, как оракул — вредно.
- Глубина ревью. Суждение о чужом коде не ускоряется производством текста — ни вашего, ни модельного.
Закономерность простая: чем ближе кучка к «набору нового кода известной формы», тем больше выигрыш. Чем ближе к суждению — тем ближе к нулю или минусу.
Как проверить на себе
Один вечер: разложите по кучкам часы последней большой задачи — это «до». Через месяц с ассистентом — то же самое, это «после». Сравнивать не строки, а часы в кучках. Если сдвиг есть, на такой грубости он виден; точнее для решения «оставлять или нет» не требуется. Автоматическая метрика, если совсем хочется, — время цикла задачи целиком, от открытия до продакшна: шумная, но хотя бы измеряет то, что нужно, а не то, что легко считать.
Позиция редакции
Мы считаем: ассистент в редакторе — ускоритель текста и навигации, а не мышления. Пока проверка выхода висит на человеке, чистый выигрыш существует только там, где вычитка дешевле набора, и это условие проверяется на любой подсказке правилом о спецификации.
Мы ошибаемся — и позиция неверна — при одном условии: если проверка уйдёт внутрь инструмента. Модель сама прогонит тесты, сама поправит, сама закроет цикл правок — и дорогой член суммы, человеческая t_вычитки, исчезнет. Спор о том, кого называть ИИ-агентом, — ровно спор об этом: владеет ли инструмент циклом проверки или только генерацией; мы разбирали его отдельно. Останется экономическое условие: цикл самопроверки жжёт инференс, и сходится ли это по деньгам, зависит от его цены на вашей нагрузке — этому у нас посвящён отдельный разбор.
Пока этого не случилось, ответ на вопрос «помогает ли ИИ в программировании» — арифметический, а не лозунговый. Смотрите на свою f и на свою цену проверки: они у вас свои, и это единственные числа, которые здесь что-то весят.