Please open Telegram to view this post
VIEW IN TELEGRAM
👍44❤9💯9
In 2023, Amazon Prime moved from a microservices architecture to a monolith, reducing costs by up to 90%. This shift surprised many, as breaking a monolith is usually seen as key to scaling. Here’s what happened:
Amazon Prime Video’s live stream monitoring service struggled with performance and costs. Their microservices setup couldn’t handle 90% of the expected load due to expensive orchestration and slow data transfers between services, especially using AWS Step Functions (serverless).
To fix this, the team consolidated all components (media conversion, detection, etc.) into a single process. Instead of sending data between services, they kept everything in memory, reducing network overhead and storage costs. They also scaled by cloning the monolithic service with different configurations, achieving significant cost savings and better performance.
The takeaway: in most cases Microservices aren't the best choice — monolithic designs can be more efficient but a complex solution.
Amazon Prime Video’s live stream monitoring service struggled with performance and costs. Their microservices setup couldn’t handle 90% of the expected load due to expensive orchestration and slow data transfers between services, especially using AWS Step Functions (serverless).
To fix this, the team consolidated all components (media conversion, detection, etc.) into a single process. Instead of sending data between services, they kept everything in memory, reducing network overhead and storage costs. They also scaled by cloning the monolithic service with different configurations, achieving significant cost savings and better performance.
The takeaway: in most cases Microservices aren't the best choice — monolithic designs can be more efficient but a complex solution.
👍46💯9🤯6🤣2❤1
Когда вы слышите, что программисту нужна БАЗА, то спросите, какую СУБД рекомендуют
😁32💯3👍2🤣1
— Кто говорит?
— Индустрия говорит
— Помолчи, индустрия, ведь ты еще не умеешь говорить.
— Я умею говорить хрюшами. Я умею плакать. Я умею смеяться. Что ты хочешь?
— Индустрия говорит
— Помолчи, индустрия, ведь ты еще не умеешь говорить.
— Я умею говорить хрюшами. Я умею плакать. Я умею смеяться. Что ты хочешь?
😁7🤯3👀2🤷♂1🤣1
Вот вы говорите, алгоритмы, алгоритмы, а тут открываешь ноду и видишь такое: https://github.com/nodejs/node/blob/7014e50ca32d39b94d04e04a5e6498e5c2f4346f/lib/path.js#L249-L274
🤣23👍4💯2
https://nodejs.org/en/blog/release/v22.9.0
* New API to get current stack trace: util.getCallSite()
* V8 Maglev is now disabled by default
* Option to partially trust chain on tls.createSecureContext
* New API to get current stack trace: util.getCallSite()
* V8 Maglev is now disabled by default
* Option to partially trust chain on tls.createSecureContext
👍12🫡3🎉2
🧩 Patterns 2024: The mentoring program is ready, I'll prepare translations tomorrow )))
🗓 Start: 1 October; Duration: 12 weeks
👉 Training description: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024.md
👉 Registration for the course: https://forms.gle/wuJ3nvSeF2apgUESA
🗓 Start: 1 October; Duration: 12 weeks
👉 Training description: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024.md
👉 Registration for the course: https://forms.gle/wuJ3nvSeF2apgUESA
🎉6👍3😎1
🚀 Patterns 2024 Тренінг із наставниками
Переклад готовий, раджу його прочитати навіть тим, хто курс не бере, бо це майже стаття і там багато ідей як вдосконалити свої знання та структурувати їх: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024-ua.md
Автор стверджує, що це найважливіші речі, які слід вивчати та практикувати:
📂 Системи модульності, Dependency Injection (DI) та інверсія управління (IoC)
📦 Декомпозиція абстракцій та принципи GRASP із сучасною інтерпретацією
🧩 Паттерни «Банди чотирьох» (GoF) переосмислені для JavaScript та TypeScript
🔮 Принципи ізоляції та SoC (Розподіл відповідальності)
👷🏻♂️ Відокремлення прикладного та системного коду (різні спеціальності)
🧩 Принципи SOLID: SRP, OCP, ISP, DIP, LSP з адаптацією для різних парадигм
🌟 Мультипарадигменне програмування та створення доменних мов (DSL)
🧩 Контрактне програмування та декларативне моделювання через схеми
🏛 Чиста архітектура (Clean) та лукова архітектура (Onion або Layered)
(читати далі...)
Переклад готовий, раджу його прочитати навіть тим, хто курс не бере, бо це майже стаття і там багато ідей як вдосконалити свої знання та структурувати їх: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024-ua.md
Автор стверджує, що це найважливіші речі, які слід вивчати та практикувати:
📂 Системи модульності, Dependency Injection (DI) та інверсія управління (IoC)
📦 Декомпозиція абстракцій та принципи GRASP із сучасною інтерпретацією
🧩 Паттерни «Банди чотирьох» (GoF) переосмислені для JavaScript та TypeScript
🔮 Принципи ізоляції та SoC (Розподіл відповідальності)
👷🏻♂️ Відокремлення прикладного та системного коду (різні спеціальності)
🧩 Принципи SOLID: SRP, OCP, ISP, DIP, LSP з адаптацією для різних парадигм
🌟 Мультипарадигменне програмування та створення доменних мов (DSL)
🧩 Контрактне програмування та декларативне моделювання через схеми
🏛 Чиста архітектура (Clean) та лукова архітектура (Onion або Layered)
(читати далі...)
❤6⚡4🎉1
🧩 Тарифні плани тренінгу із наставниками Patterns 2024
∙ Minimal: навчання у загальній групі без наставника, але з груповими семінарами
∙ Standard: навчання з наставником у невеликих групах (10 осіб)
∙ Professional: навчання з наставником, індивідуально та в групах, додаткові матеріали
∙ Exclusive: персоналізований навчальний трек з автором курсу та запрошеними експертами
👉 Подробиці: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024-ua.md
Формат тренінгу
🗓 12 тижнів (3 місяці) + онбординг (1 тиждень) + секретний модуль
👍 Доступ до матеріалів курсу надається назавжди
🕑 Щотижня обов'язково: 1 година лекцій + 2 години семінар + 2 години самостійної роботи
🥋 Тренування та групова робота з наставниками, а не тільки перегляд видосів та читання
🙋♂️ За бажанням: для глибокого занурення +3 години додаткових матеріалів на старших тарифах
🏅 По завершенню курсу Ви отримуєте сертифікат
⚠️ Вхідні вимоги: базовий JavaScript + рекомендується досвід практичного програмування
🙅 Для кого не підійде: не для початківців, безкоштовні матеріали для початківців шукайте у Тимура
💳 Розстрочка: помісячна оплата для всіх тарифів, окрім мінімального
🗺 Після курсу участь у ком'юніті випускників, де вже тисячі людей по всьому світу
👉 Придбати: https://nodeua.com/Patterns-2024-buy.html
∙ Minimal: навчання у загальній групі без наставника, але з груповими семінарами
∙ Standard: навчання з наставником у невеликих групах (10 осіб)
∙ Professional: навчання з наставником, індивідуально та в групах, додаткові матеріали
∙ Exclusive: персоналізований навчальний трек з автором курсу та запрошеними експертами
👉 Подробиці: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024-ua.md
Формат тренінгу
🗓 12 тижнів (3 місяці) + онбординг (1 тиждень) + секретний модуль
👍 Доступ до матеріалів курсу надається назавжди
🕑 Щотижня обов'язково: 1 година лекцій + 2 години семінар + 2 години самостійної роботи
🥋 Тренування та групова робота з наставниками, а не тільки перегляд видосів та читання
🙋♂️ За бажанням: для глибокого занурення +3 години додаткових матеріалів на старших тарифах
🏅 По завершенню курсу Ви отримуєте сертифікат
⚠️ Вхідні вимоги: базовий JavaScript + рекомендується досвід практичного програмування
🙅 Для кого не підійде: не для початківців, безкоштовні матеріали для початківців шукайте у Тимура
💳 Розстрочка: помісячна оплата для всіх тарифів, окрім мінімального
🗺 Після курсу участь у ком'юніті випускників, де вже тисячі людей по всьому світу
👉 Придбати: https://nodeua.com/Patterns-2024-buy.html
👍3❤1🔥1💩1
⭐️ Проблема сложности, которую решают микросервисы, на самом деле решается проектированием структуры кода на среднем уровне, т.е. люди от функций и классов хотят перескочить сразу к архитектуре, минуя модули, слои, подсистемы. Если код хорошо структурирован на среднем уровне благодаря:
- системам модульности,
- внедрению зависимостей и инверсии управления,
- архитектурным границам и слоям,
- декомпозиции абстракций,
- separation of concerns,
- information expert,
- контрактному программированию,
- управлению, сокрытию и изоляции сложности,
- разделению прикладного и системного кода,
то такое приложение можно в течении нескольких часов собрать в 2, 3, 5, 105 инстансов, заменив взаимодействие между их структурными компонентами на RPC и трансляцию событий. Так, что модули и подсистемы знать не будут, что они запущены не в одном процессе. А если код «рыхлый», то его и микросервисом не изолировать, у такого сервиса будет большой внешний трафик, потому, что зацепление на чужие данные и чужую логику высоки. Так что, «распиливание» это только распиливание бюджета команд и бюджета на инфраструктуру. Обойти вопрос хаоса на среднем уровне при помощи чуда не выйдет. Чтобы построить Application архитектуру, нужна качественная структура, а чтобы перейти к Solution и Enterprise архитектуре, нужна качественная Application архитектура. Попытки перескочить от функции, цикла и массива к Solution архитектуре приводят к появлению монстров типа облачных функций, микролитов, моносервисов и скоро мы увидим Variable as a Service, а потом гору этих абстракций, вываленных на уровень Solution, не сгруппированных и не изолированных в структурные единицы управления сложностью. Чуда не будет, ни кто не решит за нас вопрос перехода от отдельного кирпича к небоскребу, нужны промежуточные структурные единицы.
- системам модульности,
- внедрению зависимостей и инверсии управления,
- архитектурным границам и слоям,
- декомпозиции абстракций,
- separation of concerns,
- information expert,
- контрактному программированию,
- управлению, сокрытию и изоляции сложности,
- разделению прикладного и системного кода,
то такое приложение можно в течении нескольких часов собрать в 2, 3, 5, 105 инстансов, заменив взаимодействие между их структурными компонентами на RPC и трансляцию событий. Так, что модули и подсистемы знать не будут, что они запущены не в одном процессе. А если код «рыхлый», то его и микросервисом не изолировать, у такого сервиса будет большой внешний трафик, потому, что зацепление на чужие данные и чужую логику высоки. Так что, «распиливание» это только распиливание бюджета команд и бюджета на инфраструктуру. Обойти вопрос хаоса на среднем уровне при помощи чуда не выйдет. Чтобы построить Application архитектуру, нужна качественная структура, а чтобы перейти к Solution и Enterprise архитектуре, нужна качественная Application архитектура. Попытки перескочить от функции, цикла и массива к Solution архитектуре приводят к появлению монстров типа облачных функций, микролитов, моносервисов и скоро мы увидим Variable as a Service, а потом гору этих абстракций, вываленных на уровень Solution, не сгруппированных и не изолированных в структурные единицы управления сложностью. Чуда не будет, ни кто не решит за нас вопрос перехода от отдельного кирпича к небоскребу, нужны промежуточные структурные единицы.
👍32🔥4💯4😁2
Which techniques do you use to control state within software abstractions? (multiselect or add in comments)
Anonymous Poll
43%
Pure Functions
13%
Idempotent Functions
12%
State Hiding Primitives
23%
Functional Techniques
52%
OOP Techniques
24%
Flags
9%
Critical Sections and Locks
29%
Shared State
10%
Conflict-Free Data Structures
10%
Conflict-Free Flow Control
👍3❤1
⚠️ Завтра первый день онбординга на Patterns 2024.
Это нулевая неделя, формируются группы и назначаются менторы. Процесс оказался не таким простым организационно. Всем, кто зарегистрировался - прошу спокойно подождать до вечера и если вам на почту не придет приглашение, то утром обратиться в нашу поддержку, там отдельные люди занимаются вопросами платежей, рассрочкой, потерянными контактами (часть людей везде указывает разные почты и телефоны, вводят "Юра" или "EA 00 00 FF FF" в поле фамилии и невозможно понять, кто это).
∙ Поддержка по платежам: https://www.tg-me.com/patterns2024 или на почту [email protected]
∙ Кто зарегистрировался но не оплатил, то платить тут https://nodeua.com/Patterns-2024-buy.html
∙ Кто оплатил, но не заполнил форму, это тут: https://forms.gle/wuJ3nvSeF2apgUESA
∙ Кто и зарегистрировлся и оплатил, но не полял куда попал, то можно посмотреть описание тренинговой программы на трех языках тут https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024.md
∙ Курсы по ноде и по асинхронному программированию тут: https://www.patreon.com/tshemsedinov
Пишу это потому, что есть люди, которые пишут, что хотели попасть на курс по ноде и уже где-то оплатили, а оказалось, что они на паттерны попали.
Это нулевая неделя, формируются группы и назначаются менторы. Процесс оказался не таким простым организационно. Всем, кто зарегистрировался - прошу спокойно подождать до вечера и если вам на почту не придет приглашение, то утром обратиться в нашу поддержку, там отдельные люди занимаются вопросами платежей, рассрочкой, потерянными контактами (часть людей везде указывает разные почты и телефоны, вводят "Юра" или "EA 00 00 FF FF" в поле фамилии и невозможно понять, кто это).
∙ Поддержка по платежам: https://www.tg-me.com/patterns2024 или на почту [email protected]
∙ Кто зарегистрировался но не оплатил, то платить тут https://nodeua.com/Patterns-2024-buy.html
∙ Кто оплатил, но не заполнил форму, это тут: https://forms.gle/wuJ3nvSeF2apgUESA
∙ Кто и зарегистрировлся и оплатил, но не полял куда попал, то можно посмотреть описание тренинговой программы на трех языках тут https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Patterns-2024.md
∙ Курсы по ноде и по асинхронному программированию тут: https://www.patreon.com/tshemsedinov
Пишу это потому, что есть люди, которые пишут, что хотели попасть на курс по ноде и уже где-то оплатили, а оказалось, что они на паттерны попали.
👍7👀5❤2😁1😎1
Ноду нужно спасать, primordials и этот стиль, ну как так можно написать, например:
вместо:
или
const setupPromise = Promise.resolve(setup?.(root.reporter));
PromisePrototypeThen(PromisePrototypeThen(PromisePrototypeThen(setupPromise, runFiles), postRun), teardown);
вместо:
await Promise.resolve(setup?.(root.reporter))
.then(runFiles)
.then(postRun)
.then(teardown);
или
await Promise.resolve(setup?.(root.reporter));
await runFiles();
await postRun();
await teardown();
🤯37⚡3
Начинающий программист совершенно уверен в том, как все должно быть, но не знает как и шагу ступить в конкретной ситуации. А опытный программист не уверен в том, как все на самом деле, но точно знает, как действовать в конкретной ситуации.
Концепции, парадигмы, паттерны и принципы, построены как мифы и верования. И самое парадоксальное в мифе, что он работает, дает хорошие результаты в ежедневной практике. Не нужно думать о нем, как о чем-то мистическом, выдуманном, отвлеченном. Если программист избавится от мифологического сознания, например перестанет верить в микросервисы, в nodejsоднопоточный, в скалярные типы данных, перестанет писать на примесях и мидлварах, то картина мира рассыпается и он не может ничего написать. Чтобы опять начать что-то создавать, нужно построить другой миф. Только ощущение, что у тебя сложилась картина мира, позволяет перейти от теории к практике. Но любая картина мира состоит из разрозненных фактов, которые переклеены мифом, иначе, бы мы утонули в зазорах между знаниями, как в пустотах между электронами и атомами. Без мифа мир страшен, непредсказуем и неуправляем. Опытный программист просто имеет несколько мифов в голове и может между ними переходить, некоторые могут даже конструировать свои, и такое конструирование может быть только интуитивное, если его начать логически строить, то никто не поверит. В мифе должны быть нестыковки, странности, даже противоречия, вот это заходит в голову идеально. Это инструмент, который позволяет действовать эффективно, скрывать сложность, давать целостную картину мира, но не слишком идеальную, чтобы было место для развития.
Концепции, парадигмы, паттерны и принципы, построены как мифы и верования. И самое парадоксальное в мифе, что он работает, дает хорошие результаты в ежедневной практике. Не нужно думать о нем, как о чем-то мистическом, выдуманном, отвлеченном. Если программист избавится от мифологического сознания, например перестанет верить в микросервисы, в nodejsоднопоточный, в скалярные типы данных, перестанет писать на примесях и мидлварах, то картина мира рассыпается и он не может ничего написать. Чтобы опять начать что-то создавать, нужно построить другой миф. Только ощущение, что у тебя сложилась картина мира, позволяет перейти от теории к практике. Но любая картина мира состоит из разрозненных фактов, которые переклеены мифом, иначе, бы мы утонули в зазорах между знаниями, как в пустотах между электронами и атомами. Без мифа мир страшен, непредсказуем и неуправляем. Опытный программист просто имеет несколько мифов в голове и может между ними переходить, некоторые могут даже конструировать свои, и такое конструирование может быть только интуитивное, если его начать логически строить, то никто не поверит. В мифе должны быть нестыковки, странности, даже противоречия, вот это заходит в голову идеально. Это инструмент, который позволяет действовать эффективно, скрывать сложность, давать целостную картину мира, но не слишком идеальную, чтобы было место для развития.
❤19👍10💯5👨💻2🫡1
Forwarded from HowProgrammingWorks - JavaScript and Node.js Programming
⭐️ Good and bad cases for TypeScript union types based on JavaScript V8 optimizations
👍 Good cases for union types:
- Union of strings instead of enum:
- Union of numeric as status or result code: type
- Union with shared properties:
- Union with common method:
👎 Bad cases for union types:
- Polymorphic object shapes causing depots:
- Requiring extensive "if"-logic and type checking:
- Inconsistent return types:
- Mixed primitives and objects:
- Сontradictory members:
- Union types that include any:
- Incompatible contracts:
🎁 Empty value for primitive types and reference types:
- Use
- Use
- Avoid mixing symbols with other types in unions
👍 Good cases for union types:
- Union of strings instead of enum:
type Direction = 'north' | 'south' | 'east' | 'west';
- Union of numeric as status or result code: type
StatusCode = 200 | 201 | 204 | 400 | 500;
- Union with shared properties:
type MailTarget = User | Company;
(both with email
)- Union with common method:
type Thenable = Promise | Query;
(both with then
method)👎 Bad cases for union types:
- Polymorphic object shapes causing depots:
type Something = User | Socket | string;
- Requiring extensive "if"-logic and type checking:
type Input = string | number | boolean;
- Inconsistent return types:
function getData(id: number): string | string[];
- Mixed primitives and objects:
type Value = number | { value: number };
- Сontradictory members:
type Person = { name: string; } | { name: number[] };
- Union types that include any:
type FlexibleType = number | any;
- Incompatible contracts:
type Handler = (() => string) | ((event: Event, data: any) => void);
🎁 Empty value for primitive types and reference types:
- Use
null
for empty reference types: Object, Function, Array
, etc...- Use
undefined
for empty primitive types: string, number, boolean, bigint
- Avoid mixing symbols with other types in unions
👍24❤4👀2💯1