Asynchronous Programming
Open in Telegram
2 005
Subscribers
-124 hours
-37 days
-1830 days
Posts Archive
🕳 AI: Event Horizon for IT
Коллапс, образование, AI пузырь, работа
👤 Vlad Ten
👤 Timur Shemsedinov
Fri, 22 May 2026, 19:00
https://www.youtube.com/live/17RqGlJjb50
Вспомните, как часами отлаживаете код, потому что он работает не так, как должен?
map вдруг возвращает не array, а array-like object, error instanceof Error неожиданно дает false, или Promise.then() ведет себя будто вместо микротасков, начал использовать макротаски, возможно then теперь реализован через setTimeout, обычный for...of или Array.from() ломается на ровном месте, ну вообще js себя так не должен вести, это невозможно, вы не верите своим глазам...
Разве могу осуждать мух за то, что ебутся? Однако когда у меня в node_modules, злит. Так же и авторы npm зависимостей. Когда в тихом уединении делают то, к чему лежат их души, кто возразит? Но они устраивают манкипатчинг встроенных прортотипов, делают гребаные полифилы, дудят в дудки, бьют в барабаны и кричат, чтобы все знали про их нрав — что-де лупятся в о... и долбятся в ж... Истинно, они хуже мух, ибо мухи только изредка согрешают на моей голове, авторы npm библиотек же изо дня в день пытаются совокупиться в самом центре node_modules. Мухи по недомыслию, авторы оупенсорса же хладнокровно и сознательно.
Одна библиотека улучшила прототип, другая рассчитывала на стандартное поведение, третья защищалась от этого туалетным ершиком, а виноватым в итоге остается ваш код. Да ладно такм код, время вашей жизни кто вернет? В такие моменты кажется, что это невозможно, что ошибка где-то рядом, что надо просто еще немного вывести console.log, запустить с дебагере. Ну найдете вы, что кто-то пропатчил Array, Promise, Error, итераторы, прототипы. Что делать то?
Именно поэтому нужно понять, что такое primordials. Не для того, чтобы знать, как Node.js защищает встроенные прототипы, а для того, чтобы понять сам принцип и защитить свой код от "магии", которую почти невозможно локализовать. Чтобы изолировать одну библиотеку от другой. Допустим, primordials не самый удобный для этого метод, но у меня уже несколько альтернативных. Осталось довести этот ресерч до выбора оптимального варианта и я расскажу, как оно работает.
Если хочется самому копнуть, то тут можно начать - https://github.com/nodejs/TSC/issues/1439#issuecomment-4413664027Тут новая классификация абстракций, что я обещал
https://github.com/tshemsedinov/AsyncProgramming
На днях нарисую новую карту абстракций асинхронности, они не заменяют друг друга, и частая проблема - натягивание совы на глобус, и.е. неуместное применение абстракций. Есть разные по своей природе задачи, есть разные масштабы грануляции и вариативность в других аспектах:
По грануляции:
- multiple: iterator, queue, collection
- value: promise, signal, automata
Разное управление потоком:
- control flow: generators, async/await
- event flow: signal, observer, stream
Разные по владению состоянием:
- exclusive: future, async compose
- shared: mutex, locks, semaphore
- cooperative: chain of responsibility
И таких аспектов еще несколько.
Ревью кода и постановка ТЗ занимает много времени в программировании с AI и люди, естественно, пытаются переложить эту задачу тоже на AI. Пусть агенты друг-другу ТЗ пишут, друг-друга дрессируют и ревью делают. Так можно дойти и до кнопки "Сделай все хорошо", которая запускает бесконечный цикл. У вас не выйдет не тратить внимания на проект.
AI про ваши потребности не занет и мысли не читает. Идеи, приоритеты, контекст, критерии качества и продуктовые компромиссы он сам не определит. AI хорошо пишет только то, что уже много раз кем-то писалось. Если убрать из процесса человеческое внимание, вы не ускорите проект - вы просто зациклите галюцинирование.
На проект все равно придется тратить внимание. Вопрос не в том, как убрать человека из контура, а в том, куда именно направить внимание и в какой форме его вписать в жизненный цикл разработки, чтобы получить максимальную отдачу. Например, в виде DSL-языков, в форме md-файлов или json-файлов, блок-схем, в виде ревью или архитектурных документов.
- Не заменять ревью, а удешевлять его через стандарты, скилы, субагентов, экономию контекста
- Не строить зацикленные цепочки агентов, а ограничивать зоны их ответственности
- Не пытаться автоматизировать мышление целиком, а освобождать внимание человека от рутины
- Не держать требования в текстовой форме, а выносить логику в строгие синтаксисы и контракты
- Не надеяться на память чата, а собирать контекст в версионируемые артефакты, схемы и спецификации
Многие выпускники курса кардинально изменили свою профессиональную карьеру, запустили свои проекты, нашли новую работу, стали менторами на курсе, начали контрибьютить в оупенсорс, заслужили уважение коллег, научились делать доклады и статьи, писать концептуальный код, который вдохновляет подчиненных и делает задание понятным.
Воскресенье - последний шанс зарегистрироваться, потом догнать курс уже будет нереально, а следующего набора ждать примнрно 5 месяцев. https://nodeua.com/Patterns-2025
🎬 Режисерская версия стрима с Мурычем и Брагилевским про парадигмы программирования нарезана и собрана в один плейлист, кто не смотрел, вот тут все https://www.youtube.com/playlist?list=PLHhi8ymDMrQYveSqg-fFSbT3e3j1pYgbV
✔️ Курс Patterns 2025 уже начался, пример того, что мы разбираем на созвонах у вас есть, вчера опубликовал лекцию про Referential Transparency (ссылочную прозрачность) адаптированную для ООП и других парадигм, не нужно думать, что это только для ФП полезно, мы многое берем из ФП и адаптируем. Но все еще есть несколько мест, если вы не успели, можно догнать, неделя это не критичное отставание, заходим, цены как положено на черную пятницу
https://nodeua.com/Patterns-2025
Тут несколько примеров из завтрашних слайдов
Containers
Box.of(42); Either.right(42); Promise.resolve(42);
let maybe: number | null = 42; type Pair = { a?: number; b?: number };
type Option<T> = { kind: 'some'; value: T } | { kind: 'none' };
std::optional<int>; std::tuple<int>; std::reference_wrapper<int>;
Nullable<int> maybe = 42; new StrongBox<int>(value); Tuple.Create(myIntValue);
Guards
func process(_ x: Int?) -> Int? {
guard let v = x else { return nil }
guard v >= 0 else { return nil }
return v * 2
}
in JavaScript
const process = (x) => {
if (x === null) return null;
if (x < 0) return null;
return x * 2;
};
Pattern matching
fn process(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(v) if v < 0 => None,
Some(v) => Some(v * 2),
}
}
in JavaScript
const match = (variant, handlers) => handlers[variant.tag](variant);
match({ tag: 'point', x: 10, y: 20 }, {
point: ({ x, y }) => `(${x}, ${y})`,
circle: ({ r }) => `radius: ${r}`
});
Do-notation
Do({ id: 15 })
.chain(({ id }) => ({ id, name: 'marcus', age: 42 }))
.chain(({ name, age }) => name === 'marcus' ? (log) => log(age) : () => {})
.run()(console.log);
Pipeline operator
(({ id: 15 })
|> read
|> (({ name, age }) => name === 'marcus' ? (log) => log(age) : () => {})
)(console.log);
Declarative style
execute({
read: { id: 15 },
success: {
match: { name: 'marcus' },
success: { effect: { log: 'age' } },
fail: { effect: 'noop' },
},
})(reader)(console.log);
🧐 заходим, не стесняемся 👉 https://nodeua.com/Patterns-2025-paradigms
Available now! Telegram Research 2025 — the year's key insights 
