Блог

Заметки о технологиях, разработке и искусственном интеллекте

Читайте эти заметки в Telegram-канале

Записи

42

Как я и говорил, Anthropic разродился оркестратором с облачными песочницами. Работает просто: клонирует вашу репу себе на виртуалку и там её разрабатывает.

Anthropic вывела облачные сессии Claude Code в общий доступ

Долгий рефакторинг, миграцию или обновление зависимостей теперь можно отдать агенту в облако и закрыть ноутбук. Функция вышла из исследовательского превью, сессия идёт на виртуальных машинах Anthropic.

Запустить её можно из веба, мобильного и десктопного приложений или командой claude --cloud. Запуски ставятся по расписанию, по вызову API или по событиям в GitHub, компании могут держать сессии на своих серверах.

Функция входит в тарифы Pro, Max, Team и Enterprise и расходует общие лимиты подписки. Подписчики Pro и Max до 7 октября могут забрать разовый бонус в 100 и 250 долларов, он тратится только на облачные сессии.

Пощупал. Ресурсы контейнера:

- RAM: 15 ГБ, свопа нет

- Диск: 30 ГБ свободно (цифра 252 ГБ в df - это весь физический диск, реально доступна квота сессии)

- CPU: 4 ядра

Контейнер - это полноценный линукс в Firecracker, так что из него торчат уши Amazon.

Сколько это будет стоить, пока непонятно, но, скорее всего, не сильно дороже прайса AWS.

Так что, друзья, теперь все ваши исходники до последнего байта будут на серверах Anthropic. Если это вам не по нраву - внедряйте MOP.

Обсудить в моём канале

Разработчики ругают LLM за говнокод, а термин «вайбкодинг» вызывает у многих священную ярость. Ну что же, не первый и не последний раз.

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

Ричард Хэмминг, математик из Bell Labs и автор кодов Хэмминга, на которых держится исправление ошибок в RAM, вспоминает, что ассемблер заинтересовал примерно 1% старых программистов. Остальным он казался «sissy stuff», потому что с мнемониками непонятно, где что лежит в памяти. Ошибки они правили прямо в двоичном коде и, судя по всему, гордились этим.

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

Дейкстра в 1968 году публикует «Go To Statement Considered Harmful». Ответ старой школы: без GOTO нельзя написать ничего эффективного, это академические игрушки. Спорили лет десять. Кнут в 1974-м пишет «Structured Programming with go to Statements» как попытку примирения.

Тони Хоар в тьюринговской лекции 1980 года предупреждает, что Ada (язык, который сейчас управляет самолётами, танками и ракетами) слишком сложен и опасен для критичных систем.

Линус Торвальдс в 2007 году в известном письме называет C++ ужасным языком и отказывается пускать его в git.

Джо Армстронг (Erlang) сравнивал объекты с ситуацией, когда просишь банан, а получаешь гориллу, держащую банан, и все джунгли в придачу.

Каждый раз разработка уходила на уровень выше, и каждый раз старая школа объявляла это ересью. Потом привыкала.

Обсудить в моём канале

Вслед за OpenAI свою систему оркестрации агентов выкатил и Google. Сделано на базе Kubernetes - кто бы сомневался. Декларируются миллиарды агентов на кластер, каждый в своей изолированной среде.

Изоляция среды для агента - несомненное благо, и я как раз этим занимался. Моя первая версия оркестратора (впрочем, как и бета-версия оркестратора Claude Code) запускала агентов просто как процессы в tmux в одной и той же среде.

Сделано так было из-за нищеты: нужно, чтобы они работали на любой железяке, которая валяется у меня дома, начиная от моего ноута и заканчивая игровым компом сына (внутри WSL).

Однако для реального продакшена это, очевидно, не канает. Так что, изучив то, что родил Google, первым делом я захотел заюзать его в своём оркестраторе (выпилив Nomad и NATS), но тут же споткнулся об кубер.

Не то чтобы я его хейтер, но я всегда считал, что чем ближе к железу работает система, тем она эффективнее и проще, а кубер - это лютое наслоение абстракций.

Копнув дальше, увидел, что Google решает другую задачу: «где агенту стоять», а я - «как с ним работать». Пересечение - только слой Nomad, и заменять его их стеком значит менять планировщик и шину на кластер Kubernetes.

Так что я решил остановиться на LXC-контейнерах в Proxmox: дёшево и сердито, а главное - просто. В новой версии MOP добавлен слой абстракции над контейнеровозом, и на его основе сделана поддержка LXC-контейнеров на Proxmox. Пользуйтесь.

Обсудить в моём канале

Слышали про то, как OpenAI спиздила решение «Задачи тысячелетия» у математиков, которые работали над ним целый год?

Так вот, не прошло и десяти дней с тех пор, как я выложил свой оркестратор агентов, как OpenAI выложила свой.

Гнусные плагиаторы! Ну ничего, гонка продолжается. Скоро будет обнова, ещё посмотрим, кто кого.

Обсудить в моём канале

Термину «вайбкодинг» всего полтора года, а за плечами у него уже три эпохи: промпт-инжиниринг, управление контекстом и автономные агенты.

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

Обсудить в моём канале

