HowProgrammingWorks - JavaScript and Node.js Programming
رفتن به کانال در Telegram
Программная инжененрия для 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
نمایش بیشتر6 541
مشترکین
+124 ساعت
-47 روز
+4130 روز
در حال بارگیری داده...
کانالهای مشابه
ابر برچسبها
اشارات ورودی و خروجی
---
---
---
---
---
---
جذب مشترکین
اوت '26
اوت '26
+130
در 3 کانالها
ژوئیه '26
+49
در 3 کانالها
Get PRO
ژوئن '26
+141
در 1 کانالها
Get PRO
مه '26
+146
در 3 کانالها
Get PRO
آوریل '26
+199
در 1 کانالها
Get PRO
مارس '26
+115
در 3 کانالها
Get PRO
فوریه '26
+109
در 1 کانالها
Get PRO
ژانویه '26
+55
در 0 کانالها
Get PRO
دسامبر '25
+72
در 0 کانالها
Get PRO
نوامبر '25
+60
در 3 کانالها
Get PRO
اکتبر '25
+121
در 1 کانالها
Get PRO
سپتامبر '25
+48
در 0 کانالها
Get PRO
اوت '25
+68
در 1 کانالها
Get PRO
ژوئیه '25
+55
در 1 کانالها
Get PRO
ژوئن '25
+54
در 1 کانالها
Get PRO
مه '25
+64
در 0 کانالها
Get PRO
آوریل '25
+57
در 2 کانالها
Get PRO
مارس '25
+101
در 2 کانالها
Get PRO
فوریه '25
+114
در 0 کانالها
Get PRO
ژانویه '25
+153
در 2 کانالها
Get PRO
دسامبر '24
+94
در 1 کانالها
Get PRO
نوامبر '24
+81
در 0 کانالها
Get PRO
اکتبر '24
+106
در 2 کانالها
Get PRO
سپتامبر '24
+138
در 0 کانالها
Get PRO
اوت '24
+243
در 1 کانالها
Get PRO
ژوئیه '24
+286
در 3 کانالها
Get PRO
ژوئن '24
+89
در 0 کانالها
Get PRO
مه '24
+188
در 3 کانالها
Get PRO
آوریل '24
+105
در 2 کانالها
Get PRO
مارس '24
+124
در 0 کانالها
Get PRO
فوریه '24
+79
در 2 کانالها
Get PRO
ژانویه '24
+115
در 1 کانالها
Get PRO
دسامبر '23
+120
در 0 کانالها
Get PRO
نوامبر '23
+103
در 1 کانالها
Get PRO
اکتبر '23
+107
در 1 کانالها
Get PRO
سپتامبر '23
+251
در 0 کانالها
Get PRO
اوت '23
+142
در 0 کانالها
Get PRO
ژوئیه '23
+188
در 0 کانالها
Get PRO
ژوئن '23
+125
در 0 کانالها
Get PRO
مه '23
+87
در 0 کانالها
Get PRO
آوریل '23
+63
در 0 کانالها
Get PRO
مارس '23
+105
در 0 کانالها
Get PRO
فوریه '23
+58
در 0 کانالها
Get PRO
ژانویه '23
+82
در 0 کانالها
Get PRO
دسامبر '22
+301
در 0 کانالها
Get PRO
نوامبر '22
+156
در 0 کانالها
Get PRO
اکتبر '22
+78
در 0 کانالها
Get PRO
سپتامبر '22
+106
در 0 کانالها
Get PRO
اوت '22
+110
در 0 کانالها
Get PRO
ژوئیه '22
+110
در 0 کانالها
Get PRO
ژوئن '22
+185
در 0 کانالها
Get PRO
مه '22
+81
در 0 کانالها
Get PRO
آوریل '22
+49
در 0 کانالها
Get PRO
مارس '22
+63
در 0 کانالها
Get PRO
فوریه '22
+91
در 0 کانالها
Get PRO
ژانویه '22
+193
در 0 کانالها
Get PRO
دسامبر '21
+131
در 0 کانالها
Get PRO
نوامبر '21
+53
در 0 کانالها
Get PRO
اکتبر '21
+91
در 0 کانالها
Get PRO
سپتامبر '21
+165
در 0 کانالها
Get PRO
اوت '21
+81
در 0 کانالها
Get PRO
ژوئیه '21
+64
در 0 کانالها
Get PRO
ژوئن '21
+67
در 0 کانالها
Get PRO
مه '21
+52
در 0 کانالها
Get PRO
آوریل '21
+106
در 0 کانالها
Get PRO
مارس '21
+111
در 0 کانالها
Get PRO
فوریه '21
+133
در 0 کانالها
Get PRO
ژانویه '21
+126
در 0 کانالها
Get PRO
دسامبر '20
+3 962
در 0 کانالها
| تاریخ | رشد مشترکین | اشارات | کانالها | |
| 26 اوت | +4 | |||
| 25 اوت | 0 | |||
| 24 اوت | +4 | |||
| 23 اوت | +1 | |||
| 22 اوت | +5 | |||
| 21 اوت | +1 | |||
| 20 اوت | +3 | |||
| 19 اوت | +9 | |||
| 18 اوت | +13 | |||
| 17 اوت | +34 | |||
| 16 اوت | +2 | |||
| 15 اوت | 0 | |||
| 14 اوت | +4 | |||
| 13 اوت | +2 | |||
| 12 اوت | +5 | |||
| 11 اوت | +3 | |||
| 10 اوت | +3 | |||
| 09 اوت | +2 | |||
| 08 اوت | +3 | |||
| 07 اوت | +5 | |||
| 06 اوت | +16 | |||
| 05 اوت | +2 | |||
| 04 اوت | +2 | |||
| 03 اوت | 0 | |||
| 02 اوت | +3 | |||
| 01 اوت | +4 |
پستهای کانال
С самых простых вещей, язык не особо важно какой, но лучше сразу 2 параллельно учить, они сейчас все развитые, а вот важное:
- как делать промежуточные переменные вместо сложных выражений
- разделять сложное на части и объединять части в целое
- давать всему семантически полезные имена, строить читаемые управляющие конструкции, избегать комментариев
- избегать accidental complexity, из нескольких решений выбирать попроще
- сначала думать о данных, как они представлены в памяти и связаны, а уже потом писать алгоритмы обработки
- привыкать думать об ограничениях и контрактах, какие входные данные можно изменять, какие нет
- больше думать не о вычислительной сложности, а о семантической сложности и как ее можно изолировать
| 2 | Ownership and Resource Lifetime
Pure JavaScript examples of deterministic resource lifetime, ownership, move, borrow, lease, shared ownership, weak references, and RAII-inspired abstractions built on modern JavaScript.
const timers = require('node:timers/promises');
class AbortScope {
#controller = new AbortController();
signal = this.#controller.signal;
[Symbol.dispose]() {
this.#controller.abort(new Error('Scope disposed'));
}
}
const main = async () => {
let operation;
{
using scope = new AbortScope();
operation = timers.setTimeout(1000, 'done', {
signal: scope.signal,
});
}
try {
await operation;
} catch (error) {
console.log(error.name);
}
};
main();
Sources: https://github.com/HowProgrammingWorks/Ownership | 1 177 |
| 3 | В JavaScript уже есть половина того, что нужно для реализации ownership-like, как в Rust, просто она разбросана по разным API:
- using / Symbol.dispose
- DisposableStack.move()
- ArrayBuffer.transfer()
- Proxy.revocable()
- AbortSignal, WeakRef
Поверх этого можно собрать runtime-прототип. Делаю. Без borrow checker и compile-time гарантий, но с вполне полезными affine semantics в рантайме. Ownership в JS появляется не как одна фича языка, а как композиция нескольких независимых механизмов. | 1 414 |
| 4 | بدون متن... | 1 605 |
| 5 | А что если никакого вайбкодинга не существует, весь нейрослоп, как и раньше, генерирует население Индии, а истерия - это просто ребрендинг? | 2 201 |
| 6 | Добавляем пункты 0 и 11-14 в список
0. Управляй структурой и архитектурой приложения через спецификацию, а не через промпты. Архитектурные решения должны быть явными и проверяемыми артефактами в репозитории, а AI должен подтягивать их в нужные контексты, а не хранить в истории диалога.
11. Изоляция становится еще важнее, потому, что контекст — это тоже архитектурный ресурс. Чем больше модели нужно прочитать, чтобы сделать локальное изменение, тем хуже устроены архитектурные границы. Хорошая архитектура уменьшает необходимый контекст через изоляцию модулей и слоев.
12. Проверяемость! Нужно иметь возможность дешево проверять результат: линтерами, типами, тестами, схемами, контрактами. AI резко снижает стоимость добавления кода, но подымает стоимость владения кодом.
13. Обратимость! Чем дороже ошибка, тем больше нужно уделять внимания возможности отката. Миграция, изменение публичного API, характеристик кода, парадигмы, или архитектурного контракта должны быть под пристальным контролем.
14. AI должен быть ограничен с своих фантазиях: пространство допустимых решений, NFR, constraints, invariants, forbidden dependencies, acceptance criteria, вообще система запретов и красных линий. | 2 999 |
| 7 | Общие принципы того, как архитектура изменилась в связи с 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 и можно ли это принимать в проект. | 3 889 |
| 8 | 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 | 2 076 |
| 9 | Which JS/TS library would you choose for error handling? | 2 401 |
| 10 | https://youtu.be/neqdcpPz1Ic?si=noWHeadvb8y819Gl | 3 076 |
| 11 | Архитектура без AI — самый медленный путь к релизу.
AI без архитектуры — суета перед факапом.
// Сунь-Цзы | 3 059 |
| 12 | https://www.youtube.com/live/d8H60lhsAr8 | 2 935 |
| 13 | 🕔 17:00 🔜 https://gm.nexttick.it/go/data-structures-code-review | 2 516 |
| 14 | Завтра Часть 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 | 2 464 |
| 15 | 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 | 2 310 |
| 16 | Мир был бы намного лучше, если бы люди и роботы делали несколько простых вещей
- промежуточные переменные вместо сложных выражений
- давали бы им семантически полезные имена
- и называли переменные в JavaScript идентификаторами | 3 221 |
| 17 | Под стримом по структурам данных задали вопрос, какие AI модели я использую и какой харнес.
Отвечаю развернуто
Я стараюсь по неделе переключаться между моделями, чтобы знать их состояние и чувствовать особенности, но для моих задач сейчас лучше всего подходит Sonnet 4.6 (даже не 5), Codex 5.3, Grok 4.5, они не очень умные, но мне не нужно, чтобы они были умные, за то они не придумывают хитрых и запутанных решений и работают очень быстро. Вот в тех же структурах данных я их все пробовал использовать и пришел к выводу, что они примерно все на одном уровне, если применять их для текхической рутины. Они делают именно то, что просишь, особенно если сбрасывать контекст часто, хотя и деградация у них ниже, чем у флагманов.
Дело в том, что я использую AI для технических вещей, писать буквы, а не придумывать решение, они двигаются по четкому заданию, котороя я написал.
Но Fable 5 и Opus 5 я обычно использую для другого, чтобы они сделали альтернативное моему решение и чтобы сравнить со своим, т.е. они хороши не как вспомогательный персонал, а как самостоятельные авторы и какие-то идеи у них можно брать, хоть я обычно и выкидываю их результат, потому, что они заводят код в глухой тупик очень быстро из-за того, что умные и дерзкие.
В субботу 8 августа мастер-класс в 17:00, покажу тем, кто зарегистрируется | 2 610 |
| 18 | بدون متن... | 2 359 |
| 19 | Стало сложно писать лучше чем Fable, я неделю оптимизировал под V8 три несчастные структуры данных, чтобы обогнать его: Unrolled List, Doubly List, Circular Buffer.
Но не бойтесь, я завтра буду рассказывать не про то, как они устроены (картинка с 6 структурами), а как их использовать (картинка с 12 интерфейсами):
https://youtube.com/live/qNAjrZ07un0 | 3 193 |
| 20 | Как вы думаете, кому выгодно, чтобы вы не читали код и чтобы он все время переписывался и никогда не стабилизировался? One-shot? Все с нуля и каждый раз - вот что нужно. Все свои софты личные, одноразовые тулы, agentic loop, self-review, Best-of-N, infinite repair, full-replay... | 2 825 |
