ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

HowProgrammingWorks - JavaScript and Node.js Programming

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 572
Подписчики
-224 часа
-57 дней
+6030 дней
Архив постов
Кстати, открыта предварительная регистрация на курс Patterns 2024 — я уже изучил всю доступную литературу и конкурентов и теп
Кстати, открыта предварительная регистрация на курс Patterns 2024 — я уже изучил всю доступную литературу и конкурентов и теперь уверен — аналогов нет, ни кто так и не смог сделать приличной адаптации паттернов к JavaScript, TypeScript, Async, Node.js миру — https://nodeua.com/Patterns-2024-buy.html

Кто еще не смотрел стрим про связь профессионального роста и паттернов, то готовьтесь, там больше 7 часов, и главное — все по делу, про то, как и чему учиться и про важность культуры, которая проникает через паттерны https://www.youtube.com/watch?v=QzxklJW4_LM

Я редко делаю стримы, ну вот как завтра будет. Можем найти несколько, и я считаю, вот этот до сих пор достаточно актуальный и глубокий https://youtu.be/qipIRQptP_4

В субботу будет мастер-класс «Middle to Senior in 2024» в 15.00 (GMT+3) 👉 https://t.me/JavaScriptPatternsBot?start=TIMUR
В субботу будет мастер-класс «Middle to Senior in 2024» в 15.00 (GMT+3) 👉 https://t.me/JavaScriptPatternsBot?start=TIMUR

🧩 Мастер-класс Middle to Senior in 2024 Переосмысление GRASP, SOLID и GoF паттернов для фронтенда и бекенда Начало: 17 августа в 15:00 👉 Сюда: https://t.me/JavaScriptPatternsBot?start=TIMUR

✅ План стримов по паттернам: 08 августа - четверг - ITBeard 09 августа - пятница - Деми Мурыч 10 августа - суббота - Илья Климов

🙊 The Law of Demeter (LoD): Don’t talk to strangers If you see something like this: 👉 connection.parent.service.storage.db.saveRecord 👉 this.action.scenario.bot.telegram.sendMessage 👉 service.find('logger').kind('error').stream.write You have technical debt! It's time to plan refactoring. Each entity (unit/instance) should have only limited knowledge about others (only "closely" related to the current one). Each entity should only talk to its friends (immediate friends): don’t talk to strangers! Вut don't do it in a panic and do not mix refactoring with other issues (like new features implementation). Just note that and plan resource allocation.

Почему нужно избегать union-тайпов? 1. Каждый раз, когда юнион куда-то приходит аргументом, нужно делать if, чтобы понимать, как с ним работать, кроме случая, когда все классы/типы, входящие в юнион имплементируют один и тот же интерфейс и нас интересует обращение именно через этот интерфейс, зачем тогда юнион, используйте этот интерфейс вместо него, ну если в юнион не входит undefined, null, unknown и т.д. 2. Юнионы приводят к мегаморфной форме обращения к объектам в V8, и это замедляет код, не сметртельно, но это неприятно и проще всего всего забыть их. Но для чего же они тогда вообще нужны? Для совместимости с JS, если в нем можно передать что-угодно аргуметом, то это нужно меть возможность как-то выразить. Это не значит, что это хорошо и так нужно писать кода, это добавили как возможность, а не как обязанность ) 3. Это часто ведет к нарушению SOLID:SRP (принципа единственной ответственности), потому, что как может метод, например, получать сокеты или таймеры на выбор и делать разные вещи в зависимости от этого, это же маразм, нарушает SOLID:LSP (принцип подстановки), иногда нарушает GRASP:InformationExpert, явно повышает Coupling. Вместо этого нужно всегда использовать маленькие интерфейсы, заточенные под узкую задачу, помним про SOLID:ISP (принцип разделения интерфейсов) и могут быть optional аргументы, для этого не нужно делать union с null.

+1
Sync and async code

