Условие
У нас есть маркетплейс, где можно находить товары, читать их описание и добавлять в корзину. Необходимо спроектировать архитектуру приложения с нуля. Проект должен быть масштабируемым: через полгода ожидается много пользователей и большая команда разработки. Глубокие детали реализации не требуются, важны интерфейсы, классы, структуры, свойства и связи между компонентами.
Архитектура и проектирование
1. Нарисуй архитектуру экрана деталки (product details). Какие основные компоненты и связи ты заложил бы?
2. Какую архитектуру выберешь для этого экрана: MVC, MVVM, VIPER, Clean Swift или что-то другое?
3. Какую минимальную версию iOS стоит взять для проекта?
4. В какой момент и каким образом detail_view_module попадает в detail_view_controller?
5. Как api_client попадает в detail_view_module?
6. Где должна происходить связка view_controller, view_module и api_client — в фабрике или в другом месте?
7. Нужно ли использовать router или coordinator для навигации между экранами?
8. Ты бы сделал роутер отдельным для каждого экрана или общий?
Работа с сетью и данными
9. Что бы ты выбрал для взаимодействия с сетью: Alamofire, URLSession, GraphQL или что-то другое?
10. Слышал ли ты про gRPC?
11. Как реализовать работу приложения, если у пользователя пропал интернет? Например, при нажатии на карточку товара всё равно показать деталку с ранее загруженными данными.
12. Как реализовать кэширование данных: использовать готовый фреймворк или писать самому?
13. Что выберешь для локального хранения: CoreData, SQLite, Realm?
14. Какие минусы у использования CoreData?
15. Можно ли кэшировать данные без использования базы данных? Если да, то как?
16. Для чего используется Keychain и когда он очищается?
Backend-driven UI и гибкость интерфейса
17. Как можно менять порядок элементов на экране деталки с помощью данных, приходящих с бэкенда?
18. Как бы ты реализовал возможность управлять отображением описания товара (ссылки, жирный текст, курсив, картинки) через бэкенд?
19. Слышал ли ты про такие подходы, как Backend-driven UI или Server-driven UI?
Аналитика и метрики
20. Какую аналитику ты бы встроил в приложение, и где бы в архитектуре разместил этот компонент?
21. Где именно должен происходить вызов метрики — во view_controller или во view?
22. Если нужно передать параметры (например, id товара) в событие аналитики, как это сделать?
23. Если придётся добавить вторую систему аналитики (например, AppsFlyer), будет ли твое текущее решение достаточно гибким?
24. Должна ли аналитика попадать во view_controller через DI или быть доступной глобально?
Локализация
25. Как решить проблему отображения валюты при выходе приложения в Узбекистане (где не рубли)?
26. Как устроена локализация в iOS? Какие файлы для этого используются?
27. Можно ли исправить опечатку в тексте уже выпущенного приложения без нового релиза? Если да, как это реализовать через бэкенд?
Принципы проектирования (SOLID)
28. Что означает аббревиатура SOLID?
29. Можешь объяснить принцип единственной ответственности (Single Responsibility)?
30. Что значит принцип разделения интерфейсов (Interface Segregation)?
31. Можешь привести пример нарушения этого принципа в UIKit?
32. Как бы ты разделял методы у UITableViewDataSource и UITableViewDelegate, чтобы соответствовать этому принципу?
Модульность
33. Приходилось ли тебе работать с многомодульностью в проектах?
34. Как бы ты реализовал многомодульность (через CocoaPods, SPM или другими способами)?
Тестирование
35. Приходилось ли тебе писать тесты? Какие инструменты ты использовал?
36. Что знаешь про пирамиду тестирования?
37. Работал ли ты с XCTest?
38. Как у вас на проекте были устроены автотесты и кто ими занимался?
Дополнительно
Собеседование полностью проходило в формате систем-дизайна. Кандидату было предложено спроектировать архитектуру приложения-маркетплейса с нуля, закладывая масштабируемость на будущее.
Вложения
[2785658f_Магнит. Собеседование.zip](./media/2785658f_Магнит. Собеседование.zip)