Это тестовое задание на стажировку в KODE.
Во-первых, поздравляем! Ты выбрал для начала своей карьеры, пожалуй, самый эффективный и увлекательный старт - стажировку в нашей компании.
Во-вторых, приготовься к тому, что будет непросто - мы разработчики, а не университетские преподаватели. Времени на раскачку не будет, а обучение на стажировке максимально приближено к реальной работе :)
В-третьих, надо сделать тестовое задание, чтобы попасть на стажировку. Нам это нужно для того, чтобы понять, что ты уже немного умеешь программировать и сможешь справиться с тем материалом, который мы будем давать в процессе стажировки.
Удачи!
В качестве тестового задания мы предлагаем тебе реализовать небольшое приложение, в котором есть всего по чуть-чуть: вёрстки, работы с API, преобразований данных и т.д.
- Первое, что нужно сделать - это прочитать и разобраться во всех требованиях, дизайне и API, указанных в этом документе;
- Затем - разбить проект на отдельные задачи, т.е. продекомпозировать;
- После этого дать временную оценку в часах каждой задаче. Если ожидаемое тобой время выполнения отдельной задачи превышает 2 часа - значит, нужно эту задачу разбить на подзадачи и оценить каждую из них. В итоге у тебя должен получиться план работ и ожидаемое время выполнения всего тестового задания;
- После планирования можно переходить к программированию. Создай новый репозиторий в GitHub, сделай его приватным (после старта стажировки можно будет его сделать публичным)
- В репозитории создай файл
README.md
и зафиксируй в нём свой план задач с ожидаемой временной оценкой из пункта 3; - Двигаясь по собственному плану, реализуй тестовое задание;
- По завершении работ добавь в
README.md
реальное время выполнение задач - Добавь в Collaborators пользователя kode-ios и отправь ссылку на свой GitHub к нам в бот https://t.me/KODE_Internship_2024_Bot
Тестовые задания принимаются до 22 марта 2024.
- полнота реализованного функционала;
- соответствие макетам в Figma;
- количество ошибок;
- стиль и оформление кода;
- гибкость сетевой части;
- работа с git - оформление коммитов, наличие веток и Pull Request'ов;
- декомпозиция и оценка - то есть на твоё умение разбивать задачи и планировать собственное время;
- Swift 5
- UIKit
- iOS 15+
- Зависимости через Cocoapods или SPM
Библиотеки использовать можно свободно на своё усмотрение, но будет круче, если сделать всё самостоятельно.
Макеты, на которые нужно ориентироваться – тут.
Спецификация метода API (он у нас один) - здесь
Запрос для получения успешного ответа:
curl --request GET \
--url https://stoplight.io/mocks/kode-api/trainee-test/331141861/users \
--header 'Content-Type: application/json' \
--header 'Prefer: code=200, example=success'
Запрос, который вернет ошибку с HTTP-статусом 500:
curl --request GET \
--url https://stoplight.io/mocks/kode-api/trainee-test/331141861/users \
--header 'Content-Type: application/json' \
--header 'Prefer: code=500, example=error-500'
Обратите внимание на заголовки Prefer
– с их помощью можно манипулровать ответом.
Когда пользователь открывает приложение, необходимо загрузить актуальный список работников компании.
При входе в приложение необходимо отобразить экран 2.0.0.
При этом изначально, при первой загрузке данных, он должен быть в состоянии 1.0.0.
Если же при загрузке данных произошла ошибка (отсутствует интернет-соединение или API вернул ошибку, например), необходимо отобразить экран в состоянии "Критическая ошибка".
А в случае успеха, понятное дело, отображаем список людей.
Компонент навигации находится в верхней части экрана и содержит поле поиска, кнопку сортировки и панель вкладок. В списке на главном экране должны быть работники департамента, соответствующего выбранной вкладке, либо вообще все сотрудники, если выбрана вкладка "Все".
Соответствия названия вкладок с полем "department" из запроса API:
android
- Androidios
- iOSdesign
- Дизайнmanagement
- Менеджментqa
- QAback_office
- Бэк-офисfrontend
- Frontendhr
- HRpr
- PRbackend
- Backendsupport
- Техподдержкаanalytics
- Аналитика
При нажатии на кнопку "Фильтр" открывается Bottom Sheet с вариантами сортировки списка работников. Есть два варианта сортировки: "По алфавиту" (по умолчанию) и "По дню рождения". При переключении варианта сортировки Bottom Sheet закрывается, а список на главной странице обновляется (на время запроса снова показываем состояние 1.0.0).
Когда пользователь вводит текст в поле поиска, необходимо локально фильтровать список и отображать только работников, соответствующих параметрам поиска. Поиск может осуществляться по имени, фамилии или никнейму, состоящему из двух символов.
В случае отсутствия результатов поиска необходимо отобразить информацию о том, что ничего не было найдено – состояние 2.0.2Г.
В режиме сортировки "По алфавиту" для каждого работника отображается его фотография, имя, никнейм и департамент. Пока фотография не загрузилась, вместо неё отображается картинка-заглушка.
В режиме сортировки "По дню рождения" список отображается от ближайшей даты для рождения вниз. Если день рождения следующего работника будет только в следующем году, то необходимо отобразить блок с годом – состояние 2.0.1А.
При тапе на сотрудника нужно открыть экран информации о нём.
Пользователь должен иметь возможность перезагрузить список людей жестом pull-to-refresh. Если в процессе обновления произошла ошибка, необходимо ее игнорировать. Если данные загрузились успешно, необходимо обновить список на главном экране. При этом параметры поиска и сортировки, если они были выставлены ранее, должны учитываться и не должны быть сброшены.
В шапке должны отображаться аватарка пользователя, имя, никнейм и название департамента.
Ниже находятся дата рождения и номер телефона. При нажатии на номер телефона необходимо показать Action Sheet с подтверждением звонка. При нажатии на кнопку с номером телефона должен начаться звонок, а сам Action Sheet закрывается.
Дополнительные задания не обязательны для выполнения. Если вы не успеваете - лучше сделать хорошо основную часть. Но если время осталось...
Если при обновлении списка людей через pull-to-refresh произошла ошибка, нужно показать уведомление с текстом ошибки - состояние 2.0.0.А. Существует несколько видов ошибок:
- Ошибка сетевого соединения (timeout, HTTP-статус 5xx и т.п.). В этом случае в уведомлении текст "Не могу обновить данные. Проверь соединение с интернетом"
- Ошибка от сервера (HTTP-статус 4xx) или ошибка при парсинге данных. В этом случае в уведомлении текст "Не могу обновить данные. Что-то пошло не так".
Уведомление закрывает собой статус-бар. Оно должно скрываться спустя 3 секунды само, но его можно также убрать тапом.
Индикатор должен выглядеть так и заполняться по часовой стрелке в зависимости от того, как далеко его вытянул пользователь, а при старте обновления вращаться по кругу (см. пример анимации).