Код больше не пишут

Глава 1. Random Code Programming

Часть I. Обезьяна научилась печатать9 мин

01

Random Code Programming

В 2017 году Виктор Пелевин выпустил роман «iPhuck 10», главный герой которого, Порфирий Петрович, служит полицейско-литературным роботом: он раскрывает преступления, а заодно пишет о них детективы, и относится к людям с той снисходительной нежностью, с какой взрослый относится к детям, пытающимся объяснить ему устройство телевизора. Где-то во второй части романа выясняется, откуда такие существа вообще берутся, и объяснение звучит как издевательство над всей компьютерной наукой разом. Некий Резник, создатель метода, рассказывает, что программу никто не пишет: машины генерируют случайные последовательности кода, после чего каждую прогоняют через исчерпывающее тестирование и оставляют то, что случайно заработало. Для наглядности Пелевин вспоминает обезьяну, которая, если дать ей пишущую машинку и достаточно времени, рано или поздно напечатает «Войну и мир». Метод называется Random Code Programming, программирование случайным кодом, и в романе про него сказано, что оно не требует большого ума и больше всего похоже на вышивание.

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

Прошло всего несколько лет, и выяснилось, что Пелевин ошибся в одной детали, которая оказалась решающей.


Обезьяна с машинкой старше Пелевина почти на век. Французский математик Эмиль Борель придумал её в 1913 году, когда объяснял, что значит «практически невозможно»: событие может быть разрешено законами вероятности и при этом не случиться ни разу за всё время существования Вселенной. Посчитать это несложно, и расчёт полезно проделать хотя бы раз, чтобы почувствовать масштаб. Если на клавиатуре девяносто знаков, то строчек длиной в сто символов существует девяносто в сотой степени, то есть примерно единица со ста девяноста пятью нулями. Атомов в наблюдаемой Вселенной, по нынешним оценкам, около единицы с восемьюдесятью нулями. Даже если превратить каждый атом в обезьяну, посадить её за машинку и заставлять печатать по миллиарду строк в секунду с самого Большого взрыва, до одной правильной строчки кода эта армия не доберётся, а программа, которая хоть что-нибудь делает, состоит из тысяч таких строчек.

Инженеры, впрочем, пробовали и обезьяну, только в облагороженном виде. В 1992 году американский учёный Джон Коза выпустил книгу «Генетическое программирование», где предложил выращивать программы так, как природа выращивает виды: берёшь популяцию случайных программ, проверяешь, какие из них решают задачу хоть немного лучше соседок, скрещиваешь удачных, добавляешь случайные мутации и повторяешь, пока не получится что-нибудь пригодное. Метод работал, местами очень неплохо, но только на маленьких задачах, где программа укладывалась в несколько десятков операций. На задаче размером с банковское приложение эволюция требовала бы времени, сравнимого с тем, которое понадобилось настоящей эволюции, чтобы от одноклеточных дойти до бухгалтеров, а заказчик обычно хочет получить результат к концу квартала.

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


В мае 2020 года инженеры компании OpenAI собрали на GitHub, крупнейшем в мире общем хранилище программного кода, пятьдесят четыре миллиона открытых проектов и выбрали из них всё, что было написано на языке Python. После чистки осталось сто пятьдесят девять гигабайт текста, то есть, грубо говоря, несколько миллиардов строк, которые люди писали, исправляли, комментировали и ругали на протяжении десятилетий. На этих строчках обучили модель под названием Codex, и в июле 2021 года вышла статья с её результатами.

Что умеет такая модель, проще всего объяснить без слов «нейросеть» и «искусственный интеллект». Модель видит начало текста и предсказывает, что вероятнее всего идёт дальше, после чего дописывает это продолжение, снова смотрит на получившийся текст, снова предсказывает и так символ за символом. Когда её учили на коде, она видела миллионы раз, чем обычно заканчивается строчка, начатая определённым образом, как обычно устроена функция, которая сортирует список, и какие ошибки люди чаще всего исправляли в следующей версии. Строго говоря, модель по-прежнему выбирает следующий символ случайно, но вероятности у неё неравные: она бросает кости, утяжелённые всем кодом, который до неё написали люди. Это та же обезьяна Бореля, только прочитавшая GitHub целиком.

Самое интересное в статье про Codex спрятано в цифрах. Авторы придумали сто шестьдесят четыре задачи, каждую с набором автоматических проверок, которые показывают, работает решение или нет. С первой попытки модель решала 28,8 процента задач, что для машины 2021 года было неплохо, а для программиста посредственно. Потом исследователи сделали очень пелевинскую вещь: попросили модель написать сто вариантов решения каждой задачи и посмотрели, найдётся ли среди этой сотни хотя бы один, проходящий проверки. Таких нашлось на 70,2 процента задач. В самой статье этот приём скромно назван удивительно эффективной стратегией, хотя по сути это метод Резника в чистом виде: нагенерировать много кода и оставить то, что прошло тест.