Программирование, как и любая человеческая деятельность насквозь мифологично, более того, мы решительно ни о чем не можем пог
Программирование, как и любая человеческая деятельность насквозь мифологично, более того, мы решительно ни о чем не можем поговорить, чтобы не опереться на тот или иной миф, то у нас Node.js однопоточный (хоть никогда не был), то мы говорим о нетипизированном языке программирования (хоть таких не бывает), то переменные иммутабельные (хоть это оксюморон), то микросервисы ускоряют ответ (хоть могут только замедлять), и даже, если мы понимаем неточность терминов, и пытаемся говорить точнее, то рассказ растягивается на бесконечность, потому, что все нужно уточнять, а уточнения тоже уточнять, и к каждому факту в уточнениях можно придраться и оспорить. Так что, быстро общаться можно, но только понимая друг друга между строк. Выйти за рамки мифа можно, но только создавая новый миф. Ошибки исправить можно, но только делая новые и новые ошибки. Да и учиться сразу правильно не выйдет, мы осваиваем частично ложные знания еще и плохо осваиваем, сталкиваемся с опытом и благодаря ошибкам, можем делать следующий шаг.

🧩 Пока я готовлю курс по паттернам GoF, SOLID, GRASP с адаптацией для Node.js и JavaScript, собрал тут ссылки на все старые материалы, видео, примеры кода, задачи, если по ссылке github репозиторий, то часто там и примеры и видео: https://github.com/tshemsedinov/Patterns-JavaScript

Если кто хочет лучше понять о чем был ШОК-контент про конец TypeScript: тут лекция в академическом виде, без стеба https://youtu.be/9JUY3prnCQ4

💡 Начиная Chrome 119 и Node.js 22 у нас есть Promise.withResolvers(); Для чего оно нужно? Представьте, что у нас есть какое-то callback-returning API или EventEmitter/EventTarget или другие абстракции, поведения которых нужно подождать. И вот нужно сделать адаптер, обертку с внешним Promise-returning интерфейсом. Пример:
const sumAsync = (a, b, callback) => {
  if (typeof a !== 'number') return;
  if (typeof b !== 'number') return;
  setImmediate(() => {
    callback(a + b);
  });
};
Раньше это могло выглядеть так:
let resolve, reject;
const promise = new Promise((resolved, rejected) => {
  resolve = resolved;
  reject = rejected;
});
setTimeout(reject, 1000, new Error('Timed out'));
sumAsync(2, 3, resolve);
const result = await promise;
console.log({ result });
Или так:
const promise = new Promise((resolve, reject) => {
  sumAsync(4, 5, resolve);
  setTimeout(reject, 1000, new Error('Timed out'));
});
const result = await promise;
console.log({ result });
Но теперь withResolvers позволяют это написать проще
const { promise, resolve, reject } = Promise.withResolvers();
setTimeout(reject, 1000, new Error('Timed out'));
sumAsync(6, 7, resolve);
const result = await promise;
console.log({ result });
‣ Значит ли это, что иначе писать уже плохо? Это достаточно редкая и специфическая штука, ее нужно использовать в библиотеках и коде платформ с надеждой на то, что движки будут это как-то дополнительно оптимизировать, а в продуктовом коде нет на вас вины, если пишете по старинке. ‣ Значит ли это, что оно всем нужно? Нет, но если знаете, это плюс.

💥 Шок! Названа возможная дата КОНЦА Node.js, JavaScript и С++, эксперты раскрыли тайну TypeScript ☠️ https://youtu.be/bRlUtzQPOhA Скандал в твиттере, все, что вы знали про программирование — скоро не будет стоить ничего!!! Когда наш CTO узнал это, то он три раза сбросился с унитаза и съел свою копию "Книжки с кабанчиком". Но я вас полюбил и я вас научу — тут статья «Самые важные знания для программиста» https://x.com/tshemsedinov/status/1809633457754034433