Как Я Научился Сдавать Секции Архитектуры

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

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



План

Очень важно иметь его.

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

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

Мой план был примерно таким:

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

    Этот простой трюк поможет вам запомнить важное ограничение или предположение.

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

  3. Создайте простейшее решение, рассчитанное на одну машину, которое хоть как-то будет работать.

    Нет необходимости начинать с 20 дата-центров по всему миру; гораздо лучше добиваться этого постепенно.

  4. Найдите единственную точку отказа или узкое место в производительности.

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

  6. Выберите один из вариантов и перейдите к пункту 4, если время еще есть, а если оно заканчивается, перейдите к следующему пункту
  7. Оцените размер хранилища, количество серверов, пропускную способность сети, внимательно все это запишите.

  8. Бонус: рассказываем о дополнительных функциях, реализации ML, метриках продукта, экспериментах.

Очень важно контролировать время.

Я старался уделить 5-10 минут на первые два пункта и 5 минут на два последних.



Торговцы

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

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

Компромиссы могут быть примерно такими:

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

  2. Шардинг решает проблему нагрузки и нехватки места, но добавляет проблемы с перешардингом в будущем.

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

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

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

  6. Существующее решение хорошо тем, что оно уже существует, но вам придется его найти.



Числа

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

В конечном итоге важно следующее:

  1. Узнайте временные затраты на чтение данных с разных уровней кэшей процессора, памяти, SSD, HDD и сети.

  2. Запомните время поездок туда и обратно внутри дата-центра и по всему земному шару, а также минимальную задержку, которую человек ощущает как лаг (~100мс).

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



Упражняться

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

Я рисовал на плате схемы, прикидывал нагрузку и требуемые ресурсы, искал слабые места в своей конструкции.

Еще у меня есть классные друзья, с которыми мы организовывали псевдосекции и тренировались друг на друге — это был суперполезный опыт. После практики вы можете зайти в Интернет и посмотреть, как это делается на самом деле, а затем попробовать еще раз.

После 10-20 обходов разными сервисами наступает просветление и начинают отчетливо видны отдельные повторяющиеся детали в существующих системах.

Запасными частями могут быть, например:

  1. Поиск (желательно с возможностью обновления индекса в реальном времени)
  2. Хранилище файлов (gfs, haystack)
  3. Распределенное хранилище напряжения (Кассандра, Динамо)
  4. Очередь сообщений и системы pub-sub в целом (kafka)
  5. Лента новостей (твиттер, инстаграм, фейсбук)
  6. Чат, мессенджер, сервер для онлайн-игр (whatsapp, Telegram, Battle.net)
  7. Стриминг, видео и аудио чат (skype, twitch, youtube)


Ресурсы

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

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

  2. Руководство по проектированию системы .

    По этой ссылке много полезного материала, но в ней легко запутаться.

  3. Видео с конференций о том, как это работает (их тысячи).

    После пары десятков видео начинаешь видеть слабые места решений из первых двух пунктов.

    Реальные системы иногда проще, чем описано в учебных материалах, а иногда наоборот.

  4. Веб-сайт Высокая масштабируемость
  5. Что ж, самый важный ресурс — это ваши друзья и знакомые, которые знают, как работают их системы, и могут рассказать вам о них.



Несколько хороших видео и каналов

1. Масштабируемость 2. Введение в интервью по архитектуре и системному дизайну 3. Четыре архитектурных шаблона распределенных систем 4. Дропбокс в 2012 году 5. Слабый 6. Твиттер 7. Реддит 8. Инстаграм 9. Ютуб в 2007 году 10. Канал о системном дизайне от соотечественника 11. Другой канал 12. И еще канал Если у вас нет жестких временных рамок, но перспектива собеседования уже маячит на горизонте, самой правильной тактикой будет постоянно читать/смотреть что-то в фоновом режиме о проектировании больших систем.

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

Однако интенсивная подготовка к архитектурному разделу за короткое время сделала меня гораздо лучшим специалистом.

Теги: #Карьера в IT-индустрии #интервью #архитектура #интервью

Вместе с данным постом часто просматривают: