Технічне інтерв'ю англійською: How to Think Out Loud in System Design
How to talk through a system design interview in English: structures, phrases, trade-off language, and worked examples. For non-native speakers who know the tech but struggle to express it clearly.
Інтерв’ю з розробниками систем - це інтерв’ю з розмовою. Менеджер, який приймає на роботу, не просто оцінює ваші знання з архітектури — він оцінює, як ви * спілкуєтесь * у невідомості, як ви структуруєте своє мислення, і як ви поводитесь з неоднозначністю. Для людей, для яких англійська не є рідною мовою, це подвійний виклик: вам потрібно вільно розмовляти англійською мовою * і* одночасно мислити за допомогою складних розподілених систем.
Цей посібник надає вам мовні підвалини — фрази і структури, які можна використовувати знову і знову — щоб ви могли зосередити свою розумову енергію на архітектурі, а не на пошуку правильних слів.
Чому так важко думати вголос
На собеседовании по программированию, молчание допустимо, пока ты думаешь. У інтерв’ю з системним дизайнером, мовчання - це червоний прапор. Інтерв’юер не може побачити всередині вашої голови - якщо ви припините говорити, вони вважають, що ви застрягли.
Пастка для носіїв мови, для яких англійська не є рідною: ви знаєте, що думати, але ви сповільнюєте пошук точної англійської фрази. Коли ти знайдеш цю фразу, ти вже втратиш нить свого розуму.
Рішення: вивчіть невеликий словник повторюваних сполучених фраз, які не потребують часу на пошук. Вони стають автоматичними — ви можете застосовувати їх, поки ваш мозок працює над технічною проблемою.
Структура відповіді на питання про проектування системи
Більшість відповідей на питання про розробку системи відповідають цій структурі:
** 1. Роз’яснення вимог** → 2. Оцінка масштабу → 3. Визначити API → 4. Дизайн високого рівня → 5. Глибоке занурення в компоненти → 6. Визначити вузли та компроміси → **7. Заверши
Кожен етап має свій власний словник. Давайте створимо банк фраз для кожного.
Стадія 1: Роз’яснення вимог
Ніколи не починайте проектування, не встановивши, що саме ви створюєте. Это сигналы мышления старшего уровня.
** Функціональні вимоги (що робить система): **
“Перед тим, як я почну, я хочу переконатися, що я розумію сферу. Чи ми розробляємо шлях запису, шлях читання, або обидва?»
- Нет, не надо Чи повинна система підтримувати оновлення в реальному часі, або є прийнятною послідовність?
- Нет, не надо Чи ми обробляємо завантаження файлів, чи тільки текстові дані?»
- Нет, не надо Які найважливіші функції для користувачів для цієї першої версії?»
** Нефункціональні вимоги (як добре він повинен працювати): **
Які вимоги до затримки? Чи це API, що звернений до користувача, або ми можемо терпіти кілька секунд часу обробки?»
- Нет, не надо «Скільки щоденних активних користувачів ми розробляємо? 100 мільйонів доларів»
- Нет, не надо «Що таке очікуваний коефіцієнт читання-запису — переважно читання, як новини, або збалансований, як програма обміну повідомленнями?»
- Нет, не надо Чи ми дбаємо про сильну послідовність, або можемо прийняти кінцеву послідовність для кращої доступності і продуктивності?
** Припущення (зазначте їх чітко): **
«Я припускаю, що ми розробляємо для 10 мільйонів щоденних активних користувачів — дайте мені знати, якщо це занадто високо або занадто низько»
- Нет, не надо «Я припускаю, що основний випадок використання є важким для читання — близько 90% читає, 10% пише»
- Нет, не надо «Я збираюся зосередитися на основному щасливому шляху спочатку, а потім ми можемо обговорити крайові випадки»
Стадія 2: Оцінка масштабу (розрахунки збоку конверта)
Собеседники уважают кандидатов, которые делают грубые вычисления перед тем, как начать проектирование. Це показує, що ви розумієте, що масштаб формує архітектуру.
** Перехідні фрази: **
«Дай мені зробити грубі розрахунки збоку конверта, перш ніж я почну проектування»
- Нет, не надо Я оцінюю масштаб, щоб зрозуміти, з чим ми маємо справу
** Шаблони обчислень: **
«Якщо у нас є 100 мільйонів щоденних активних користувачів, і кожен користувач надсилає приблизно 10 повідомлень на день, це 1 мільярд повідомлень на день, або близько 10 000 повідомлень на секунду в середньому»
- Нет, не надо Припускаючи, що піковий трафік становить 5 × середній, нам потрібно обробляти близько 50 000 записів на секунду в піковій точці
- Нет, не надо “Кожне повідомлення має приблизно 100 байтів. 1 мільярд повідомлень на день × 100 байтів = 100 ГБ нових даних на день. За рік, це близько 36 ТБ — нам буде потрібно масштабоване рішення зберігання»
- Нет, не надо «З співвідношенням читання до запису 10:1, ми спостерігаємо 500 000 читання за секунду в піковій точці. Це свідчить про те, що нам знадобиться значне кешування»
** Корисні номери для запам’ятовування під час інтерв’ю: **
- 1 мільйон секунд ≈ 11,5 днів
- 10 мільйонів DAU × 10 дій/день = 100 мільйонів подій/день ÷ 86,400 = ~1,160 подій/секунду
- 1 кБ = 103 байтів, 1 МБ = 106, 1 ГБ = 109, 1 ТБ = 1012
Стадія 3: Визначення API
Розробка API перед внутрішніми якорями зафіксує розмову і демонструє мислення про продукт.
** Перехідні фрази: **
«Перед тим, як я нарисую компоненти, дозвольте мені нарисувати поверхню API — це допомагає прояснити, що система повинна робити»
- Нет, не надо «Я почну з точки зору клієнта і визначу, які API виклики система виставляє»
** Фрази опису API: **
«Клієнт викликає POST /messages з JSON-запитом, що містить sender_id, recipient_id і content.»
- Нет, не надо Відповідь поверне 201 Створено з присвоєним message_id і часовим штампом на стороні сервера
- Нет, не надо Для читання подачі, ми використаємо GET /feed?user_id=X&cursor=Y — Я використовую курсор-засноване сторінкування для ефективної обробки великого обсягу елементів
- Нет, не надо «Ми будемо потребувати WebSocket з’єднання для реалізації в реальному часі, але повернемося до опитування для клієнтів, які не підтримують WebSockets»
Стадія 4: Дизайн високого рівня
Тепер ти малюєш архітектуру. Перший крок тримайте простим — не перебільшуйте на цьому етапі.
** Перехідні фрази: **
«Дозвольте мені почати з простого, наївного дизайну, а потім ми визначимо його обмеження»
- Нет, не надо «Я нарисую компоненти високого рівня — будівельні блоки — перед тим, як ми зануримося в будь-який з них»
- Нет, не надо “Ось найпростіший дизайн, який міг би працювати. Ми вдосконалим його, як ми визначимо вузькі місця»
** Опис компонентів: **
«Клієнт відправляє запити до API-шлюз, який обробляє автентифікацію і маршрутизує запит до відповідної мікросервісу.»
- Нет, не надо «Служба запису обробляє вхідні повідомлення і зберігає їх у первинній базі даних»
- Нет, не надо «Служба сповіщень відповідає за доставку оновлень в реальному часі до підключених клієнтів через WebSocket.»
- Нет, не надо «У нас є черга повідомлень тут — Kafka або SQS — яка відокремлює шлях запису від процесорів нижнього рівня. Якщо служба сповіщення повільна, черга поглинає затримку.”
** Опис потоку даних: **
«Запит тече від клієнта → API шлюзу → запису послуги → message broker → notification service.»
- Нет, не надо «На шляху читання, клієнт запитує подачу → служба подачі перевіряє кеш спочатку → на кеш-провал, він запитує базу даних і заповнює кеш для подальших читання»
Стадія 5: Глибоке занурення в компоненти
Тут ти глибоко занурюєшся в один компонент. Виберіть найцікавіше або найскладніше з них і поясніть, чому ви обрали саме цей варіант.
** Перехідні фрази: **
«Дозвольте мені збільшити рівень зберігання — саме там знаходяться найцікавіші компроміси»
- Нет, не надо «Я хочу поговорити про вибір бази даних більш детально.»
- Нет, не надо «Дозвольте мені глибше зануритися в проблему розширення — це головний виклик масштабованості для цього дизайну»
** Пояснення вибору: **
«Я вибираю NoSQL-склад, тому що дані вимагають багато запису, а шаблон доступу завжди за user_id — реляційна схема не додає цінності, а NoSQL дає нам кращу горизонтальну масштабованість»
- Нет, не надо “Ми розділимо базу даних за user_id, так що всі дані користувача будуть на одному шарді. Це робить запити з обсягом користувача ефективними і уникають перехресно-складних з’єднань»
- Нет, не надо «Я використовую кеш зі стратегією запису, а не запису назад, тому що тут важлива послідовність — ми не можемо показувати застарілі дані на сторінці профілю»
Стадія 6: Компроміси і вузли
Це найбільш мовленнєво-інтенсивна частина і та, де нерідкісні носії часто борються найбільше. Сильні кандидати показують, що вони розуміють, що кожен вибір дизайну має свої витрати.
Виявлення вузьких місць:
«Перше вузьке місце, яке я бачу, це пропускна здатність запису бази даних — при 50K записів на секунду, один основний вузол буде перевантажений»
- Нет, не надо Проблема розширення: для популярного користувача з 10 мільйонами послідовників, запис до кожного послідовника на пості вимагає 10 мільйонів записів бази даних синхронно. Це не буде масштабуватися»
- Нет, не надо «Єдиний API-шлюз є потенційною однією точкою невдачі — ми повинні розгорнути його в декількох зонах доступності»
Мова торгівлі — найважливіший словник:
| Phrase | When to use |
|---|---|
| ”The trade-off here is…” | Introduce a choice with two-sided consequences |
| ”The advantage of X is… however, the downside is…” | Compare options fairly |
| ”This approach sacrifices X in favour of Y” | Acknowledge what you give up |
| ”This is a classic consistency vs availability trade-off” | Reference CAP theorem |
| ”I’m optimising for the read path here at the cost of some write complexity” | Show you understand the imbalance |
| ”This works well at low scale, but will become a bottleneck at…” | Frame limitations honestly |
| ”If we needed stronger guarantees, we could…” | Show you know alternatives |
Повний текст:
«Компроміс з денормалізацією подачі є записом посилення — кожен пост запускає N записів (один на послідовника). Перевага полягає в тому, що читання є одним пошуком бази даних замість дорогого з’єднання»
- Нет, не надо «Я вибираю кінцеву послідовність тут, тому що сильна послідовність вимагає розподілених замків, що значно збільшить затримку і зменшить доступність. Для соціальної подачі користувачі можуть терпіти побачити пост з декількома секундами запізнення»
- Нет, не надо «Використання реляційної бази даних дає нам ACID гарантії, що спрощує логіку застосування. Компроміс полягає в тому, що горизонтальне масштабування складніше, ніж з NoSQL-сховищем»
- Нет, не надо «Ця конструкція використовує синхронну обробку, яка простіше для роздумів і зневадження. Недоліком є те, що повільна служба вниз заблокує весь ланцюг запитів — ми б хотіли перейти на асинхронний, якщо затримка стане проблемою»
Стадія 7: Завершення
Закрити сеанс безпечно. Підсумуйте те, що ви створили, і запропонуйте наступні кроки.
Заключні фрази:
«Підсумую: я розробив систему, яка обробляє [основний випадок використання] з [ключовими архітектурними рішеннями]. Основні компроміси, які ми зробили, були [X] з [Y] причин»
- Нет, не надо «Області, які я б хотів дослідити далі, якби у нас було більше часу: стратегія анульування кешу, налаштування реплікації між центрами даних, а також дизайн моніторингу і попередження»
- Нет, не надо «Я не описав безпеку в деталях — для виробничої системи я додав би обмеження швидкості на користувача, запит автентифікації через JWT і аудит журналювання для відповідності»
- Нет, не надо “Чи має ця архітектура сенс? Чи є якийсь конкретний компонент, на який ви хотіли б, щоб я глибоко занурився?»
Управління невизначеністю
Ти не завжди знаєш відповідь. Правильна відповідь - це не мовчання - це структуроване мислення вголос.
** Коли ви не впевнені: **
«Я не на 100% впевнений у точних обмеженнях Cassandra в цьому масштабі — я перевірив би це перед тим, як прийняти рішення. Але архітектурно, це має сенс, тому що…»
- Нет, не надо «Я знаю, що Kafka часто використовується тут, але я б хотів порівняти його з Kinesis, враховуючи нашу інфраструктуру AWS. Моє припущення полягає в тому, що вартість і операційні витрати будуть нижчими з управляемою службою»
- Нет, не надо «Я бачу два підходи тут і я не впевнений, який з них кращий — чи можу я подумати через обидва?»
- Нет, не надо «Я зроблю припущення тут: Я припущу, що співвідношення читання-запису становить 10:1. Якщо б це було інакше, дизайн змінився б [спеціальним чином]»
Підсилювачі вільності для носіїв, для яких мова не є рідною
Це фрази, що поєднують і з’ єднують слова, які надають вашому висновку структуру, навіть якщо ви ще не вміли розібратися у деталях:
| Phrase | Purpose |
|---|---|
| ”Let me think through this step by step…” | Buys thinking time, signals organised mind |
| ”That’s a good question. My first instinct is…” | Acknowledges the question before answering |
| ”I want to come back to that after we cover…” | Manages the flow without losing threads |
| ”If I understand correctly, the requirement is…” | Confirms before committing |
| ”One thing I want to flag is…” | Introduces an important concern |
| ”Let’s zoom out for a second…” | Returns to the big picture |
| ”One alternative here would be…” | Shows you know multiple solutions |
| ”The reason I prefer X over Y is…” | Justifies your choices |
| ”I’ll simplify for now and we can add complexity later” | Sets expectations for an iterative approach |
| ”Does that make sense so far?” | Checks alignment and invites questions |
Поширені помилки, яких слід уникати
** 1. Початок проектування без пояснень** Перехід прямо до малювання системи без запитів щодо масштабу або вимог виглядає не дуже вдало. Завжди витрачайте 2-3 хвилини на пояснення.
**2. Занадто швидко, занадто глибоко Опис структури B- дерева індексів вашої бази даних за хвилину — до того, як буде встановлено дизайн високого рівня — втрачає інтерв’ юера. Сначала ширина, потом глубина.
** 3. Ігнорування нефункціональних вимог** Розробка системи без згадки про затримку, доступність або вимоги до послідовності виглядає неповним. Проактивно викликати теорему CAP, SLA і сценарії невдач.
** 4. Не визнає компромісів** Сказати «Я використаю X, тому що це найкращий варіант» без обговорення вартості X є червоним прапором. Кожен вибір має свої мінуси - їх назва демонструє розуміння старшого рівня.
**5. Тихо, замість того, щоб думати вголос 30- секундна пауза гірша за « Я думаю, чи використовувати реляційний чи нереляційний склад — дозвольте мені проаналізувати шаблони доступу ». Не відпускайте співбесідників.
Швидкий словник
| Term | Meaning in system design context |
|---|---|
| scalability | Ability to handle more load by adding resources |
| latency | Time for a single request to get a response |
| throughput | Requests/data processed per unit time |
| availability | Uptime; fraction of time the system is functional |
| consistency | All clients see the same data at the same time |
| partition tolerance | System works despite network splits (CAP theorem) |
| trade-off | A design choice where gaining X costs Y |
| bottleneck | The component that limits overall system performance |
| fan-out | One write triggering many downstream writes (e.g., push to followers’ feeds) |
| idempotent | Repeating an operation has the same effect as doing it once |
| eventual consistency | Data converges to the same state eventually, not immediately |
| sharding | Splitting data horizontally across multiple database nodes |
| replication | Copying data to multiple nodes for fault tolerance and read scaling |
| cache hit/miss | Whether requested data was found in cache (hit) or not (miss) |
| single point of failure | A component whose failure brings down the whole system |
Мовні шаблони, наведені вище, можна використовувати для будь- якого питання проектування системи — скорочення URL, подача Twitter, розподілене зберігання ключів і значень або система оплати. Практикуйтеся вимовляти їх вголос, поки вони не стануть автоматичними. Коли слова автоматичні, твій мозок вільний зосередитись на архітектурі.