Ответ вслух Middle System design на фронте обновлено

Календарь с бронированием

Вопрос

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

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

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

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

Что должно прозвучать в ответе

  • уточнил часовые пояса, длительность слотов и правила пересечений

  • время хранится в UTC, показывается в поясе пользователя

  • сервер - единственный, кто решает, свободен ли слот

  • гонка за слот: оптимистичная блокировка или короткое удержание

  • виртуализация длинных диапазонов и подгрузка по видимому окну

  • повторяющиеся события: хранить правило, а не тысячу записей

  • обновление занятости у других пользователей: опрос или подписка

  • переход на летнее время и сутки не по 24 часа

Что могут спросить следом

  • Как удержать слот на время заполнения формы?
  • Как хранить повторяющееся событие с исключениями?
  • Что показать, если слот заняли, пока пользователь заполнял форму?

Разбор

Часовые пояса: первое, что спросят. Хранить в UTC, показывать в поясе пользователя, пояс брать явно, а не из системы молча: человек в командировке ожидает увидеть время своего календаря, а не местное. И отдельно проговорить, что бывают сутки не по 24 часа из-за перевода часов.

Занятость решает сервер. Клиент показывает свободные слоты, но при нажатии всё равно получает отказ, если кто-то успел раньше. Отсюда гонка: два пользователя жмут один слот. Варианты: короткое удержание слота на время оформления или оптимистичная блокировка по версии. Сказать, какой выбрал и почему.

Повторяющиеся события хранятся правилом (RRULE), а не миллионом записей; развёртка по видимому диапазону.

Показ длинных диапазонов: виртуализация по дням и подгрузка по мере прокрутки.

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

Ответьте сами, а не прочитайте

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