Вопросы для собеседования 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 (с которым мы сейчас работаем).
* Если нужно какие-то ссылки на Вас поставить, пришлите

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

Ребята, без вашей помощи блогу не обойтись, sharing особенно в Google+ очень нужен! Пошарьте, если Вам понравилась статья.
  • Если какие-то опечатки/плохие формулировки, странные вопросы встречаются — смело пишите в комментарии 🙂

    • SerializableObject — имеется в виду сериализация вообще? Такого класса нет.

      • Здравствуйте, Валентин.

        Да верно, ошибка. Наверняка имелся ввиду SerializedObject вместе с SerializedProperty. Это все относится к предыдущему вопросу о том, какие custom-editors приходилось писать.

        Как Вам в целом такой список вопросов? Может добавите Какие-то? Было бы здорово!

        • Ну… я для себя понял, что я итервьювер неудачный )8
          Мне надо с человеком именно поработать. Потому что, ну не знает он, например, как отрицательные числа хранятся — вероятно, потому что это в Unity разработке не нужно было никогда… При этом, активно, быстро и ответственно подходит к работе.

          Так что, про вопросы это не ко мне (8 Я сейчас сам-то не на все ответ вспомню.

  • Sasha Domase

    а ответы можно, в какой-нибудь новой теме и желательно подробне

    • Дело в том, что половина вопросов не имеет четких ответов, они подразумевают дискуссию с кандидатом, чтобы посмотреть как он думает, какой у него опыт.

      На те вопросы, которые конкретные, приводить ответы я не хочу. Я через некоторое время приведу список тем/книг/статей по которым можно поднянуть знания. Это будет полезнее и для кандидатов и для интервьюверов. Правда ведь?

      • Александр

        Это будет действительно полезно. Я занимаюсь программированием уже 5 лет и до сих пор ответы на многие общие вопросы не знаю (самоучка). Прочел с десяток книг но из общей базы многое пропустил. Ну и естественно если буду куда то пытаться устраиваться на работу прогером то отношение ко мне будет скептическое. Хотя я и веб приложения разрабатываю и десктоп, и бекенд и фронт сам пишу и легко что то новое изучаю и люблю это. Буду ждать список книг и тем)

      • Eugene Shramko

        Будем ждать!

  • Ike External

    На протяжении 2 дней читаю, перечитываю, гуглю, чего не знаю.
    Браво!

  • Sergey Molchanovsky

    GetComponent().CallMethod() — такого метода нет, и откуда вы его взяли, непонятно.
    TComponent — нет такого класса, есть просто Component.
    Про SendMessage спросили, а про ивенты, к примеру, ни слова. А эта штука куда более полезная.

    • Сергей, это псевдокод. TComponent по задумке отражает, что-то вроде where TComponent: Component, IInterfaceWithCallMethod и в нем есть метод CallMethod();
      Вопрос я откуда-то взял, у меня непоняток «что за методы и что за TComponent» не возникло, когда на него отвечал, сразу понял, что это псевдокод. (помечу, в вопросе этот факт).

      Про events да, стоит добавить, наверное. Может подскажете хороший вопрос? Мне на ум ничего, кроме: В чем разница между event Action и просто Action не приходит 🙂

      • Sergey Molchanovsky

        Отличия стандартного C# event, UnityEvent и EventSystem, что, где и для чего применяется.

        • Класс! Спасибо 🙂

          • Eugene Shramko

            Здравствуйте, а данные вопросы по unity, для junior ведь рассматриваются

          • В меру моего понимания вашего вопроса поясню: Грани junior/middle, middle/seniour очень призрачные. В разных студиях абсолютно по-разному происходят так называемые «грейды». Чаще всего это больше связано с временем работы в студии, чем с каким-то мастерством и опытом. Если у Вас совсем нет коммерческого опыта работы программистом, то ищите какой-то священный список вопросов, которые все задают для junior-разработчиков. Его не существует. В разных компаниях по-разному.

            Я пишу статью с советами для начинающих unity3d разработчиков, как учиться (книги, лекции), как устраиваться на работу (советы). Когда будет готова — добавлю сюда комментарием 🙂 Может она ответит на ваш вопрос

          • Eugene Shramko

            Благодарю за ответ!

  • Pingback: Для начинающих Unity3d программистов | Coremission()

  • Oleksii

    Интересно узнать какие паттерны наиболее часто использовались в проектах?

    • Чаще всего Object Pool, MVC, Strategy, Factory method, Composite, Singleton, Proxy. Лучше не злоупотреблять желанием использовать паттерны, использовать только когда действительно нужно.

  • Sergey Senkov

    Хорошо бы было еще ответы добавить.