
... или может ли ИИ заменить программиста? Сейчас со всех сторон долбят про то, как ИИ помогает в жизни и вообще, если ты не используешь ИИ, то ты в отстающих и лузер. Я к этому отношусь спокойно, ибо мои занятия совершенно не допускают использование ИИ из-за очень большой цены ошибки, но долбежка все-таки делает свое дело. Плюс как-то внезапно обнаружил, что у (не реклама) cloud.ru доступны Foundation Models (они же БЯМ, они же LLM) без оплаты. Понятное дело, тестовый период и прочее, но использовать можно. Но просто мучать модельки вопросами уровня «сколько цифр в слове» смысла мало, поэтому решил попробовать сделать что-то хоть капельку полезного и получить собственный ответ на вопрос пригодности БЯМ. Результат для нетерпеливых тут https://github.com/kiltum/zxgo
Далее несколько абзацев истории, чтобы просто было понятно, каким путем я шел до результата. Скажу честно, выбор места приложения сил БЯМки был сделан довольно быстро: напиши мне много кода. Раз пока все бесплатно, выбрал самый большой Qwen и предложил ему написать эмулятор КР580ВМ80А (он же Intel 8080), причем на питоне. И внезапно, он с первой попытки сгенерил что-то очень похожее на правду. Хмыкнув, я нашел образ ПЗУ от Радио-86 и зарядил еще пару десятков запросов. Вскоре я с глубоким удовлетворением увидел в окошке заветное «РАДИО 86-РК» и следом «-->».
Немного порадовавшись результату, я преисполнился энтузиазма и решил поднять ставки. Z80 и ZX Spectrum! Культовая машина, все нюансы которой разложены по полочкам и по которой документации на порядки больше, чем для «радио»,«микроши» и «специалиста» вместе взятых. А чтобы было совсем хардкорно, основным языком я выбрал С++.
Первый подход оказался полным провалом. На выходе у БЯМки получилась какая-то каша, которая походила на эмулятор Z80 меньше, чем я на программиста. Скажу честно, это было крайне неожиданно для меня: ведь обучающих материалов (читай: готовых и работающих эмуляторов, написанных на С или С++) для Z80 гораздо больше. Бери и копипасти! В смысле, генерируй. Но нет, БЯМка не осилила.
Второй подход вместе с третьим тоже завершился пшиком. Нет, эмулятор научился выполнять простейшие опкоды типа “LD A,(HL)” но дальше был затык. Попытавшись разобраться в нагенерированном коде, я признал полный провал: даже на мой неопытный взгляд, там были собраны все самые худшие практики программирования. Как говорится, на чем научился, так и пишем.
Вскоре я плюнул и решил начать очередной этап «начинаем все с чистого листа». Задача та же, но язык меняю на Go. Там, как и на питоне, чтобы писать криво, надо специально постараться. Попутно, уже набравшись опыта общения с БЯМкой и вспомнив все пройденные курсы, начинаю делать все маленькими шажочками.
Буквально пара недель по вечерам и результат может оценить любой. Эмулятор ZX Spectrum 48k. Практически 100% эмуляция Z80, со всеми скрытыми флагами и недокументированными особенностями. Почему практически? Один тест все-таки падает, но он совершенно не критичный. Честная эмуляция ULA с правильным расчетом таймингов, поэтому «те самые полоски» можно увидеть. Умеет читать и запускать TAP, но с TZX пока засада. Ну и самое больное это звук, я там уперся в приоритеты потоков. Как оказалось, Go совершенно не имеет нормальной многозадачности, но это тема для какой-либо другой статьи.
Ну а теперь то самое, ради чего была написана эта статья. Может ли БЯМ заменить программиста
БЯМ это джун. Причем джунистый джун. Не стоит давать ему задачи, которые хоть чуть-чуть требуют масштабности или глубины. Он теряется и начинает гнать дичь. Если надо что-то большое сделать, то бьем на мелкие подзадачи и заставляем фокусироваться только на этом. Реально, пишем «Focus on … , ignore others».
БЯМ это очень усидчивый джун. Просите поменять 400 кусков кода, попадающих под единый шаблон (у меня это длинный switch...case с опкодами команд) и он с очень большой вероятностью сделает все без единой помарки.
БЯМ это очень любопытный джун. Он обожает лезть во все места под предлогом «мне необходимо посмотреть существующую реализацию». И, что самое неприятное, он игнорирует при этом прямые запреты. В результате контекстное окно переполняется или он просто не может прочитать файлы из-за их размеров. Или попросту не поймет в них ничего. Решение тут только одно: создавать минимально возможное окружение для задачи. Лишние файлы убирать, большие исходные данные для тестов обрезать и так далее.
БЯМ это очень «начитанный» джун. Базовые алгоритмы на любом языке он генерит не приходя в «сознание». Из-за этого он практически идеально подходит для написания короткоживущих скриптов-оберток. К примеру, взял кусок лога, описал формат и через 5 минут у тебя написан скрипт, выдирающий нужное. Да кривой, да неоптимальный, но зато очень быстро.
БЯМ ну очень «начитанный» джун. Из-за этого он иногда начинает генерить крайне переусложненное решение. Там, где грубо говоря, надо просто сложить 2+2, он генерит здоровенный класс с геттерами и сеттерами на все случаи жизни. Если упустить этот момент, то выкусить подобное становится очень сложно.
БЯМ взял все от реальных джунов. Он обожает лениться, срезать углы и заниматься не тем, чем надо. Просишь написать "рабочий код" и в результате видишь "тут потом должен быть работающий код, сейчас заглушка". Просишь написать одну функцию и в итоге обнаруживаешь его, переписывающем совершенно другой модуль. Даешь ему рабочий тест и просишь поправить ошибку, а он тупо берет и вставляет хардкор "так хочет тест".
БЯМ это реально джун. Что бы правильно поставить ему задачу, вы просто обязаны быть на уровень-другой выше его. Иначе вы получите фигню.
Если резюмировать все вышенаписанное, то сейчас ИИ даже близко не способен заменить программиста. Его топовый уровень - это «макака». Извините, если кому разрушил иллюзии.
P.S. На написание эмулятора со всеми подходами было потрачено около 120 миллионов токенов. При цене 400 рублей за 1 миллион это 48 тысяч рублей. Дорого это или нет - решать вам.