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 который не аффектит на сильных устройствах. Сложные анимации, грузят слишком большие картинки, выполняют запросы не на тех потоках. Тестить на устройствах среднего и слабого сегмента. Наладить перфоманс тесты. Подключить линтеры. Сделать производительность как бизнес-фичу.

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

• Слать смс.

• Аналитика открытия пушей.

• 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 айтемов.

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

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

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

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

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

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

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

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

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

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

Представьте, что вам нужно разработать бесконечный список в Android с использованием архитектурного паттерна MVVM, корутин и Jetpack Compose.

• Договориться с бэкендом о контракте: Page / Limit-Offset / LastId.

• Затащить библиотеку Paging.

Проектирование приложение с нуля

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

• UI.

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

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

Проектирование экрана поиска

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

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

Проектирование приложения для интернет-магазина

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

Проектирование инстаграма

Требования:

• Нагрузка 500 млн пользователей.

Проектирование сетевого запроса (Avito)

Как сделать сетевой запрос? Что необходимо учесть? Какие инструменты использовать?

• Permissions для интернета.

• Retrofit/Okhttp/Ktor.

• Сериализация данных.

• Обработка ошибок.

• Корутины Dispatcher.IO.

• Разделение по Clean-слоям.

• Безопасность и SSL-pinning.

• Авторизация: access и refresh токены.

Проектирование корзины заказа (Ozon)

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

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

Есть 2 экрана: список товаров и экран товара. В списке можно добавить товар в корзину. На экране товара можно убрать из корзины или увеличить счетчик.

• Взаимодействие через бэк.

• Поддержка работы на нескольких устройствах.

• Работа без интернета.

• Проверка подключения к сети.

Проектирование экрана (Dodo)

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

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

Проектирование виджета промокода (Rutube)

Сделать виджет отображающий промокод с сервера (Compose/View).

• Виджет автономный.

• Промокод достается по GET-запросу из сети.

• Набор классов разбитый на слои.