Всё собеседование проходило в формате систем-дизайна. В прикреплённом архиве находятся схема приложения и условие задания.
- Систем дизайн:
- У нас есть вот такой схематичный мок дизайн (прикреплённый скриншот).
- Считай что это у нас маркетплейс, где можно находить товары, можно читать описание товаров и можно добавлять товар в корзину.
- Твоя задача нарисовать архитектуру этого приложения.
- Ты первый разработчик который закладывает остальную архитектуру. Мы 100 процентов знаем что через полгода будет много пользователей, будет большая команда, команд может быть даже несколько. Тут нужно хорошо заложиться на будущее.
- Меня не интересуют какие-то глубокие детали, достаточно интерфейсов, классов, структур, свойств. Сущности не нужно описывать, бэкенд не интересен.
- Мой совет: я ожидаю что в этом рисунке будут какие-то связи и если между двумя квадратиками нашей архитектуры стрелка — значит один обращается к другому.
- Нет никакого легаси кода, проектируем с нуля. 14 ios.
Далее идут вопросы, которые задавал собеседующий по ходу построения собеседуемым системного дизайна приложения:
- Архитектура и проектирование:
- Нарисуй архитектуру экрана деталки (product details). Какие основные компоненты и связи ты заложил бы?
- Какую архитектуру выберешь для этого экрана:
MVC,MVVM,VIPER,Clean Swiftили что-то другое? - Какую минимальную версию iOS стоит взять для проекта?
- В какой момент и каким образом
detail_view_moduleпопадает вdetail_view_controller? - Как
api_clientпопадает вdetail_view_module? - Где должна происходить связка
view_controller,view_moduleиapi_client— в фабрике или в другом месте? - Нужно ли использовать
routerилиcoordinatorдля навигации между экранами? - Ты бы сделал роутер отдельным для каждого экрана или общий?
- Работа с сетью и данными:
- Что бы ты выбрал для взаимодействия с сетью:
Alamofire,URLSession,GraphQLили что-то другое? - Слышал ли ты про
gRPC? - Как реализовать работу приложения, если у пользователя пропал интернет? Например, при нажатии на карточку товара всё равно показать деталку с ранее загруженными данными.
- Как реализовать кэширование данных: использовать готовый фреймворк или писать самому?
- Что выберешь для локального хранения:
CoreData,SQLite,Realm? - Какие минусы у использования
CoreData? - Можно ли кэшировать данные без использования базы данных? Если да, то как?
- Для чего используется
Keychainи когда он очищается?
- Backend-driven UI и гибкость интерфейса:
- Как можно менять порядок элементов на экране деталки с помощью данных, приходящих с бэкенда?
- Как бы ты реализовал возможность управлять отображением описания товара (ссылки, жирный текст, курсив, картинки) через бэкенд?
- Слышал ли ты про такие подходы, как
Backend-driven UIилиServer-driven UI?
- Аналитика и метрики:
- Какую аналитику ты бы встроил в приложение, и где бы в архитектуре разместил этот компонент?
- Где именно должен происходить вызов метрики — во
view_controllerили воview? - Если нужно передать параметры (например,
idтовара) в событие аналитики, как это сделать? - Если придётся добавить вторую систему аналитики (например,
AppsFlyer), будет ли твое текущее решение достаточно гибким? - Должна ли аналитика попадать во
view_controllerчерезDIили быть доступной глобально?
- Локализация:
- Как решить проблему отображения валюты при выходе приложения в Узбекистане (где не рубли)?
- Как устроена локализация в iOS? Какие файлы для этого используются?
- Можно ли исправить опечатку в тексте уже выпущенного приложения без нового релиза? Если да, как это реализовать через бэкенд?
- Принципы проектирования (SOLID):
- Что означает аббревиатура
SOLID? - Можешь объяснить принцип единственной ответственности (Single Responsibility)?
- Что значит принцип разделения интерфейсов (Interface Segregation)?
- Можешь привести пример нарушения этого принципа в
UIKit? - Как бы ты разделил методы у
UITableViewDataSourceиUITableViewDelegate, чтобы соответствовать этому принципу?
- Модульность:
- Приходилось ли тебе работать с многомодульностью в проектах?
- Как бы ты реализовал многомодульность (через
CocoaPods,SPMили другими способами)?
- Тестирование:
- Приходилось ли тебе писать тесты? Какие инструменты ты использовал?
- Что знаешь про пирамиду тестирования?
- Работал ли ты с
XCTest? - Как у вас на проекте были устроены автотесты и кто ими занимался?