Подготовка к собеседованию по системному дизайну: овладение искусством системного проектирования

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

В этом всеобъемлющем руководстве мы погрузимся в искусство проведения собеседований по проектированию систем. Я поделюсь идеями и стратегиями, которые помогли мне пройти собеседования в FAANG.

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

  1. Получите глубокое понимание фундаментальных концепций проектирования системы, таких как Балансировка нагрузки, Кэширование, Разделение на разделы, Репликация, >Теорема CAP и SQL против NoSQL.
  2. Изучите и попрактикуйтесь, отвечая на распространенные вопросы на собеседованиях по проектированию систем.

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

Итак, мой вам совет: изучите основы проектирования систем, а затем попрактикуйтесь в решении общих проблем проектирования систем и ознакомьтесь с широко используемыми технологиями и шаблонами проектирования. Это лучший способ показать им, что вы готовы к работе.

Подробный список общих вопросов для собеседования по проектированию систем и основных понятий см. в разделе Грокинг интервью по проектированию систем.

Оглавление

Мой опыт проведения собеседований по системному проектированию
Обзор этого руководства
Каковы цели собеседования по системному проектированию?
1. Понимание основ проектирования систем
2. Практические советы для собеседования
3. Следуйте основному шаблону проектирования системы
4. Самые популярные вопросы на собеседовании по проектированию систем
5. Ресурсы системного проектирования и стратегия
6. Готовы пройти ваше следующее собеседование с техническими специалистами?

Мой опыт прохождения собеседований по системному дизайну

Как соучредитель Design Gurus и автор серии Grokking по кодированию и системному дизайну, интервью. Я привношу 20-летний опыт разработки программного обеспечения. Приняв участие в более чем 30 циклах собеседований и более чем в 500 собеседованиях по программированию и проектированию систем, я был по обе стороны стола для собеседований.

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

У гуру дизайна есть один из наиболее полных наборов курсов по проектированию систем, взгляните на Интервью по Grokking the System Design и Grokking the Advanced System Design Interview. сильный>.

Обзор этого руководства

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

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

Давайте начнем с понимания природы интервью по системному проектированию.

Каковы цели собеседования по проектированию системы?

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

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

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

1. Понимание основ системного проектирования

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

а. Ключевые понятия и принципы

Вот несколько основных понятий, которые вы должны понимать:

  • Масштабируемость: способность системы справляться с растущими объемами нагрузки или трафика. Важно понимать различные подходы к масштабируемости, такие как горизонтальное масштабирование (добавление дополнительных машин в систему) и вертикальное масштабирование (добавление дополнительных ресурсов на одну машину).

  • Отказоустойчивость: способность системы продолжать работу, несмотря на отказ одного или нескольких ее компонентов. Такие методы, как резервирование и балансировка нагрузки, могут помочь повысить отказоустойчивость системы.
  • Балансировка нагрузки. Балансировщики нагрузки распределяют рабочие нагрузки между несколькими компьютерами, чтобы оптимизировать использование ресурсов и гарантировать, что ни один компьютер не будет перегружен.
  • Кэширование: хранение часто используемых данных на уровне высокоскоростного хранилища для снижения нагрузки на базовое хранилище данных и повышения производительности системы.
  • Доступность: способность системы своевременно реагировать на запросы. Это тесно связано с отказоустойчивостью и обычно измеряется в процентах от времени, в течение которого система находится в рабочем состоянии.
  • Согласованность: степень, в которой все узлы в распределенной системе одновременно видят одни и те же данные. Согласованность можно разделить на различные уровни, такие как сильная согласованность, окончательная согласованность и отсутствие согласованности.
  • Задержка: время, необходимое для обработки запроса и возврата ответа. Задержка является важным фактором при проектировании системы, особенно для систем, обрабатывающих данные в реальном времени.
  • Пропускная способность: количество запросов, которые система может обработать в единицу времени. Пропускная способность тесно связана с масштабируемостью и часто используется как мера производительности системы.
  • Толерантность к разделам: способность системы продолжать работу при возникновении сетевых разделов. В распределенных системах невозможно одновременно обеспечить согласованность и устойчивость к разделам, поэтому разработчик должен решить, какой из них более важен для варианта использования.
  • Теорема CAP. Теорема утверждает, что распределенная система не может одновременно обеспечивать все три из следующих гарантий: непротиворечивость, доступность и устойчивость к разделам.
  • Свойства ACID: набор свойств, гарантирующих надежную обработку транзакций базы данных. Аббревиатура расшифровывается как атомарность, согласованность, изоляция и долговечность.

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

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

б. Общие шаблоны проектирования:

Вот 7 самых известных шаблонов дизайна:

  • Микрослужбы. Это шаблон архитектуры программного обеспечения, в котором приложение разбивается на набор небольших независимых служб, которые взаимодействуют друг с другом по сети. Каждая служба отвечает за определенную функциональность и разрабатывается, развертывается и масштабируется независимо. Микросервисы предлагают несколько преимуществ, таких как повышенная масштабируемость, улучшенная отказоустойчивость и более быстрые циклы развертывания. Однако они также вносят дополнительные сложности, такие как необходимость обнаружения служб и взаимодействия между службами.
  • Источник событий. Источник событий — это шаблон, в котором состояние приложения представлено в виде потока событий, а не моментального снимка его текущего состояния. Этот шаблон часто используется в системах, которым необходимо обрабатывать большое количество одновременных обновлений, таких как финансовые системы и игровые платформы. Источник событий позволяет легко воспроизводить события, что может быть полезно для отладки и аудита. Однако для поддержки потока событий также требуются дополнительные ресурсы хранения и вычислительные ресурсы.
  • Шардинг: Шардинг — это метод горизонтального разделения данных между несколькими машинами с целью повышения масштабируемости и производительности. В разделенной системе каждый компьютер отвечает за определенное подмножество данных, и запросы направляются на соответствующий компьютер на основе ключа раздела данных. Разделение можно использовать для распределения нагрузки на систему, повышения производительности чтения и записи и увеличения общей емкости системы. Однако это также приводит к дополнительным сложностям, таким как необходимость согласованного хеширования, репликации данных и клиентов, поддерживающих разделы; следуйте этому, чтобы узнать больше о недостатках шардинга.

  • CQRS (разделение ответственности за запросы команд). CQRS — это шаблон, который разделяет операции чтения и записи в системе на отдельные модели, что позволяет оптимизировать производительность и масштабируемость. Этот шаблон может быть полезен в системах, обрабатывающих большой объем операций чтения и записи, таких как веб-сайты электронной коммерции. CQRS позволяет использовать различные хранилища данных и стратегии кэширования для операций чтения и записи, повышая производительность обоих. Однако это также требует более сложного дизайна и дополнительных усилий для поддержки двух отдельных моделей данных.
  • Обратный прокси-сервер. Обратный прокси-сервер — это сервер, который находится перед одним или несколькими веб-серверами и перенаправляет запросы клиентов на соответствующий сервер. Его можно использовать для повышения безопасности, производительности и масштабируемости системы. Его также можно использовать для предоставления дополнительных функций, таких как терминация SSL, кэширование и сжатие.

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

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

в. Знакомство с различными типами баз данных

Вот самые известные типы баз данных:

  • Реляционные базы данных. Реляционные базы данных являются наиболее распространенным типом баз данных и хранят данные в таблицах, используя SQL (язык структурированных запросов) для запросов и управления этими данными. Они основаны на реляционной модели, которая организует данные в одну или несколько таблиц, каждая из которых состоит из строк и столбцов. Популярные примеры реляционных баз данных включают MySQL, PostgreSQL и Oracle.
  • Базы данных NoSQL. Базы данных NoSQL, также известные как базы данных не только SQL, не используют фиксированную схему и оптимизированы для обработки больших объемов неструктурированных данных. Они разработаны с учетом требований масштабирования и производительности современных веб-приложений и мобильных приложений. Базы данных NoSQL можно разделить на различные типы, такие как базы данных документов, хранилища ключей и значений, базы данных графов и хранилища семейств столбцов. Популярные примеры баз данных NoSQL включают MongoDB, Cassandra и Redis.
  • Распределенные хранилища "ключ-значение". Распределенные хранилища "ключ-значение" — это тип базы данных NoSQL, в которой данные хранятся в виде пар "ключ-значение" и предназначен для горизонтального масштабирования. Они часто используются в качестве уровня кэширования или для хранения данных сеанса. Популярными примерами распределенных хранилищ ключей и значений являются Riak и Redis.
  • Базы данных документов. Базы данных документов хранят данные в виде полуструктурированных документов, таких как JSON или XML, и оптимизированы для хранения и запросов больших объемов данных. Они часто используются для приложений, требующих гибкого моделирования данных и широких возможностей запросов. Популярные примеры баз данных документов включают MongoDB и Couchbase.
  • Графические базы данных. Базы данных графов оптимизированы для хранения и запроса данных со сложными отношениями. Они хранят данные в виде узлов и ребер, а не таблиц и строк, и часто используются для приложений, связанных с социальными сетями, рекомендательными системами и обнаружением мошенничества. Популярные примеры графовых баз данных включают Neo4j и JanusGraph.
  • Базы данных временных рядов. Базы данных временных рядов оптимизированы для хранения и запроса данных с временными метками. Они часто используются для приложений, связанных с мониторингом, IoT и финансовыми данными. Популярные примеры баз данных временных рядов включают InfluxDB, OpenTSDB и Prometheus.

д. Знание различных типов распределенных систем и алгоритмов

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

  1. Дерево Меркле
  2. Последовательное хеширование
  3. Читать Ремонт
  4. Протокол сплетен
  5. Фильтр Блума
  6. "Сердцебиение"
  7. Теоремы CAP и PACELC

Подробнее об этих алгоритмах.

2. Практические советы для интервью

