🧩 В эту субботу (19 апреля) в 15:00 стрим с Мурычем
«Оптимизация структур данных для V8»
На этом канале 👉 https://www.youtube.com/@TimurShemsedinov
Разбор паттернов и структур данных:
- FixedQueue + CircularBuffer
- UnrolledQueue (LinkedList + Array)
- ObjectPool, LinkedList, RoundBuffer
Для кого эфир?
- Начинающие, джуны
- Опытные инженеры
- Синьоры, лиды
Кто ведет?
👳 Тимур Шемсединов
🧔♂️ Деми Мурыч
🤵 Дмитрий Нечай
Программа курса по паттернам: https://nodeua.com/Patterns-2025.html
«Оптимизация структур данных для 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. Это вообще не имеет значения
• 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
«Оптимизация структур данных и паттернов для 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
YouTube
🧩 Оптимизация структур данных и паттернов — V8, JavaScript, TypeScript — Деми Мурыч — Patterns 2025
👉 Программа курса: https://nodeua.com/Patterns-2025.html
👳 Тимур Шемсединов
🧔♂️ Деми Мурыч
🤵 Дмитрий Нечай
🧩 Разбор паттернов и структур данных:
- Performance testing and debugging
- Performance optimization and tuning
- Observer (EventEmitter,…
👳 Тимур Шемсединов
🧔♂️ Деми Мурыч
🤵 Дмитрий Нечай
🧩 Разбор паттернов и структур данных:
- Performance testing and debugging
- Performance optimization and tuning
- Observer (EventEmitter,…
🧩 В эту субботу (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
На этом канале 👉 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
«Паттерны асинхронного программирования»
Регистрация обязательна: https://patterns-js.com/0jiuic?utm_source=telegram_channel&utm_medium=t_shemsedinov&utm_campaign=stream_26_04
- ADT Record (mutable and immutable)
- ADT Tuple, Sum
- Result as a Sum of Value and Failure
- Either, Maybe and Result containers
- ADT Linked list
https://github.com/HowProgrammingWorks/ADT
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - HowProgrammingWorks/ADT: Algebraic Data Types
Algebraic Data Types. Contribute to HowProgrammingWorks/ADT development by creating an account on GitHub.
С понедельника начинается курс Patterns 2025
А в эту субботу 3 мая в 15:00 будет стрим
«Ключевые знания, которые изменят ваш JS/TS код за несколько месяцев»
Фреймворки могут помочь вам получить первую работу, но путь к уровню сеньора — это совсем о другом. На стриме мы поговорим о том, что действительно отличает зрелых инженеров от просто кодеров.
Решение задачек на LeetCode — это билет в индустрию, но не к мастерству. Это нужно в основном для прохождения формальных интервью, особенно в международных компаниях. Но если вы хотите научиться писать понятный, надежный и масштабируемый код — этого недостаточно.
Знаменитая "книжечка с кабанчиком" стала скорее символом технического фетишизма, чем реальным пособием по построению надежных систем. И чаще всего её вспоминают лишь на собеседованиях.
Если для простой очереди или циклического списка человек тащит RabbitMQ или Kafka — это не про инженерное решение, это про профнепригодность. Что отличает сильного разработчика? Насколько глубоко нужно знать алгоритмы и Computer Science вообще? Нужны ли знания по архитектуре и какие? И еще много вопросов на стриме в эту субботу 3 мая в 15:00
Регистрация на стрим: https://patterns-js.com/w1hpna?utm_source=telegram_channel&utm_medium=timur_shemsedinov&utm_campaign=web_3_05&utm_content=lgt_1_tehlid
А в эту субботу 3 мая в 15:00 будет стрим
«Ключевые знания, которые изменят ваш JS/TS код за несколько месяцев»
Фреймворки могут помочь вам получить первую работу, но путь к уровню сеньора — это совсем о другом. На стриме мы поговорим о том, что действительно отличает зрелых инженеров от просто кодеров.
Решение задачек на LeetCode — это билет в индустрию, но не к мастерству. Это нужно в основном для прохождения формальных интервью, особенно в международных компаниях. Но если вы хотите научиться писать понятный, надежный и масштабируемый код — этого недостаточно.
Знаменитая "книжечка с кабанчиком" стала скорее символом технического фетишизма, чем реальным пособием по построению надежных систем. И чаще всего её вспоминают лишь на собеседованиях.
Если для простой очереди или циклического списка человек тащит RabbitMQ или Kafka — это не про инженерное решение, это про профнепригодность. Что отличает сильного разработчика? Насколько глубоко нужно знать алгоритмы и Computer Science вообще? Нужны ли знания по архитектуре и какие? И еще много вопросов на стриме в эту субботу 3 мая в 15:00
Регистрация на стрим: https://patterns-js.com/w1hpna?utm_source=telegram_channel&utm_medium=timur_shemsedinov&utm_campaign=web_3_05&utm_content=lgt_1_tehlid
- иммутабельные м мутабельные записи (объекты) с оптимизацией формы
- полное клонирование, модификация, клонирование с прототипным наследованием
- проверка типов в рантайме, дефолтные значения полей
- иммутабельные записи с экономией памяти за счет цепочек прототипов
- ускорение поиска полей и оптимизации для V8, даже в сравнении с литералом объекта
Тут еще нужно многое оптимизировать, но полное решение будет тут: https://github.com/metarhia/metautil/pull/298
class Record {
static immutable(defaults) {
return Record.#build(defaults, false);
}
static mutable(defaults) {
return Record.#build(defaults, true);
}
static #build(defaults, isMutable) {
const fields = Object.keys(defaults);
const defaultValues = Object.create(null);
for (const key of fields) {
defaultValues[key] = defaults[key];
}
class Struct {
static fields = fields;
static defaults = defaultValues;
static mutable = isMutable;
static create(data = {}) {
const obj = Object.create(null);
for (const key of fields) {
const base = defaultValues[key];
const value = key in data ? data[key] : base;
if (!Record.#sameType(base, value)) {
const exp = Record.#typeof(base);
const act = Record.#typeof(value);
throw new TypeError(
`Invalid type for "${key}": expected ${exp}, got ${act}`,
);
}
obj[key] = value;
}
return isMutable ? Object.seal(obj) : Object.freeze(obj);
}
}
return Struct;
}
static #typeof(value) {
if (Array.isArray(value)) return 'array';
if (value === null) return 'null';
return typeof value;
}
static #sameType(a, b) {
if (Array.isArray(a)) return Array.isArray(b);
if (a === null) return b === null;
return typeof a === typeof b;
}
static #validate(instance, updates) {
for (const key of Object.keys(updates)) {
if (!Reflect.has(instance, key)) continue;
const current = instance[key];
const next = updates[key];
if (!Record.#sameType(current, next)) {
const exp = Record.#typeof(current);
const act = Record.#typeof(next);
throw new TypeError(
`Invalid type for "${key}": expected ${exp}, got ${act}`,
);
}
}
}
static update(instance, updates) {
if (Object.isFrozen(instance)) {
throw new Error('Cannot mutate immutable Record');
}
Record.#validate(instance, updates);
for (const key of Object.keys(updates)) {
if (Reflect.has(instance, key)) {
instance[key] = updates[key];
}
}
return instance;
}
static fork(instance, updates) {
Record.#validate(instance, updates);
const obj = Object.create(null);
for (const key of Object.keys(instance)) {
obj[key] = Reflect.has(updates, key) ? updates[key] : instance[key];
}
return Object.isFrozen(instance) ? Object.freeze(obj) : Object.seal(obj);
}
static branch(instance, updates) {
Record.#validate(instance, updates);
const obj = Object.create(instance);
for (const key of Object.keys(updates)) {
Reflect.defineProperty(obj, key, {
value: updates[key],
writable: true,
configurable: true,
enumerable: true,
});
}
return Object.isFrozen(instance) ? Object.freeze(obj) : Object.seal(obj);
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Кто узнает в этом коде плохие практики?
Если не узнаете, и вам все ок, то смотрите в репозиторий, там список и как исправить https://github.com/HowProgrammingWorks/GoodParts/blob/main/JavaScript/1-func-bad.js
Если не узнаете, и вам все ок, то смотрите в репозиторий, там список и как исправить https://github.com/HowProgrammingWorks/GoodParts/blob/main/JavaScript/1-func-bad.js
const getPrice = function(options = { convert: true }) {
let price;
let item = { price } = this;
if (!Array.isArray(item)) {
let { price } = this;
if (typeof price == 'number') return price;
price = this.cost;
if (typeof price == 'number') return price;
if (options.convert) return parseFloat(price);
}
[, price] = this;
if (typeof price == 'number') return price;
if (options.convert) price = +price;
if (!isNaN(price)) return price;
};
🧩 10 мая в 15:00 стрим
«Минимум паттернов для максимума пользы на реальном проекте с JavaScript, TypeScript, Node.js»
Глубокое погружение в 5 самых полезных шаблонов для ежедневного использования: Strategy, Factory, Pool, Queue, Adapter
👉 https://patterns-js.com/w1hpna?utm_source=telegram_channel&utm_medium=t_shemsedinov&utm_campaign=stream_10_05
«Минимум паттернов для максимума пользы на реальном проекте с JavaScript, TypeScript, Node.js»
Глубокое погружение в 5 самых полезных шаблонов для ежедневного использования: Strategy, Factory, Pool, Queue, Adapter
👉 https://patterns-js.com/w1hpna?utm_source=telegram_channel&utm_medium=t_shemsedinov&utm_campaign=stream_10_05
Тема недели на курсе Node.js 2025: Disposable objects
Примеры кода: https://github.com/HowProgrammingWorks/Disposable
Please open Telegram to view this post
VIEW IN TELEGRAM