image Привет, Хаброжители! Мы весьма рады, что вы решили изучить особенности интервью по проектированию ИТ-систем вместе с нами. Из всех технических интервью именно на этом задают самые сложные вопросы. Претенденту предлагается спроектировать архитектуру программной системы: новостной ленты, поиска Google, системы мгновенных сообщений и т. д. Задачи такого рода наводят ужас, ведь у них нет единственно верных решений. Они обычно отличаются масштабностью и расплывчатостью. Допускаются свободные и неясные формулировки без стандартного или правильного ответа.

Интервью по проектированию ИТ-систем широко практикуются в компаниях, так как навыки общения и решения задач, которые можно проверить на этом этапе, необходимы в повседневной работе программиста. Ответы претендента оцениваются с учетом того, как он анализирует расплывчатую задачу и какие шаги он предпринимает для ее решения. При этом во внимание принимается то, как он объясняет свои идеи, обсуждает их с другими, оценивает и оптимизирует систему.

Общие принцип прохождения интервью по проектированию ИТ-систем


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

Многие боятся такого рода интервью. Вопросы на них могут быть расплывчатыми и слишком уж общими, например: «Спроектируйте общеизвестный продукт X». Отсутствие энтузиазма у претендента вполне объяснимо. В конце концов, кому под силу в течение часа спроектировать популярный продукт, над которым работали сотни, если не тысячи инженеров?

Хорошая новость в том, что от вас этого никто не ожидает. Реальные системы имеют чрезвычайно сложную архитектуру. Например, поиск Google только с виду выглядит просто; количество технологий, стоящих за этой простотой, поистине потрясающее. Но если никто не ждет, что вы за час успеете спроектировать настоящую систему, то какая польза от этого интервью?

Интервью по проектированию ИТ-систем имитирует реальный процесс, в ходе которого пара коллег совместно работают над какой-то общей не совсем ясной задачей и находят подходящее решение. Задача носит общий характер, и идеального решения не существует. Важна не столько архитектура, которую вы предложите, сколько сам процесс проектирования. Это позволяет вам продемонстрировать свои навыки инженера, обосновать выбор тех или иных архитектурных решений и конструктивно ответить на возникшие вопросы.

Давайте представим себя на месте интервьюера — человека, который задает вопросы, и попробуем понять, о чем он думает, когда заходит в конференц-зал и встречает вас. Его основная задача — правильно оценить ваши способности. Худшим исходом для него будет плохо проведенное интервью или недостаток сведений, которые не позволят дать вам окончательную оценку. Что пытается узнать интервьюер во время собеседования по проектированию ИТ-систем?

Многие считают, что этот вид интервью сводится к техническим навыкам проектирования претендента. Но это лишь малая его часть. Эффективное интервью четко сигнализирует о способности претендента работать совместно, выдерживать давление и конструктивно справляться с расплывчатыми задачами. Еще одним ключевым навыком, на который особенно обращают внимание многие интервьюеры, является способность задавать подходящие вопросы.

Хороший интервьюер также ищет отрицательные признаки. Чрезмерно усложненные архитектурные решения являются настоящей болезнью многих инженеров, которые восхищаются чистотой результата и не желают идти на компромиссы. Они зачастую не догадываются о тех расходах, которые влекут за собой переусложненные системы, и многим компаниям это неведение дорого обходится. Эту склонность явно не стоит демонстрировать. Среди других нежелательных качеств можно выделить узкий кругозор, упрямство и т.д.

В этой главе мы разберем некоторые полезные советы и предложим простой и эффективный подход к решению задач на интервью по проектированию ИТ-систем.

Удачное интервью по проектированию ИТ-систем за 4 шага

Каждое интервью по проектированию ИТ-систем уникально. Хорошая задача должна носить общий характер и не иметь какого-то одного универсального решения. Но у всех интервью есть общие этапы.

Шаг 1: понять задачу и определить масштаб решения

— Почему тигр зарычал?
В заднем ряду кто-то с готовностью поднял руку.
— Джимми? — кивнул учитель.
— Потому что он ПРОГОЛОДАЛСЯ.
— Отлично, Джимми.

В своем классе Джимми всегда первым отвечал на вопросы. Всякий раз, когда учитель что-то спрашивает, в классе всегда найдется ребенок, который с радостью рискнет поднять руку, даже если у него нет ответа. В нашем случае это Джимми.

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

НЕ БУДЬТЕ такими, как Джимми.

На интервью по проектированию ИТ-систем быстрый ответ без обдумывания не даст вам дополнительных баллов. Решение задачи без глубокого понимания ее требований является очень плохим знаком, так как такое интервью — это не викторина. Правильного ответа попросту нет.

