Падающая башня из слоновой кости
59 subscribers
17 photos
2 videos
2 files
45 links
Заметки о технологиях, разработке и искусственном интеллекте
Download Telegram
В стартап-фольклоре есть святая троица первых денег: friends, family, fools. Друзья, семья и дураки. Ко мне изредка приходят по всем трём линиям: друзья, родственники и незнакомцы (кажется, вот эти как раз ищут третью F).

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

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

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

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

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

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

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

Читать в блоге →
🍾2❤1
Думаю, нужно пояснить название канала. Башня из слоновой кости (ivory tower) – метафора элитизма, который, увы, свойственен многим айтишникам. Почему она падающая – объяснять, думаю, не надо (правда, Клод?).

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

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

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

Читать в блоге →
🔥2
Падающая башня из слоновой кости pinned «Думаю, нужно пояснить название канала. Башня из слоновой кости (ivory tower) – метафора элитизма, который, увы, свойственен многим айтишникам. Почему она падающая – объяснять, думаю, не надо (правда, Клод?). У меня был забавный случай, когда я в болтовне…»
Дизайн моего сайта сделан в стиле 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.

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

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

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

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

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

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

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

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

Читать в блоге →
🤣2
Когда заблокировали 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 снова разблокировали.

Читать в блоге →
🦄3👨‍💻1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Сейчас каждому программисту нужно хотя бы иногда уходить (или уезжать) в горы. Если раньше достаточно было оставить дома компьютер, то в эпоху claude --remote-control работа преследует тебя везде, где есть хоть какое-то сотовое покрытие.

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

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

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

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

Кажется, начинается. Пожалуй, нужно обратно в горы.
🤔3👍2🔥1😁1
Кратко о том, что такое RAG (Retrieval-Augmented Generation).

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

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

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

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

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

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

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

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

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

Читать в блоге →
🤓1
Мне подходит к концу четвёртый десяток, и, как всякий мужик, я решил, что пора разобраться с кризисом среднего возраста (что это такое - хз, но лучше подготовиться заранее).

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

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

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

В итоге я заказал себе Enya Inspire Pro (на фото) - и знаете, она мне зашла. Конечно, профи будут плеваться ("пластмассовый звук!", "фонит!"), но на мой непритязательный взгляд электруха из углеволокна, которая работает на аккумуляторе и со встроенным DSP-процессором (эффектами), - такого в моё время ещё не было. Не нужны кабели, комбик и прочее, что путается под ногами.

К сожалению, софт полное Г, подумываю отреверсить протокол и навайбить что-нибудь получше. Но пока свою задачу выполняет - Fade to Black "Металлики" сыграть можно.
👍1👏1
Все знают 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. Через регулярные промежутки времени агент размышляет о том, как стать дороже, после чего соответственно корректирует своё поведение.

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

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

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

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

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

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

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

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

Читать в блоге →
💯5
DRY.md
4.7 KB
Наверное, все программисты слышали про принцип KISS - Keep It Simple, Stupid, или, по-нашему, "Будь проще, и люди к тебе потянутся".

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

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

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

Ну, клин клином вышибают. Так что я слепил такой вот скилл. Пользуйтесь.
👍3🔥1
Очередной прикол от ИИ.

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

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

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

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

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

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

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

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

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

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

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

Читать в блоге →
👌2
Помните свою первую программу?

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

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

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

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

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

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

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

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

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

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

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

Читать в блоге →
😁3❤2🤪2💯1
Решил тут посчитать, во сколько ускоряется разработка при помощи ИИ по COCOMO.

Добавим сюда мифического 10x разработчика (а кто из нас не такой 😉).

Это что, получается, что можно 720 человек заменить одним?

Читать в блоге →
😁1😱1
CLAUDE.md
17.9 KB
Я уже писал про техдолг, который наваливает LLM в коде, но самый лютый техдолг накапливается в "memory files", и наваливаем его мы.

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

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

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

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

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

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

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

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

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

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