HowProgrammingWorks - JavaScript and Node.js Programming
6.54K subscribers
373 photos
18 videos
1 file
945 links
Программная инжененрия для JavaScript, TypeScrip, Node.js
👉 Group: https://t.me/How_Programming_Works
👉 Node.js channel: https://t.me/metarhia
👉 Node.js group: https://t.me/nodeua
Download Telegram
Мир был бы намного лучше, если бы люди и роботы делали несколько простых вещей
- промежуточные переменные вместо сложных выражений
- давали бы им семантически полезные имена
- и называли переменные в JavaScript идентификаторами
🤣198💯4👨‍💻1
AI ошибается. Люди тоже ошибаются.

Проблема в том, что AI производит код полный недочетов и скрытых ошибок быстрее, чем чинит и в большем объеме, чем человек способен прочитать.

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

Нужно уменьшать стоимость проверки результата и стоимость владения.

Промпт не является контрактом. Это пожелание на естественном языке, допускающее десятки интерпретаций. Можно написать модели "не ломай совместимость", "учти все крайние случаи" и "пиши надежно", но эти фразы невозможно автоматически проверить. Контракт должен быть формальным и желательно исполняемым.

Типы фиксируют форму данных, сигнатуры и архитектурные границы. Это дешевый, широкий, но неглубокий контроль. Типы не подтверждают бизнес-логику, порядок операций, права доступа, транзакционность, идемпотентность, отсутствие гонок и корректность побочных эффектов. А в TypeScript типы вообще не являются точным описанием того, что будет реально исполняться в виртуальной машине. Типы стирается до runtime и виртуальная машина сама выводит свои типы, которые отличаются от того, что вы себе написали в TS.

Типы описывают представление компилятора о программе, а виртуальная машина работает с реальными значениями у которых есть вычислимая "форма" и с кодом, кторый оптимизируется во время исполнения под эту форму. Данные всегда приходят из сети, БД, JSON, JavaScript-модуля, пользовательского ввода и не соответствуют тому, что было в TS. Типы в рантайме более строгие, чем в TS, например, он учитывает порядок полей в объекте, знает, как резолвится асинхронная функция, через ивентлуп или очередь микротасков, отличает значения внутри Number: HeapNumber, Smi, Int8, Uint8, Int16, Uint16, Int32, Uint32, Int64, Uint64, Float16, Float32, Float64, Word8, Word16, Word32, Word64...

Более того, TypeScript сознательно не является полностью sound-системой типов. Он допускает операции, безопасность которых невозможно гарантировать статически. Поэтому типы полезны как дешевый статический фильтр, документация и компактное описание архитектурной границы. Но они не подтверждают, что программа действительно выполняет контракт. Для этого нужна runtime-валидация, ограничения данных и тесты наблюдаемого поведения.

Тесты фиксируют поведение гораздо точнее. Мутационное тестирование намеренно портит реализацию чтобы проверить общую стабильность на сломанном пути. Контрактные тесты подтверждают совместимость модулей и сервисов Интеграционные тесты проверяют взаимодействие с базой, сетью и инфраструктурой. E2E фиксируют наблюдаемое пользователем поведение. Нужно зафиксировать даже неизвестное legacy-поведение, а как это сделать типами?

Полная типизация внутренней реализации постепенно теряет смысл, AI способен читать реализацию целиком и отслеживать реальные рантайм-типы гораздо более точно. Во многих проектах достаточно JavaScript для реализации каждого модуля + d.ts для контрактов. Typings становятся суммаризацией кода и документации. Они описывают обещание модуля внешнему миру, не заставляя потребителя изучать реализацию. Внутри можно свободно менять алгоритмы, структуры данных и декомпозицию, пока сохраняются внешние типы, тесты и инварианты.

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

Заходим к Илье, учимся тестировать с AI: https://ai.javascript.ninja/gld-ai-r
14🤯4💯2
This media is not supported in your browser
VIEW IN TELEGRAM
Завтра Часть 2 вводного курса по применению структур данных, покажу и сами примеры внедрения и Skills для AI, чтобы писать код эффективнее

1. Встроенные структуры JavaScript: Object, Array, Map, Set, WeakMap, WeakSet, TypedArray

2. Кастомные структуры: Queue, Deque, Stack, List, UnrolledList, Circular Buffer, Heap, Trie, Graph, LRU, Pool, CRDT

3. Высокопроизводительные структуры metautil: Struct, ConsList, Trie, List, UnrolledList, Queue, Deque, Stack, Pool, Semaphore

В субботу, 8 августа, в 17:00 смотрим, как подключать скилы и библиотеки и использовать их в реальном коде:
https://gm.nexttick.it/go/data-structures-code-review
👍106🔥1
Архитектура без AI — самый медленный путь к релизу.

AI без архитектуры — суета перед факапом.


// Сунь-Цзы
😁338👍1👎1
Slop Engineering Toolkit:
- Neuroslop types
- Security cosplay
- Vibe architecture
- Happy path tests
- Unreviewed AI code
- Dependency roulette
- AI-generated docs for AI
- Shipping without understanding
- Complexity hidden behind clean syntax
💯10🤣6🔥2
Общие принципы того, как архитектура изменилась в связи с AI:

1. Управляющая система должна иметь достаточное разнообразие воздействий относительно управляемого поведения (закон Эшби). Если вы не способны различать, оценивать и корректировать существенные варианты ответов модели, управлять начинает уже она.

2. Пиши с AI то, что мог бы написать сам, но дольше. Иначе ты не можешь проверить результат и стать его владельцем. Потеря контроля начинается там, где нельзя оценить адекватность.

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

4. Каждая сгенерированная строка — тяжесть. Её нужно читать, чинить, объяснять людям и следующей модели. Соревноваться надо не в объеме генерации, а в результате при меньшем коде.

5. Сложность накапливается быстрее, чем способность ее осилить. Человек пишет код, который не поймёт через два месяца; модель — код, который не поправит через пять минут. Главный навык рядом с AI — уменьшение accidental complexity.

6. Документация стала исполняемым контекстом. AI читает markdown, ADR, RFC, issues, расшишифровки. То, что раньше жило в головах, теперь версионируемый артефакт.

7. Паттерны не исчезают. DI, IoC, SRP, идемпотентность, гранулярность, контракты, изоляция нужны, чтобы точно ставить задачу людям и модели.

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

9. Человек остаётся в контуре внимания. Вопрос в том, куда направить внимание: DSL, схемы, контракты, ревью, архитектурные документы.

10. Архитектурные знания нужны почти всем. Не обязательно быть архитектором по должности, но нужно понимать, что генерирует AI и можно ли это принимать в проект.
👍2615🔥3👎1
Добавляем пункты 0 и 11-14 в список

0. Управляй структурой и архитектурой приложения через спецификацию, а не через промпты. Архитектурные решения должны быть явными и проверяемыми артефактами в репозитории, а AI должен подтягивать их в нужные контексты, а не хранить в истории диалога.

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

12. Проверяемость! Нужно иметь возможность дешево проверять результат: линтерами, типами, тестами, схемами, контрактами. AI резко снижает стоимость добавления кода, но подымает стоимость владения кодом.

13. Обратимость! Чем дороже ошибка, тем больше нужно уделять внимания возможности отката. Миграция, изменение публичного API, характеристик кода, парадигмы, или архитектурного контракта должны быть под пристальным контролем.

14. AI должен быть ограничен с своих фантазиях: пространство допустимых решений, NFR, constraints, invariants, forbidden dependencies, acceptance criteria, вообще система запретов и красных линий.
🔥14👍6💯2