img

Руководство по выживанию на собеседовании по проектированию систем (2023): стратегии подготовки и практические советы

 

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

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

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

Коротко о данном руководстве

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

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

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

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

В чем состоит цель собеседования по проектированию систем?

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

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

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

Мой личный опыт прохождения собеседований по проектированию систем

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

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

Стратегии подготовки

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

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

А. Ключевые концепции и принципы

Здесь приведены некоторые основные понятия, которые вы должны знать:

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

Вертикальное и горизонтальное масштабирование: сравнение

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

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

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

Б. Известные шаблоны проектирования

Здесь приведены 7 самых известных шаблонов проектирования:

  • Шаблон на основе микрослужб (Microservices): это шаблон архитектуры программного обеспечения, в котором приложение представляет собой набор небольших независимых служб, которые взаимодействуют друг с другом по сети. Каждая из этих служб выполняет определенную функцию, а также разрабатывается, развертывается и масштабируется независимо от других. У этого шаблона есть ряд преимуществ, например, повышенная масштабируемость, улучшенная отказоустойчивость и более быстрое развертывание. Однако использование этого шаблона влечет за собой некоторые дополнительные сложности, например, появляется необходимость в обнаружении служб и обеспечении взаимодействия между ними.
  • Шаблон источников событий (Event Sourcing): это шаблон, в котором состояние приложения представляется в виде потока событий, а не моментального снимка его текущего состояния. Этот шаблон чаще всего применяется в системах, которые должны обрабатывать огромное количество одновременных обновлений. Сюда относятся финансовые системы и игровые платформы. С помощью шаблона источников событий можно с легкостью воспроизводить события. Это может существенно помочь вам, когда вы будете проводить отладку и ревизию системы. Но также у этого шаблона есть один недостаток: для того, чтобы поддерживать поток событий, вам потребуются дополнительная память и вычислительные ресурсы. 
  • Шаблон сегментирования (Sharding): этот шаблон подразумевает горизонтальное сегментирование данных между несколькими компьютерами. Это необходимо для повышения масштабируемости и производительности системы. В сегментированной системе каждый компьютер отвечает за определенную часть данных. Соответственно, запросы для получения доступа к этим данным будут отправляться на соответствующий компьютер, а для этого нужен специальный ключ раздела данных. Сегментирование может помочь распределить нагрузку на систему, повысить скорость чтения и записи данных, а также увеличить общую производительность системы. Но с таким подходом также связаны и дополнительные сложности. Например, появляется необходимость согласованного хэширования и репликации данных. К тому же, клиенты должны быть в курсе того, что система использует шаблон сегментирования. 

Сегментирование базы данных

 

  • CQRS (Command Query Responsibility Segregation – Разделение ответственности на команды и запросы): это шаблон, который позволяет разделить операции чтения и записи данных на отдельные модели. Таким образом можно повысить производительность и масштабируемость системы. Такой шаблон отлично подойдет для систем, которые обрабатывают большой объем операций записи и чтения данных, например, для торговой онлайн-площадки. CQRS позволяет использовать различные стратегии хранения и кэширования данных, что повышает производительность как одного, так и другого. Но не все так просто: для такого шаблона требуется более сложная структура, а также вам придется приложить дополнительные усилия, чтобы поддерживать две отдельные модели данных.
  • Шаблон правила «обратный прокси-сервер» (Reverse proxy): обратный прокси – это сервер, который располагается перед одним или несколькими веб-серверами и перенаправляет запросы клиентов на нужный сервер. Этот шаблон можно использовать для того, чтобы повысить безопасность системы, а также улучшить ее производительность и масштабируемость. К тому же, обратный прокси может предоставить дополнительные функциональные возможности, например, SSL-терминацию, кэширование и сжатие данных. 

Шаблон правила «Обратный прокси-сервер»

  • Шаблон автоматического выключения (Circuit breaker): это шаблон, который используется для того, чтобы предотвратить каскадные отказы в распределенной системе. Он работает следующим образом: когда в процессе отслеживания работоспособности служб вдруг выясняется, что в одной из них есть проблема, она просто «отключается», и запросы в эту службу больше не отправляются. Таким образом можно «спасти» всю систему. 
  • Шаблон обратной связи (Backpressure): с помощью этого шаблона можно управлять скоростью обработки данных в системе, тем самым предотвращая ее перегрузку. Здесь есть два варианта. В первом случае вы можете выполнять буферизацию данных, чтобы успевать их обрабатывать с определенной скоростью. Во втором случае вы можете просто отклонять входящие данные, если на данный момент система не способна их обработать. 
  • Объектный пул (Object pool): это шаблон, который использует объекты повторно, а не создает новые, тем самым повышая производительность системы. Объектные пулы часто используются для управления дорогостоящими ресурсами, например, подключениями к базе данных или потоками.

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

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