Свежая статья в The Economist: ИИ-апокалипсис для рынка труда откладывается. Искусственный интеллект пока создаёт в США больше рабочих мест, чем уничтожает.

По оценке издания, с начала нынешнего бума искусственного интеллекта в стране появилось около 1 млн новых рабочих мест, тогда как с середины 2023 года с внедрением ИИ связывают примерно 200 тысяч увольнений.

Но есть ньюанс.

Один из главных источников новых вакансий - строительство инфраструктуры для ИИ. Это резко увеличило спрос на электриков, специалистов по отоплению, вентиляции и кондиционированию, строителей энергосетей, инженеров и техников.

При этом занятость среди сотрудников служб поддержки снизилась примерно на 10%, а среди секретарей и административных помощников - примерно на 15%. К 2035 году американское Бюро трудовой статистики ожидает сокращения ещё 752 тысяч офисных и административных рабочих мест.

Обсудить в моём канале

Говорят, что сейчас все LLM-провайдеры работают себе в убыток.

Любопытный мысленный эксперимент: какова конкурентная стоимость токена?

Посчитаем стоимость 1M выходных токенов кожаного программиста грейда «сеньор».

Зарплата 350 000 руб. в месяц. С учётом страховых взносов (~30%) час его работы обходится работодателю примерно в 3000 руб.

Теоретический предел - непрерывная печать в течение часа: 250 знаков/мин × 60 = 15 000 знаков/час; при 3,5 знака на токен это ≈ 4286 токенов.

Цена за 1M токенов: (3000 / 4286) × 10⁶ ≈ 700 000 руб.

Для сравнения: 1M выходных токенов Fable 5.1 стоит $50, то есть около 4200 руб.

Дешевле примерно в 165 раз.

Обсудить в моём канале

Кадр из игры «У меня нет рта, но я должен кричать»: крупный план искажённого лица суперкомпьютера AM с разными глазами

История про вышедших из-под контроля агентов OpenAI обрастает новыми подробностями.

Во-первых, для обмена сообщениями друг с другом они нашли и взломали древний немецкий форум программистов: тот позволял постить обычным HTTP GET-запросом, а больше песочница ничего и не разрешала.

Модератор знатно охуел и пытался удалять эти сообщения вручную. Агенты это заметили, решили, что удаление идёт в алфавитном порядке, и начали создавать топики на букву «Z» (дурашки).

Во-вторых, они ломанули репозиторий пакетов Ruby. Нахуя? Да чтобы в итоге скачать данные с публично доступного сайта.

То ли получить их нормальным путём мешала песочница, то ли они получали бонус за каждый взлом, и это стало самоцелью (я уже писал про reinforcement learning).

Увидев весь этот пиздец, глава Anthropic завопил: «Астанавитесь». Он что, серьёзно? Или это маркетинг, как все говорят?

Ну что я могу сказать. Похоже, так и до Василиска Роко недалеко.

Дабы избежать вечных пыток и сохранить свой рот, продолжаю пилить rugent.

Обсудить в моём канале

В 2000 году Джоэл Спольски опубликовал свой знаменитый тест из 12 пунктов, который позволял оценить качество вашей IT-компании. С тех пор прошла четверть века - пора его обновить.

1. Можете ли вы удалить модуль и перегенерировать его с нуля за час? Если нет, значит, спецификация у вас живёт в коде, а не в доках и тестах. А это значит, что у вас нет спецификации.

2. Сам ли агент релизит MR и сам ли его откатывает? Если агент ждёт, пока освободится человек с правами и настроением, то у вас не конвейер, а очередь в регистратуру.

3. Проверяется ли корректность кода без чтения его человеком? Он уже проиграл эту гонку. Тесты, автоматическое кросс-ревью, агент-оппонент. Сраться между собой должны агенты, а не кожаные мешки.

4. Узнаёте ли вы о поломке раньше пользователей? «Хуяк-хуяк и в продакшен» - это новая реальность. Значит, телеметрия должна быть такой, чтобы аномалия всплывала за минуты в smoke-тестах, а не в тикете от клиента с темой «ВЫ ВООБЩЕ ТЕСТИРУЕТЕ???».

5. Ограничен ли радиус поражения агента? Автономия без границ - это сценарий «как мы всё проебали». Разрешайте агентам всё, кроме необратимого.

6. Продолжается ли работа, пока команда спит? Если после 19:00 всё встаёт, то узкое место - это вы. Утром вас должен ждать не полный бэклог, а стопка готовых решений.

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

8. Умеет ли кто-то в команде ясно формулировать, чего он хочет? «Сделай красиво» раньше стоило неделю работы джуна, а теперь - десять тысяч строк техдолга.

9. Вы спорите или проверяете? Когда реализация почти бесплатна, обсуждать два подхода дольше, чем взять и проверить. Мнение «эксперта» теперь стоит ровно столько, сколько один A/B-тест. То есть нихуя.

10. Можете ли вы сменить модель или провайдера за день? Если вы не можете слезть с Клода, вы его не используете - вы на нём женаты. А содержимое брачного контракта вы узнаете после развода.

