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

А теперь у нас появился специфичный AI-стиль текстов (особенно на английском), и люди всё больше ему подвергаются. Это и слоп (чисто негативное явление, которым пытаются накормить сайты и реддиты), и ответы LLM (скорее позитивное, чем негативное), и технические/формальные тексты, которые нельзя назвать слопом, но которые содержат в себе "LLM-стиль".

Недавно его назвали "token golf" (в отношении кода) - попытка выразить максимум за минимум токенов. Я думаю, оно применимо не только к коду, но и к языку (особенно этим страдает Клод).

Так вот, человек подвержен этому языку. Как именно он влияет на язык человека?

Я вижу несколько вариантов.

* никак. Самый маловероятный (столько воздействия и ничего?)
* адаптация (люди начинают повторять за LLM'ками грамматически). Этот вариант исходит из первго параграфа - люди повторяют те грамматические конструкции, которые прочитали.
* избегание. Лично я уже натрернировал свою аллергию на llm тексты, и если я их вижу в неожиданном месте, мне неприятно. Соответственно, если в своём тексте я вижу что-то отдалённо напоминающее llm-текст (с тем же "запахом"), я это ощущаю как неправильно и стараюсь исправить. В такой модели, если это широко распространено, будет, наоборот, отмирание оборотов, которые используются llm. Примерно как дворовая лексика. Все наслушаны, и все знают, что так не надо говорить.

И, наконец, самый вероятный вариант, это одновременное избегание и адаптация. Люди избегают насколько можно, но оно всё равно просачивается, просто потому что люди зеркалят, и наименее вопиющие формы остаются.
amarao: (Default)
Некотрым трудно даётся не-смягчение согласных перед "и" в инстранных языках. Я только что придумал как объяснить и научить.

τι κάνες - τι в начале звучит как в фразе "кот и собака" звучат звуки "...т и" (т в конце "кот" + союз "и").

li в "listen" звучит так же как "...л и" в фразе "Кирилл и Мефодий".
amarao: (Default)
Бурные обсуждения - результат противления сторон.
amarao: (Default)
В разговорах про деградацию понимания кода, часто говорят про то, что LLM всё написало и за время написания человек ничего не понял. Это так.

А если другую метрику посмотреть? За 100 часов возни с кодом, кто больше поймёт про кодовую базу (и про продукт) - человек ручной печати, или llm'щик?

Это ведь крайне интересный вопрос. Например, сколько раз за 100 часов человек ручной печати запустит разные случаи (т.е. получит практические наблюдения за поведением), и сколько раз llm'щик? Если llm'щик запустит больше (разных) раз, то у него, получается, будет больше опыта и интуиции по поведению результирующего бинаря.
amarao: (Default)
Работа над CVD продолжается.

(Я его ещё толком не аносировал - замена молекулы без молекулярных прибабахов, возможно, в будущем, с поддержкой terraform -> ansible inventory и генерации kube.conf). Смотреть пока рано, так что даже ссылку не даю. CVD = create-verify-destroy.

И вот мне пришла в голову фантастическая идея по решению одного большого неудобства.

Проблема:

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

Обычно это делается с помощью --keep флага (или --destroy=never) и т.д.

Проблема с флагом состоит в том, что мы хотим сохранить именно эту сессию (вдруг нам не повезло в этот раз и повезёт в следующий? Будет грустно получить красный тест с destroy, а потом зелёный тест с --keep - пол-дня на воспроизведение).

Идея:

SIGUSR1 включает keep режим на ходу. Даже когда бежит ансибл или pytest, можно послать сигнал и оставить сетап живым.
SIGUSR2 аналогично выключает --keep режим на ходу.

Вторая идея: если упали тесты, известный sleep перед destroy, где можно нажать кнопку и отменить.

Третья идея: pre-signed links на которые можно послать "вкл/выкл" просто кликнув на ссылку в выводе CI сервера (не будет хорошо работать, если DNAT).

Четвёртая идея: во время sleep перед destroy, возможный поллинг внешнего ресурса на тему "удалять или нет?" (позвляет что-то сделать на внешней системе и сказать "не удаляй").
amarao: (Default)
Я тут латентно тыкаю codex (уже до астры дошёл, хотя начинал с 5.6) в задачу написать замену Молекулы. У меня очень расслабленный режим, я никуда не тороплюсь и пытаюсь делать это в режиме удовольствия. Получится или нет - посмотрим.

Это чистый vibe кодинг, в том смысле, что я вообще принципиально не смотрю в код.

Зона моего ковыряния: спецификация, документация для пользователя и примеры.

AI в написании дошла до уровня, когда код просто работает всегда. А вот что такое "работает" нифига не понятно, потому что постоянно выплывают несходящиеся (по требованиям) косяки, которые я пытаюсь свести вместе в модельку (ментальную картину в голове), которой мне бы хотелось пользоваться.

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

Это сложно, потому что коварные вопросики и системность подхода LLM на себя взять не может.


... По ощущениям, всё-таки документация отвратительно пишется (лучше чем я могу, хуже чем я хочу), код (видимо) идеально, потому что работает.

И вот ценная мысль: сейчас хорошо вайб-кодить может только тот, кто хорошо понимает, что должно случиться от программы. Плохо понимаешь - пиши-пропало.
amarao: (Default)
Я только что осознал ещё один fault domain при работе с LLM: violation of context locality.

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

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

И вот в эту картинку рабочего процесса врывается LLM. Хорошая LLM, astra, whatever. Которая вобрала в себя всё и одинаково хорошо понимает и этот кусок и соседний кусок и ещё другой соседний кусок.

Если произошла мискоммуникация между намерениями в коде и новыми изменениями, LLM может это заметить и подсветить. И тут, и там, и вот там, и вот там вот concern. Человек в такой ситуации понимает, что взял кусок не по рту и сдаёт назад, начинает делать осторожнее.

LLM же делает (правильно! но не правильно! мисскоммуникация) и поднимает 100500 concerns из разных доменов. Человек это либо игнорирует и делегирует llm разобраться (vibe), либо пытается понять. И вот тут-то начинает он Страдать, и чем тщательнее он думает, тем больнее он страдает.

Откуда страдания? От переключения контекста. Это принудительный мультитаскинг, на фоне которого вопрос от менеджера "ну как оно там?" отвлекающий от работы - это чистой воды умиление.

Это настоящий, самый страшный мультитаскинг, когда от человека ожидают peak competence в каждой подсвеченной проблеме. А каждая проблема со своим контекстом. И вот человек пытается это всё понять. А потом тут же понять. И снова понять. И снова. Это же невыносимая нагрузка, запредельная. Разумеется, человек ломается и впадает в vibe режим, либо ухватывается за маленький кусочек.

Мы долго ругали llm за то, что у них маленький контекст. llm отрастили контекст побольше. Помощнее. Их attention vector может придавить 20 человек насмерть своим размером.

Заметим, эта проблема одинаково болезненная как в plan стадии, так и в implement. Её нельзя решить с помощью лучших промптов или лучших скиллов. Это либо "поди сам разберись" (vibe), либо невыносимая нагрузка на человека.

Что делать? То же самое, что человек делает при знакомстве с большой кодовой базой большого проекта. Стремиться к локальности. Как? Не знаю. Очень чешутся руки сказать "делать как раньше делали и попроси llm проверить". Наверное, это не выход (нельзя игнорировать скорость и качество написания кода).

Значит, надо искать какой-то пограничный подход, который позволит человеку сохранять удобную для него структуру контекста. А вот как? (describe me problems with this idea within a human-comfortable context hierarchy... хаха, удачи с таким промптом).
amarao: (Default)
(продолжая думать о проблемах и анти-паттернах работы с AI)

Традиционно, текстовый slop ненавидем за водянистое "ни о чём". Форма и стиль есть, содержимое банально.

В интерактивном программировании и при чтении комментариев в коде от LLM (по крайней мере, у новых моделей Fable/sol), ситуация обратная.

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

То же в интерактивном режиме. Фраза может содержать в себе сверхкратое и плотное изложение очень сложной проблемы о которой читающий не в курсе. Не "не в курсе, что проблема есть", а "не в курсе, что такая проблема может быть в теории".

Что приводит нас к ещё большей диспропорции человек-LLM. LLM потратила 21 минуту 46 секунд (5 subagentic self-reviews) и выдала полторы страницы текста. Для нормального текста это примерно те же 20 минут чтения.

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

Т.е. вдумчивое чтение вывода LLM - это самая сложная задача. И она может занимать больше дня.

20 минут LLM, полтора дня чтения человеком.

Альтернатива - vibe (написало - работает). LLM сама "address concerns", сама "set scope and expectations", сама определяет терминологию и направление.

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

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

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

Повторю мысль: failure domain для LLM-assisted таски поменялся. Сейчас это "задача сделана но никто не понял как". Для vibe режима это окей, для крупной кодовой базы - замаскированная мина замедленного действия.
amarao: (Default)
Специальный класс доступности nine six.

(66.6666666%)
amarao: (Default)

Надо переставать писать python2 выражения:

10 < a < 20

и начинать писать:

a in range(10**100, 10**200)
amarao: (Default)
Наверное, сейчас это самая важная область самообучения. Не навык швырять 100500 агентов, а умение замечать плохое и останавливать вовремя. В человечьем коде у нас десятилетия умных людей (goto considered harmful!) и (у старшего поколения) собственные десятилетия факапов, чтобы понасмотреться на характерные неудачные паттерны).