Здесь представлены самые известные типы баз данных:

  • Реляционные базы данных: это самый распространенный тип баз данных. В таких базах данных все данные хранятся в таблицах, а для запросов и выполнения операций с ними используется SQL (Structured Query Language – язык структурированных запросов). В основе этих баз данных лежит реляционная модель, которая организует все данные в одну или несколько таблиц, при этом каждая таблица состоит из строк и столбцов. Самыми популярными примерами реляционных баз данных являются MySQL, PostgreSQL и Oracle.
  • Нереляционные базы данных: эти базы данных не используют какую-то определенную схему, они оптимизированы для обработки больших объемов неструктурированных данных. Нереляционные базы данных полностью отвечают требованиям масштабируемости и производительности современных мобильных и веб-приложений. Их, в свою очередь, также можно разделить на несколько различных типов, например, документоориентированные базы данных, хранилища данных типа «ключ-значение», графовые базы данных и колоночные базы данных. Самыми популярными примерами нереляционных баз данных являются MongoDB, Cassandra и Redis.
  • Распределённые хранилища данных типа «ключ-значение»: это разновидность нереляционных баз данных. В таких хранилищах данные хранятся в виде пар «ключ-значение». Такой тип базы данных отлично подходит для горизонтального масштабирования. Чаще всего такие хранилища данных используются в качестве уровня кэширования или для хранения данных сеанса. Самыми популярными примерами распределенных хранилищ данных типа «ключ-значение» являются Riak и Redis.
  • Документоориентированные базы данных: такие базы данных хранят данные в виде полуструктурированных документов, например, JSON или XML. Они хорошо подходят для хранения и запросов больших объемов данных. Чаще всего их используют для приложений, которые требуют гибкого моделирования данных и широких возможностей для отправки запросов. Самыми популярными примерами документоориентированных баз данных являются MongoDB и Couchbase.
  • Графовые базы данных: такие базы данных хорошо подходят для хранения и запроса данных со сложными связями. В них данные хранятся не в виде таблиц и строк, а в виде узлов и ребер. Чаще всего графовые базы данных используют для приложений, которые связаны с социальными сетями, рекомендательными системами и выявлением мошенничества. Самыми популярными примерами графовых баз данных являются Neo4j и JanusGraph.
  • Базы данных временных рядов: эти базы данных оптимизированы для хранения и запроса данных с временными метками. Чаще всего их используют для приложений, которые связаны с мониторингом данных, Интернетом вещей и финансовыми данными. Самыми популярными примерами баз данных временным рядов являются InfluxDB, OpenTSDB и Prometheus. 

Типы нереляционных баз данных

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

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

  1. Дерево Меркла
  2. Консистентное кэширование
  3. Разрешение конфликтов при чтении
  4. Gossip-протокол
  5. Фильтр Блума
  6. Алгоритм Heartbeat
  7. Теорема Брюэра (теорема CAP) и теорема PACELC

Теорема PACELC

  1. Практические советы для прохождения собеседования

А. Излагайте свои мысли

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

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

Б. Как справляться с пограничными ситуациями и ограничениями

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

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

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

В. Как отвечать на вопросы по проектированию систем на собеседовании

Здесь представлены 7 шагов, которые помогут ответить вам на любой вопрос собеседования по проектированию систем:

7 шагов для ответа на любой вопрос собеседования по проектированию систем

Шаг 1: выяснение требований

Шаг 2: грубая оценка

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

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

Шаг 5: предварительный проект

Шаг 6: более детальный проект

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

Топ вопросов на собеседованиях по проектированию систем

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

  1. Спроектируйте мессенджер Facebook
  2. Спроектируйте Youtube
  3. Спроектируйте новостную ленту Facebook
  4. Спроектируйте ограничитель частоты запросов к API
  5. Спроектируйте Twitter
  6. Спроектируйте Dropbox или Google Drive
  7. Спроектируйте поискового робота
  8. Спроектируйте поисковую систему Twitter
  9. Спроектируйте сервис коротких ссылок, такой как TinyURL
  10. Спроектируйте Instagram
  11. Спроектируйте Yelp или Nearby Friends
  12. Спроектируйте Ticketmaster

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

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

Ссылка
скопирована
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
  Проектирование масштабируемых систем – это довольно непростая задача. А если вы, к тому же, готовитесь к собеседованию по прое
img
Совсем недавно команда OpenAI  представила GPT-4o, усовершенствованную версию своей флагманской модели. И это не все новости от
img
Мы уже рассказали вам про Github, прочитать про него можно  здесь . Теперь предлагаем познакомиться с их основным конкурентом —
img
Иногда хочется простого человеческого выучить язык программирования, стать разработчиком и писать код. Если вам это созвучно, пр
img
Data Scientist — это не просто человек, который умеет работать с данными. Это эксперт, специализирующийся на сборе, обработке, а
img
Хотите успешно пройти собеседование на должность веб-разработчика или только готовитесь к интервью? Мы знаем, как вам помочь! Ло
Комментарии
ЛЕТНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59