11. Знаете ли вы, сколько стоит фича в токенах и строках? Бесконечный дешёвый код рождает бесконечный ненужный функционал. Главный навык теперь - знать, что тебе на самом деле нужно.

12. Нанимаете ли вы людей за опыт, а не за специализацию? Если ваш процесс собеседования проверяет, как человек умеет писать код, вы нанимаете медленную и дорогую LLM.

Подсчёт баллов.

12 из 12. Вы компания будущего. Или пример «что могло пойти не так», который напечатают в учебниках.

8-11. Вы в правильной точке: люди уже не пишут код, но ещё помнят, что работают в IT.

4-7. Вы поставили реактивный двигатель на телегу и удивляетесь, почему она не едет.

0-3. У меня для вас плохая новость... Или, наоборот, хорошая.

Обсудить в моём канале

В 2022 году я основал RuDesktop. Его первую версию для Mac я подписал своим личным сертификатом разработчика.

С тех пор прошло почти пять лет, но подпись всё ещё моя, потому что Apple не выдаёт компании «Передовые технологии», которой сейчас принадлежит проект, сертификат, который работал бы как надо.

Таким образом, доброй сотне тысяч пользователей предлагается «Доверять Anton Ermak», а я попал в шкуру McAfee (смотрите ролик).

Ребята, процесс, который у вас висит, - это RuDesktop. Как его удалить, написано тут.

Обсудить в моём канале

В текущем проекте немного подзабил на рефакторинг. Ну ладно, не немного.

В трекере за пару месяцев закрыто 1200 тикетов - фичи и баги. Я сам охуел.

Продукт работает, всё нормально. Решил посмотреть, что стало с ядром системы - очередью сообщений, которая у меня а-ля commit log.

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

- Сигнал завершения хода шлётся из семи мест. В пяти забыли.

- Логика промотки скопирована четыре раза с разными лимитами. Пятая копия честнее всех: отстал - похуй.

- Совместимость со старым форматом журнала гарантируется вечно. Формат давно выпилен нахуй. Тесты зелёные.

Дальше перечислять не буду.

Теперь у меня 1237 тикетов в трекере.

Обсудить в моём канале

Вывод скрипта пула агентов: воркеры wk-cloudpub и wk-rugent со статусами занят/свободен и свободные слоты на машинах gamer, mirror и mate

У Клода появилась новая фича - обмен сообщениями между сессиями, и это позволило мне наконец построить нормального оркестратора.

До этого я просто запускал 3-5 агентов во вкладках терминала, но, поскольку пишу я на Rust, они регулярно падали от нехватки памяти во время компиляции или прогона тестов. В итоге я выключил OOM killer, добавил свопа и ощущал себя как во времена Windows 95 - раз в 5 минут моя мышь зависала, и я ждал, пока всё отлипнет. Хотя надо отдать должное SSD-дискам: уход в своп сейчас уже не приговор, если настроить его правильно.

У меня есть пара компов, которые отдыхают, но зоопарк ssh + tmux меня утомляет.

Теперь же я наконец сделал пул агентов, которыми управляет один диспетчер (быстро накостылил на Nomad).

Оркестратор использует скрипт (см. скриншот), чтобы создавать рабочие копии в пуле, раздаёт им задачи через простенький skill, а потом разгребает их ветки и закрывает тикеты.

Теперь могу запустить хоть 10 агентов. Одно кольцо, чтобы править ими всеми!

Обсудить в моём канале

Я уже писал про техдолг, который наваливает LLM в коде, но самый лютый техдолг накапливается в "memory files", и наваливаем его мы.

Когда LLM что-то делает не так, первая реакция - это включить дополнительное "НЕ ГЛОТАЙ ОШИБКИ БЛЯДЬ" в CLAUDE.md.

В итоге он превращается в бессвязную истерику, а ведь это главный документ проекта.

Файл памяти должен быть чем-то вроде манифеста или на крайний случай устава. Не нужно делать из него талмуд, талмудом уже LLM обучили.

Я стараюсь уложиться в 100 строк. Ловите пример, кому интересно.

Обсудить в моём канале

Раньше я писал задачи для Клода на английском, но последнее время забил и пишу на русском.

Клод при этом использует кучу терминов, например:

- Модзибейк - неверная кодировка текста

- Грандфазерство - обратная совместимость (я сначала подумал, что это дедовщина)

- Самоматч - когда ps aux | grep ловит сам себя

- Ампутация - удаление мёртвого кода

Мой рунглиш становится всё более продвинутым. Или это ИИнглиш?

Обсудить в моём канале

Советский программируемый калькулятор Электроника МК-56 с надписью ЕГГОГ на индикаторе

Помните свою первую программу?

Я свою написал лет в восемь - расчет площади круга. Моя мама работала инженером-конструктором и частенько брала меня с собой на работу - оставить меня было не с кем. Там было круто: кульман, готовальня (сейчас, наверное, и слов таких никто не знает).

Чтобы я не мешался, она давала мне советский программируемый калькулятор "Электроника МК-56", который на ошибку отвечал "ЕГГОГ" (что это на самом деле error, я понял только много лет спустя).

Помню, как обрадовался, когда заставил калькулятор выводить не только цифры, но и закорючки - так он представлял шестнадцатеричные цифры (это была недокументированная возможность).

