HowProgrammingWorks - JavaScript and Node.js Programming
6.34K subscribers
306 photos
7 videos
1 file
745 links
Программная инжененрия для JavaScript, TypeScrip, Node.js 👉 Group: https://t.me/MetarhiaHPW 👉 Node.js channel: https://t.me/metarhia 👉 Node.js group: https://t.me/nodeua
Download Telegram
🧩 This and much more will be covered in Patterns 2025 course

const getTomorrowDate = () => {
const timeout = 86400000;
return new Promise((resolve) => {
setTimeout(() => resolve(new Date()), timeout)
});
};


// ⚡️ Electricity over IP, as defined in RFC 3251: https://datatracker.ietf.org/doc/html/rfc3251
const socket = new WebSocket('wss://lamp.local:3251');

socket.onopen = () => {
socket.send(JSON.stringify({ voltage: 230, frequency: 50 }));
};

socket.onmessage = (e) => {
const { voltage, frequency } = JSON.parse(e.data);
console.log(`⚡️ Transferred: ${voltage}V @ ${frequency}Hz`);
};


const Coin = (v) => ({ map: (f) => Coin(f(v)) });
const flip = () => crypto.getRandomValues(new Uint8Array(1))[0];
Coin(flip()).map((r) => (r & 1 ? '🪙' : '💩')).map(console.log);


const findMeaningOfLife = () => {
const offset = 0;
const delay = Infinity;
return new Promise((resolve) => {
setTimeout(() => resolve(42 + offset), delay);
});
};


['🥚', '🥚',  '🐓', '🥚', '🥚', '🥚'].toSorted()


class Coming {
constructor() {
return new Promise((resolve) =>
setTimeout(() => {
resolve(this);
}, DAY_OF_JUDGMENT - Date.now())
);
}
}

const secondComing = await new Coming();


((<F extends () => void>(Function: F = {} as F) => Function())());


class Future {
constructor() {
const { name: key } = this.constructor;
const value = void [].length;
throw new Error(`${key} is ${value}`);
}
}

new Future();
🧩 Завтра, 5 апреля, 15:00 — 18:00 будет стрим, на котором мы разберем патерны:
Actor — Инкапсулирует состояние и поведение, взаимодействуя асинхронно через передачу и последовательную обработку сообщений в очереди. Обеспечивает потокобезопасность и асинхронную безопасность при параллельном выполнении путём изоляции состояния актора.
Reactor (event-loop) — Обрабатывает параллельные события синхронно, помещая их в очередь и направляя зарегистрированным обработчикам. Реализует событийно-ориентированную асинхронную обработку поверх синхронного цикла событий. Часто применяется в системах с интенсивным I/O, упрощая управление конкурентными событиями.
Proactor — Цикл событий, в котором операции начинаются пользовательским кодом, но завершаются внешним агентом (например, I/O подсистемой), который запускает обработчик завершения по завершении операции (возвращая данные в callback).
И будет презентация курса Patterns 2025
👉 Сохраните себе ссылку на каталог паттернов с примерами кода: https://github.com/tshemsedinov/Patterns-JavaScript/tree/ru
👉 Подпишитесь на канал, чтобы не пропустить этот и следующие стримы: https://www.youtube.com/@TimurShemsedinov
∙ Готовлю также стрим по доступу к данным с обсуждением паттернов: Active Record, DAO, DTO, DAL, Repository, ORM, Query Builder, Transaction Script, Template Method
В Node.js для очередей используется FixedQueue на базе CircularBuffer. Он оптимизирован для V8, на базе списка массивов фиксированной длины по 2048 элементов. Это гораздо лучше, чем просто push/shift на массиве, когда массив постоянно меняет длину и память перераспределяется. Но все же очень неоптимально, потому, что нам для очереди нужно добавлять только в голову списка, а брать только с хвоста, не нужно по кругу бегать в буфере. Они неправильно выбрали структуру данных, тут не нужно было циркулярный буффер реализовывать, тут нужно использовать Unrolled List, эффективнее и проще. В текущей реализации, много лишнего кода, когнитивная нагрузка выше, там битовая маска используется, и вконце буфера один элемент всегда undefined, вот этот лишний undefined - как раз не страшно, но циркулярная машинерия медленнее.
Тут есть 4 варианта кода, чтобы разобраться в вопросе: 1 - наивная очередь, 2 - очередь на списках, 3 - очередь на циркулярном буффере, 4 - очередь на развернутом списке. Для курса по паттернам я сделаю лекцию где мы подробне это разберем и составим сравнительную таблицу, для разных реализаций, где что оптимально использовать - https://github.com/HowProgrammingWorks/Queue/tree/main/JavaScript
🧩 В субботу (12 апреля) в 15:00 cтрим Data access patterns
На этом канале 👉 https://www.youtube.com/@TimurShemsedinov