Через полгода исследовательская лаборатория DeepMind довела ту же идею до промышленных масштабов. Их система AlphaCode участвовала в соревнованиях по спортивному программированию, где люди решают на время задачи, придуманные специально, чтобы их было трудно решить. На каждую задачу AlphaCode генерировала огромное количество программ, по некоторым задачам счёт шёл на миллионы, а затем отбрасывала все, которые не справлялись с примерами из условия. Отбор уничтожал около девяноста девяти процентов написанного. Оставшиеся тысячи вариантов система группировала по сходству поведения и отправляла жюри не больше десяти. По итогам нескольких соревнований на площадке Codeforces она оказалась примерно в середине таблицы, выше 46 процентов участников-людей, среди которых было немало очень сильных программистов, потративших годы на тренировки.

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


Второго февраля 2025 года Андрей Карпатый, один из самых известных исследователей в этой области, написал в соцсети короткий пост, который потом сам называл мыслью, случайно пришедшей ему в голову под душем. Он описал новый способ программировать, при котором ты полностью отдаёшься ощущению, веришь в экспоненциальный рост и забываешь, что код вообще существует: говоришь машине, чего хочешь, смотришь на результат, а если что-то сломалось, копируешь сообщение об ошибке обратно и просишь починить. Он назвал это vibe coding, программированием на ощущениях. Через девять месяцев словарь Collins объявил vibe coding словом 2025 года.

Если сравнить пост Карпатого со схемой Резника, сходство получается почти пугающим. Генерацию делает модель, то есть та самая обезьяна, прочитавшая GitHub. Отбор тоже есть, только исчерпывающее тестирование из романа заменено человеком, который смотрит на экран и решает, похоже ли то, что он видит, на то, чего он хотел. Если кнопка нажимается, значит, работает; если страница открылась, значит, готово; если выскочила ошибка, её отправляют модели и генерируют следующий вариант.

Внезапным прорывом февраля 2025 года vibe coding выглядит только для тех, кто не читал ни Пелевина, ни статьи про Codex. По устройству это Random Code Programming, которому дали огромную фору в виде всего публичного кода человечества, а роль отборочной комиссии поручили одному усталому человеку за экраном.


Сам я пришёл к этому сравнению на четыре с лишним месяца позже Карпатого, и при обстоятельствах, которые Пелевин, пожалуй, оценил бы. К лету 2025 года я уже собирал программы именно так, как описано в его посте: объяснял модели, чего хочу, запускал то, что она выдавала, смотрел, где оно развалилось, и возвращал ошибку обратно, пока после нескольких кругов из правдоподобных кусков не складывалось что-то работающее. Двадцать первого июня, в разговоре с одной из таких моделей, я вспомнил Резника и написал фразу, которую привожу дословно, потому что короче сформулировать всё равно не получится: «random code programming у Пелевина это ж vibe coding». Модель вежливо возразила, что у Пелевина это скорее сатирический образ, и предложила обсудить, над чем именно иронизирует писатель. Пришлось попросить её перестать фантазировать и найти в романе сам принцип, так что со стороны сцена выглядела довольно пелевински: я объяснял обезьяне, что она обезьяна, а обезьяна в ответ предлагала мне литературоведческий разбор.

Через два месяца, двадцать пятого августа, мысль стала неприятнее. Я снова написал, что RCP — это random code programming, читай vibe coding, и на этот раз добавил, что с точки зрения самой нейросети между ними вообще нет разницы. Модели всё равно, называют её работу программированием, вышиванием или генерацией вариантов: она в каждом случае продолжает текст наиболее вероятным образом, и разница между «написала программу» и «выдала правдоподобную последовательность символов» возникает только снаружи, в тот момент, когда кто-то эту последовательность запускает и смотрит, что получилось. Тем же летом у меня вырвалась и фраза пошире, про то, что если смотреть объективно, то по RCP устроена вся Вселенная, но до неё мы доберёмся в самом конце книги. А к маю 2026 года, рассказывая, как я сам теперь разрабатываю программы, я уже говорил о пелевинском методе без всяких кавычек: у меня именно он.


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

Random Code Programming работает по той простой причине, что отбор оказался важнее происхождения варианта. Проверке безразлично, придумал ли решение гениальный инженер после бессонной ночи, собрала ли его эволюция за миллион поколений или выдала модель на сорок седьмой попытке: код либо проходит проверку, либо отправляется в корзину, и если проверка хороша, выживает хорошее. Это наблюдение, если его додумать, объясняет почти всё, о чём пойдёт речь дальше, от тестов и автоматических контролёров до памяти машин и тех мест, где люди окажутся незаменимы.

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

При vibe coding эта работа достаётся человеку, который смотрит на экран, и он с ней справляется, пока программа маленькая, а последствия ошибки сводятся к кнопке не того цвета. Потом программа вырастает, за ней встают чужие деньги и чужие данные, а проверяющий по-прежнему смотрит только на то, открылась ли страница, и обезьяна, прочитавшая весь GitHub, оказывается перед комиссией, которая судит о «Войне и мире» по обложке.

Random Code Programming — Код больше не пишут | Mike Fluff