Хакни System Design | algocode.io
763 subscribers
62 photos
1 video
45 links
Изучи System Design для собеседований и карьеры
Download Telegram
🔥 Собеседование по System Design: Как большинство кандидатов не раскрывают свой потенциал за 60 минут?


➡️ Домены


Давай я расскажу, что это и как применять


Без доменов — ты строитель без чертежей.

Но что такое "домен"? Проще говоря:

Домен = автономная бизнес-логика с чёткими границами.

Внутри — высокая связность, снаружи — минимум зависимостей.



Как прийти к доменам? Шаг за шагом:

1️⃣ Функциональные требования (ЧТО система делает):

Пример: "Трекинг заказов, сбор статистики, оплата товаров".

2️⃣ Нефункциональные требования (КАК она это делает):

Пример: "Нагрузка 10K RPS, 99.9% uptime для платежей".

3️⃣ Домены — мостик между ними!


Вот как это выглядит на практике:

Смотрим на картинку

▫️ Аналитика: группировка + выгрузка данных

▫️ Платежи: оплата + история + возвраты

▫️ Товары: показ + редактирование


Как проверить, что домены выделены верно?

✔️ Тест на независимость: Изменения в одном домене не ломают другие.

Пример: Новая выгрузка в «Аналитике» = ноль изменений в «Платежах».

✔️ Тест на простоту: Описываешь домен одной фразой без "и".

Плохо: "Отвечает за пользователей и рассылки".

Хорошо: "Управление жизненным циклом заказа".


🔪 Осторожно: 2 частые ошибки!

Слишком мелкие домены:

Ошибка: Домен "Отображение платежей" (слишком мелко!).

Решение: "Платежи" как единый домен.

Технические псевдодомены:

Ошибка: "Сервис кеша" или "Модуль БД".

Исключение: "Единый механизм бэкапов" — да, если это бизнес-требование.

А микросервисы?


🚫 НЕ путай домены с микросервисами!

— Домен = логическая единица бизнес-логики.

— Микросервис = физическая реализация.


Один домен может жить в:

• 1 микросервисе (простой домен)

• Нескольких сервисах (сложный домен, например "Платежи")

• Монолите (если не нужна изоляция).


💡 Фишка для собеса:

Говори: "Выделяю домен X, потому что он инкапсулирует логику Y и изолирует данные Z. Это позволит независимо масштабировать/менять его без влияния на систему!"

P.S. Нефункциональные требования — твой компас для масштабирования. 10K RPS при покупках? Усиливай «Платежи». Частые ошибки от внешних интеграций? Добавь fallback паттерны

А если хочешь заглянуть дальше доменов, то держи бесплатник на Stepik. В нем проходится вся база для проектирования, собирается система и разбирается собес по system-design
👍5🔥2
Как функциональные требования могут убить твою систему?🔪

Представь, что ты разработчик в Big Tech. И вот тебе выдали задачу, где общие требования:

1️⃣ DAU 50 mln
2️⃣ Важна минимальная задержка между обновлением данных в источнике и в нашей системе
3️⃣ В нашей системе любые задержки неприемлемы, так как для сервиса критичен response time


Иначе говоря, бизнес хочет максимальную согласованность между данными в источнике и на нашей стороне. Но в то же время мы не можем позволить себе ходить во внешние API.

И вот ты садишься, считаешь нагрузку, пытаешься что-то сделать день/два/три. А еще ты нервничаешь, что, наверное, не вывозишь задачу и вообще какое тебе место в Big Tech!😨

Но на самом деле все проще: нужно оспаривать бизнес по поводу их требований.

Как гласит CAP-теорема: невозможно сделать систему одинаково согласованной и доступной.


Так и здесь: нужно делать выбор — хотим ли мы 100% точности в системе или же нам важнее скорость. Так как скорость страдать не может, то жертвуем точностью🎯

А как аргументировать свой подход? — Об этом расскажу в следующей части🔜

#функциональныетребования #нагрузка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
А как говорить с Бизнесом, когда требования — фантастика? 🤯

Привет! В прошлый раз мы залипли на том, что хотеть 100% согласованности данных + нулевых задержек + бесконечной доступности — это как мечтать о вечном двигателе. Значит, нужно идти к Бизнесу и... спорить😱

Но кто этот ваш "Бизнес"? Чаще всего на другом конце — BizDev (Business Development). Их задача — растить рынок, завоевывать клиентов, заключать партнерства и ставить амбициозные цели. Технические детали — не их профиль (хотя бывают и приятные исключения!).

Проблема: Как донести до BizDev'а, что его "просто сделайте" — это путь в технический ад? 🤔 Всё зависит от его "технической просвещенности":

1. Тип "Вообще Не Шарю":

Как выглядит: Глаза стекленеют при словах "база данных", "репликация". Для него система — черный ящик: "Закинул данные -> получил результат".

Как аргументировать:

🔹 Аналогии из жизни: "Представь, ты хочешь, чтобы курьер мгновенно доставлял пиццу в любую точку города, абсолютно горячей, и при этом стоил копейки. Так не бывает? Вот и с данными так же: скорость, точность, цена (ресурсы) — выбирай два".