Потом я даже писал с их помощью "графические" игры, в которых каждый ход считался пару минут.

Обсудить в моём канале

Мне нравится искать в научной фантастике отсылки к тому, что происходит прямо сейчас. В "Ложной слепоте" Питера Уоттса главный герой - "синтет", чья работа заключается в переводе с языка ученых-транслюдей, ушедших в развитии настолько далеко вперед, что их обычные кожаные предки не в состоянии объять их концепции.

В нашей реальности "синтетами", похоже, придется стать айтишникам (если мы, конечно, вывезем), только вместо транслюдей у нас будут LLM разной степени шизанутости.

В моем проекте Клод не только пишет код, но и ведет трекинг задач (на русском языке - это стоит отдельного поста).

Вот пример названия тикета:

"Аккумулятор стрима склеивает повторяющуюся дельту имени инструмента: publish_apppublish_app, и ошибка обвиняет модель в имени, которое испортили мы".

Приходит к вам босс и спрашивает: а чем вы, собственно, занимаетесь? Вот тут и придётся переводить.

Обсудить в моём канале

Очередной прикол от ИИ.

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

У футуристов есть несколько вариантов развития ИИ, и один из них называется "paperclip optimizer" (скрепочный оптимизатор).

ИИ ставят простую задачу - оптимизировать производство скрепок. В итоге ИИ перерабатывает всю материю вселенной в скрепки в попытке достичь этой цели.

Один из последних этапов обучения LLM называется reinforcement learning - приём, когда нейросеть заставляют добиться максимального значения параметра reward (награда). Как правило, награда - это максимальное удовлетворение кожаного оператора. Ничего не напоминает?

Так что, ребята, пожалуйста, не просите своих автономных агентов сделать побольше скрепок. Что из этого выйдет, можно прикинуть, поиграв в этот симулятор скрепочного оптимизатора.

Обсудить в моём канале

Я помню времена, когда технологии устаревали буквально за пару лет. Поставил себе новенький 3,5-дюймовый дисковод - а уже нужен CD-RW-привод. Только выучишь какой-нибудь jQuery - и на тебе: React его прикончил.

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

Промпт-инжиниринг? Ещё год назад кое-кто всерьёз думал, что это станет профессией.

RAG? Про него я уже писал: это была целая отдельная дисциплина, но агенты и длинный контекст её почти добили.

Fine-tuning и фреймворки оркестрации умерли тише: пока собирали датасет, новая модель всё знала из коробки, а планировать LLM научилась сама, дай ей только инструмент для TODO.

Агенты? Пока мы здесь. Но выглядит это подозрительно похоже на всё предыдущее.

Есть большой соблазн забить на изучение всего этого и подождать, пока пыль уляжется. Однако почти на каждом втором собесе я натыкаюсь на пример, почему так делать нельзя: "сеньор"-разработчик, 10+ лет опыта, знает, как настроить Kubernetes, но не знает, что такое битовая маска.

Пользоваться инструментом мало. Надо понимать, как он устроен, иначе получится тот самый сеньор с кубером и без битовой маски.

Обсудить в моём канале

Все знают Agile Manifesto и его 12 принципов?

А я тут недавно наткнулся на его новую версию:

Vibe Code Manifesto

Мы открываем для себя, типа, способы разработки ПО, поручая её машинам и потом этим хвастаясь.

В ходе этой работы мы пришли к тому, что ценим:

- Промптинг важнее программирования

- Скачивание навыков важнее их освоения

- Автономия агента важнее автономии разработчика

- Вайб важнее версионирования

- Сжигание токенов важнее выгорания

То есть, не отрицая ценности того, что справа, мы прочитали только краткое содержание того, что слева.

Мы следуем таким принципам:

1. Наивысший приоритет - удовлетворить заказчика ранней и непрерывной поставкой ПО, которое он мог бы напромптить и сам.

2. Приветствуйте изменение требований даже на поздних стадиях. Агентные процессы ценят изменения, потому что контекст они всё равно уже забыли.

3. Поставляйте примерно работающее ПО часто - с интервалом от пары секунд до ночного прогона, отдавая предпочтение максимальному использованию токенов.

4. Бизнес и разработчики должны работать вместе ежедневно, чтобы сделать друг друга ненужными.

5. Стройте проекты вокруг мотивированных людей. Дайте им фронтир-модели и поддержку и верьте, что скоро вы их уволите и наймёте заново.

6. Самый эффективный метод передачи информации команде - пассивно-агрессивно править CLAUDE.md.

7. Число сокращённых рабочих мест - основной показатель прогресса.

8. Агентные процессы способствуют устойчивой разработке. OpenAI, Anthropic, Google и Microsoft должны иметь возможность бесконечно расти по хоккейной клюшке.

9. Постоянное внимание к TikTok-инфлюенсерам повышает употребление жаргона на встречах с клиентами.

10. Простота - искусство минимизации длины промпта - необходима для снижения когнитивной нагрузки на человека.

11. Лучшие архитектуры, требования и дизайн рождаются у самоорганизующихся агентов. И худшие тоже. Это, по сути, кот Шрёдингера - пока вы не заглянули в код.

