Как распределяется логика между клиентом и сервером
Что проверяют
Умеете ли вы как аналитик решать, где должно выполняться правило, и фиксировать это в требованиях. Интервьюеру важно услышать про безопасность и единый источник правды. Следом часто спрашивают, где вы опишете эту границу и что будет, если у системы появится второй клиент.
Как отвечать
Базовый принцип: клиенту доверять нельзя, всё, что влияет на деньги, права и данные, решает сервер.
- на клиенте: отображение и состояние интерфейса, навигация, форматирование, быстрая проверка полей для удобства (обязательность, маска телефона), локальный кэш и черновики, работа без сети, если она нужна;
- на сервере: бизнес-правила и расчёты (цена, скидка, лимиты, статусная модель), проверка прав доступа, итоговая валидация, транзакции, интеграции с внешними системами;
- дублирование валидации: правило на клиенте нужно ради скорости отклика, на сервере ради корректности. Сервер проверяет всегда, даже если клиент уже проверил;
- промежуточный слой: при нескольких клиентах часто вводят BFF, серверный слой под конкретный фронт, который собирает данные из сервисов и отдаёт их в удобной форме.
Дальше про факторы выбора: сколько клиентов (веб, iOS, Android), нужен ли офлайн, как быстро придётся менять правила. Логика на сервере меняется одним релизом, а старые версии мобильного приложения живут у пользователей месяцами.
В артефактах аналитика это выглядит так: в спецификации API (OpenAPI) описаны поля, правила проверки и коды ошибок, а в требованиях к экрану отдельно указано, какие проверки клиентские, какие серверные и что видит пользователь при серверном отказе.
Где спотыкаются
Отвечают «интерфейс на клиенте, база на сервере» и останавливаются. Вопрос именно про бизнес-правила, и такой ответ его обходит.
Допускают расчёт итоговой суммы на клиенте с передачей её на сервер. Запрос легко подменить, и сервер примет любую цену.
Не учитывают несколько клиентов. Если правило реализовано в вебе и в мобильном приложении по отдельности, через пару релизов они начнут считать по-разному.