🔹 Фокус на бизнес-последствиях: "Если мы попробуем сделать именно так, как в требованиях, система будет падать каждый час, и пользователи уйдут к конкурентам. Готовы ли мы к такому риску?"

🔹 Простота: Никаких "CAP", "Paxos" или "кворумов". Только суть: "Скорость или точность? Выбирай приоритет".


2. Тип "Чуть-Чуть Шарю":

Как выглядит: Знает слова "API", "база", "нагрузка", но глубоко не копает.

Как аргументировать:

🔹 Упрощенная визуализация: Схемка потока данных, где видно узкое горлышко или источник задержек. "Видишь эту стрелочку? Вот здесь при таких требованиях будет пробка".

🔹 Оценка в цифрах (очень грубо): "Ты хочешь обновлять данные для 50 млн DAU мгновенно. Даже если мы сделаем магию и обновим 1 запись за 1 мс, на всех это займет ~14 часов. Это реалистично?"

🔹 Предложение конкретных альтернатив: "Мы не можем гарантировать мгновенную точность для всех. Но можем: а) Гарантировать для премиум-пользователей; б) Гарантировать точность с задержкой 5 сек для всех; в) Гарантировать, что 99.9% данных будут точны через 10 сек. Что важнее для реального сценария?"


Итого: Независимо от типа BizDev, твоя ключевая задача как инженера — перевести технические ограничения на язык бизнес-рисков и возможностей. Умение делать этот перевод — критически важный навык, который часто приходит с опытом. Многие junior-middle разработчики фокусируются только на технической стороне, упуская бизнес-контекст.


В конце накину еще пару примеров:

🔹 Вместо “из-за кеширования могу быть неточности в данных” → “Чтобы ответить пользователю максимально быстро, мы используем предварительно подготовленные данные. Это может приводить к небольшим задержкам в актуальности информации, но критично ускоряет работу сервиса.” (Фокус на цели "скорость" и компромисс)

🔹 Вместо “У нас Postgres в этих сервисах, поэтому мы не сможешь просто так шардировать” → “Текущая архитектура хранения данных оптимизирована под надежность и сложные запросы. Ее масштабирование для таких нагрузок потребует значительных изменений и времени, так как простое ‘разделение’ данных здесь неприменимо.” (Фокус на последствиях - время/ресурсы и причина - "надежность/сложность запросов")"

#bizdev #коммуникации #карьера #softskills
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👏4
Почему "это невозможно" — худшая фраза в диалоге с Бизнесом? 🚫

Привет! В прошлом посте мы разобрали стратегии общения с BizDev, когда их требования кажутся нереальными. Сегодня — о главной ловушке, в которую часто попадают инженеры: фраза "это невозможно".

Почему это проблема? 🤔
Помнишь, BizDev обычно не погружен в технические детали (это просто не их фокус!). Но когда они слышат "невозможно":

🔹 Это звучит как отказ без объяснений. Бизнес не понимает почему, чувствует нежелание искать решение.
🔹 Подрывает доверие. "Не может команда X, а команда Y смогла?" — подумают они. И да, скорее всего, они пойдут к другим командам за альтернативами.
🔹 Твоя команда теряет. Меньше интересных задач → меньше возможностей для роста. Зачем доверять сложные фичи тем, кто сразу говорит "нет"? 😟

Что сказать вместо "невозможно"?
Вспомни главный принцип из прошлого поста: переводи технические ограничения в бизнес-термины и предлагай альтернативы!

Пример:
"Невозможно сделать мгновенное обновление для 50 млн пользователей!"

"Прямое обновление для 50 млн DAU в реальном времени потребует огромных ресурсов и может сделать систему нестабильной (риск для пользователей!). Давай подумаем:
• Гарантированное обновление данных за 5 секунд для всех?
• Или мгновенно — но только для премиум-сегмента?
Что критичнее для сценария?"

Суть:
▫️ Фраза "Давай подумаем, как это реализовать в рамках ограничений":
→ Переводит диалог в конструктивное русло
→ Показывает твою экспертизу
→ Сохраняет доверие и задачи в твоей команде! 💪

#коммуникации #bizdev #карьера #softskills
👍5🔥2👏1
Ну, лента😅

Казалось, есть лента в любой социальной сети. Что там сложного: берёшь посты юзеров и накидываешь в общий пул постов. А ещё какую-нибудь рандомную сортировку — вообще великолепно.

Но не тут-то было

Во-первых, тебе нужно учитывать подписчиков пользователя. Во-вторых, тебе нужно понимать, что есть так называемые селебрити, у которых много подписчиков, а есть обычные пользаки. В-третьих, а что если пользователь давно не был в сети?

А ещё есть много способов доставки этих постов в ленту. Например, сравним 3 подхода:

- Храним все посты юзеров в кеше у Feed Service. При запросе ленты получаем подписчиков юзера и делаем feed-merge (подготовка ленты).

- Храним посты в кеше у Feed Service только для активных пользователей. А если неактивный: получить подписчиков и затем выгребать посты из сервиса постов.

