Это тестовое задание на стажировку в KODE.
Во-первых, поздравляем! Ты выбрал для начала своей карьеры, пожалуй, самый эффективный и увлекательный старт — стажировку в нашей компании.
Во-вторых, приготовься к тому, что будет непросто: мы разработчики, а не университетские преподаватели. Времени на раскачку не будет, а обучение на стажировке максимально приближено к реальной работе :)
В-третьих, чтобы попасть на стажировку, надо сделать тестовое задание. Так мы сможем понять, что ты уже немного умеешь программировать и сможешь справиться с тем материалом, который мы будем давать в процессе стажировки.
Удачи!
В качестве тестового задания мы предлагаем тебе реализовать небольшое приложение, в котором есть всего по чуть-чуть: верстки, работы с API, преобразование данных и т.д.
- Первое, что нужно сделать - это прочитать и разобраться во всех требованиях, дизайне и API, указанных в этом документе;
- Затем - разбить проект на отдельные задачи, т.е. декомпозировать;
- После этого дать временную оценку в часах каждой задаче. Если ожидаемое тобой время выполнения отдельной задачи превышает 2 часа, значит нужно эту задачу разбить на подзадачи и оценить каждую из них. В итоге у тебя должен получиться план работ и ожидаемое время выполнения всего тестового задания;
- После планирования можно переходить к программированию. Создай новый репозиторий в GitHub (имя-фамилия-kode-trainee-2024, например ivan-ivanov-kode-trainee-2024), сделай его приватным (после старта стажировки можно будет его сделать публичным);
- В репозитории создай файл
README.md
и зафиксируй в нём свой план задач с ожидаемой временной оценкой из пункта 3; - Двигаясь по собственному плану, реализуй тестовое задание;
- По завершении работ добавь в
README.md
реальное время выполнение задач - Добавь в Collaborators пользователя kode-android и отправь ссылку на свой гитхаб к нам в бот https://t.me/KODE_Internship_2024_Bot
- на полноту реализованного функционала и соответствие дизайну;
- количество ошибок;
- стиль и оформление кода;
- работу с git - оформление commits, pull requests;
- декомпозицию и оценку - то есть на твоё умение разбивать задачи и планировать собственное время;
- на что-то ещё :)
Столько, сколько потребуется. Но, разумеется у реализации тестового, как и у любой рабочей задачи есть дедлайн - 22 марта 2024 23:59:59 UTC +2. Но постарайся закончить выполнение тестового как можно быстрее, чтобы мы смогли вдумчиво его проверить!
Достаточно вводных, переходим к требованиям!
- Kotlin
- Single Activity
- Retrofit
- Jetpack Compose
- Kotlin Coroutines
Хороший дизайн для клиентского разработчика - отличный способ быстро понять, что предстоит сделать. Он у нас именно такой:
https://www.figma.com/file/GRRKONipVClULsfdCAuVs1/KODE-Trainee-Dev-Осень'21?node-id=11%3A14413
Спецификация метода API (он у нас один) - https://openapi.kode.ru/docs/trainee-test/ew2ilitadvkry-get-users
Запрос для получения успешного ответа:
curl --request GET \
--url https://stoplight.io/mocks/kode-api/trainee-test/331141861/users \
--header 'Accept: application/json, application/xml' \
--header 'Prefer: code=200, example=success'
Запрос для тестирования на разных данных (генерируется автоматически при каждом запросе):
curl --request GET \
--url https://stoplight.io/mocks/kode-api/trainee-test/331141861/users \
--header 'Accept: application/json, application/xml' \
--header 'Prefer: code=200, dynamic=true'
Запрос, который вернет ошибку с http кодом 500:
curl --request GET \
--url https://stoplight.io/mocks/kode-api/trainee-test/331141861/users \
--header 'Accept: application/json, application/xml' \
--header 'Prefer: code=500, example=error-500'
Когда пользователь открывает приложение, необходимо загрузить актуальный список всех работников компании.
При входе в приложение необходимо отобразить экран 2.0.0. Изначально он должен быть в состоянии загрузки, экран 1.0.0. Если при загрузке произошла ошибка, отсутствует интернет соединение или API вернул ошибку, необходимо отобразить экран "Критическая ошибка". В случае успеха, необходимо отобразить Top App Bar и список людей.
Компонент находится вверху экрана и представляет из себя поле для поиска с иконкой "Поиск", кнопкой "Сортировка" и панелью вкладок. При переключении между вкладками, на главном экране список работников фильтруется и отображаются только люди работающие в выбранном выбранном департаменте, либо все, если выбрана вкладка "Все".
Соответствия названия вкладок с полем "department" из запроса API:
android -> Android
ios -> iOS
design -> Дизайн
management -> Менеджмент
qa -> QA
back_office -> Бэк-офис
frontend -> Frontend
hr -> HR
pr -> PR
backend -> Backend
support -> Техподдержка
analytics -> Аналитика
При нажатии на кнопку "Фильтр" открывается Bottom Sheet с вариантами сортировки списка работников. Есть два варианта сортировки: "По алфавиту" (по умолчанию), "По дню рождения". При переключении варианта сортировки, панель должна закрываться, а список на главной странице должен перезагружаться.
Когда пользователь вводит текст в поисковое поле, необходимо фильтровать список на главном экране и отображать только работников соответствующих параметрам поиска. Поиск может осуществляться по имени, фамилии или никнейму, состоящему из двух символов.
В случае отсутствия результатов поиска необходимо отобразить информацию о том, что ничего не было найдено. Экран "2.0.2.Г Люди (Ошибка поиска)".
Вверху главной страницы должна быть расположена верхняя панель приложения, на которой должны находиться: поле для поиска, панель вкладок для группировки загруженного списка пользователей, список работников. Список должен обновляться каждый раз, когда меняются параметры поиска, обновляется вариант сортировки или пользователь переключается вкладки департаментов.
Пользователь имеет возможность скролить список работников.
В режиме сортировки "По алфавиту" для каждого работника отображается его фотография, имя, никнейм и департамент.
В режиме сортировки "По дню рождения", список отображается от ближайшей даты для рождения вниз. Если день рождения следующего работника будет только в следующем году, то необходимо отобразить блок с годом, экран 2.0.1.А.
Когда пользователь кликнет на человека, необходимо открыть экран информации о человеке (экран "детали").
Pull-to-refresh. Пользователь имеет возможность перезагрузить список людей. Для этого необходимо сделать свайп сверху вниз до появления индикатора загрузки. Если в процессе обновления произошла ошибка, необходимо ее игнорировать. Если данные загрузились успешно, необходимо обновить список на главном экране. При этом параметры поиска и сортировки должны учитываться и не должны быть сброшены.
Сверху экрана деталей должна отображаться кнопка назад для навигации на главный экран. Также вернуться на главный экран можно, если нажать системную кнопку назад.
В шапке экрана должна отображаться аватарка пользователя, имя, никнейм и название департамента.
Ниже находится дата рождения и номер телефона. При нажатии на номер телефона необходимо открыть приложение для звонка по номеру.
Дополнительное задание не обязательно для выполнения. Если вы не успеваете - лучше сделать хорошо основную часть. Но если время осталось...
При обновлении списка на главном экране, необходимо отображать состояние загрузки. Снизу экрана должен появиться снек бар со статусом.
Когда производится загрузка данных, необходимо показать синий снек бар с текстом "Секундочку, гружусь...". Снек бар должен отображаться до того момента пока данные не загрузятся.
Если при загрузке списка людей произошла ошибка, необходимо показать красный снек бар с текстом ошибки. Существует несколько видов ошибки:
- Отсутствует интернет соединение. В этом случае на SnackBar должен отображаться текст "Не могу обновить данные. Проверь соединение с интернетом."
- Ошибка API. В этом случае на SnackBar должен быть отображен текст "Не могу обновить данные. Что-то пошло не так".