Привет!
Это тестовое задание на стажировку в KODE. Стажировка уже закончилась, но сделать приложение в качестве практики для своего GitHub всё ещё можно.
Если хочешь, чтобы задание прошло ревью, то пиши @ekaterina_sergeeva1_en. Обычно мы даём ответ в течение 2 недель, но срок может увеличиться, если заявок будет много. Мы проверим задание и при возможности дадим краткий фидбэк, а если задание выполнено достаточно хорошо, то пригласим на интервью:)
Удачи!
Что нужно сделать?
В качестве тестового задания мы предлагаем тебе реализовать небольшое приложение, в котором есть всего по чуть-чуть: верстки, работы с api, преобразование данных и т.д.
Какие требования к процессу и результату?
- Первое, что нужно сделать - это прочитать и разобраться во всех требованиях, дизайне и api, указанных в этом документе;
- Затем - разбить проект на отдельные задачи, т.е. продекомпозировать;
- После этого дать временную оценку в часах каждой задаче. Если ожидаемое тобой время выполнения отдельной задачи превышает 2 часа - значит, нужно эту задачу разбить на подзадачи и оценить каждую из них. В итоге у тебя должен получиться план работ и ожидаемое время выполнения всего тестового задания;
- После планирования можно переходить к программированию. Создай новый репозиторий в GitHub, сделай его приватным (после старта стажировки можно будет его сделать публичным) и добавь в collaborators пользователя kode-ios;
- В первом commit в репозиторий в файле readme.md зафиксируй свой план задач с ожидаемой временной оценкой из пункта 3;
- Двигаясь по собственному плану, реализуй тестовое задание;
- По завершении работ добавь в readme.md реальное время выполнение задач и напиши в телеграм о готовности @ekaterina_sergeeva1_en, чтобы задание начали проверять.
На что мы будем смотреть? На все сразу:
- на полноту реализованного функционала и соответствие дизайну;
- количество ошибок;
- стиль и оформление кода;
- работу с git - оформление commits, pull requests;
- декомпозицию и оценку - то есть на твоё умение разбивать задачи и планировать собственное время;
- на что-то ещё :)
Требования
Стэк
- Swift 5
- UIKit
- iOS 13+
- Зависимости через SPM или Cocoapods
Библиотеки использовать можно свободно на своё усмотрение, но будет круче, если сделать всё самостоятельно.
Дизайн
Хороший дизайн для клиентского разработчика - отличный способ быстро понять, что предстоит сделать. Он у нас именно такой:
https://www.figma.com/file/GRRKONipVClULsfdCAuVs1/KODE-Trainee-Dev-Осень'21?node-id=0%3A1
API
Спецификация метода API (он у нас один) - https://kode-education.stoplight.io/docs/trainee-test/b3A6MjUxNDM5Mjg-get-users
Запрос для получения успешного ответа:
curl --request GET \
--url https://stoplight.io/mocks/kode-education/trainee-test/25143926/users \
--header 'Content-Type: application/json' \
--header 'Prefer: code=200, example=success'
Запрос для тестирования на разных данных (генерируется автоматически при каждом запросе):
curl --request GET \
--url https://stoplight.io/mocks/kode-education/trainee-test/25143926/users \
--header 'Content-Type: application/json' \
--header 'Prefer: code=200, dynamic=true'
Запрос, который вернет ошибку с http кодом 500:
curl --request GET \
--url https://stoplight.io/mocks/kode-education/trainee-test/25143926/users \
--header 'Content-Type: application/json' \
--header 'Prefer: code=500, example=error-500'
Функциональные требования
Запуск
Когда пользователь открывает приложение, необходимо загрузить актуальный список работников компании.
При входе в приложение необходимо отобразить экран 2.0.0. Изначально он должен быть в состоянии загрузки, экран 1.0.0. Если при загрузке произошла ошибка, отсутствует интернет-соединение или API вернул ошибку, необходимо отобразить экран "Критическая ошибка". В случае успеха необходимо отобразить список людей.
Навигация
Компонент навигации находится в верхней части экрана и содержит поле поиска, кнопку сортировки и панель вкладок. В списке на главном экране должны быть работники департамента, соответствующего выбранной вкладке, либо вообще все сотрудники, если выбрана вкладка "Все".
Соответствия названия вкладок с полем "department" из запроса api:
android - Android
ios - iOS
design - Дизайн
management - Менеджмент
qa - QA
back_office - Бэк-офис
frontend - Frontend
hr - HR
pr - PR
backend - Backend
support - Техподдержка
analytics - Аналитика
При нажатии на кнопку "Фильтр" открывается Bottom Sheet с вариантами сортировки списка работников. Есть два варианта сортировки: "По алфавиту" (по умолчанию) и "По дню рождения". При переключении варианта сортировки Bottom Sheet должен закрываться, а список на главной странице должен быть обновлен.
Когда пользователь вводит текст в поле поиска, необходимо фильтровать список и отображать только работников, соответствующих параметрам поиска. Поиск может осуществляться по имени, фамилии или никнейму, состоящему из двух символов.
В случае отсутствия результатов поиска необходимо отобразить информацию о том, что ничего не было найдено. Экран "2.0.0Г Люди (Ошибка поиска)".
Список работников
В режиме сортировки "По алфавиту" для каждого работника отображается его фотография, имя, никнейм и департамент.
В режиме сортировки "По дню рождения" список отображается от ближайшей даты для рождения вниз. Если день рождения следующего работника будет только в следующем году, то необходимо отобразить блок с годом, экран 2.0.1А.
При тапе на сотрудника нужно открыть экран информации о нём (экран "детали").
Пользователь должен иметь возможность перезагрузить список людей жестом pull-to-refresh. Если в процессе обновления произошла ошибка, необходимо ее игнорировать. Если данные загрузились успешно, необходимо обновить список на главном экране. При этом параметры поиска и сортировки должны учитываться и не должны быть сброшены.
Экран "детали"
В шапке должны отображаться аватарка пользователя, имя, никнейм и название департамента.
Ниже находятся дата рождения и номер телефона. При нажатии на номер телефона необходимо показать action sheet с подтверждением звонка. При нажатии на кнопку с номером телефона в action sheet должен начаться звонок, а сам action sheet должен закрыться.
Дополнительные задания
Дополнительные задания не обязательны для выполнения. Если вы не успеваете - лучше сделать хорошо основную часть. Но если время осталось...
Отображение ошибки обновления
Если при загрузке списка людей произошла ошибка, необходимо показать уведомление с текстом ошибки - экран "2.0.0.А – Люди (Ошибка)". Существует несколько видов ошибок:
- Отсутствует интернет соединение. В этом случае в уведомлении должен отображаться текст "Не могу обновить данные. Проверь соединение с интернетом."
- Ошибка API. В этом случае в уведомлении должен быть отображен текст "Не могу обновить данные. Что-то пошло не так".
Уведомление закрывает собой Status bar. Оно должно скрываться спустя 3 секунды, также его можно убрать тапом.
Анимированный индикатор pull-to-refresh
Индикатор должен заполняться по часовой стрелке в зависимости от того, как далеко его вытянул пользователь, а при старте обновления вращаться по кругу (см. пример анимации). Экран "Refresh" под звездочкой.