- Храним посты в кеше у Feed Service, но делаем fallback strategy на Post Service, чтобы в случае отказа ленты у нас был запасной вариант. И ещё сюда можно прикрутить circuit breaker.

В чём и 〰️ подходов? Для первого требуется гигантский RAM, но меньше response time. Для второго меньше RAM, но потенциально выше response time. Третий более надежный, но требует более сложной логики и долгой настройки.

А ещё можно поставить кеш перед Feed Service, чтобы первые 10 постов были всегда готовы (допустим, для всех пользаков). И таким образом мы можем сначала отдать из кеша, а попутно запустить поток готовить ленту дальше.

Как ты видишь, даже у 1 элемента в системе можно набросать множество вариантов. Но у каждого будут свои сильные и слабые стороны. Это называют trade-off📎


В след посте расскажу, а почему важно уметь прорабатывать разные варианты, если ты хочешь получить senior и выше👆

#лента #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81😎1
Хочешь стать senior в Яндексе — умей видеть несколько вариантов реализации системы

В прошлом посте я говорил, что важно видеть несколько вариантов реализации системы. Обязательно прочитай посты выше (если ещё не видел).

🔍 Разберём реальные ситуации:

1️⃣ Спроектировать MVP системы и реализовать её за месяц
2️⃣ Распилить монолит и превратить его в микросервисы
3️⃣ Полгода на проект — нужно сделать всё идеально с первого раза

📌 Кратко по шагам для каждого случая

🚀 Быстрое MVP
- Главный компромисс — сложность против скорости:
- Можно пожертвовать надёжностью (durability), чтобы уложиться в срок
- Не делать всю функциональность, а только необходимую часть
- Обязательно провести load testing

🔨 Разделение монолита
- Анализ нагрузки каждого модуля (чтение/запись/CPU)
- Проработка зависимостей между сервисами
- Чёткий план миграции (не растягивать на годы!)

Полугодовой проект
- Прописать fallback-стратегии
- Заложить peak multipliers
- Продумать rollout: сначала только на X городов/Y% пользователей
- Не забыть про observability

👉 Как видишь, разные задачи требуют разного подхода.

📚 Пример из обучения
Со студентами обсуждали выбор структур данных для геозон:
- GeoHash
- KD-Tree
- R-Tree
- Quad-Tree

💡 Вывод:
Любая система многогранна. Оценивай свой проект под этим углом — и увидишь множество путей реализации.

PS: если хочешь проверить свой уровень проектирования, то записывайся на бесплатную диагностику

#разработка #архитектура #советы
🔥1
Я считаю, что программисты должны только писать код🖥

Смелое заявление, которое делают некоторые люди. Давай посмотрим на это с разных сторон.

Если ты не прорабатываешь задачу, не рисуешь архитектуру от и до, не выбираешь подходы, не набрасываешь product manager'у контраргументы на его предложения — ты отвечаешь только за свой маленький кусочек. И если другие звенья уйдут в отпуск или уволятся, тебе будет сложно — и оценка на ревью окажется не такой прекрасной.

А что, если ты захочешь попасть в западный Big Tech или создать свой проект? Тебе нужно уметь смотреть на проект шире, чем «вот ТЗ — напиши по нему».

Помни, что работа должна развивать тебя как специалиста, чтобы ты не оказался позади рынка. А если ты бездумно выполняешь задачи по ТЗ, то о каком развитии может идти речь

Если согласен, то ставь палец вверх👍

#архитектура #yandex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥1🤯1
Какой же алгоритм для прохождения system design?🔧

Очень часто меня просят рассказать про этапы собеса по system-design. А также, что стоит делать на каждом.

Я решил подготовить ультимативный шаблон для этой секции, где будут шаги и примеры.

Забирай по ссылке

Если оказалось полезным, то ставь ❤️

#собес #шаблон
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍2
Думаю устроить созвон через недельку где-то. Пообщаемся с вами на разные темы: от программирования до карьерных моментов.

Можете накидывать вопросы в комментах. По времени скажу чуть позже: в Екб в пятницу вечером лечу и будет +2 Мск

PS: если будешь, то ставь лайк (ну или как минимум хочешь зайти)
👍35
Live stream scheduled for
Решено) В это воскресенье в 11:00 по Мск проведем эфир. Я буду в Екб, там +2

Если кто-то живет в Екб, то можете писать мне в личку — увидимся лично.

PS: а если ты с Москвы, то тоже можешь писать мне. Можем лично увидеться и поболтать
👍6🔥5❤‍🔥2
Через минут 25 начнем эфир)

Если у кого-то есть конкретные вопросы, то кидайте в комменты
👍3
Погнали)
🔥3
Live stream finished (1 hour)
Всем спасибо за эфир!⚡️

Прикрепляю схему, которую объяснял.

А также ссылки:

Kafka scale up/down

1. Red Hat

2. Strimzi

Read your writes

1. Replication in distributed systems

2. Read your writes consistency

3. GitHub article

4. How to read your own writes


На следующий эфир приглашу гостя из западного Big Tech🧑‍💻
Анонс заранее сделаю


Можете также накидывать разные вопросы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥91👍1