Поэтому не спешите предлагать решение. Повремените. Хорошенько подумайте и задайте вопросы, чтобы уточнить требования и допущения. Это чрезвычайно важно.

Мы, инженеры, любим сложные задачи и спешим выдать на-гора готовые решения, но такой подход, скорее всего, не приведет к проектированию нужных систем. Один из самых важных навыков любого инженера состоит в умении задавать правильные вопросы, делать подходящие предположения и собирать всю информацию, необходимую для создания системы. Поэтому не бойтесь спрашивать.

Услышав вопрос, интервьюер либо прямо ответит, либо попросит вас высказать собственные предположения. Во втором случае свои мысли лучше записать на доске или бумаге. Позже они вам пригодятся.

О чем следует спрашивать? Попытайтесь уточнить требования к архитектуре. Вот список вопросов, с которых можно начать:

— Какие именно возможности мы будем реализовывать?

— Сколько пользователей у нашего продукта?

— Как скоро ожидается наращивание мощностей? Какой масштаб планируется через 3 месяца, полгода, год?

— Как выглядит технологический стек компании? Какие существующие сервисы можно применить для упрощения архитектуры?

Пример

Если вас попросят спроектировать ленту новостей, вам следует прояснить требования, которые к ней предъявляются. Ваш разговор с интервьюером может выглядеть так:

Кандидат: «Это мобильное или веб-приложение? Или и то и другое?»

Интервьюер: «И то и другое».

Кандидат: «Какие самые важные возможности должны быть у этого продукта?»

Интервьюер: «Возможность публиковать статьи и видеть новостные ленты своих друзей».

Кандидат: «Новостная лента сортируется хронологически или в каком-то особом порядке? Особый порядок означает, что каждой статье назначается определенный вес. Например, статьи ваших близких друзей важнее статей, опубликованных в группе».

Интервьюер: «Чтобы не усложнять, предположим, что лента сортируется в обратном хронологическом порядке».

Кандидат: «Сколько друзей может быть у пользователя?»

Интервьюер: «5000».

Кандидат: «Какой объем трафика?»

Интервьюер: «10 миллионов активных пользователей в день (DAU)».

Кандидат: «Может ли лента содержать изображения и видеофайлы наряду с текстом?»

Интервьюер: «В ленте могут быть медиафайлы, включая изображения и видео».

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

Шаг 2: предложить общее решение и получить согласие

На этом этапе мы пытаемся выработать общее решение и согласовать его с интервьюером. Очень желательно в ходе этого процесса наладить совместную работу.

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

— Нарисуйте на доске или бумаге блок-схемы с ключевыми компонентами, такими как клиенты (мобильные/браузерные), API-интерфейсы, веб-серверы, хранилища данных, кэши, CDN, очереди сообщений и т.д.

— Выполните приблизительные расчеты, чтобы понять, соответствует ли ваше решение масштабу задачи. Рассуждайте вслух. Прежде чем что-то считать, пообщайтесь с интервьюером.
По возможности пройдитесь по нескольким конкретным сценариям использования. Это поможет вам сформировать общую архитектуру и, скорее всего, обнаружить крайние случаи, о которых вы еще не думали.

Следует ли на этом этапе обозначать конечные точки API-интерфейса и схему базы данных? Это зависит от задачи. Если вас просят спроектировать что-то масштабное, такое как поиск Google, то лучше не углубляться настолько сильно. Если же речь идет о серверной части многопользовательской игры в покер, эти аспекты вполне можно указать. Общайтесь с интервьюером.

Пример

Давайте посмотрим, как происходит разработка общей архитектуры на примере новостной ленты. Вам не нужно понимать, как на самом деле работает эта система. Все детали будут описаны в главе 11.

На высоком уровне архитектура делится на два потока: публикацию статей и составление новостной ленты.

— Посты в ленте. Когда пользователь публикует пост, соответствующая информация записывается в кэш или базу данных, а сам пост появляется в ленте новостей его друзей.

— Составление ленты новостей. Новостная лента формируется путем группировки постов ваших друзей в обратном хронологическом порядке.

На рис. 3.1 и 3.2 показан общий принцип публикации постов и, соответственно, составления новостной ленты.

image

image


Шаг 3: глубокое погружение в проектирование

На этом этапе вы и интервьюер достигли следующих целей:

— согласовали общие требования и будущий масштаб;

— начертили примерную схему архитектуры;

— узнали мнение интервьюера о вашем общем решении;

— получили какое-то базовое представление о том, на каких областях нужно сосредоточиться при подробном проектировании (исходя из того, что ответил интервьюер).

