Вступление и личные наблюдения
Собеседование на юнити-разработчика состоит в основном из трёх частей. Процесс выглядит практически один в один как и на любую другую техническую специальность в IT. Сначала собеседование с HR или рекрутером, потом техническое интервью с Team Leader команды разработки. В конце, если предыдущие этапы успешно пройдены, вас ждет финальный босс - Project Manager(или Product Owner). Эта статья будет полезна для джунов и мидлов, а также людей которые недавно познакомились с Unity. Бородатые синьоры и лиды - буду рад увидеть от вас в комментариях ваш опыт.
Благодарности
Спасибо Никите и Денису за помощь в оформлении и составлении списка вопросов.
Первая часть - собеседование с рекрутером
Как правило занимает от 10 до 30 минут. На нём задача рекрутера дать предварительную оценку по кандидату. Обычно просят рассказать о себе.
Цель - проверить адекватность человека, совпадение по ключевым словам вакансии, а также проверить английский язык если это необходимо. Английский принято проверять беседой на вольную тему 5-10 минут(разговор о хобби, любимых играх, почему ушли из предыдущего места работы или моделирование общения с заказчиком). Важно понимать что наличие проверки английского языка сильно зависит от типа компании и позиции, на которую проходит отбор.
Из личного опыта пришел к тому что нужно научиться за 3 минуты коротко резюмировать свой опыт, выделить самое главное и уверенно презентовать себя другому человеку. Эта информация должна касаться только вашего пути разработчика. То, что вы умеете кататься на коньках, рисуете маслом или прыгаете с парашютом мало кого интересует на данном этапе. Предполагается, что вам будут платить деньги за выполнение задач, описанных в вакансии, поэтому максимально заинтересуйте рекрутера рассказывая только о релевантных для позиции навыках. Этого будет более чем достаточно. Вас спросят подробнее о ваших увлечениях и других вещах, если это будет необходимо.
Пример ответа на “Расскажите о своем опыте.”:
“Разрабатываю игры со старшей школы как инди разработчик, участвовал в джемах и конкурсах. На первом курсе начал работать в гипер-казуальном стартапе. Разрабатывал проекты на Unity C# и Lens Studio JavaScript. Отвечал за полный цикл разработки и гейм дизайн, общался с заказчиком и т.д. Команда состояла из.... Потом принял решение расти как программист дальше, пошел работать в большую компанию для улучшения понимания процессов разработки и технических навыков. Там делал… За время работы научился делать…. На последнем месте работы делаю… Удалось автоматизировать… Предложил варианты решений для... Хочу сменить работу потому, что...”
Часть вторая - техническое интервью
Вот мы и прошли скрининг. В целом, вроде бы не сумасшедший, какие-то слова из вашей речи рекрутер смог сопоставить с требованиями в вакансии, “Лондон из зэ кэпитал оф Грейт Британ” смогли из себя выдавить. Супер! Идём дальше!
А дальше - техническое собеседование. Важно отметить, что вопросы будут отличаться в зависимости от уровня разработчика. Для джуна необходимо определить способность к обучаемости и слышал ли он хотя бы о части технологий, применяемых в проекте. Рассматривая мидла обычно пытаются понять, насколько опыт человека соответствует позиции, чтобы поскорее начать приносить деньги бизнесу, желательно еще вчера. Когда собеседуют бородатого синьора, хотят видеть эксперта в области, который сможет руководить командой, общаться с заказчиком и вообще находить проблемы, которые нужно решать.
Интервью обычно делится на такие части:
Общие вопросы по разработке ПО (OOP, algorithms, DI, SOLID, etc.).
Вопросы по C# (boxing/unboxing, GC, async/await, reference types, etc.).
Unity и опыт в конкретном игровом жанре(match 3, slots, AAA, FPS, etc.) или направлении(mobile, PC, consoles, AR/VR, etc.).
Общие вопросы по разработке
Принципы ООП. Рассказать про каждый. Как это реализовано в языке C#? Как применяли на практике?
SOLID. В чем смысл каждого принципа и как применяли на практике?
Структуры данных. Какие структуры данных вы знаете? Для каких задач лучше использовать ту или иную.
В чем разница между array и List?
Что такое хеш-таблица? Что такое хеш-функция? Как обрабатываются коллизии в словарях?
Алгоритмы. Поиск пути в графе, сортировки коллекций, поиск элемента в коллекции. Какие подходы в обработке коллизий объектов в 2д и 3д знаете?
Сложность алгоритма. Big O notation.
Шаблоны проектирования. Архитектурные шаблоны(MVC, MVP, MVVM, компонентный подход, ECS). Шаблоны для решения типовых задач(GoF, GRASP, Game Programming Patterns).
Dependency Injection. Что это за подход разработки и умеете ли работать с Zenject?
Реактивность. Что это за подход разработки и умеете ли работать с UniRx?
Клиент-серверные приложения. В чем основные принципы разработки клиент-серверных игр? Какие типы вы знаете и разрабатывали?
CI/CD окружение. Для чего используется? Есть ли опыт работы с ним?
Вопросы по C#
Что такое .NET? Что такое CLR? Что такое IL?
Чем отличается динамическая типизация от статической?
Значимые и ссылочные типы. Спецификаторы аргументов функций ref, out.
Boxing и unboxing. Что это и почему это плохо?
Строки. Операции над строками, StringBuilder.
Что такое класс? Что такое структура? В чем отличие между структурой и классом?
Модификаторы доступа.
Что такое интерфейс? Какие члены можно описывать в интерфейсе?
Отличие интерфейса и абстрактного класса.
Upcasting, downcasting.
Обработка исключений. Блок try, catch, finally. Порядок выполнения.
Что такое делегат? Ковариантность, контрвариантность.
Что такое замыкание? Привести пример с замыканием.
Может ли структура реализовывать интерфейс?
Что такое атрибут? Для каких целей используются атрибуты?
Что такое рефлексия? Для решение каких задач приходилось использовать?
LINQ. Extension syntax, query syntax.
Как работает сборщик мусора? Что происходит с объектами которые имеют циклические зависимости?
Есть ли опыт написания авто-тестов и юнит-тестов?
Вопросы по Unity
Игровой движок. Что собой представляет и какие проблемы решает?
Корутины. Что это? Работают в одном потоке или в разных? Какой механизм C# используется для реализации корутин в юнити? Можно ли запустить рутину не из MonoBehaviour? Какие типы yield инструкций вы знаете? Когда они вызываются?
Что такое Game Object? Что такое сцена?
Что такое MonoBehaviour? От чего он наследуется? Можно ли создать тип наследуемый от Component?
Жизненный цикл MonoBehaviour.
Порядок вызова Event функций в runtime режиме Unity.
Физика. Какие компоненты позволяют работать с физикой. Что такое rigid body? Что такое рейкаст? Отличие от лайнкаста?
NavMesh. Поиск пути.
Опыт работы с UI компонентами? Что такое канвас? Что такое панель? Чем плох и хорош канвас? Как верстать адаптивный интерфейс? Что такое LayoutGroup?
Камера. Типы камер, параметры для настройки. Скай бокс, occlusion culling.
Что такое deltaTime и fixedDeltaTime? Отличия между ними.
Аниматор. Можно ли дописывать логику к состояниям аниматора? Что такое Timeline и опыт работы с ним?
Опыт написания кастомного редактора, окна для инструментов, расширения для ускорение и автоматизации рутинных задач.
Ассет бандлы и адрессаблы. Для чего используются и есть ли опыт разработки с их использованием?
Батчинг и Draw calls. Что это? Какие подходы оптимизации вызовов отрисовки вы знаете?
Что такое mesh? Из чего состоит 3д модель?
Опыт работы с шейдерами. Приходилось ли писать шейдеры?
Профайлинг. Какие инструменты для диагностики проблем производительности вы знаете(profiler, deep profiling, frame debugger, memory profiling, profiling on device)?
Unity Web Requests. Что это? Приходилось ли работать с клиент-серверным взаимодействием?
Есть ли опыт работы с нативным слоем? Android Studio, XCode.
Опыт интеграции SDK(реклама, аналитика, конфиги, БД, пуш уведомления).
Test Runner. Опыт работы с тестами в движке.
Конечно же это не полный список того что вас могут спросить на собеседовании. Хотелось показать в какую сторону смотреть и что спрашивают в большинстве случаев на технических интервью. Вас могут попросить решить задачу в реальном времени или написать программу. По моему опыту, очень важным моментом является двустороннее общение. Если на этапе с рекрутером кроме описания вакансии вряд ли вам дадут детальную информацию по будущему проекту, то на техническом собеседовании самое время задавать вопросы вам. Обязательно спросите про состав команды, уровень разработчиков, наличие код ревью. Спросите про организацию процессов, кто за что отвечает и как происходит валидация вашей работы. На какой проект вас рассматривают если вам еще не сказали окончательно. Так же вопросы с вашей стороны дадут понимание компании, что вы действительно заинтересованы в получении работы.
Часть третья - финальный босс
Когда по вам дали добро в плане технических навыков, вам предложат пройти последний этап. Это беседа с вашим будущим ПМом или продюсером(aka PO). Вас могут спросить, умеете ли вы эстимировать задачи. Есть ли у вас понимание как оценивать сложность задач. Не остаетесь ли вы один на один с проблемой, умеете ли вы просить помощь и в целом коммуницировать с другими членами команды. Задача вашего потенциального административного руководителя - определить уровень самостоятельности человека, насколько он подходит по типажу к людям в команде. Не пытайтесь врать или приукрашать ответы на вопросы. Это всегда видно, а вам с этим человеком потом вместе проходить сквозь спринты. Во-первых, если вы не умеете делать вещи выше - пришло время в этом начать разбираться. Во-вторых, честные ответы ценятся больше чем красивые истории.
Вопросы
Есть ли опыт провалившихся дедлайнов? Как справлялись с ситуацией?
Как решали задачи которые не могли решить самостоятельно?
Расскажите о самой сложной задаче.
Как вы оцениваете задачи по времени и сложности?
Есть ли опыт менторства? Как работали с джунами?
Приходилось ли работать в стрессовой обстановке перед релизом?
Как относитесь к овертаймам?
По какой методологии работали(agile, scrum, kanban)?
Подведение итогов
К счастью или к сожалению, прохождение собеседований - это отдельный навык, который по моему мнению, не имеет ничего общего в решении боевых задач. Он даст двум сторонам первое впечатление друг о друге, но не более. Для того, чтобы понять, насколько компания подходит вам, и вы подходите компании, существует испытательный срок. А это уже совсем другая история…
Как и любой другой навык, прохождение собеседований нарабатывается, как не удивительно, прохождением собеседований! Главное - покажите на максимум те навыки, которыми уже обладаете. И помните, если вы провалили собеседование или получили отказ, это может значить две вещи: или вам нужно еще поучиться, или вы банально не подходите этой компании, этому проекту, этой вакансии… Это IT, слышал, тут так бывает. Удачи на собеседовании!