HowProgrammingWorks - JavaScript and Node.js Programming
6.34K subscribers
308 photos
7 videos
1 file
747 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
💡 На кого можно подписаться в Github:
1. Маттео Калина https://github.com/mcollina
2. Джеймс Снелл https://github.com/jasnell
3. Ден Абрамов https://github.com/gaearon
4. Анна Хеннингсен https://github.com/addaleax
5. Рик Тротт https://github.com/Trott
6. Илья Климов https://github.com/xanf
7. Андрей Ситник https://github.com/ai
8. Федор Индутный https://github.com/indutny
9. Линус Торвальдс https://github.com/torvalds
10. Дуглас Крокфорд https://github.com/douglascrockford
11. Брендон Эйх https://github.com/BrendanEich
12. Андерс Хейлсберг https://github.com/ahejlsberg

🖼 А тут еще профили контрибьторов, менторов и выпускников Метархии:
1. Алексей Орленко https://github.com/aqrln
2. Дмитрий Нечай https://github.com/nechaido
3. Денис Отришко https://github.com/lundibundi
4. Николай Белочуб https://github.com/belochub
5. Георг Ольденбургер https://github.com/georgolden
6. Владислав Духин https://github.com/primeare
7. Иван Тимошенко https://github.com/ivan-tymoshenko
8. Лидия Иванова https://github.com/lidaamber
9. Алексей Голиков https://github.com/agil
10. Артем Черненький https://github.com/GYFK
11. Андрей Высоцкий https://github.com/Gagnant
12. Сергей Нановский https://github.com/snanovskyi
13. Влад Дзюба https://github.com/DzyubSpirit
14. Роман Огиевич https://github.com/rohiievych
15. Диана Болотенюк https://github.com/mille-nium
16. Дмитрий Михайлов https://github.com/Tariod
17. Илья Федорович https://github.com/Kowalski0805
18. Алина Листунова https://github.com/alinkedd
19. Даниил Гуськов https://github.com/imnetcat
20. Алексей Румянцев https://github.com/o-rumiantsev
21. Виталий Кухар https://github.com/vkukh

И если кто еще не подписан на меня, то вот мой профиль:
👉 Тимур Шемсединов https://github.com/tshemsedinov
Please open Telegram to view this post
VIEW IN TELEGRAM
Считаю плохой идеей учиться программированию на базе:
🙅🏻 Алгоритмы - они уже давно есть готовые в языках и платформах, менее 1% программистов будут их реализовывать в работе, а если будут, то их нужно за это наказывать. Вот что действительно нужно, так это краткий обзор алгоритмов и использование структур данных, именно с упором на применение, а не разработку.
🙅🏻 leetcode и аналоги - это задачи которые не должны встречаться в жизни никогда,
🙅🏻 Олимпиадное программирование - это простыни быстрого, нечитаемого кода, условия такие, пишем быстро и write-only, к чему хорошему это может привести?
🙅🏻 System design и highload - большинство людей пишут системы совсем не для миллионов пользователей, а те, кто пишут для миллионов, могут просто посмеяться, как эту тему любят обсуждать на собеседованиях, на курсах, в свободное время между программистами, об этом приятно мечтать, да... но люди пишут на работе обычно апишки, модельки, формочки, бизнес-логику и интеграции. Мы не говорим про 100% людей, но массово именно так.
🙅🏻 Треш-головоломки, типа как сделать await [promise1, promise2] - я сам их использую но это только для привлечения внимания, они реально возбуждают фантазии программистов, но я всегда делаю оговорку, что так писать нельзя и даже такую задачу ставить нельзя.
🧩 Паттерн Adapter может быть реализован в JavaScript множеством разных способов, на примерах для Node.js и браузеров. Все они имеют одну главную концепцию - обертка абстракции и связывание обернутого интерфейса с внешним. Но враперы для реализации адаптера можно делать на базе разных идей:

- Расширение адаптирруемого класса при помощи extends
- Боксирование адаптирруемого класса или функции
- Обертка адаптирруемого класса или функции в замыкание
- Использование композиции для боксинга адаптирруемого класса
- Использование аггрегации для боксинга адаптирруемого класса
- Реализаци обертки как широко известного контракта или интерфейса
- Применение открытого конструктора вместо наследования

Я думаю, что из примеров кода это проще понять, чем из текста, но после кода все же хорошо вернуься к обобщению. Примеры кода тут: https://github.com/HowProgrammingWorks/Adapter
💥 Шок! Названа возможная дата КОНЦА Node.js, JavaScript и С++, эксперты раскрыли тайну TypeScript ☠️ https://youtu.be/bRlUtzQPOhA

Скандал в твиттере, все, что вы знали про программирование — скоро не будет стоить ничего!!! Когда наш CTO узнал это, то он три раза сбросился с унитаза и съел свою копию "Книжки с кабанчиком". Но я вас полюбил и я вас научу — тут статья «Самые важные знания для программиста» https://x.com/tshemsedinov/status/1809633457754034433
💡 Начиная 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 });


‣ Значит ли это, что иначе писать уже плохо?
Это достаточно редкая и специфическая штука, ее нужно использовать в библиотеках и коде платформ с надеждой на то, что движки будут это как-то дополнительно оптимизировать, а в продуктовом коде нет на вас вины, если пишете по старинке.

‣ Значит ли это, что оно всем нужно?
Нет, но если знаете, это плюс.
🧩 Пока я готовлю курс по паттернам GoF, SOLID, GRASP с адаптацией для Node.js и JavaScript, собрал тут ссылки на все старые материалы, видео, примеры кода, задачи, если по ссылке github репозиторий, то часто там и примеры и видео: https://github.com/tshemsedinov/Patterns-JavaScript
Программирование, как и любая человеческая деятельность насквозь мифологично, более того, мы решительно ни о чем не можем поговорить, чтобы не опереться на тот или иной миф, то у нас Node.js однопоточный (хоть никогда не был), то мы говорим о нетипизированном языке программирования (хоть таких не бывает), то переменные иммутабельные (хоть это оксюморон), то микросервисы ускоряют ответ (хоть могут только замедлять), и даже, если мы понимаем неточность терминов, и пытаемся говорить точнее, то рассказ растягивается на бесконечность, потому, что все нужно уточнять, а уточнения тоже уточнять, и к каждому факту в уточнениях можно придраться и оспорить. Так что, быстро общаться можно, но только понимая друг друга между строк. Выйти за рамки мифа можно, но только создавая новый миф. Ошибки исправить можно, но только делая новые и новые ошибки. Да и учиться сразу правильно не выйдет, мы осваиваем частично ложные знания еще и плохо осваиваем, сталкиваемся с опытом и благодаря ошибкам, можем делать следующий шаг.