Обновить
16K+
49
Alex Gusev@flancer

Я кодирую, потому что я кодирую…

3,1
Рейтинг
99
Подписчики
Отправить сообщение

Я лет 8, как интегратор, копался в "кишках" Magento (и первой, и второй) - вот там мне это смирение пригодилось на все 100%.

И, это... я ни в коей мере не считаю "Magento" поделкой, если что. Это очень сложный продукт в инженерном смысле. Код в двойке был ужасен с точки зрения перфекциониста, но в археологическом плане он был изумительно любопытен. Такого нагромождения архитектурных стилей и разных подходов в одном продукте я не видел нигде. А ещё огромный зоопарк расширений, где у каждого были свои тараканы в голове! И тем не менее - она работала и работает! Удивительный в инженерном смысле продукт! Со своей замечательной философией.

Ну нет, это вряд ли. Тут как раз весь смысл в неформальности и неявности. Модели улавливают связи, невыраженные формально. Если всё формализовать, то это как Java в JS перегонять в GWT. Это уже есть.

Я вам показал. Видеть или нет - ваше дело. Лошадь можно привести к водопою...

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

Ну, и вишенкой на торте - агент в браузерном приложении использует мою собственную библиотеку для внедрения зависимостей @teqfw/di. Про которую он при обучении вряд ли что-то мог сильно много узнать. Тем не менее, код в web/app написан на чистом JS и не содержит статических импортов:

import'ы есть только в карте типов для VSCode
import'ы есть только в карте типов для VSCode

Вот тут - да, пришлось заборчиков понаставить, чтобы агент с темы не съезжал. Но в результате JS-код работает в браузере без транспиляции и сборок - as-is.

Я же говорю, управляемы и повторяемы в определённых границах.

Вы просто про PWA и WebRTC мало чего знаете, поэтому полезли на бэк. Так-то, в этом приложении вся логика в браузере. Вот список файлов фронта:

Скрытый текст
./web/app.js
./web/service-worker.js
./web/app/types.d.js
./web/app/Media/Manager.mjs
./web/app/Media/Monitor.mjs
./web/app/App.mjs
./web/app/Rtc/Peer.mjs
./web/app/VersionWatcher.mjs
./web/app/Config/RemoteLogging.mjs
./web/app/Net/Signal/Client.mjs
./web/app/Net/Signal/Orchestrator.mjs
./web/app/Net/Session/Manager.mjs
./web/app/Ui/Screen/Home.mjs
./web/app/Ui/Screen/End.mjs
./web/app/Ui/Screen/Call.mjs
./web/app/Ui/Screen/Settings.mjs
./web/app/Ui/Screen/NotFound.mjs
./web/app/Ui/Router/Config.mjs
./web/app/Ui/Toast.mjs
./web/app/Ui/Flow.mjs
./web/app/Ui/Router.mjs
./web/app/Ui/Templates/Loader.mjs
./web/app/Ui/ShareLinkService.mjs
./web/app/Pwa/Cache.mjs
./web/app/Pwa/ServiceWorker.mjs
./web/app/State/Media.mjs
./web/app/State/Machine.mjs
./web/app/Logger.mjs
./web/app/Env/Provider.mjs
./web/manifest.json
./web/AGENTS.md
./web/assets/icons/menu.svg
./web/assets/icons/phone.svg
./web/assets/icons/settings.svg
./web/assets/icons/help-circle.svg
./web/assets/icons/mic.svg
./web/assets/icons/icon-512.svg
./web/assets/icons/link.svg
./web/assets/icons/share.svg
./web/assets/icons/circle-check.svg
./web/assets/icons/refresh-ccw.svg
./web/assets/icons/mic-off.svg
./web/assets/icons/camera-off.svg
./web/assets/icons/AGENTS.md
./web/assets/icons/cable.svg
./web/assets/icons/close.svg
./web/assets/icons/video.svg
./web/assets/icons/camera.svg
./web/assets/icons/trash-2.svg
./web/assets/icons/rss.svg
./web/assets/icons/return-home.svg
./web/assets/icons/alert-triangle.svg
./web/assets/icons/icon-192.svg
./web/assets/icons/copy.svg
./web/assets/icons/slash.svg
./web/ui/component/icon-wrapper.css
./web/ui/component/header-action-button.css
./web/ui/component/icon-wrapper.js
./web/ui/component/AGENTS.md
./web/ui/component/screen-card.js
./web/ui/component/components.js
./web/ui/component/screen-note.css
./web/ui/component/screen-note.js
./web/ui/component/screen-header.js
./web/ui/component/header-action-button.js
./web/ui/component/screen-card.css
./web/ui/component/screen-header.css
./web/ui/component/big-button.js
./web/ui/component/big-button.css
./web/ui/style/toast.css
./web/ui/style/tokens.css
./web/ui/style/reset.css
./web/ui/style/layout.css
./web/ui/screen/settings.html
./web/ui/screen/home.css
./web/ui/screen/home.html
./web/ui/screen/call.css
./web/ui/screen/AGENTS.md
./web/ui/screen/settings.css
./web/ui/screen/call.html
./web/ui/screen/not-found.html
./web/ui/screen/not-found.css
./web/ui/screen/end.html
./web/ui/style.css
./web/reinstall.html
./web/index.html
./web/version.json

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

Вы пытаетесь отвёрткой заколачивать гвозди и говорите, что получается плохо.