Разбор паттернов и подходов:
- Repository и Active Record
- Query Builder и Object-Relational Mapping (ORM)
- Value Object и Null Object
- Data transfer object (DTO)
- Data access object (DAO) и Data Access Layer (DAL)
- Patterns: SAGA, Transaction Script и др.

Для кого эфир?
- Начинающие разработчики
- Опытные инженеры
- Тех-лиды, тим-лиды
- Самоучки без CS-образования

Кто ведет?
👳 Тимур Шемсединов - в представлении не нуждается
🧔‍♂️ Николай Белочуб - 10+ лет в Продуктовой Разработке, Senior SWE, OSS Contributor
🤵 Дмитрий Нечай - Chief Architect в PLATMA, CTO в HandyAI

Программа курса по паттернам: https://nodeua.com/Patterns-2025.html
🧩 Программа курса уже на сайте, кто там спрашивал, вот: https://nodeua.com/Patterns-2025.html
Авторы, приглашенные эксперты и менторы: 👳‍♀️ Тимур Шемсединов 🥷 Илья Климов 🤵🏼‍♂️ Дмитрий Нечай 👨‍💻 Денис Отришко 👨 Тимур Севимли 🧔 Николай Белочуб
📅 1 мая: старт курса
👉 Каталог паттернов: https://github.com/tshemsedinov/Patterns-JavaScript
👉 Плейлист стримов с экспертами: https://www.youtube.com/playlist?list=PLHhi8ymDMrQYkcxj1eb-Se6Ojd0PRJfFO
🧩 В эту субботу (19 апреля) в 15:00 стрим с Мурычем
«Оптимизация структур данных для V8»

На этом канале 👉 https://www.youtube.com/@TimurShemsedinov

Разбор паттернов и структур данных:
- FixedQueue + CircularBuffer
- UnrolledQueue (LinkedList + Array)
- ObjectPool, LinkedList, RoundBuffer

Для кого эфир?
- Начинающие, джуны
- Опытные инженеры
- Синьоры, лиды

Кто ведет?
👳 Тимур Шемсединов
🧔‍♂️ Деми Мурыч
🤵 Дмитрий Нечай

Программа курса по паттернам: https://nodeua.com/Patterns-2025.html
Что бы вы выбрали для очереди в JavaScript, чтоб было оптимизированно для V8? Все случаи будут обсуждаться в эту субботу на стриме. Источники: https://github.com/HowProgrammingWorks/Queue
• 1-queue.js — интерфейс с наивной реализацией поверх Array
• 2-naïve.js — наивная реализация поверх односвязного списка
• 3-fixed.js — FixedQueue (из Node.js) поверх FixedCircularBuffer
• 4-unrolled.js — UnrolledQueue поверх развернутого массива
• 5-spare.js — развернутый массив + один запасной (свободный) элемент
• 6-pool.js — развернутый массив + пул объектов
• 7-current.js — развернутый массив, объединенный с пулом в общий односвязный список
• 8-circular.js — кольцевой буфер + развернутый массив
• 9. Я хочу писать прикладной код. Я бы предпочел, чтобы платформа предоставляла лучшее
• 10. Это вообще не имеет значения
🧩 Завтра (19 апреля) в 15:00 стрим с Мурычем
«Оптимизация структур данных и паттернов для V8»
👉 https://youtube.com/live/PncSzdGTzk0

Темы:
- Performance testing and debugging
- Performance optimization and tuning
- Observer (EventEmitter, EventTarget)
- Queue (FixedQueue + CircularBuffer)
- UnrolledQueue (LinkedList + Array)
- ObjectPool, LinkedList, RoundBuffer

Программа курса по паттернам: https://nodeua.com/Patterns-2025.html
🧩 В эту субботу (26 апреля) в 15:00 стрим «Паттерны асинхронного программирования»

На этом канале 👉 https://www.youtube.com/@TimurShemsedinov

Разбор паттернов и контрактов:
- Thenable, Promise, Future, Deferred
- Callbacks, Async/await, Coroutines
- Observer, EventEmitter, Signals
- Locks API, Semaphore, Mutex
- AsyncCompose, AsyncPool, AsyncQueue
- Threads, MessageChannel, MessagePort
- function*/yield, Async Iterator
- Actor Model, Chain of responsibility
- AsyncCollector, Streams, RxJS...

👳 Тимур Шемсединов
🧔‍♂️ Денис Отришко — контрибьютор Node.js и Metarhia
🤵 Дмитро Нечай — Chief Architect в PLATMA, CTO в HandyAI

Программа курса по паттернам: https://nodeua.com/Patterns-2025.html
🧩 В эту субботу (26 апреля) в 15:00 стрим
«Паттерны асинхронного программирования»


Регистрация обязательна: https://patterns-js.com/0jiuic?utm_source=telegram_channel&utm_medium=t_shemsedinov&utm_campaign=stream_26_04