Великая иллюзия Copilot
- понедельник, 2 июня 2025 г. в 00:00:08
Пустая оболочка человека. Он больше похож на попугая, чем на личность. Мой начальник, искренне верящий в священнодействие Парного Программирования, сковал цепью меня и этого коллегу-«программиста», как сиамских близнецов с разных планет. Общей была наша клавиатура, но не мышление. Боже, как же он был далёк от этого.
«Постой-ка. У меня появилась идея. Дай мне клавиатуру.»
Идея. Ага. Как у младенца появляется «идея» засунуть вилку в розетку. Я почти доделал нечто прекрасное; стройную, изящную логику, пронзающую сложность подобно ножу, режущему масло. И тут появился он — бьёт по клавиатуре, как будто она ему деньги должна, копипастит код-франкенштейн из комментария на StackOverflow, написанный последователем Дяди Боба в 2014 году.
Знает ли он, что делает наша система? Нет.
Прочитал ли он тикет? Разумеется, нет.
Ощущает ли он уверенность, когда безрассудно корёжит глобальное состояние? Разумеется, да.
Я занимаюсь рефакторингом. Затягиваю болты, подчищаю деревья компонентов, гармонизирую чакры системы.
И тут внезапно:
«Эй, я тут добавил useEffect
, который заново загружает всё, когда меняется что-нибудь. Здорово, правда?»
«Зачем?», — вопрошаю я, моргая, как снимаемый на плёнку военнопленный, пытающийся передать морзянкой, что операция провалилась.
«Я исправил то, что было поломано. Теперь это работает.»
Хаотичная обезьяна, притворившаяся коллегой. Никаких тестов, никакого профилирования. Никакого понимания побочных эффектов и влияния на производительность. Просто слепое клацанье и щёлканье. Он программирует, как будто бьёт по старому телевизору, пытаясь избавиться от помех.
И так он поступает со всеми. Человек-оркестр, генерирующий баги. Нашёптывающий непроработанные решения в уши джуниорам подобно безумному фуллстек-бесу. Его вполне устраивают собственные ошибки.
Система взрывается. Ничего невозможно задеплоить. UI замёрз, как овощи в морозилке, которую я должен был разморозить восемь лет назад. И где же мой любимый второй пилот?
А нигде.
Он испарился. Наверно, читает где-нибудь о новом хайповом JS-фреймворке, который попытается «продать» мне на следующей неделе. А я тем временем блуждаю во тьме ада обратных вызовов с фонариком, собранным из сожалений.
Начальник начинает на меня давить.
«Почему ты не работаешь с ним в паре? Он печатает вдвое быстрее тебя.»
Разумеется, быстрее. Как и кот, у которого случился эпилептический припадок на клавиатуре. Но это не значит, что он должен писать код для продакшена.
Я продолжаю развиваться. Изучаю инфраструктуру, совершенствую свои ментальные модели, тщательно выбираю компромиссы. А он? Он гуглит. Он скользит взглядом. Он копипастит. Иногда он может продемонстрировать умный трюк, наполовину правильный и без учёта контекста. Но команда охает и ахает, как пещерное племя, открывшее огонь.
А я стал лентяем. Как же иначе. Когда система заставляет тебя писать код вместе с галлюцинирующим клоуном, то рано или поздно ты перестаёшь сопротивляться. Пусть он печатает. Пусть он будет «продуктивным». Ты одобряешь изменения. Твой мозг отступает перед шумом, и ты плывёшь по волнам.
Капитан Очевидность спешит на помощь
Разумеется, я говорил не о программисте. Я описывал GitHub Copilot. Или Claude Codex. Или OpenAI lmnop6.5 ultra watermelon.
Это не инструменты для повышения продуктивности или скорости разработки. Это инструменты для создания иллюзии прогресса. Потому что если бы подобный программист, это СУЩЕСТВО, пришло бы на вашу планёрку в человеческом обличье, вбивая полуграмотный мусор в кодовую базу без учёта архитектуры и исчезая после очистки кода, то вы бы уволили его, не дав ему сказать ни слова.
Но что, если мы наклеим на него маркетинговый ярлычок Microsoft и подключим в IDE каждого разработчика организации? Вот теперь это инновация. Наука, Прогресс. Прибыль.
Реальный второй пилот на коммерческом авиарейсе знает свой самолёт и системы. Он проходил симуляции, повторные сертификации. Когда он говорит, то для того, чтобы помочь пилоту... Он не нажимает случайную кнопочку на кокпите, чтобы катапультироваться сразу после этого.
Copilot — это совсем другое. Это просто призрак тысяч постов в блогах и самоуверенных постов на StackOverflow. Он шепчет: «Слушай, я видел один раз такое. Собственными глазами. Значит, это хороший код. Давай задеплоим его.» А когда приложение выходит в продакшен и шасси при посадке не выпускаются, он исчезает.
Если вы пустите призрак управлять самолётом, то достойны того, чтобы вас поглотило пламя аварии.
Давайте сначала уточним один момент, прежде чем я продолжу выжигать это синтетическое порождение ада всей яростью солнца: он не так уж плох.
Даже жулик с пропитым мозгом за покерным столом иногда может собрать флэш. И Copilot тоже временами на что-то годится.
Вы молоды и никогда не работали с C++. Вы смотрите на синтаксис, как будто это какая-то марсианская пещерная живопись. Вы просите помощи у оракула... Бум! Вот она. Шаблоны, интеллектуальные указатели, range-based for... И всё это синтаксически безупречно, как будто код извлекли прямиком из мозга Бьёрна Страуструпа и вывели вам на экран.
Разумеется, он не знает пограничных случаев. Он не прошепчет: «Слушай, shared_ptr
может протечь, если хитро закинуть сырые указатели и хорошенько их перемешать.» Он не укажет вам пути к священным скрижалям, на которых ветераны обсуждали гарантии исключений. Но если вы уже знаете, что вам нужно, и осталось лишь найти нужное заклинание, то он напишет его быстрее и лучше, чем большинство живых стажёров, и к тому же не будет жаловаться, когда вы попросите его написать в три часа ночи шаблонный код метапрограммирования.
А теперь предположим, что вы занимаетесь системным дизайном, требующим глубокого программирования. Принимаете важные решения. Создаёте инфраструктуру. Подобные вещи требуют уверенности и энциклопедических знаний YouTube-канала ByteByteGo. Вы излагаете свой план подобно генералу перед войной: вот ingress, вот очередь, вот политика инвалидации кэшей, которая может нас всех убить.
А потом вы спрашиваете у Copilot: «Что тут может поломаться?»
Внезапно он начинает перечислять слабые стороны, как опытный аудитор безопасности. Возможно, половина из них ошибочна или тупа. Часть может дублироваться. Но он провёл мозговой штурм с такой скоростью, которой ни за что бы не смог достичь ваш джун, и теперь у вас есть боеприпасы для создания спецификации, как будто проектируемой в соавторстве с самим Мартином Клеппманном.
А иногда вы просто устали. Не полностью отупели, но выдохлись. Ваш мозг работает в режиме «превращаем объект в строку». Вам не нужна помощь. Вы просто не хотите мысленно вращать матрицу, подобную кубику Рубика из желе.
Поэтому вы говорите: «Так, у меня есть вот такой объект C# и мне нужен LINQ-запрос, группирующий его по полю X, суммирующий Y и фильтрующий Z».
Copilot отвечает, как странный маленький гремлин: «Готово, босс».
Вы не доверяете ему и проверяете его работу строка за строкой. Но тем не менее вам не пришлось мысленно жонглировать двадцатью цепочками методов, и вы выиграли время, чтобы поразмышлять над действительно важными задачами.
Или, может, вы читаете какую-то сложную математическую статью, написанную безумным математиком с PhD, не понимающим границы человеческого рассудка. Вам не хватает энергии, чтобы превратить этот усеянный LaTeX-разметкой древний свиток в код. За дело берётся Copilot и даёт вам наполовину готовый псевдокод. Мусор ли это? Возможно. Но из этого мусора можно собрать что-то ценное. Вы занимаетесь настройкой производительности, SIMD, низкоуровневыми тонкостями. Он просто дал вам леса, на которых можно складировать взрывчатку.
Возможно, вы унаследовали чью-то кодовую базу. Минное поле из вложенных замыканий, частично прокомментированных хаков и переменных вида d
и foo
. Хаос запутанного ООП головного мозга, в котором для отслеживания единственного поведения вам нужно обойти восемнадцать файлов. У вас нет времени заниматься этим целыми днями. Вам нужна общая картина, план поля битвы, прежде чем вы высадитесь и начнёте разминировать растяжки.
Спросите Copilot: «Что делает этот код?»
Всё необязательно должно быть красиво и давать полную картину. Но этого будет достаточно, чтобы вы сориентировались, прежде чем лезть в дебри.
Да, этому помощнику следует отдать должное. Copilot похож на безмозглого, но высокофункционального стажёра, которому недостаёт практики:
Отличная память на синтаксис.
На удивление быстро умеет составлять списки слепых пятен.
Хорошо справляется с созданием оснастки, если сформулировать ему всё идеально.
Ужасно плохо разбирается в нюансах.
Бесполезен без надзора.
Мгновенно уничтожит весь продакшен, если оставить его без присмотра хотя бы на полминуты.
А теперь давайте продолжим прожаривать его.
Сначала о главном: мне нравится писать код, а не приглядывать за тем, как это делают другие. Я не хочу стоять над душой синтетического лоботомизированного чат-бота, как какой-то стажёр, пытающийся запомнить, что делает std::move
. Мне не нравится быть менеджером среднего звена, который проверяет результаты бредовых трудов нейросетки, состоящей из переплетённых операторов switch
. Я хочу создавать что-то реальное и странное. Системы, которые жгут.
«Но я просто использую ИИ для бойлерплейта!», — завопите вы, дорожа своей подпиской на CoPilot. Услышьте себя. Если вы каждый день пишете бойлерплейт, как какая-то обезьянка промышленной эпохи, то автоматизируйте его самостоятельно. Напишите библиотеку, придумайте макрос. Верните себе достоинство. Если ИИ занимается за вас «скучной работой», то что же остаётся вам? Перетаскивать ползунки? Раскрашивать картины по номерам, пока инференс делает свою работу?
И давайте не будем забывать о FOMO-гоблинах. Я вас вижу. Вы накачиваетесь энергетиками в два часа ночи, убеждаете себя, что «создаёте будущее», хотя на самом деле крудошлёпите какое-то приложение-франкенштейна из того, чем кормит вас с ложечки бот, скопировавший синтаксис из репозитория GitHub за 2016 год. Он забагованный. Он некрасивый. Вы даже ни разу не взглянете на него, пока не опубликуете своё видео в Twitter. «Зато я быстро двигаюсь вперёд!», — скажете вы. Ага. Прямиком с обрыва, как лемминг. ИИ не помогает вам создать ничего нового. Он попросту этого не может. Он знает только то, что уже было сделано. Это функция автозаполнения с большим самомнением.
Вы хотите реальной связи с кодом? Его нужно заслужить. Вы ковыряетесь в нём. Боретесь с segfault в три часа ночи. Вышагиваете по квартире, бормоча об арифметике указателей. Вы сами зарабатываете статус героя. Вы ведёте собственные заметки, а не склеиваете воедино слайды с лекций, притворяясь, что они что-то значат. Когда вы отдаёте на аутсорс мышление, то и аутсорсите и обучение. Вы становитесь посредником для механической птицы, которая отрыгивает переваренную добычу в ваш клювик. Вы не знаете код. Вы играетесь с ним.
Давайте поговорим и о качестве вашего кода, потому что лучше оно не становится. Большинство разработчиков и так уже пишет раздутый абстрактный код-айсберг, сжигающий ресурсы CPU подобно калифорнийским пожарам. Чистый код? Ха! Вы пишете, чтобы получить похвалу других программистов, а не для оборудования. Вы позабыли, что железо — это важно. У ИИ нет концепции локальности памяти и интуитивного понимания промахов кэша. Он не развернёт цикл и не найдёт ошибочный ложный доступ в вашей атомарной структуре. Он обучался на коде, который сам по себе стал оскорблением для кремния.
Проблема не только в лени. Дело в деградации. Разработчики перестают исследовать. Перестают совершенствоваться. Им это уже не важно. Добавить ещё один слой абстракций, ещё один ленивый вызов загрузки в цикле рендеринга. В конечном итоге вы начинаете жить в соборе, состоящем из технического долга, за который расплачивается каждый пользователь. Миллисекунды и секунды, каждый такт — налог на ваше равнодушие. У пятидесяти миллионов пользователей ежедневно возникает трёхсекундная задержка, без которой можно было обойтись, если бы вы не нажали на Tab вместо того, чтобы писать код? Суммарно это почти 5 лет впустую потраченного времени.
К слову, о маркетинговом названии «copilot» («второй пилот»). Реальный второй пилот — это равный тебе. Это сертифицированный специалист, способный посадить самолёт, если вы потеряете сознание. Они обучаются и практикуются. Они вместе с вами проверяют чек-листы. GitHub Copilot похож на того, кто наиграл двести часов в Arma 3 и теперь считает, что может посадить Boeing 747. Он прочитал руководство. Один раз. На китайском и в обратную сторону. А теперь он орёт вам в ухо: «Дай-ка быстренько накидаю этот код, я видел его в комментарии на Slashdot!»
В таком режиме вы работаете не со вторым пилотом. Вы играете в русскую рулетку с заряженным графом зависимостей.
Хотите быть настоящим программистом? Думайте головой. Уважайте машину. Или проваливайте из кабины пилотов.
Послушайте: вы человек. Живая плоть, хрупкие зубы, синапсы передают электрические сигналы друг другу, заряженные кофеином и досадой. Но вы, даже в своём хронически не выспавшемся, утомлённом состоянии можете стараться. Вы можете прищуриться, разглядывая слои абстракции, чтобы увидеть их насквозь. Снимите кожуру красивого эргономичного типобезопасного, чистого, ленивого синтаксического сахара и представьте тот ассемблерный хаос, который изрыгает компилятор. Вы можете ощущать шестым чувством строки кэша. Вы знаете, где хотят находиться данные. И где кремний сердится, если вы что-то напутаете.
Машина реальна. Кремний реален. DRAM, L1, ложный общий доступ, бросающий монетку блок предсказания ветвления. И если вам это важно, то вы сможете работать с этим. Вы можете сделать так, чтобы программа просачивалась через память подобно стальной змее, почти не тратя лишних ресурсов. Вы можете тонко планировать выборки с упреждением. Вы можете вручную разворачивать стратегию размещения, по сравнению с которой malloc будет походить на детские игры. Вы можете знать (на самом деле знать), когда настаёт время поразмять костяшки пальцев и написать несколько строк грязного, но прекрасного встроенного ассемблерного кода, чтобы напрямую инъецировать стероиды в ягодицы вашей программы.
А бот? Что бот? Он понятия об этом не имеет.
Бот обладает нулевым пониманием. Он не отличит page fault от опарыша. Он сгаллюцинирует модель памяти, как я галлюцинирую после двух ночей без сна. Он не умеет профилировать. Он не поймёт flame-график. Он не прочувствует ожога от потраченных впустую в горячем цикле тактов CPU. Он скопирует совет какого-нибудь мимоходца из темы StackOverflow за 2008 год, который выполнял бенчмаркинг на Pentium 4 с 512 МБ ОЗУ, а потом сам что-нибудь додумает. Он скажет: «Это оптимально», как будто что-то в этом понимает. Как будто он видел когда-то промах кэша. Он не видел. Но видели вы.
Он будет кормить вас мусором. Он скормит вам ложную мудрость от выдуманных людей и будет умолять, чтобы вы в неё поверили. Но если вы хотите создать красивую быструю систему, которую можно будет встраивать в кардиостимуляторы и системы наведения ракет, то вам лучше выкинуть бота в воздушный шлюз и начать учиться.
Возможно, вы никогда не напишете код, благодаря которому самолёты не падают с неба. Возможно, вы никогда не будете управлять битами, которые уравновешивают человеческую жизнь. Это нормально. Большинство таким не занимается. Но даже если вы клепаете ещё одно CRUD-приложение для какого-нибудь раздутого энтерпрайза, вы всё равно должны уважать пользователей и их достоинство.
Эти пользователи отдают вашей компании деньги в обмен на инструмент. Не на гротескный кафкианский бред, впустую тратящий время. Не на раздутый тормозной мусор, вытягивающий жилы из железа, на котором запущен. Они платят вам не за то, что вы кучу раз нажмёте на Tab.
Пока вы сжигаете деньги венчурного капитала по четверти миллиона долларов в год, то хотя бы притворитесь, что вам это важно. Притворяйтесь настолько, что профилируйте код. Чтобы сэкономить 200 мс на рендеринге. Пусть ваш код не напоминает труды современного Пикассо.
Это ваша профессия. Испытывайте гордость за работу своей жизни.
Вы нарабатываете вкус, пробуя. Ошибаясь. Улучшая результат на наносекунды при помощи хирургических инструментов. Тем, что пишете процедуру в понедельник, переписываете её во вторник, а в среду осознаёте, что она всё ещё ужасна. Вы не наработаете вкус, спрашивая современную версию «Скрепыша», как делать вашу работу.
На текущем долгом этапе истории вычислений мы всё ещё копаемся в грязи, перепахиваем биты плугами. Мы ездим на лошадях. Но некоторые из нас уже знают, как создать нечто новое и великое. Поезда. Катера. Гиперзвуковые лайнеры чистого кода.
А те, кто обращается с ИИ, как будто он божественный оракул, будут продолжать пытаться примотать изолентой лошадей к блоку двигателей и удивляться, что они не взлетают. Они будут повторять: «Они всё ещё не летают... Пожалуйста, исправь это.»
Больше всего в ИИ я ненавижу простоту пользования им; это медленное, мучительное умирание души хакера... Оно вызвано не войной и не голодом, а удобством. Кнопками и ботами.
Самое страшное не в том, что ИИ заберёт нашу работу. Это даже привлекательно для тех людей, которые изначально не хотели работать. Людей, которых не волнует качество. На самом деле, ИИ сломал последний, и так уже невысокий барьер, который хотя бы заставлял людей пытаться понять поток управления. Вампиров с мечтами о SaaS и Web3 в биографии на LinkedIn. Пустые оболочки, которые видят в терминале не прогресс, а насос для высасывания денег венчурных капиталистов. Они пускают слюни на GitHub Copilot, как будто это святой дух продуктивности, выпекающий React CRUD. Они снова и снова форкают VS Code, чтобы продать ту же самую мечту столь же глубоко заблуждающимся несмышлёнышам.
Когда-то здесь была магия. Когда-то здесь было безумие.
Подростки не спали по ночам, общаясь по IRC в попытках отрендерить OpenGL без segfault. Им было это важно. Они устанавливали Gentoo на тостер просто чтобы проверить, запустится ли. Они знали, как пахнут сгоревшие стабилизаторы напряжения и наизусть помнили точную строку ассемблерного кода, благодаря которому Doom запускался на их калькуляторе с 10 FPS. Они были художниками. Они писали код подобно джазменам, полные ярости, точности и божественного хаоса.
Сегодня же мы создаём мир, в котором любопытство вырезают ещё на входе. Какой-нибудь несчастный, рождённый быть великим, по восемь часов в день проверяет сгенерированный ИИ набор патчей, и всё его любопытство каменеет, превращаясь в апатию. Терминал превращается в электронную таблицу. Отладчик становится гробом.
Потому что мы не знаем, чего мы не знаем. Это очень жестокая шутка. Мы заполняем эту отрасль людьми, которые считают, что хорошо справляются, потому что их бот прошёл CI. Они плывут вперёд в полной уверенности, пока других, голодных до знаний, пережёвывает система, которая больше не ценит понимание. Только результат. Только количество токенов в секунду.
Хуже всего то, что мы нормализуем эту посредственность. Цементируем её в инструментарии. Превращаем её в «рекомендуемые практики». Мы возводим на алтарь современный раздутый, тормозной адский ландшафт со слишком высоким уровнем абстракций, называя его пиком развития ПО. Сама мысль о создании чего-то оптимального, безумного и точного, выжимающего до последней капли производительность, будет казаться фольклором.
Что, если это произойдёт? Что, если последние настоящие программисты потонут в море нажимающих на кнопочки карьеристов? Тогда я лишь пожалею умных аутсайдеров, которые придут мне на смену.
Если мы отдадим мышление на откуп ботам, то все мы обречены.