а. Общение с вашим мыслительным процессом

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

  1. Начните с формулировки проблемы. Четко объясните проблему, которую вы пытаетесь решить, и требования к системе. Это поможет интервьюеру понять ваш подход и то, как вы планируете решать проблему.
  2. Разбейте проблему. Разделите проблему на более мелкие части и объясните, как вы будете решать каждую часть по отдельности. Это облегчит интервьюеру понимание вашего подхода и того, как вы продумываете проблему.
  3. Используйте диаграммы и эскизы: рисуйте диаграммы и эскизы, чтобы объяснить свой дизайн. Это облегчит интервьюеру визуализацию вашего дизайна и понимание того, как различные компоненты системы взаимодействуют друг с другом.
  4. Обсудите компромиссы и ограничения: объясните компромиссы, которые вы сделали, и ограничения, которые вы учитывали в процессе проектирования. Это продемонстрирует ваше понимание проблемы и вашу способность принимать обоснованные решения.
  5. Объясните свои доводы. Четко объясните, почему вы приняли определенные дизайнерские решения и как они решают проблему и требования. Это поможет интервьюеру понять ход ваших мыслей и то, как вы пришли к решению.
  6. Будьте готовы отвечать на вопросы и предлагать альтернативы. Интервьюер может задавать дополнительные вопросы о вашем дизайне, быть готовым ответить на них, а также быть готовым предоставить альтернативы и объяснить плюсы и минусы каждой из них.
  7. Будьте открыты для отзывов. Будьте открыты для отзывов и будьте готовы пересмотреть свой дизайн на основе отзывов интервьюера. Это продемонстрирует вашу способность повторять и улучшать дизайн на основе отзывов.

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

б. Обработка пограничных случаев и ограничений

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

  1. Предвидеть крайние случаи. Подумайте о потенциальных крайних случаях и о том, как они могут повлиять на ваш дизайн. Примеры пограничных случаев включают высокий трафик, нехватку памяти и высокий уровень параллелизма пользователей.
  2. План на случай сбоя. Подумайте, как ваш проект будет реагировать на сбои и как он будет поддерживать доступность и согласованность в случае сбоя.
  3. Учитывайте масштабируемость. Подумайте, как будет масштабироваться ваш дизайн по мере увеличения количества пользователей или объема данных.
  4. Подумайте о безопасности. Подумайте, как ваш дизайн защитит конфиденциальные данные и обеспечит безопасность.
  5. Будьте готовы объяснить свои доводы. Будьте готовы объяснить, почему вы приняли те или иные дизайнерские решения и как они учитывают крайние случаи и ограничения.

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

в. Как ответить на вопрос о системном дизайне на собеседовании

Вот 7-этапный процесс, чтобы ответить на любой вопрос собеседования по проектированию системы:

Шаг 1. Уточнение требований

Шаг 2. Предварительная оценка

Шаг 3. Определение системного интерфейса

Шаг 4. Определение модели данных

Шаг 5. Проект высокого уровня

Шаг 6. Детальный дизайн

Шаг 7. Выявление и устранение узких мест

Для получения дополнительной информации о каждом из этих шагов см. Пошаговое руководство.

3. Следуйте основному шаблону проектирования системы

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

Подробнее см. в разделе Мастер-шаблон проектирования системы.

4. Основные вопросы на собеседовании по проектированию систем

Вот 12 основных вопросов для собеседования по проектированию систем, которые задают ведущие технологические компании, в том числе FAANG (Facebook, Apple, Amazon, Netflix и Google).

  1. Дизайн Facebook Messenger
  2. Дизайн Ютуб
  3. Дизайн новостной ленты Facebook
  4. Разработка ограничителя скорости API
  5. Дизайн Твиттера
  6. Дизайн Dropbox или Google Drive
  7. Разработка веб-краулера
  8. Дизайн Поиск в Твиттере
  9. Создайте службу сокращения URL-адресов, например TinyURL.
  10. Дизайн Инстаграм
  11. Дизайн Yelp или ближайших друзей
  12. Дизайн Билетмастер

Смотрите больше вопросов для интервью по системному дизайну с ответами здесь и здесь.

5. Ресурсы для проектирования системы и стратегия

Исходя из своего опыта, могу порекомендовать следующее:

Для младших инженеров я рекомендую Grokking the Object Oriented Design Interview.

6. Готовы пройти ваше следующее техническое собеседование?

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

Взгляните на Интервью Grokking the System Design Interview, чтобы получить ответы на такие вопросы, как:

  1. Разработка службы обмена файлами, такой как Google Drive или Dropbox.
  2. Разработка популярной службы обмена сообщениями, такой как Facebook Messenger.
  3. Разработка сайтов популярных социальных сетей, таких как Twitter или Facebook.
  4. Разработка глобального сервиса потокового видео, такого как Youtube.
  5. Разработка глобальной службы заказа такси, такой как Uber.

Чтобы изучить архитектуру программного обеспечения и попрактиковаться в вопросах собеседования по продвинутому системному проектированию, ознакомьтесь с разделом Grokking the Advanced System Design Interview.







Спасибо за прочтение