Тестовое задание для кандидата на вакансию iOS Developer Предлагаем вам продемонстрировать компании Сайберс ваши знания и выполнить тестовое задание (ТЗ). Вы можете выбрать любую из двух приведённых ниже задач, если не было указаний выполнять какую‑то конкретную задачу или задачу из конкретного раздела. Пожалуйста, обратите внимание на требования к выполнению заданий из раздела дополнительных для разработчиков разного уровня (Junior Developer, Developer, Senior Developer). Также на требования к технологиям, которые необходимо использовать, и качеству кода. Если у вас возникнут вопросы, пишите нам или звоните по телефону +7 (383) 330-6626. Выполненное ТЗ ждём на почту [email protected]. Желаем успехов! ОБЯЗАТЕЛЬНЫЕ ТРЕБОВАНИЯ Важно: эти тестовые задания даются для проверки у вас некоторых вполне определённых знаний и умений, и в число этих умений не входит умение «делать примитивное решение на скорую руку, потому что задача простая, зачем лишние сложности». Важно, особенно для претендующих на вакансию старших разработчиков: одно из важных качеств, которым должен обладать разработчик высокого уровня, — это умение не только выполнять поставленную задачу, но и спроектировать и построить архитектуру приложения таким образом, чтобы потом можно было без проблем организовать работу команды или передать проект другому разработчику. Поэтому несмотря на то, что задание небольшое, стоит со всей серьёзностью подойти к проработке архитектуры решения, потому что она будет оцениваться в первую очередь. Представьте, что это не законченная задача, а только первая страница в двухтомной спецификации. Важно: обязательные требования к заданиям необходимо соблюсти все, независимо от того, кажутся они вам целесообразными применительно к данной задаче или нет. Общие ОБЯЗАТЕЛЬНЫЕ требования ко всем задачам: — приложение должно быть написано на Objective-C или Swift в среде разработки Xcode, с использованием iOS SDK, актуальной на момент выполнения задания версии. Для работы приложения не должен требоваться Jailbreak; — необходимо соблюдение архитектурного паттерна MVC. Практика показывает, что большинство кандидатов почему-то считают, что этот пункт можно игнорировать, но это не так. Задача, решённая без использования MVC, считается автоматически проваленной и дальше даже не рассматривается. Конечно, если вы решите использовать MVVM или VIPER, мы будем только рады. Но если все эти аббревиатуры вы видите в первый раз, пожалуйста, прочитайте хотя бы в Википедии про MVC и придерживайтесь этого паттерна при выполнении задания; — приложение должно использовать только стандартные публичные фреймворки; — использование 3rd-party компонентов (включая CocoaPods, Carthage и пр.) не допускается, если это не оговорено отдельно. Мы верим, что вы умеете пользоваться сторонними библиотеками, но хотим проверить, насколько вы хороши без них; — если не оговорено отдельно, приложение должно быть ориентировано на работу под iPhone. Создание универсального приложения не является обязательным условием, но будет плюсом. www.sibers.ru www.vk.com/sibers [email protected] Николаева, 9/1, 4 этаж Новосибирск 630090, Россия +7 (383) 330-6626 Sibers® является зарегистрированной торговой маркой. Страница 1 Для кандидатов, претендующих на позиции Developer и Senior Developer, выполнение части дополнительных заданий является обязательным. Это указано отдельно, и, как правило, претендентам на Senior Developer достаточно выполнить задания только из своей секции, выполнение заданий среднего уровня не обязательно. Для кандидатов, претендующих на позицию Junior Developer, выполнение дополнительных заданий не является обязательным, но существенно добавляет очков при проверке. Если в дополнительных заданиях не указан уровень сложности, это означает, что данная задача предназначена только для вакансии Junior Developer (ну, может, для самого дохлого Developer, и то, если сделать всё идеально). Стоит помнить, что лучше сделать немного, но хорошо, чем много, но кое-как. ВРЕМЯ НА ВЫПОЛНЕНИЕ ТЕСТОВОГО ЗАДАНИЯ В среднем выполнение подобных задач у разработчика соответствующего уровня может занять до 8-12 часов. КРИТЕРИИ ОЦЕНКИ При оценке тестового задания в первую очередь оценивается ваше понимание принципов ООП, владение паттернами и понимание принципов проектирования. Поэтому, пожалуйста, не нужно тратить время на украшение интерфейса или цветной текст в консоли, если вы не уверены в качестве вашего кода на 100%. Лучше добавьте побольше комментариев к коду. Задача 1: Кристаллы и драконы Суть задания Sibers® является зарегистрированной торговой маркой. — Лабиринт не должен быть непроходимым. Не должно быть ситуаций, когда ключ или сундук находятся в изолированной от игрока части лабиринта, или путь из начальной позиции до ключа и сундука больше лимита шагов; — минимальный набор предметов: ключ, сундук, камень, гриб, кость. Последние три объекта ничего не делают, просто могут быть помещены в инвентарь и извлечены из него; — не стоит зацикливаться на внешнем виде игры. Скачайте иконки с icons8.com, этого более чем достаточно. Если вы обнаружили, что потратили больше часа на рисование интерфейса, то пора это прекратить и взяться за программирование. Дополнительные задания к Задаче 1 — Добавить новый тип комнаты: тёмная комната. Когда игрок попадает в тёмную комнату, он видит чёрный экран и может только нажимать в разные места экрана наугад (при этом тачи обрабатываются как положено – если игрок попадёт на дверь, то он перейдёт в другую комнату). Но если игрок предварительно взял с собой предмет «факел», то комната обрабатывается как самая обычная; — добавить монстров. Если игрок входит в комнату с монстром, то монстр отображается в произвольном месте комнаты и движется к той части экрана, со стороны которой пришел игрок. У пользователя должно быть примерно полторы-две секунды на то, чтобы выполнить какие-то действия (собрать предметы, уйти в другую дверь). Если он не успевает, и монстр достигает входа (центра соответствующей стены), то жизненная сила игрока уменьшается (уменьшается лимит шагов на 10% от его начального значения), и игрок перекидывается в ту комнату, из которой пришёл; Сначала игрок вводит количество комнат, и программа генерирует лабиринт. Игрок оказывается в одной из его комнат. На экране отображается текущая комната, в ней как-то разбросаны присутствующие в комнате предметы и отмечены доступные выходы из комнаты (либо в соответствующей части экрана есть кнопка для перехода в смежную комнату, либо её нет). Сам игрок на карте не отображается, перемещение между комнатами происходит моментально при нажатии на соответствующие кнопки. В нижней части экрана находится инвентарь пользователя. Касание предмета в комнате переносит его в инвентарь (если это не сундук), касание предмета в инвентаре отображает меню снизу, с кратким описанием и возможными действиями. Предмет можно использовать (если +7 (383) 330-6626 Требования — добавить объект «еда». Если игрок находит такой объект в комнате, он может поместить его в инвентарь, а затем, тапнув по нему в процессе игры, съесть его и пополнить здоровье (лимит шагов) на некоторую величину; Ход игры Николаева, 9/1, 4 этаж Новосибирск 630090, Россия Примечание: эта задача, особенно если делать не минимальный, а хотя бы слегка расширенный вариант, может позволить вам продемонстрировать всю вашу мощь во владении ООП и всевозможными паттернами. Рекомендуем воспользоваться этим шансом, если вы претендуете на позицию Developer и выше. Для претендующих на позицию Developer необходимо выполнить не менее одного дополнительного задания, Senior Developer – не менее четырёх дополнительных заданий. — добавить drag and drop для предметов и сохранение позиций предметов внутри комнаты. Игрок может перемещать пальцем предметы в пределах текущей комнаты, перемещать предметы из комнаты в инвентарь и обратно, и, если покинуть комнату, а затем войти в неё снова, предметы будут лежать на тех же позициях, где их оставил игрок; Написать игру, где главный герой ходит по лабиринту и ищет клад. Игровой мир представляет собой матрицу MxN комнат, при этом у каждой комнаты есть от 1 до 4 дверей (по сторонам света), через которые можно попасть в смежне комнаты. В каждой комнате может быть несколько игровых объектов, с которыми игрок может взаимодействовать по некоторым игровым правилам. Цель – найти ключ и сундук, открыть сундук ключом и получить священный Грааль. www.sibers.ru www.vk.com/sibers [email protected] предмет используемый), выбросить или уничтожить. Факел освещает комнату, еда добавляет здоровья, ключ открывает сундук (если в комнате есть сундук) и так далее. Проигрыш происходит в случае, если у игрока кончается лимит перемещений между комнатами, и он умирает от голода в мрачных застенках драконьей пещеры. В дополнительных заданиях понятия «жизненная сила», «здоровье» и «лимит шагов» по своей сути означают одно и то же. — добавить меч. Если игрок взял меч, то он может перетащить его на монстра и с 50% вероятностью уничтожить монстра. После использования меч возвращается в инвентарь; — добавить состояние меча — с каждым использованием меч постепенно разрушается и после некоторого количества использований ломается навсегда (либо исчезает, либо превращается в объект «сломанный меч»); — сделать сохранение состояния игры между запусками приложения; Страница 2 www.sibers.ru www.vk.com/sibers [email protected] Николаева, 9/1, 4 этаж Новосибирск 630090, Россия +7 (383) 330-6626 Sibers® является зарегистрированной торговой маркой. Страница 3 — добавить золото. Оно просто валяется в комнатах, и его можно собирать. Отличие от произвольных предметов в том, что на экране комнаты над изображением золота подписано число – количество монет. При тапе по золоту игрок добавляет к своим игровым деньгам указанное количество монет; — добавить мини-карту лабиринта, которая будет либо постоянно на экране, либо доступна по нажатию на соответствующую кнопку на экране. Отображаться на ней должны только посещённые комнаты. Задача 2: Download Manager Суть задания Написать менеджер закачек с очередью скачивания, поддержкой сегментов, докачки и работы в фоновом режиме. Интерфейс менеджера закачек представляет собой одну страницу, на которой находится поле ввода и таблица текущих закачек. В поле ввода можно ввести любой адрес, и при нажатии кнопки Download этот файл будет добавлен в очередь. В каждой ячейке таблицы находится название закачиваемого файла, его URL, его состояние (общий прогресс-бар), кнопка состояния и некоторая текстовая информация. Текстовую информацию лучше рассмотреть на примере: предположим, пользователь закачивает 150-мегабайтный файл. Этот файл будет разделён на 30 сегментов по 5 Мб. 12 сегментов уже полностью скачаны, ещё сейчас в памяти существуют пять одновременно скачивающихся сегментов, но из-за того, что пользователь только что въехал в туннель, два из них уже получили сообщение об обрыве связи, а три ещё пытаются качать. Таким образом, информационная строчка в таблице будет содержать «Total downloaded: 12/30 Active: 3/5». Кнопка состояния служит для переключения между режимом скачивания и режимом паузы. В режиме паузы закачка приостанавливается и, при переключении обратно в активный режим, начинается с того же места, где была остановлена. При обрыве связи приложение должно пытаться автоматически восстановить скачивание некоторое количество раз, после чего выдавать сообщение об ошибке и переводить закачку в режим паузы. Таймаут каждой попытки не должен превышать 10 секунд. Полученные файлы должны храниться в документах, чтобы пользователь мог вытащить их через iTunes. Дополнительные задания к Задаче 2 — Добавить страницу настроек, где можно будет задать максимальное количество одновременно скачиваемых сегментов для одного файла, максимальный размер сегмента, максимальное число одновременно скачиваемых файлов, количество попыток восстановить соединение при обрыве связи, прежде чем выдавать ошибку; — добавить графическое отображение статуса закачки: прямоугольная область, символизирующая файл, будет постепенно закрашиваться разными цветами, показывая статус закачки отдельных частей и их расположение внутри файла. Пример подобного отображения – любой торрент-клиент; — добавить страницу со списком закачанных файлов с возможностью открыть их в UIWebView. Если файл не может быть открыт системными средствами через UIWebView, достаточно вывести сообщение об этом и вернуться к списку; — сделать так, что при нажатии кнопки Home приложение, насколько это возможно долго, качает данные в фоновом режиме и, при получении сообщения об окончании отведённого времени, сохраняет текущее состояние на диск, чтобы при следующем запуске стартовать с того же места, где была остановлена закачка. www.sibers.ru www.vk.com/sibers [email protected] Николаева, 9/1, 4 этаж Новосибирск 630090, Россия +7 (383) 330-6626 Sibers® является зарегистрированной торговой маркой. Страница 4