Архитектурные разделы у многих вызывают чувство неуверенности и беспокойства: формулировки не изобилуют подробностями, и непонятно, как проверить ответ. Однако умение сдать секцию архитектуры отличает вчерашнего выпускника от человека, которому можно доверить построить нечто большее, чем обход бинарных деревьев.
В определенный момент я решил как следует подготовиться к разделу «Дизайн», потратил на это около пары недель и выработал системный подход, которым хочу с вами поделиться.
План
Очень важно иметь его.Даже если вы где-то допустите ошибку и сделаете неправильный поворот в своих рассуждениях, общий структурированный подход пойдет вам на пользу.
В самом начале можно в меру тупить и расспрашивать интервьюера о деталях, но начиная с определенного момента (который в моем плане ниже соответствует пункту 3) инициатива должна быть полностью на вашей стороне и лучше всего не допускать идти до самого конца.
Мой план был примерно таким:
- Соберите список ключевых особенностей и запишите их в углу доски.
Этот простой трюк поможет вам запомнить важное ограничение или предположение.
- Поймите, какими техническими характеристиками должна обладать система: ожидаемое количество запросов в секунду, диапазон приемлемого времени отклика, ожидания в отношении согласованности и надежности.
- Создайте простейшее решение, рассчитанное на одну машину, которое хоть как-то будет работать.
Нет необходимости начинать с 20 дата-центров по всему миру; гораздо лучше добиваться этого постепенно.
- Найдите единственную точку отказа или узкое место в производительности.
- Предложите один или несколько вариантов решения проблемы, четко объясните плюсы и минусы каждого из них.
- Выберите один из вариантов и перейдите к пункту 4, если время еще есть, а если оно заканчивается, перейдите к следующему пункту
- Оцените размер хранилища, количество серверов, пропускную способность сети, внимательно все это запишите.
- Бонус: рассказываем о дополнительных функциях, реализации ML, метриках продукта, экспериментах.
Я старался уделить 5-10 минут на первые два пункта и 5 минут на два последних.
Торговцы
О них нужно говорить, даже если они кажутся очевидными.После введения любой новой детали важно сказать что-то в духе «мы добавили новый элемент, это решит такую-то проблему, но мы заплатим за это такой-то».
Компромиссы могут быть примерно такими:
- Любые новые компоненты системы или увеличение количества существующих запчастей решают проблему скорости загрузки/отклика, но добавляют головной боли с поддержкой и развертыванием.
- Шардинг решает проблему нагрузки и нехватки места, но добавляет проблемы с перешардингом в будущем.
- Реплицированное хранилище решает проблему нагрузки и надежности, но в случае с репликами чтения и записи заставляет задуматься о гнилых значениях и противостоянии доступности и консистентности.
- Кэш решает проблему загрузки, но заставляет задуматься о тухлых значениях и когерентности кеша.
- Вы можете легко изменить собственное решение и оптимизировать его под свои нужды, но сначала вам придется его написать.
- Существующее решение хорошо тем, что оно уже существует, но вам придется его найти.
Числа
Все знают о цифры задержки, которые должен знать каждый программист , но цифры в ссылке, на мой взгляд, структурированы не самым удобным образом и в процессе подготовки я их переформатировал для удобства запоминания.В конечном итоге важно следующее:
- Узнайте временные затраты на чтение данных с разных уровней кэшей процессора, памяти, SSD, HDD и сети.
- Запомните время поездок туда и обратно внутри дата-центра и по всему земному шару, а также минимальную задержку, которую человек ощущает как лаг (~100мс).
- Чтобы иметь возможность быстро конвертировать байты в гигабайты, наносекунды в секунды и т. д., я сам выработал этот навык на практике.
Упражняться
Я купил доску для сухого стирания, взял существующие сервисы и попытался придумать, как их создать с нуля.Я рисовал на плате схемы, прикидывал нагрузку и требуемые ресурсы, искал слабые места в своей конструкции.
Еще у меня есть классные друзья, с которыми мы организовывали псевдосекции и тренировались друг на друге — это был суперполезный опыт. После практики вы можете зайти в Интернет и посмотреть, как это делается на самом деле, а затем попробовать еще раз.
После 10-20 обходов разными сервисами наступает просветление и начинают отчетливо видны отдельные повторяющиеся детали в существующих системах.
Запасными частями могут быть, например:
- Поиск (желательно с возможностью обновления индекса в реальном времени)
- Хранилище файлов (gfs, haystack)
- Распределенное хранилище напряжения (Кассандра, Динамо)
- Очередь сообщений и системы pub-sub в целом (kafka)
- Лента новостей (твиттер, инстаграм, фейсбук)
- Чат, мессенджер, сервер для онлайн-игр (whatsapp, Telegram, Battle.net)
- Стриминг, видео и аудио чат (skype, twitch, youtube)
Ресурсы
- Прохождение собеседования по проектированию системы .
Не все решения оттуда оптимальны, некоторые откровенно слабы, но материал хорошо структурирован и служит хорошей отправной точкой.
- Руководство по проектированию системы .
По этой ссылке много полезного материала, но в ней легко запутаться.
- Видео с конференций о том, как это работает (их тысячи).
После пары десятков видео начинаешь видеть слабые места решений из первых двух пунктов.
Реальные системы иногда проще, чем описано в учебных материалах, а иногда наоборот.
- Веб-сайт Высокая масштабируемость
- Что ж, самый важный ресурс — это ваши друзья и знакомые, которые знают, как работают их системы, и могут рассказать вам о них.
Несколько хороших видео и каналов
1. Масштабируемость 2. Введение в интервью по архитектуре и системному дизайну 3. Четыре архитектурных шаблона распределенных систем 4. Дропбокс в 2012 году 5. Слабый 6. Твиттер 7. Реддит 8. Инстаграм 9. Ютуб в 2007 году 10. Канал о системном дизайне от соотечественника 11. Другой канал 12. И еще канал Если у вас нет жестких временных рамок, но перспектива собеседования уже маячит на горизонте, самой правильной тактикой будет постоянно читать/смотреть что-то в фоновом режиме о проектировании больших систем.То же и с алгоритмическими задачами: лучше решать их периодически и всегда быть в тонусе, чем пытаться освоить весь литературный код на выходных перед собеседованием.
Однако интенсивная подготовка к архитектурному разделу за короткое время сделала меня гораздо лучшим специалистом.
Теги: #Карьера в IT-индустрии #интервью #архитектура #интервью
-
3D-Фоны Для Рабочего Стола
19 Oct, 24 -
Дум Бой Esp32. Вторая Итерация
19 Oct, 24 -
Перспективы И Пустота
19 Oct, 24