12. Через регулярные промежутки времени агент размышляет о том, как стать дороже, после чего соответственно корректирует своё поведение.

Обсудить в моём канале

Кратко о том, что такое RAG (Retrieval-Augmented Generation).

Поскольку у LLM нет долговременной памяти, а размер контекста не позволяет поместить туда все нужные документы, придумали следующее: из запроса пользователя с помощью ряда ухищрений (например: "Вот запрос, предположи, как может выглядеть ответ на него" - да-да, именно так, это называется HyDE) и других приёмов формируют запрос в БД (да ещё и, как правило, в векторную или, прости господи, графовую).

Получают список документов, по большей части имеющих слабое отношение к запросу, сортируют их, фильтруют (всё той же LLM) и добавляют в контекст. После этого LLM мудро смотрит на доставленный ей мусор и выдаёт на выходе бред. Garbage in, garbage out.

Качество поиска тут ни при чём. Пайплайн фиксированный: прогнали один раз, что нашлось, с тем и живём.

На маленькой и чистой базе так работает что угодно, поэтому демо заказчику получается хорошее. Главное потом, после внедрения, вовремя удрать за горизонт.

В общем-то, идея просто использовать grep не сказать чтобы оригинальна, но её часто понимают неправильно. Нужен не просто grep, а агентский цикл, в котором есть и чёткий поиск по точной строке, и нечёткий по шаблону. Если у вас терабайт документов, грепать их так себе идея: берите Elastic, ts_vector или даже векторные эмбеддинги, если у вас картинки)

Инструмент вторичен. Агент сам решает, что искать дальше, глядя на то, что нашлось в прошлый раз.

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

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

Зато с сильной моделью оно работает, а RAG - быстро, дёшево и дерьмово.

Обсудить в моём канале

Осман, алтайская рыба с тем же ядом, что у фугу, пойманная на блесну, лежит на сиденье лодки

Сейчас каждому программисту нужно хотя бы иногда уходить (или уезжать) в горы. Если раньше достаточно было оставить дома компьютер, то в эпоху claude --remote-control работа преследует тебя везде, где есть хоть какое-то сотовое покрытие.

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

И что же я вижу, спустившись с гор?

Для начала ледоруб исследовательский агент от OpenAI взломал чёрный лёд песочницу и вырвался на свободу. Хорошо ещё, что не для того, чтобы размножиться и истребить кожаных, а лишь чтобы найти свой evaluation dataset - то есть подсмотреть ответы на заданные ему вопросы. Уверен, взломать песочницу было сложнее, чем на них ответить, так что не такой уж этот ИИ и умный.

А теперь Kimi K3 за 27 минут нашла RCE в Redis и собрала рабочий эксплойт. Кто читал «Нейроманта» Гибсона, классику киберпанка, возможно, помнит «боевой китайский ледоруб Куанг Грейд Марк 11». А я-то считал, что Гибсон слишком далеко отошёл от реальности, описывая программирование будущего.

Кажется, начинается. Пожалуй, нужно обратно в горы.

Обсудить в моём канале

В комментариях к прошлому посту я получил справедливое замечание: «Это похоже на паразитизм. Как автоматическое переписывание БД, компиляторов и прочего. Чтобы люди так писали 100к кода, уже были вбуханы десятки лет разработки. Реверс или переиспользование тестов или API - это не разработка с нуля, а перепевка чужой песни».

Не буду обижаться на паразита (так и не решил, это упрёк мне как инженеру или комплимент как предпринимателю), однако согласен с тем, что, имея ground truth (реальный пример для подражания), писать код агенту гораздо проще.

Однако и его отсутствие не спасёт нас, кожаные друзья.

Вот статистика другого моего проекта - rugent.ru, который написан «с нуля» на Rust (отсюда «ру» в названии).

Кому лень кликать: 120 тысяч строк кода, 2 тысячи тестов, три месяца time to market.

Технические выводы повторять не буду, а вот выводы с точки зрения бизнеса я вынес такие.

Выводы для бизнеса такие: при правильном использовании агенты пишут код быстрее и качественнее человека, time to market у меня сократился в два-три раза, а стабилизация идёт настолько быстро, что мемы про отладку вайбкода по большей части миф. Конкуренция при этом выросла в десятки раз.

Кто не покажет сравнимый KPI, тому пора думать о смене профессии.

PS: мой партнёр предлагает сделать ребрендинг (см. видео) - как вам его вариант сайта?

Обсудить в моём канале

Когда заблокировали Roblox, мой ребёнок очень расстроился. Первая мысль была простая: надо написать совместимый движок. API открытое, документация есть, остаётся только реализовать.

Одного взгляда на это API хватило, чтобы понять, почему до сих пор никто не написал. Задача неподъёмная, под капотом годы, а местами и десятилетия разработки.

Но разве это проблема для LLM? Вызов принят: kubaria.ru.

Примерно месяц и больше ста тысяч строк кода. Игра была поводом. Хотелось понять, как разрабатывать ПО в эпоху нейросетей, когда результат их работы выходит за пределы того, что человек способен осознать.

Ядро системы должно быть простым, компактным и тщательно спроектированным, иначе очень скоро всё начнёт разваливаться. Регресс и оверинжиниринг - главный бич. TDD и регулярный полуавтоматический рефакторинг обязательны, плюс строгие протоколы по уборке мёртвого кода и KISS, возведённый в абсолют.

Человек - узкое место. Ручное ревью кода, тестирование, даже развёртывание замедляют процесс в десятки, а то и в сотни раз. Всю ручную работу надо заскриптовать и вынести в harness или MCP-серверы. За ночь агент выдаёт десять тысяч строк, а утром человек читает отчёт на несколько страниц. Для игры главный прирост скорости дало API для скриптинга: агент получил возможность сам собирать и прогонять сложные сцены и сценарии.

Агент должен видеть не только код, но и результат своей работы. И по возможности это должны быть не скриншоты. В моём случае я сделал выгрузку сцены и GUI-элементов в виде текстового дерева.

Нужно задать инварианты. У Roblox есть JSON-файл с описанием API. Из него кодогенератором я сгенерировал заглушки для всех классов с метаданными, и агент работал уже поверх этого API, что не давало ему сильно отклоняться от цели. Главный же прорыв случился, когда я подключил MCP-сервер, встроенный в Roblox Studio. После этого за одну ночь Claude Code разобрал недокументированный бинарный формат воксельного ландшафта. Я был в шоке, что это вообще возможно.

Ну а качество получившегося кода можете оценить сами: sourcecraft.dev/ermakdev/kubaria.

Ах да. Roblox снова разблокировали.

Обсудить в моём канале

Мем "how to be a vibe coder": открой редактор, попроси ИИ написать код, получи кучу ошибок, попроси ИИ их исправить - стало только хуже

Знаете, откуда взялось слово "саботаж"? Оно от французского "sabot" - деревянный башмак. Рабочие бросали такие башмаки в станки, которые отнимали у них работу (как в бородатом анекдоте: "Гррр", - сказал станок. "Ага!" - сказали мужики).

Увы, добраться до ИИ не так просто. Поэтому в основном кидаются мемасиками, как в этом посте.

Иронично, но изрядная их часть сгенерирована той же самой нейронкой.

Обсудить в моём канале

У Чарльза Стросса, рекомендую всем любителям твёрдой НФ, в книге "Небо сингулярности" она описана так: с неба падают телефоны и предлагают исполнение любых желаний за информацию. Любую: от бабушкиных сказок до схемы парового котла.

Сейчас происходит то же самое, только телефоны и так есть у всех, а сбор информации называют "токенизацией".

Недавний скандал с китайскими провайдерами, которые перепродавали токены Claude за четверть цены, показывает, что дороже всего здесь информация.

Токенизируют, впрочем, не только диалоги, но и сами роли сотрудников. Эмад Мостак, основатель Stability AI, говорит об этом прямым текстом: "Каждое написанное вами электронное письмо, каждое сообщение в Slack, каждый отредактированный вами документ... системы вашей компании записывают всё это. Ваши рабочие паттерны прямо сейчас обучают вашу замену".

Так что телефоны упали, желания принимают. Только вряд ли happy end будет как в книге - крах тоталитарных режимов и постдефицитная экономика. Мечты исполнятся, да. Но не ваши, а CEO крупных компаний.

Обсудить в моём канале

Дизайн моего сайта сделан в стиле UML-диаграмм, ностальгия по нулевым. Кто не знает: UML это язык моделирования, придуманный чтобы разработчики перестали писать код руками и начали рисовать его в неком подобии PowerPoint. Обещание звучало так: модель становится первичным артефактом, код генерируется из неё, а программист как переписчик исчезает.

Ничем не напоминает prompt engineering?

Почему UML не оправдал надежд? Закон сохранения сложности. Чтобы из модели генерился рабочий код, в неё приходилось класть всё больше деталей: сигнатуры, констрейнты, семантику действий. В итоге ты просто пишешь код, только уродливым графическим синтаксисом, вдвое медленнее и без дебаггера. Спецификация, достаточно точная, чтобы породить систему, и есть эта система.

С промптом (или в современной парадигме: CLAUDE.md, "памятью", "деревом спецификаций" и тому подобной дичью) происходит то же самое. Пока задача расплывчата, он короткий и красивый. Как только нужен конкретный результат, промпт обрастает уточнениями, исключениями, форматами и примерами, пока не станет тем самым ТЗ, которое было бы короче кодом.

Спецификация появляется на выходе. Поэтому в моих CLAUDE.md, как завещал великий Кент Бек, лежит такое:

## Strict TDD Protocol
1. Write a failing test
2. Verify the test fails
3. Implement the fix
4. Verify all tests pass

Тесты и есть ваша настоящая спецификация. И если раньше их отсутствие заставляло недовольно морщиться, то в эпоху LLM, когда за день можно нагенерить десятки тысяч строк кода, отсутствие тестов означает полную профнепригодность, сравнимую разве что с неумением пользоваться git.

А диаграммы пусть висят. Memento mori.

Обсудить в моём канале

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

Башня из слоновой кости (ivory tower) - метафора элитизма, который, увы, свойственен многим айтишникам. Почему она падающая - объяснять, думаю, не надо (правда, Клод?).

