Привет!

Это тестовое задание на стажировку в KODE.

Во-первых, поздравляем! Ты выбрал для начала своей карьеры, пожалуй, самый эффективный и увлекательный старт - стажировку в нашей компании.

Во-вторых, приготовься к тому, что будет непросто - мы разработчики, а не университетские преподаватели. Времени на раскачку не будет, а обучение на стажировке максимально приближено к реальной работе :)

В-третьих, надо сделать тестовое задание, чтобы попасть на стажировку. Нам это нужно для того, чтобы понять, что ты уже немного умеешь программировать и сможешь справиться с тем материалом, который мы будем давать в процессе стажировки.

Удачи!

Что нужно сделать?

В качестве тестового задания мы предлагаем тебе реализовать небольшое приложение, в котором есть всего по чуть-чуть: вёрстки, работы с API, преобразований данных и т.д.

Какие требования к процессу и результату?

  1. Первое, что нужно сделать - это прочитать и разобраться во всех требованиях, дизайне и API, указанных в этом документе;
  2. Затем - разбить проект на отдельные задачи, т.е. продекомпозировать;
  3. После этого дать временную оценку в часах каждой задаче. Если ожидаемое тобой время выполнения отдельной задачи превышает 2 часа - значит, нужно эту задачу разбить на подзадачи и оценить каждую из них. В итоге у тебя должен получиться план работ и ожидаемое время выполнения всего тестового задания;
  4. После планирования можно переходить к программированию. Создай новый репозиторий в GitHub, сделай его приватным (после старта стажировки можно будет его сделать публичным)
  5. В репозитории создай файл README.md и зафиксируй в нём свой план задач с ожидаемой временной оценкой из пункта 3;
  6. Двигаясь по собственному плану, реализуй тестовое задание;
  7. По завершении работ добавь в README.md реальное время выполнение задач
  8. Добавь в 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

Спецификация метода 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 - Android
  • ios - iOS
  • design - Дизайн
  • management - Менеджмент
  • qa - QA
  • back_office - Бэк-офис
  • frontend - Frontend
  • hr - HR
  • pr - PR
  • backend - Backend
  • support - Техподдержка
  • 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 секунды само, но его можно также убрать тапом.

Анимированный индикатор pull-to-refresh

Индикатор должен выглядеть так и заполняться по часовой стрелке в зависимости от того, как далеко его вытянул пользователь, а при старте обновления вращаться по кругу (см. пример анимации).

На этом всё, желаем удачи!