System Design

06.03.2024https://habr.com/ru/companies/vk/articles/798391/
13.02.2024https://habr.com/ru/companies/vk/articles/793200/
18.12.2023https://habr.com/ru/articles/781404/
19.04.2024https://youtu.be/KZN654huFeQ
20.03.2024https://youtu.be/B9zOXjtHY7Q
21.12.2023https://youtu.be/SD3N7vyJElc
12.12.2023https://youtu.be/OdEUqeJzrLA
17.05.2023https://youtu.be/p7QIEzIFzdQ
23.11.2022https://youtu.be/FmgzRI47NiA
18.11.2022https://youtu.be/Wh5Ya6UFG1k
09.08.2022https://youtu.be/5k7dfoOgngg
09.11.2021https://youtu.be/uZlOpmJLtL4
05.10.2021https://youtu.be/s9j_7byy9-c
28.07.2021https://youtu.be/hsyTEQkaUAc

Функциональные требования

Описывают как пользователь будет взаимодействовать с приложением. Примеры:

• возможность проскроллить приложения в каталоге или загрузить их.

• аутентификация пользователей: создание учётных записей, вход в систему, сброс паролей.

• корзина покупок: добавление товаров, просмотр содержимого корзины, переход к оформлению заказа.

• функция поиска: поиск продуктов по ключевым словам.

Нефункциональные требования

Незаметны пользователю но влияют на его опыт взаимодействия с приложением. Примеры:

• кэширование или подгрузка превью в низком разрешении для экономии трафика.

• производительность: загрузка веб-страницы менее чем за 3 секунды при одновременном использовании 100 пользователей.

• безопасность: соответствие отраслевым стандартам безопасности и протоколам шифрования.

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

Приложение тормозит. Что делать?

Локализуем проблему на кластере устройств. Если проблема на сильный устройствах - очень плохо, если на слабых - уже не так плохо. Запустить посмотреть, потыкать UI с помощью LayoutInspector, для compose соответственно бенчмарки, как композиция происходит, слишком много рекомпозиций, добавить аннотации. Обычно проблема в плохо написанном UI который не аффектит на сильных устройствах. Сложные анимации, грузят слишком большие картинки, выполняют запросы не на тех потоках. Тестить на устройствах среднего и слабого сегмента. Наладить перфоманс тесты. Подключить линтеры. Сделать производительность как бизнес-фичу.

Спроектируй экран поиска?

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

Дополнительные требования: предварительный поиск в кэше, дебаунс на поле ввода.

Спроектируй приложение для интернет-магазина?

Будет работа с финансами. Подумать о безопасности хранении данных. Провайдеры биллинга. Категории товаров должны попадать под категории публикации в магазинах приложений требования гугла. Приложение - это витрина, продумать дизайн и бэкенд. Нужна ли авторизация? Декомпозировать главные фичи: авторизация, витрина, корзина. Чтобы фичи пилились параллельно - чистая архитектура, разбить по gradle-модулям, чтобы команды не пересекались. Один на всех database-модуль, network-модуль, core-ui модуль. У каждой фичи должен быть 1 модуль, который я подключаю и он сам внутри себя тянет нужные ему модули. Круговой зависимости не будет, общий код вынесем в другой модуль. Модуль application знает про все фичи и может вызывать их с помощью deeplinks.

Как доставить пуш гарантированно?

Слать смс. Аналитика открытия пушей. GMS и HMS.

Как скачать файл гарантированно?

Использовать стандартный DownloadManager.

Как загружать большие файлы?

POST-запрос через HTTP. Объект грузится по частям (чанки). Информация указывается в заголовках запроса.

За какими метриками приложения следить?

• сколько идут запросы.

• сколько жрет оперативки.

• сколько жрет заряд батареи.

• скипаются фремы кадры в секунду отзывчивость UI.

• время старта приложения.

• как забивается кэш.

Как улучшить время старта приложения?

https://developer.android.com/topic/performance/vitals/launch-time

Следить за метриками: TTID (Time-To-Initial-Display) отрисовка 1 кадра и TTFD (Time-To-Full-Display) готов к взаимодействию с юзером.

Метод Activity.onCreate оказывает наибольшее влияние на время загрузки.

• ленивая инициализация зависимостей (библиотека AppStartup).

• не использовать тяжелые макеты которые долго инфлейтятся.

• у большинства телефонов 4 и больше ядер. использовать многопоточность.

Что делать если нестабильный интернет?

• кэширование.

• отключить autoplay у медиа.

• грузить картинки в низком разрешении.

• пагинацию уменьшим до 10 айтемов.

Как спроектировать приложение с нуля?

• прототипирование.

• UI.

• бизнес-логика.

Возьмем чистую архитектуру. Data (API, DB), Domain (Interactor, UseCase), Presentation (Compose). ViewModel + MVVM или MVI.

Как работать с картинками?

Картинки можно конвертировать в base64.

Шардирование и репликация?

Репликация - полное копирование бд на такой же сервер. Любой из этих серверов будем называть Node. Реплики будут синхронизироваться с мастером.

• отказоустойчивость - если мастер умерт одна из реплик его заменит.

• чтение - читать можем из любой ноды. в три раза больше.

Шардирование - не дублирует данные а разделяет их по нодам.

• записывать можем в 4 раза больше данных одновременно.

• диска стало тоже в 4 раза больше.

Как делать пагинацию?

page offset lastId

Ozon. Проектирование

Нужно спроектировать 2 экрана. Выбрать технологии. При этом счетчик в корзине должен увеличиваться сразу, а кнопка в корзину должна менять цвет + counter справа. А если запрос на бэк упадет нужно вернуть все в исходное состояние и наривать какую-нибудь ошибку. Важно упомянуть, что запрос на бэк на добавление в корзину нужно запускать не из Scope Вьюмодели экрана деталей, а из такого скоупа, который гарантирует, что операция не прервется, если пользователь закроет экран деталей раньше(например из Scope MainActivity).

Экран со списком
Экран с деталями
Экран деталей если добавить к корзину

Dodo. Проектирование

• Какой проект или какой функциональностью горжусь?

• Как сделать этот экран? XML или Compose. Полный путь. Если бы я пришел на проект и дали такую задачу.

Yandex. Проектирование

• Потренироваться находить баги в своём коде без компиляции/исполнения.

• (Опционально) потренироваться в придумывании тестов для собственного кода, попробовать самостоятельно придумывать краевые случаи, для которых может потребоваться реализации отдельной логики.

System Design. Вопросы на собесе
  1. Что такое функциональные и нефункциональные требования?
  1. Как доставить пуш гарантированно?
  1. Как загрузить большой файл на сервер?
  1. За какими метриками приложения следить?
  1. Как улучшить время старта приложения?
  1. Что делать если нестабильный интернет?
  1. Как спроектировать приложение с нуля?
  1. Что такое шардирование и репликация?
  1. Как сделать пагинацию?
  1. Как обеспечить безопасность данных в Android-приложении?
  1. Как анализировать и устранять проблемы с производительностью в Android-приложении?
  1. Как обеспечить высокое качество кода и поддержку тестируемости в проекте?