Вопросы для собеседования Unity3d программиста
Несколько лет занимаюсь тем, что коллекционирую хорошие вопросы для собеседования unity3d разработчиков.
Немного информации про эти вопросы: Я как unity3d программист довольно часто бываю на собеседованиях, а иногда их и провожу, поэтому какие-то вопросы я отметил как хорошие и сгруппировал в этот список. Он, конечно же, не претендует на полноту, академичность и я буду очень рад если вы что-то добавите или поправите в комментариях.
С одной стороны: часто бывает, что и в хороших игровых студиях интервью проводит абсолютно неподготовленный лид-разработчик, который морщит лоб и пытается из головы “навскидку” вспомнить какой-то интересный случай, который случался с ним недавно, чтобы спросить о нем кандидата. С этой стороны мой список поможет подготовиться к проведению подобного собеседования.
С другой стороны: Собеседования программистов (в том числе и unity3d программистов) это чаще всего набор стандартных вопросов, на которые просто необходимо знать ответы. Это мат.часть/ликбез, которую совершенно необходимо знать программисту. И перед интервью мой список поможет вспомнить какие-то моменты.
Общие вопросы
С вопросов из этой категории обычно начинаются и заканчиваются интервью unity3d разработчиков, они общие, часто не технические. Цель таких вопросов: познакомиться с кандидатом, послушать о его опыте. Многие из вопросов применимы не только для интервью на позицию unity3d программиста, но и в целом всех программистов.
- Какие книги по программированию вы читали? Какая из них – любимая? Какая больше всего чему-то научила?
- Владеете ли вы методом слепой печати?
- Чем принципиально отличается фреймворк от библиотеки?
- Что такое инкапсуляция? Какие еще принципы ООП вы знаете? Что такое SOLID, расскажите о принципах.
- Объясните школьнику что такое OpenGL или DirectX, в метафорах, так, чтобы он понял.
Алгоритмы и структуры данных
- Каким образом отрицательные числа представляются в памяти компьютера? Как из положительного числа получить отрицательное в таком случае? А как обратно?
- Как получить ближайшую сверху к числу степень двойки?
- На компьютере массив чисел из 100 элементов сортируется за одну секунду, за сколько секунд отсортируется массив из 100 000 элементов?
- Что такое “время работы алгоритма”?
- Зачем “балансируют” дерево?
- Что такое динамическое программирование? Какие задачи оно решает? Приведите пример.
- Какие вы знаете способы представления графа?
- Какой алгоритм используется для нахождения пути?
- У вас есть односвязный список и указатель на один из его элементов (не последний), как удалить этот элемент из списка, оставив список целостным? Возможно ли решение за О(1)?
-
Что делает эта функция?
func(x,y): if (x == 0): return 1 else: result = 0; for i->1 to y: result += func(x-1, y); return result
- Что делает следующий код?
В случае беззнакового, целочисленного n
((n & (n – 1)) == 0)
- Даны три числа: 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 и в нем есть метод: DoSomethingpublic class Test : MonoBehaviour { void Start () { gameObject.AddComponent(); TComponent t = gameObject.GetComponent(); t.DoSomething(); t.variable = 5; } void Update () { TComponent t = gameObject.GetComponent(); t.DoSomething(); t.variable = 5; } }
- Какие способы вызвать функцию из компонента, вы знаете/используете? Плюсы и минусы данных способов (Варианты: SendMessage, SendMessageUpwards, BroadcastMessage, вызов через GetComponent (GetComponent().SomeMethod() );
- В чем отличия делегатов от стандартных C# events, UnityEvent и EventSystem? Что, где и для чего применяется?
- Что выведет на экран следующий фрагмент кода?
var numbers = new int[] { 1, 2, 3, 4, 5 }; var result = numbers.Where(n => { Console.WriteLine(n); return n <= 3; });
- Измените код из предыдущего вопроса таким образом, чтобы исключить использование лямбда-выражений и делегатов.
- Прокомментируйте разницу в нескольких способах получить первый элемент коллекции.
var element1 = collection.SingleOrDefault(); var element2 = collection.FirstOrDefault(); var element3 = collection.First();
- Напишите unit-test, который подтвердил бы, что в TestTargetClass OpenConnection вызывается раньше, чем DoSomeStuff
public interface IService { void OpenConnection(); void DoSomeStuff(); } public class TestTargetClass { private IService service; public TestTargetClass(IService service) { this.service = service; } public void TestMethod() { this.service.OpenConnection(); this.service.DoSomeStuff(); } }
Senior Unity 3D
Как мне кажется вопросы для старшего unity3d программиста, должны провоцировать его рассказать о своем интересном и богатом опыте. И чаще они будут вытекать из разговора с кандидатом. Но все же несколько вопросов-зацепок я люблю:
- Какие расширения редактора вы писали?
- Для чего используются классы SerializedObject, SerializedProperty, ScriptableObject, AssetDatabase?
- С какими проблемами производительности вы сталкивались и каким образом их решали?
Литература и полезные ресурсы
По мотивам этой коллекции вопросов я написал статью для начинающих unity3d программистов, в которой привел книги по темам, которые можно почитать, чтобы восполнить пробелы.
Благодарности
Многие вопросы мне предложили мои коллеги, за что я им очень благодарен. Сейчас уж и не вспомнить, кто именно и какой вопрос предложил.
Но несколько людей я хочу упомянуть. Павел и Даниил из Sperasoft, Олег из Nival, Павел из Sperasoft и Ян.
* Если нужно какие-то ссылки на Вас поставить, пришлите
ЛЮБЫЕ ЗАМЕЧАНИЯ ПО ФОРМУЛИРОВКАМ, НОВЫЕ ВОПРОСЫ И КОММЕНТАРИИ КРАЙНЕ ПРИВЕТСТВУЮТСЯ
Если какие-то опечатки/плохие формулировки, странные вопросы встречаются – смело пишите в комментарии :)
SerializableObject — имеется в виду сериализация вообще? Такого класса нет.
Здравствуйте, Валентин.
Да верно, ошибка. Наверняка имелся ввиду SerializedObject вместе с SerializedProperty. Это все относится к предыдущему вопросу о том, какие custom-editors приходилось писать.
Как Вам в целом такой список вопросов? Может добавите Какие-то? Было бы здорово!
Ну… я для себя понял, что я итервьювер неудачный )8
Мне надо с человеком именно поработать. Потому что, ну не знает он, например, как отрицательные числа хранятся — вероятно, потому что это в Unity разработке не нужно было никогда… При этом, активно, быстро и ответственно подходит к работе.
Так что, про вопросы это не ко мне (8 Я сейчас сам-то не на все ответ вспомню.
а ответы можно, в какой-нибудь новой теме и желательно подробне
Дело в том, что половина вопросов не имеет четких ответов, они подразумевают дискуссию с кандидатом, чтобы посмотреть как он думает, какой у него опыт.
На те вопросы, которые конкретные, приводить ответы я не хочу. Я через некоторое время приведу список тем/книг/статей по которым можно поднянуть знания. Это будет полезнее и для кандидатов и для интервьюверов. Правда ведь?
Это будет действительно полезно. Я занимаюсь программированием уже 5 лет и до сих пор ответы на многие общие вопросы не знаю (самоучка). Прочел с десяток книг но из общей базы многое пропустил. Ну и естественно если буду куда то пытаться устраиваться на работу прогером то отношение ко мне будет скептическое. Хотя я и веб приложения разрабатываю и десктоп, и бекенд и фронт сам пишу и легко что то новое изучаю и люблю это. Буду ждать список книг и тем)
Будем ждать!
На протяжении 2 дней читаю, перечитываю, гуглю, чего не знаю.
Браво!
Спасибо!) Я очень рад, что Вам пригодился этот список!
GetComponent().CallMethod() — такого метода нет, и откуда вы его взяли, непонятно.
TComponent – нет такого класса, есть просто Component.
Про SendMessage спросили, а про ивенты, к примеру, ни слова. А эта штука куда более полезная.
Сергей, это псевдокод. TComponent по задумке отражает, что-то вроде where TComponent: Component, IInterfaceWithCallMethod и в нем есть метод CallMethod();
Вопрос я откуда-то взял, у меня непоняток “что за методы и что за TComponent” не возникло, когда на него отвечал, сразу понял, что это псевдокод. (помечу, в вопросе этот факт).
Про events да, стоит добавить, наверное. Может подскажете хороший вопрос? Мне на ум ничего, кроме: В чем разница между event Action и просто Action не приходит :)
Отличия стандартного C# event, UnityEvent и EventSystem, что, где и для чего применяется.
Класс! Спасибо :)
Здравствуйте, а данные вопросы по unity, для junior ведь рассматриваются
В меру моего понимания вашего вопроса поясню: Грани junior/middle, middle/seniour очень призрачные. В разных студиях абсолютно по-разному происходят так называемые “грейды”. Чаще всего это больше связано с временем работы в студии, чем с каким-то мастерством и опытом. Если у Вас совсем нет коммерческого опыта работы программистом, то ищите какой-то священный список вопросов, которые все задают для junior-разработчиков. Его не существует. В разных компаниях по-разному.
Я пишу статью с советами для начинающих unity3d разработчиков, как учиться (книги, лекции), как устраиваться на работу (советы). Когда будет готова – добавлю сюда комментарием :) Может она ответит на ваш вопрос
Благодарю за ответ!
Интересно узнать какие паттерны наиболее часто использовались в проектах?
Чаще всего Object Pool, MVC, Strategy, Factory method, Composite, Singleton, Proxy. Лучше не злоупотреблять желанием использовать паттерны, использовать только когда действительно нужно.
Хорошо бы было еще ответы добавить.
Интересно, что вопросы про
расширения для редактора в разделе
Senior. У нас их писать наоборот отдают
наименее опытным ребятам в команде
В разных командах по-разному, и уровень сеньорности так же определяют как придется, зависит от компании
OpenGL это не графическая библиотека *facepalm*
Спасибо, подправил.
Тем не менее, больше половины инфы разработчик может изучить в течении задачи, потратив на это минут 20-30. Всегда был против собесов, которые превращаются в экзамен по знанию предмета. Это не способность размышлять, это в большинстве способность лишь заучить материал, что не совсем подходит под стиль найма в крупных европейских и американских игровых компаниях (прискорбно, что такой подход используют наши студии, т.к. метод такого отбора пройдёт мало самоучек, но много университетских “ботанов”, живущих возле книжек)
Ну тут хз. С одной стороны, многое из указанного можно подзубрить за недельку, если мозги схватывают (во всяком случае я так и делаю). У меня вот лично довольно обширный опыт работы с разными инструментами, но при этом по теории провал. Думаю, что самоучка в состоянии все подзубрить за короткий срок.
Насчет ботанов – у меня такое чувство, что они не способны писать и поддерживать реально большие программы. Такое чувство, что их используют как шестеренку в крупных компаниях, чтобы они ковырялись вилкой в одном классе.
На теорию все таки не стал бы гнать, сам недавно для себя очень многое подчерпнул.
Скажите, а когда вообще Unity разработчики задумывались о том, какое значение имеет старший бит числа, в его двоичной форме: 0 или 1 )))? вопрос, конечно не касается тех ребят, кто пишет свой физический движок, либо напрямую работает с OpenGL )
Но как мне кажется эти программеры немного выходят за рамки такого собеседования, ИМХО
Трактую вопрос как “нафига программистам на unity это знать”. Крутому программисту нужно это знать, а обычному — не нужно.
Равно как и многие другие вопросы в этом списке: Про матрицы, например тоже.
Не, я полностью согласен с тем, что настоящему программисту это надо знать ))) “кодеры” обходятся и без этого… я лично встречал людей, которые умножают на степень 2-ки и при этом не слышали про операторы сдвига )