Работая совместно с интервьюером, вы должны определить компоненты архитектуры и назначить им тот или иной приоритет. Стоит подчерк­нуть, что все интервью проходят по-разному. Иногда вам могут дать понять, что желательно сосредоточиться на общей архитектуре. Иногда, если кандидат претендует на серьезную должность, обсуждение может коснуться характеристик производительности системы с вероятным упором на узкие места и оценку необходимых ресурсов. В большинстве случаев кандидата просят углубиться в детали каких-то компонентов системы. Если вы проектируете сервис для сокращения URL-адресов, особый интерес будет представлять функция хеширования, превращающая длинный адрес в короткий. В системе обмена сообщениями двумя интересными аспектами являются снижение латентности и поддержка онлайн/офлайн-статусов.

Ключевую роль играет рациональное использование времени. Очень легко зациклиться на несущественных деталях, которые не позволяют оценить ваши способности. Вы должны показать интервьюеру то, что он хочет о вас узнать. Старайтесь не углубляться в ненужные подробности. Например, лучше не скатываться в подробное обсуждение алгоритма EdgeRank, с помощью которого Facebook взвешивает публикации в своей ленте, так как это отнимает ценное время и не демонстрирует вашу способность проектировать масштабируемые системы.

Пример

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

1. Публикация постов.

2. Выдача новостной ленты.

На рис. 3.3 и 3.4 в деталях показан принцип работы этих двух функций. Подробнее об этом речь пойдет в главе 11.

image

image


Шаг 4: подведение итогов

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

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

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

— Будет интересно поговорить о внештатных ситуациях, таких как поломка серверов, разрыв сети и т.д.

— Стоит затронуть эксплуатационные вопросы. Как вы отслеживаете метрики и журналы ошибок? Как выкатывается система?

— Проведение следующего этапа масштабирования — тоже весьма интересная тема. Например, если ваша текущая архитектура поддерживает 1 миллион пользователей, какие изменения нужно внести, чтобы увеличить эту цифру до 10 миллионов?

— Если еще остается время, предложите дальнейшие улучшения.
В заключение составим краткий список того, что следует и не следует делать.
Рекомендуется

— Всегда уточняйте. Не надейтесь на то, что ваши предположения окажутся верными.

— Определитесь с требованиями.

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

— Делитесь мыслями с интервьюером. Общайтесь с ним.

— По возможности предложите разные подходы.

— Согласовав с интервьюером общую архитектуру, подробно обсудите каждый компонент. Начинайте проектирование с самых важных компонентов.

— Предлагайте разные идеи. Хороший интервьюер работает с кандидатом, как с членом своей команды.

— Никогда не сдавайтесь.

Не рекомендуется

— Не приходите на интервью, не подготовившись к типичным вопросам.

— Не начинайте работать над решением, пока не уточните требования и собственные предположения.

— Не уделяйте сразу слишком много времени какому-то одному компоненту. Предложите общую архитектуру, а затем уже погружайтесь в детали.

— Если испытываете затруднения, не стесняйтесь обратиться за подсказкой.

— Опять же, не замыкайтесь в себе. Не рассуждайте молча.

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

Время, выделяемое на каждый этап

Вопросы, задаваемые на интервью по проектированию ИТ-систем, обычно носят крайне общий характер, и для обсуждения всей архитектуры целиком недостаточно 45 минут или часа. Очень важно рационально использовать свое время. Сколько минут следует выделить на каждый этап? Ниже приводятся очень приблизительные рекомендации о том, как разбить 45-минутное интервью. Пожалуйста, имейте в виду, что это лишь примерные расчеты: распределение времени зависит от масштабов задачи и требований, которые озвучил интервьюер.

Шаг 1. Понять задачу и определить масштаб: 3–10 минут.

Шаг 2. Предложить общее решение и получить одобрение: 10–15 минут.

Шаг 3. Подробное проектирование: 10–25 минут.

Шаг 4. Подведение итогов: 3–5 минут.

Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

Для Хаброжителей скидка 25% по купону — Design

