System Design
06.03.2024 | https://habr.com/ru/companies/vk/articles/798391/ |
13.02.2024 | https://habr.com/ru/companies/vk/articles/793200/ |
18.12.2023 | https://habr.com/ru/articles/781404/ |
19.04.2024 | https://youtu.be/KZN654huFeQ |
20.03.2024 | https://youtu.be/B9zOXjtHY7Q |
21.12.2023 | https://youtu.be/SD3N7vyJElc |
12.12.2023 | https://youtu.be/OdEUqeJzrLA |
17.05.2023 | https://youtu.be/p7QIEzIFzdQ |
23.11.2022 | https://youtu.be/FmgzRI47NiA |
18.11.2022 | https://youtu.be/Wh5Ya6UFG1k |
09.08.2022 | https://youtu.be/5k7dfoOgngg |
09.11.2021 | https://youtu.be/uZlOpmJLtL4 |
05.10.2021 | https://youtu.be/s9j_7byy9-c |
28.07.2021 | https://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. Вопросы на собесе
- Что такое функциональные и нефункциональные требования?
- Как доставить пуш гарантированно?
- Как загрузить большой файл на сервер?
- За какими метриками приложения следить?
- Как улучшить время старта приложения?
- Что делать если нестабильный интернет?
- Как спроектировать приложение с нуля?
- Что такое шардирование и репликация?
- Как сделать пагинацию?
- Как обеспечить безопасность данных в Android-приложении?
- Как анализировать и устранять проблемы с производительностью в Android-приложении?
- Как обеспечить высокое качество кода и поддержку тестируемости в проекте?