Да, отвёрткой гвозди заколачивать плохо. Согласен.

Знаете, что хорошо делать с LLM? Попросить её по скрину с фрагментом XML-файла написать скрипт для подсчёта количества позиций определённого узла в этом XML-файле. Причём сам файл на 110М, его даже не каждый viewer с полпинка откроет, а клиент висит на связи и вы пытаетесь понять, почему у него экспорт не прошёл и на чьей стороне проблемы. Запрос к чатику, пара итераций с уточнениями и через несколько минут ответ есть - 280К+ позиций и проблемы не на нашей стороне. Всё это - не прерывая общения с клиентом.

Одноразовые приложения - вот конёк LLM.

Ну смотрите, для меня LLM вполне себе повторяемы и управляемы. Я себе уже это доказал (см. коммент выше). Я теперь щупаю границы управляемости и повторяемости.

Но другим я ничего доказывать не хочу - нервное это занятие. Я просто показываю. Вот сервис, который я писал через LLM - GPT + Codex. Там много больше "Hello, World!" - PWA, сигнальный сервер на web-сокетах, WebRTC. История отношений агента со мной есть. Сервис живой, можно пробовать.

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

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

Ну, температуру можно "выкрутить в ноль", а если ещй и зафиксировать seed - то вот и повторяемость. Случайность в основы внесли специально, чтобы убрать детерминированность. А иначе это сильно смахивало на Большую Британскую Энциклопедию, а не на ИИ.

Но даже без этого повторяемость можно очень сильно усилить за счёт работы с контекстом. Вот пример из моей же публикации (см. Сходимость "вычислений"):

Плотность и согласованность контекста уменьшает "свободу выбора" Модели. Сравните запросы:

  • Сколько будет два в пятой степени?

  • Сколько будет два в пятой степени? Ответ дай одним числом.

  • Сколько будет два в пятой степени? Ответ дай одним числом. Только число и ничего более, это важно.

И что вас заставило запостить 4+ тыс. комментариев на "форуме для недотыкомок"? Я за 10+ лет в два раза меньше комментов настрочил, чем вы за два с небольшим года. Причём я-то свои комменты делал на техническом форуме для айтишников, а вы - на форуме для недотыкомок.

Не мучали бы вы себя здесь. Шли бы на форум профессионалов, соответствующих вашему осознанию вашего уровня.

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

Аналогично, когда LLM докажут свою "повторяемость и управляемость", вы сможете формировать когнитивный контекст приложения, по которому агенты будут "что-то там генерировать". Весь вопрос в том, в каких рамках LLM "повторяемы и управляемы"? Достаточно ли этих рамок для генерации чего-то более сложного, чем "Hello, World!"?

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

Если бы вы были берёзовым поленом, вы бы не писали комменты на Хабре и не получили бы обратную связь от меня. А так, получилось, как получилось, именно потому, что вы - это вы и никто другой. Вот при этом тут ad hominem. Я всем разное пишу, так-то. Кто на что наговорил.

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

Я лет 8, как интегратор, копался в "кишках" Magento (и первой, и второй) - вот там мне это смирение пригодилось на все 100%.

Я в код и так время от времени заглядываю. Но "заглядывать" != "ревьюить". У меня, например, есть в коде кандидат на переделку - простыня на 500+ строк. Я как-то когда-то взглядом зацепился и пометил, что надо бы в контексте проекта прописать этот момент более детально (декомпозиция + иерархия). Но пока так и не дошёл до. Были более приоритетные задачи.

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

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

ревьюить все изменения утомляет

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

Я не говорю, что я вообще не смотрю на то, что делает агент. Как раз смотрю. Мне важно понимать, почему агент "вырвался из загона контекста". Кстати, он в сессии, зачастую, и сам может об этом рассказать, если его спросить. А потом важно переставить заборчики контекста так, чтобы он в следующий раз не вырывался.

У такого пути тоже есть свои ограничения, но, мне кажется, хорош любой путь, который позволяет дойти до границ. Главное - не за'loop'иться. Вот там-то границ как раз и нет :)

Мне кажется, что контроль результата работы LLM - это "путь тестирования". Тесты могут сказать, что работает неправильно, но они не говорят, как сделать, чтобы работало правильно.

IMHO, задача "парного кодирования с LLM" - держать агентов в определённых рамках и не давать им "проявлять творчество". Лично я ставлю на контекст (spec driven).

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

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

У меня был такой интересный случай лет 7-10 назад. На одном из местных новостных сайтов была опубликована реклама компании, в которой работала тогда моя жена. Я читал новости на ноуте, а она подошла и сказала: "О, наша компания новую рекламу запустила!". А я такой: "Где?!". Она: "Вон, на странице!". Вот я пялюсь на страницу и не вижу никакой рекламы. Пока она мне пальцем не показала - прямо в центре экрана, здоровый такой блок. В фирменных цветах и большой надписью с названием компании.

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

Тренируйте свой мозг, чтобы он позволял вам эффективно действовать в условиях информационного насилия, и не впадайте в депрессию ;)

Информация

В рейтинге
1 302-й
Откуда
Рига, Латвия, Латвия
Дата рождения
Зарегистрирован
Активность

Специализация

Фулстек разработчик
Ведущий
От 3 000 €
JavaScript
HTML
CSS
Node.js
Vue.js
Веб-разработка
Progressive Web Apps
PostgreSQL
MySQL
GitHub