Комментарии (13)


  1. likhtarovich
    10.02.2022 19:25
    +2

    Плохая книга, для перевода можно было выбрать что-то более подробно объясняющее проектирование, чем книжку скомпилированную из высокоуровневых абстракций без детального погружения в конкретную тему и контекст.


    1. Deq56
      10.02.2022 19:34

      А какие книги по подобной тематике посоветуете?


      1. Diamon33
        10.02.2022 20:00

        DDIA


        1. onyxmaster
          10.02.2022 22:37
          +5

          Я всем люблю советовать книжку с кабаном, но книга из статьи это условно говоря набор чеклистов, и, поверьте мне, не стоит отрицать эффективность следования чеклисту, особенно если противопоставлять ему блуждание в потёмках собственного незнания. Можно иметь 10+ лет опыта, а можно прочесть книжку и разом набрать процентов 10-15 этого опыта за неделю-две. Да, "теория без практики мертва", да остальные 85-90 так просто не набрать, но польза от таких книг всё-таки есть.

          Кстати, у Марка Зимана недавно вышла книжка "Code That Fits in Your Head", и по сравнению например с его семинарами по основами функционального программирования она кажется слишком... простой, но тем не менее я советую всем прочесть и её тоже.


          1. Diamon33
            11.02.2022 09:03

            Видимо, кому-то не понравился мой лаконичный комментарий.

            DDIA - не набор чеклистов, а довольно подробный разбор существующих подходов для хранения, пересылки и организации данных с учетом подходов в существующим приложениях. Книга для души.

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

            Что и говорить, основная причина, по которым я заваливаю интервью - System Design.


            1. onyxmaster
              11.02.2022 09:42
              +1

              Комментарий не понравился не мне, минус не мой.

              Я и не говорил что DDIA это набор чеклистов, прочтите пожалуйста мой комментарий внимательно, обратив внимание на пассаж "книга из статьи".


              1. Diamon33
                11.02.2022 19:03

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

                Возможно, мне стоило ответить непосредственно на свой же комментарий.


      1. likhtarovich
        10.02.2022 20:06
        +1

        Надо осознать что "золотых" решений нет. Задача любого интервью по проектированию ( system design ) - оценить насколько человек владеет умением проектировать классы, модули, компоненты и далее масштабировать. Как выбирает решение, какими идеями и принципами руководствуется при выборе, насколько тщательно составляет требования к задаче и видит/может продумать подводные камни.
        Если что-то читать по проектированию, то скорее классику: GOF, Domain-Driven Design от Eric Evans, Patterns of Enterprise Application Architecture от Fowler, Object Thinking от David West, Agile Principles, Patterns, and Practices от Robert Martin.
        Это, при наличии опыта в разработке, даст понимание основных принципов проектирования систем и идей лежащих за ними.
        Потом понимать какие принципы заложены в работу тех или иных систем: как работают компьютерные сети и интернет: здесь Таненбаум пригодится или Computer Networking A Top-Down Approach от Kurose & Ross.
        Еще материалы конференций помогут, особенно что-то типа Highload ++, там как раз очень часто объясняют почему выбрали то или иное решение при проектировании сервисов или продуктов, начиная от объяснений типа ничего другого не знали, до вдумчивых аргументов за тот или иной подход.

        В общем нет какой-то одной книжки, которая научит мыслить как проектировщик и поможет пройти интервью.


    1. oji
      11.02.2022 02:28
      +1

      На мой взгляд, цель подобных книжек - научить проходить определённые этапы игры собеседования. Придуманные для грубого отсева толпы страждущих в условном FAANG/MANGA методики подхватили в виде карго-культа многие компании попроще. Отсюда растёт востребованность литературы с шаблонными ответами на не менее шаблонные вопросы вида "придумайте архитектуру твиттера", и сайтов типа CodeWars / LeetCode с задачками вроде переворачивания двоичных деревьев. Текущий аналог вопросов про "круглые люки", показывающих лишь то, изучил ли кандидат брошюрку по теме.


      1. Diamon33
        11.02.2022 09:10
        +3

        Именно так это и есть, могу этот "спорт" в свою очередь сравнить с подготовкой к экзамену IELTS.

        Вроде же можно "просто хорошо знать английский язык", однако правила, по которым проводится экзамен, структура задач, ключевые моменты в вопросах, порядок слов, предлогов и артиклей, время пауз - зная все это студент может получить значительное преимущество при сдаче.

        А если методика работает, то ее будут совать куда попало. Не идут кандидаты? Ну сделаем уровень задач попроще - и пойдут.


  1. onyxmaster
    10.02.2022 22:41
    +2

    Кстати, @ph_piter, "Code That Fits in Your Head" планируете к выпуску? Возьму одну ещё себе на русском (две на английском у меня уже есть), и штуки три на русском раздать для образования знакомым =)


  1. XaBoK
    10.02.2022 23:43
    +2

    Проектировать систему и проходить собесодования - разные задачи. Для собеседования не важно насколько хорошее решение вы дадите. Важно насколько хорошо его поняла комиссия (обычно такие интервью не делают тет-а-тет). И, конечно, насколько ваше решение совпадает с их мнением, которое, кстати, может быть совсем отличным от принятого, модного или даже оптимального.


  1. Dahgoth
    12.02.2022 12:51

    Общие принцип?