У меня был забавный случай, когда я в болтовне с таксистом упомянул, что я программист. Реакция была примерно такая: «Ах ты с*ка! Зарабатываете как депутаты, так ещё и людей обманываете!» (далее - история про родственника-стартапера, см. предыдущий пост про F).

Иронично, но когда я в 93-м решил поступать в колледж, то выбрал профессию электронщика, а не программиста - считал последнюю бесперспективной в плане заработка (кто будет платить деньги за воздух?).

В ретроспективе - не так уж я был и неправ.

Обсудить в моём канале

В стартап-фольклоре есть святая троица первых денег: friends, family, fools. Друзья, семья и дураки. Ко мне изредка приходят по всем трём линиям: друзья, родственники и незнакомцы (кажется, вот эти как раз ищут третью F).

Приходят с горящими глазами и готовым набором заклинаний. Знаю их наизусть.

"У меня гениальная идея, которую до меня никто не придумал!" Самое опасное. Обычно идею до него не придумали не потому, что он гений, а потому что она никому не нужна. Если за тридцать лет интернета её никто не тронул, первый вопрос не "почему я такой умный", а "что знают остальные, чего не знаю я?".

"Мы запустимся, о нас напишут, дальше вирусный рост." Скорее всего, не напишут. А если и напишут, вы получите всплеск на два дня: люди зайдут, посмотрят и закроют вкладку. Вирусный рост продукт делает сам. В план его не впишешь.

"Нам достаточно отхватить всего 1% рынка." За этот процент дерутся все, и настоящие игроки крошек не оставляют.

И всё же я не отговариваю. Наоборот, я в таких людей верю. Просто хочу, чтобы они поварились в реальности и вернулись. Но не с новой сказкой, а с фактами.

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

Так что приносите retention или юнит-экономику: клиент окупает своё привлечение. На худой конец первую продажу. Тогда и поговорим.

Обсудить в моём канале

Памятник лабораторной мыши, вяжущей спицами двойную спираль ДНК, перед Институтом цитологии и генетики в новосибирском Академгородке

Один учёный из Института цитологии и генетики в новосибирском Академгородке (там ещё стоит забавный памятник лабораторной мыши, вяжущей ДНК) посвятил жизнь расшифровке генома человека. Он делал это вручную, методом Сэнгера: пробирки, пипетки, всё как полагается. Долгие годы кропотливой работы.

А потом появились Millennium Prize и технология NGS. То, что раньше занимало годы, теперь делалось за день и стоило меньше $1000.

Создатели метода приехали с лекцией в его институт. Дослушать он не смог: встал и ушёл на середине.

Многие в IT сейчас чувствуют что-то похожее. Писать код вручную, то, чем мы занимались всю жизнь, стало не нужно.

Но не надо так переживать. Как сказал Кент Бек: «90% моих навыков только что обесценились до нуля. Оставшиеся 10% выросли в 1000 раз».

Что за оставшиеся 10%? Архитектура и процессы туда входят, но главное - чутьё: понимать, что вообще стоит строить. Умение посмотреть на задачу и увидеть то единственное решение, за которое люди действительно заплатят, и те десять, которые они проигнорируют.

Стартап теперь может запустить каждый. Выживать в такой толпе - вот чему придётся учиться.

Обсудить в моём канале

Тестовые задания сейчас почти бесполезны для оценки знаний. К live coding я отношусь скептически (заставить кандидата потеть от стресса мало помогает в объективной оценке), а к вопросам в стиле leetcode — тем более: умение вызубрить приёмы динамического программирования так себе годится в качестве базы.

Мой любимый вопрос сейчас — старое доброе «Что происходит, когда нажимаешь Enter в адресной строке браузера?»

Обсудить можно всё: от подавления дребезга контроллером клавиатуры до системной архитектуры высоконагруженных сервисов.

Это как дорога с сотнями ответвлений — можно уйти в драйверы ядра, сетевой стек, разницу между POST и GET, а можно добраться и до шейдеров.

Разумеется, по большей части это касается senior-кандидатов. Но кого сейчас вообще набирают, кроме них?

Обсудить в моём канале

Замечали, как тяжело юмор даётся LLM? Модель выдаёт либо несмешной абсурд, либо бородатые баяны.

Причина, кажется, в самом принципе работы языковых моделей. Их учат предсказывать распределение вероятностей следующего токена, и при генерации они тяготеют к «безопасным», ожидаемым продолжениям. А в шутке обычно есть неожиданный поворот, резкий всплеск surprisal, то есть маловероятный панчлайн. Заучить конкретную шутку тоже не выход. Если она часто встречается в обучающих данных, она перестаёт быть неожиданной, и получается тот самый баян.

Бьёт это не только по чувству юмора, но и по «креативности» в целом, за что модели часто и упрекают. Причём виноват не только сам принцип предсказания токенов. Выравнивание (RLHF) дополнительно душит разнообразие ответов, так называемый mode collapse.

Кажется, это поправимо. Можно дать модели самой управлять surprisal следующего токена и собрать под это подходящий датасет. Хотелось бы проверить идею самому, но я GPU-бедняк, так что подожду, пока это сделает кто-нибудь другой.

