Как работать с изменениями архитектуры бэкенда при обновлении мобильных приложений
Что проверяют
Понимаете ли вы главное отличие мобильного клиента от веба: старые версии приложения живут у пользователей месяцами, и обновить всех разом нельзя. Интервьюер хочет услышать, как вы договариваетесь с бэкендом о совместимости и что делаете, когда она всё же ломается. Следом часто спрашивают, как откатить неудачный релиз.
Как отвечать
Контракт API должен меняться только совместимо, а клиент должен переживать неожиданные ответы:
- аддитивные изменения: новые поля и эндпоинты добавляются, старые не удаляются и не переименовываются, пока ими пользуются живые версии;
- версионирование: ломающее изменение уходит в новую версию (
/v2/в пути или заголовок), старая работает до отключения; - терпимый парсер: в
kotlinx.serializationвключаютignoreUnknownKeys = true, новым полям дают значения по умолчанию, аcoerceInputValues = trueспасает от неизвестного значения enum, если у свойства есть дефолт; - версия клиента в запросе: заголовок с
versionCodeпоказывает бэкенду, сколько пользователей сидит на старых сборках и когда версию можно отключать; - принудительное обновление: минимальная поддерживаемая версия приходит из конфига, обновление запускается через In-App Updates API в режиме
IMMEDIATEилиFLEXIBLE; - фиче-флаги: функция включается с сервера, когда бэкенд готов, и выключается без нового релиза.
Про откат скажите честно: в Google Play откатить версию нельзя. Можно остановить поэтапную раскатку, но те, кто уже обновился, останутся на ней, а исправление выходит новой сборкой с большим versionCode. Поэтому риск снижают заранее: поэтапный rollout, флаги и контрактные тесты между клиентом и сервером.
Где спотыкаются
Предлагают выпустить обновление одновременно с бэкендом. Часть пользователей не обновится неделями, и у них приложение сломается.
Не знают, что kotlinx.serialization по умолчанию падает на неизвестном ключе, в отличие от Gson, и узнают об этом из крашей после релиза бэкенда.
Обещают «быстрый откат релиза», хотя в магазине приложений такой кнопки нет: есть только остановка раскатки и новый хотфикс.