Вопросы для собеседования Unity3d программиста

Несколько лет занимаюсь тем, что коллекционирую хорошие вопросы для собеседования unity3d разработчиков.

Немного информации про эти вопросы: Я как unity3d программист довольно часто бываю на собеседованиях, а иногда их и провожу, поэтому какие-то вопросы я отметил как хорошие и сгруппировал в этот список. Он, конечно же, не претендует на полноту, академичность и я буду очень рад если вы что-то добавите или поправите в комментариях.

С одной стороны: часто бывает, что и в хороших игровых студиях интервью проводит абсолютно неподготовленный лид-разработчик, который морщит лоб и пытается из головы «навскидку» вспомнить какой-то интересный случай, который случался с ним недавно, чтобы спросить о нем кандидата. С этой стороны мой список поможет подготовиться к проведению подобного собеседования.

С другой стороны: Собеседования программистов (в том числе и unity3d программистов) это чаще всего набор стандартных вопросов, на которые просто необходимо знать ответы. Это мат.часть/ликбез, которую совершенно необходимо знать программисту. И перед интервью мой список поможет вспомнить какие-то моменты.

Общие вопросы

С вопросов из этой категории обычно начинаются и заканчиваются интервью unity3d разработчиков, они общие, часто не технические. Цель таких вопросов: познакомиться с кандидатом, послушать о его опыте. Многие из вопросов применимы не только для интервью на позицию unity3d программиста, но и в целом всех программистов.

  • Какие книги по программированию вы читали? Какая из них — любимая? Какая больше всего чему-то научила?
  • Владеете ли вы методом слепой печати?
  • Чем принципиально отличается фреймворк от библиотеки?
  • Что такое инкапсуляция? Какие еще принципы ООП вы знаете? Что такое SOLID, расскажите о принципах.
  • Объясните школьнику что такое графическая библиотека (OpenGL, DirectX), в метафорах, так, чтобы он понял.

Алгоритмы и структуры данных

  • Каким образом отрицательные числа представляются в памяти компьютера? Как из положительного числа получить отрицательное в таком случае? А как обратно?
  • Как получить ближайшую сверху к числу степень двойки?
  • На компьютере массив чисел из 100 элементов сортируется за одну секунду, за сколько секунд отсортируется массив из 100 000 элементов?
  • Что такое “время работы алгоритма”?
  • Зачем “балансируют” дерево?
  • Что такое динамическое программирование? Какие задачи оно решает? Приведите пример.
  • Какие вы знаете способы представления графа?
  • Какой алгоритм используется для нахождения пути?
  • У вас есть односвязный список и указатель на один из его элементов (не последний), как удалить этот элемент из списка, оставив список целостным? Возможно ли решение за О(1)?
  • Что делает эта функция?

  • Что делает следующий код?
  • В случае беззнакового, целочисленного n

  • Даны три числа: a, b, c. Как определить за максимум два сравнения существует ли треугольник со сторонами длиной a, b и с?
  • Определить является ли беззнаковое целое число (unsigned int) степенью двойки? (написать функцию.время работы О(1))
  • Есть односвязный список — постройте перевернутый (обратный) список из данного. Последний элемент указывает на предпоследний, …, второй указывает на первый.

Графика/3D математика/Rendering pipeline

В программировании игр графика это главный инструмент взаимодействия с игроком. «Art is a king»,- говорят в игровых студиях.
Я считаю, что игровой программист должен иметь какое-то представление о том, как устроен графический pipeline и быть хоть немного знакомым с 3d математикой.

  • Что такое lerp? Напишите lerp для float.
  • Что такое dot-product, cross-product векторов? Геометрический смысл этих операций.
  • Расскажите про графический пайплайн, какие системы координат используются на этапах, какие преобразования осуществляются? Что такое drawcall?
  • Какие способы представления ориентации объекта в пространстве вы знаете? Чем хороши кватернионы?
  • Почему slerp работает по кратчайшей дуге?
  • Какие модели освещения вы знаете? Расскажите о принципе работы какой-нибудь из них
  • Когда GPU делает sample текстуры каким образом выбирается mipmap-уровень?
  • Какие данные в себе хранит меш?
  • Для чего нужны нормали? Как нормали преобразуются из одной системы координат в другую (например из локальных координат в мировые, координаты камеры)? Почему таким образом?
  • Есть два вектора — a, b (не ортогональные). Необходимо получить вектор ортогональный плоскости образованной векторами a и b
  • Есть два вектора — a, b (не ортогональные). Необходимо получить вектор ортогональный a или b в плоскости образованной этими векторами
  • Каким образом по вектору нормали и вектору света определить вектор отраженного света?
  • Напишите матрицу поворота вокруг любой из оси