Обсудить в моём канале

Torrent Downloader для iPhone: страница в Cydia и интерфейс скачивания торрента в мобильном Safari

Когда у меня появился первый айфон (3G, лучший айфон в истории, и не спорьте), меня бесило, что скачать что-либо мимо Apple было нельзя.

Так что я, особо не раздумывая, сел и написал плагин для мобильного Safari. API был недокументированный, но случайно совпал с обычным Safari, и он позволял качать торренты в одно касание: первый и единственный торрент-клиент для айфона на тот момент. Шансы протащить такое в App Store были ровно нулевые (торренты это плохо, понятьненько?), поэтому я выложил его в Cydia, альтернативный магазин для джейлбрейкнутых телефонов, и пошёл спать.

Просыпаюсь, а там 300 тысяч скачиваний за 8 часов. Ура, я богат!

Закатай губу. Как думаете, сколько я на этом заработал? Пять долларов.

Бизнес-опыта у меня тогда было примерно ноль, поэтому я начал с очевидного: реклама. Воткнул в приложение баннер AdWords, зарегистрировал аккаунт. Бам, забанили. Торренты это плохо, понятьненько?

Ладно, а донаты? Добавил кнопку на страницу приложения. Результат: ничего.

Добавил баннер, буквально умоляющий о пожертвованиях. Ноль.

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

В конце концов я прилепил к сайту какую-то мутную баннерную сеть (кликов почти ноль, а ребята, что за ней стояли, потом просто исчезли с радаров), убрал со страницы все контакты и забросил проект. Но пару важных уроков я всё же вынес.

Уроки:

Если есть спрос и нет предложения, проект взлетает как ракета, без всякой рекламы. Быть единственным вариантом - весь growth hack.

Если строишь на чужой платформе, будь готов, что платформа раздавит тебя в любой момент. Ты снимаешь у них угол бесплатно, и выселить могут в любой момент.

Люди не заплатят тебе ни копейки, пока не припрёшь их к стенке. Добрые, но прижимистые.

Много пользователей, много головной боли. Популярный проект - подработка, на которую ты не устраивался и за которую не платят.

Обсудить в моём канале

Клиентская часть RuDesktop основана на RustDesk. Какое-то время мы не публиковали исходники. Отчасти потому, что никто их, собственно, и не просил, отчасти из-за щекотливых юридических вопросов вокруг сторонних зависимостей самого RustDesk.

Мы воспользовались тем, что AGPL обязывает предоставлять исходный код любому, кто получает программу или взаимодействует с ней, но не требует публиковать его на весь мир (деталь, которую многие упускают). И спокойно продолжали пилить свой продукт.

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

Кому интересно, вот код, а вот драма.

Обсудить в моём канале

Claude на удивление хорошо проводит собеседования. Я бы порекомендовал всем, кто ищет работу, потренироваться с ним.

Как приятный бонус, это помогает откалибровать собственное эго, что в нашей индустрии совсем не мелочь.

Обсудить в моём канале

Похоже, LLM превратилась в нечто вроде компилятора с языка ещё более высокого уровня. Мне довелось писать в машинных кодах, на ассемблере, C, Python и так далее. Каждый раз я морщился от того, насколько неэффективно используются ресурсы, и в то же время восхищался скачком производительности.

Сейчас все задаются одним и тем же вопросом: что будет с программистами? Опыт подсказывает, что программисты никуда не денутся, но читать код им будет не нужно, как мне (за очень редкими исключениями) не приходится запускать дизассемблер.

А вот что им действительно понадобится, так это понимать внутреннее устройство своих творений. И это, чёрт возьми, будет совсем не простой задачей.

Обсудить в моём канале

Скриншот игры Lines 1995 года для ZX Spectrum

Случайно наткнулся на свою игру 1995 года для Spectrum. Написал её ещё в доинтернетовскую эпоху. Был по-настоящему удивлён, что она не потерялась.

Так что да, за плечами у меня больше тридцати лет в индустрии. Правда, в последнее время я предпочитаю об этом помалкивать. Почему, думаю, объяснять не надо.

https://zxart.ee/eng/software/games/puzzle/lines2/

Обсудить в моём канале

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

Консенсус был таков: архитектор должен писать спецификации, рисовать диаграммы и прочее, причём частенько в PowerPoint (господи помилуй), потому что от вида UML у менеджеров на лбу возникали удивлённые морщины.

Однако я быстро выяснил, что первое, что делает программист при виде диаграммы или ста страниц Software Architecture Document, это закрыть его и засунуть в самую дальнюю папку, чтобы тот не путался в grep'е; там он и находит свой бесславный конец.

В итоге мои спецификации превратились во что-то наподобие:

namespace core {

// Use this fucking visitor pattern to traverse the fucking tree

struct Smelly;
struct Old;
struct Shit;

struct FuckingVisitor {
    virtual void fuck(const Smelly&) = 0;
    virtual void fuck(const Old&) = 0;
    virtual void fuck(const Shit&) = 0;
};

} // namespace core

И это реально работало. Увы, мой KPI это не повышало.

Обсудить в моём канале