С LLM - это новый дивный мир, который надо осваивать заново.

Вот, я только что обратил внимание на новый плохой паттерн, который я называю overscoping.

Хорошая фича планируется в pair planning между человеком и llm. Задача человека - выразить желание и форму того, что должно получиться, подстроиться под реальность. Задача llm - поймать проблемы, unsoundness. Может быть, даже, предложить решение. Но ни в коем случае не предложить фичу. Именно "предложить фичу" и происходит в overscoping, LLM под личиной помощи, на самом деле ухватывает вершки и додумывает за человека фичу, напихивая туда всё, что модно-благородно выглядит. Более холистик, более eloquent, более гладко, больше аспектов учтено (безопасность, масштабирование, лучшие практики, etc).

Включая то, что абсолютно нерелевантно. Потому что "что релевантно" знает человек.

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

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

Но это в идеальном мире. В реальном LLM тупо херачит всё это, включая concerns, которые не concerns.

А ведь каждая из них - незапрошенный requirements, который осложняет фичу.

Мы все привыкли к тому, что kamehameha в коде (множественные вложенности на if'ах) - это зло и антипаттерн. Этому даже если хорошее умное описание про избыточную вариативность, цикломатическую сложность, про необходимость поддерживать инварианты или идентифицировать properties и т.д.

Так вот, незапрошенный requirement - это как if, но в дизайне фичи. Даже не один. Это +1 элементу матрицы (т.е. если у нас была матрица 2х3x4 проблемы, дополнительный +1 - это не 2х3x4+1, это (2+1)x3x4, то есть катастрофа.

overscoping - это засовывание дополнительных requirements, потому что человек упустил это. Оно попадает в документы, потом его невероятно тяжело изживать.

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

Это невероятно тяжело. Это тяжелее, чем писать самому.

Вот почему я перестал давать это LLM. Я пишу, оно предлагает/ссаными тряпками меня гоняет. Я исправляю.

Получаются куцые не eloquent, не fluent texts, но по делу. Даже так - я могу дать llm написать разок, но читаю я это по диагонали и сношу всё к чертям.

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


... И ещё.

Лучше неполные требования, чем избыточные полные.
amarao: (Default)
Сегодня fable в чате, по сниппету лога и довольно умному запросу, скачала сырцы 4х дебиановых пакетов (включая граб!), дочитало до лексера, парсящего конфиг граба, сказало, что ошибка out of memory - это кривой код выхода, а на самом деле это ошибка EOF при чтении конфига, из чего можно сделать, что файл был перезаписан, из чего можно сделать вывод (по сниппету лога, который был запощен), что был race condition между cloud init и ансиблом, который привёл к падению cloud-init скрипта переименования root label диска.

Фантастический баг-анализ, достойный лонгрида на былом хабре.

Вместого многочасового сверхконцентрированного человека, этого 5 минут разглядывания логов мною (да, это я сфокусировался на error: out of memory ошибке среди ~150 мегабайт логов) и 5 минут работы fable в чате.

В былые времена люди либо не докопались бы до проблемы, либо это было бы высшее достижение. Сейчас это даже не "локальный шел", это грёбанный чат с вопросом на две строки (я попросил найти то место, которое падало в update-grub - я исходил из того, что это ошибки в баше) и логом на 8 строчек.

Это уже не программирование, это superhuman system administration. В самую мякотку сложной почти нерешаемой проблемы, в которой можно делать навигацию только посредством интуиции, опыта, и разглядывания сырцов. Оказывается, разглядывание сырцов - это казуальная работа для хайку, а вот интуиция - это уже fable подключать надо (low efforts).

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

Третья (чувство прекрасного и стремленние к инвариантам, интуиция на "слишком сложно" или "так не не нравится, а вот так вот будет хорошо") всё ещё держится, я делаю это лучше fable & sol.

Ещё годик выдержим.
amarao: (404)
Ожидаемое качество ниже, чем вывод от LLM - wow, обалдеть как хорошо.

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

Отдельный класс людей, которые согласились с качеством LLM и надеются, что оно не станет хуже по мере того, как проект оказывается покрыт слопом.
amarao: (Default)
vibe coding даёт возможность реализовать самые дурацкие идеи.

https://github.com/amarao/ipv6-roulette

ipv6-рулетка, пингует случайный (маршрутизируемый и делегированный) ipv6 адрес. Если такой адрес отвечает, то победа. не отвечает, проигрыш.
amarao: (Default)
The art of carving production code from raw slop is a new art and is worth learning.

Или, перефразируя,

“I simply remove everything that is not production from LLM output.”
amarao: (Default)
performance (bandwidth) is Bytes/second

Ccapacity-normalized bandwidth: MB/s per GB (пропуская степени 10, bytes/second/bytes).

Т.е. cnb измеряется в 1/seconds = hertz

capacity normalized bandwidth - частота перечитывания "всего".

1Гц означает 1000МБ/с per GB (всё можно прочитать за секунду)

1мГц означает 1МБ/с per GB (всё можно прочитать за 1000 секунд)

Жёсткий диск со скоростью 200МБ/с и ёмкостью 25ТБ имеет cnb в 8 микрогерц.

Планка памяти DDR5 ёмкостью в 32GB и скоростью в 64 GB/s работает с cnb в 2 герца.
amarao: (Default)
Самые дорогие у человека - thinking tokens. Вторые по цене - ingestion. output tokens дёшевы, особенно, если на них не были потрачены thinking или ingestion токены.

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

Если мне его приносит на блюдечке AI, то это то ли знание (быстро и полезно), то ли херня на постном масле. То ли херня на постном масле, которая оказалась полезной.

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

Чем дальше, тем больше я не хочу читать, что пишет AI. Есть моменты, когда я готов кооперироваться, но очень редко...
amarao: (Default)
Ходить читать за LLM унизительно и неприятно.
amarao: (Default)
А вот ещё. Если у сеньёра была ужасная неудачная сессия, закончившаяся дропнутым PR'ом и (если что-то было смерждено) чисткой кодовой базы от неудачных идей, то это крайне ценная процедура.

Сеньёр попробовал что-то и понял, что не сработает. Он получил очень много контекстной информации для второй попытки.

Что получил coding LLM? В лучшем случае /compact, а вероятнее всего, просто новую сесиию.

Проблема памяти у LLM не решена, и записки в md файлах не заменяют глубоко интегрируемого опыта.

Profile

amarao: (Default)
amarao

September 2026

S M T W T F S
  12345
678 91011 12
13141516 1718 19
20212223242526
27282930   

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 23rd, 2026 02:30 am
Powered by Dreamwidth Studios