Вопросы на собеседование Unity программиста
Game Dev
Как Unity программист довольно часто бываю на собеседованиях, а иногда их и провожу, поэтому какие-то вопросы я отметил как хорошие и сгруппировал в этот список.
Часто бывает, что и в хороших игровых студиях интервью проводит абсолютно неподготовленный лид-разработчик, который морщит лоб и пытается из головы «навскидку» вспомнить какой-то интересный случай, который случался с ним недавно, чтобы спросить о нем кандидата. С этой стороны мой список поможет подготовиться к проведению подобного собеседования.
Общие вопросы
С вопросов из этой категории обычно начинаются и заканчиваются интервью Unity разработчиков, они общие, часто не технические. Цель таких вопросов: познакомиться с кандидатом, послушать о его опыте. Многие из вопросов применимы не только для интервью на позицию Unity программиста, но и в целом всех программистов.
- Какие книги по программированию вы читали? Какая из них — любимая? Какая больше всего чему-то научила?
- Владеете ли вы методом слепой печати?
- Чем принципиально отличается фреймворк от библиотеки?
- Что такое инкапсуляция? Какие еще принципы ООП вы знаете? Что такое 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?
Unity
- Рассказать о 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
Как мне кажется вопросы для старшего Unity программиста, должны провоцировать его рассказать о своем интересном и богатом опыте. И чаще они будут вытекать из разговора с кандидатом. Но все же несколько вопросов-зацепок я люблю:
- Какие расширения редактора вы писали?
- Для чего используются классы SerializedObject, SerializedProperty, ScriptableObject, AssetDatabase?
- С какими проблемами производительности вы сталкивались и каким образом их решали?