Ответ вслух Middle System design на фронте спрашивают часто обновлено

Офлайн-режим

Вопрос

Спроектируй приложение, которое работает без сети: заметки, которые можно править офлайн.

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

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

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

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

Коротко

Разделяем: оболочка (HTML, JS, CSS) кэшируется service worker'ом, данные живут в IndexedDB, изменения копятся в очереди. Очередь - главное.

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

  • уточнил, что именно должно работать офлайн: чтение, правка или всё

  • service worker кэширует оболочку, IndexedDB хранит данные

  • очередь неотправленных изменений с ключами идемпотентности

  • стратегия разрешения конфликтов выбрана и названа явно

  • индикатор состояния: офлайн, синхронизируется, разошлось

  • фоновая синхронизация при возврате сети

  • версионирование кэша: как выкатывать новую версию приложения

  • что нельзя делать офлайн - сказать честно, а не изображать всемогущество

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

  • Как разрешать конфликт, если правили с двух устройств?
  • Чем IndexedDB лучше localStorage здесь?
  • Как выкатить новую версию, не сломав открытые вкладки?

Разбор

Разделяем: оболочка (HTML, JS, CSS) кэшируется service worker'ом, данные живут в IndexedDB, изменения копятся в очереди.

Очередь - главное. Каждая правка получает клиентский идентификатор и уходит на сервер при возврате сети; ключ идемпотентности не даёт продублировать при повторе.

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

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

И версионирование: новый service worker не должен подхватываться посреди сессии - иначе получим смесь старого и нового кода.

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

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