C#/.Net

  • Какой IDE вы пользуетесь? Назовите несколько часто используемых вами short-cut’ов этой IDE. Пробовали ли вы другие IDE? Visual Studio/VS + ReSharper?
  • В чем разница между Lambda и Expression?
  • Что такое замыкание (closure)? Каким образом оно реализуется в C#/.Net?
  • Что такое Boxing/Unboxing?
  • Методы класса Object. Перечислите и расскажите для чего они нужны.
  • Что такое partial классы и для чего они нужны? Partial методы?
  • Какие существуют способы приведения типа и в чем их различия? Как лучше пользоваться?
  • Что вы знаете о Reflection?

Unity3d

  • Рассказать о yield return, yield break и Coroutine в Unity. Как работают yield-инструкции? Как работают Coroutines в Unity?
  • Назовите функции преобразования из локальных координат в мировые и обратно (для точки и для направления). Как работают эти функции? Связано ли их время работы с расположением/вложенностью объекта в иерархии? Реализуйте собственные extension-методы для Transform, которые будут давать такой же результат, как и настоящие.
  • В каком порядке вызываются события MonoBehaviour в процессе рендеринга кадра? Зачем нужны отдельные Update и FixedUpdate?
  • Каким образом Unity обеспечивает кроссплатформенность? Как, например, работает написанная Вами игра на платформе Android?
  • Необходимо интерполировать вектор из A в B за определенный промежуток времени. Каким образом реализовать?
  • Что такое drawcall, batching? Какие возможности предоставляет Unity?
  • Что бы Вы изменили в данном коде для увеличения быстродействия? Как можно еще улучшить этот код? В чем его проблема?
    TComponent это класс-наследник Component и в нем есть метод: DoSomething
  • Какие способы вызвать функцию из компонента, вы знаете/используете? Плюсы и минусы данных способов (Варианты: SendMessage, SendMessageUpwards, BroadcastMessage, вызов через GetComponent (GetComponent().SomeMethod() );
  • В чем отличия делегатов от стандартных C# events, UnityEvent и EventSystem? Что, где и для чего применяется?
  • Что выведет на экран следующий фрагмент кода?

  • Измените код из предыдущего вопроса таким образом, чтобы исключить использование лямбда-выражений и делегатов.
  • Прокомментируйте разницу в нескольких способах получить первый элемент коллекции.

  • Напишите unit-test, который подтвердил бы, что в TestTargetClass OpenConnection вызывается раньше, чем DoSomeStuff

Senior Unity 3D

Как мне кажется вопросы для старшего unity3d программиста, должны провоцировать его рассказать о своем интересном и богатом опыте. И чаще они будут вытекать из разговора с кандидатом. Но все же несколько вопросов-зацепок я люблю:

  • Какие расширения редактора вы писали?
  • Для чего используются классы SerializedObject, SerializedProperty, ScriptableObject, AssetDatabase?
  • С какими проблемами производительности вы сталкивались и каким образом их решали?

Литература и полезные ресурсы

По мотивам этой коллекции вопросов я написал статью для начинающих unity3d программистов, в которой привел книги по темам, которые можно почитать, чтобы восполнить пробелы.

Благодарности

Многие вопросы мне предложили мои коллеги, за что я им очень благодарен. Сейчас уж и не вспомнить, кто именно и какой вопрос предложил.
Но несколько людей я хочу упомянуть. Павел и Даниил из Aggrostudios, Олег из Nival, Павел из Sperasoft, Ян из Aggrostudios/EA/HarborCrew (с которым мы сейчас работаем).
* Если нужно какие-то ссылки на Вас поставить, пришлите

ЛЮБЫЕ ЗАМЕЧАНИЯ ПО ФОРМУЛИРОВКАМ, НОВЫЕ ВОПРОСЫ И КОММЕНТАРИИ КРАЙНЕ ПРИВЕТСТВУЮТСЯ

Ребята! Пожалуйста, если Вам понравилась статья — пошарьте её в соц. сетях, особенно ценны Facebook и Google+
Это очень поможет нашему блогу, огромное спасибо!
Читай также:  Compute Shaders 2: Вычислительный блок
, ,