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

Вопросы для собеседования 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 и в нем есть метод: DoSomething

     

    public 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 и Ян.
* Если нужно какие-то ссылки на Вас поставить, пришлите

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

Понравилась статья? Поделиться с друзьями:
Автор snezhok_13
Время от времени пишет статьи о разработке игр и проводит интервью с разработчиками. Сейчас работает engine-progremmer'ом в Larian Studios. Большой поклонник игр Naughty Dog.
  1. Если какие-то опечатки/плохие формулировки, странные вопросы встречаются – смело пишите в комментарии :)

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

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

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

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

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

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

  2. Sasha Domase :

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

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

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

      • Александр :

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

      • Eugene Shramko :

        Будем ждать!

  3. Ike External :

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

  4. 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 :

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

  5. Oleksii :

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

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

  6. Sergey Senkov :

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

  7. Ivan :

    Интересно, что вопросы про
    расширения для редактора в разделе
    Senior. У нас их писать наоборот отдают
    наименее опытным ребятам в команде

  8. none :

    OpenGL это не графическая библиотека *facepalm*

  9. Станислав :

    Тем не менее, больше половины инфы разработчик может изучить в течении задачи, потратив на это минут 20-30. Всегда был против собесов, которые превращаются в экзамен по знанию предмета. Это не способность размышлять, это в большинстве способность лишь заучить материал, что не совсем подходит под стиль найма в крупных европейских и американских игровых компаниях (прискорбно, что такой подход используют наши студии, т.к. метод такого отбора пройдёт мало самоучек, но много университетских “ботанов”, живущих возле книжек)

    • Кеков :

      Ну тут хз. С одной стороны, многое из указанного можно подзубрить за недельку, если мозги схватывают (во всяком случае я так и делаю). У меня вот лично довольно обширный опыт работы с разными инструментами, но при этом по теории провал. Думаю, что самоучка в состоянии все подзубрить за короткий срок.
      Насчет ботанов – у меня такое чувство, что они не способны писать и поддерживать реально большие программы. Такое чувство, что их используют как шестеренку в крупных компаниях, чтобы они ковырялись вилкой в одном классе.
      На теорию все таки не стал бы гнать, сам недавно для себя очень многое подчерпнул.

  10. Владимир :

    Скажите, а когда вообще Unity разработчики задумывались о том, какое значение имеет старший бит числа, в его двоичной форме: 0 или 1 )))? вопрос, конечно не касается тех ребят, кто пишет свой физический движок, либо напрямую работает с OpenGL )
    Но как мне кажется эти программеры немного выходят за рамки такого собеседования, ИМХО

    • Трактую вопрос как “нафига программистам на unity это знать”. Крутому программисту нужно это знать, а обычному — не нужно.
      Равно как и многие другие вопросы в этом списке: Про матрицы, например тоже.

      • Владимир :

        Не, я полностью согласен с тем, что настоящему программисту это надо знать ))) “кодеры” обходятся и без этого… я лично встречал людей, которые умножают на степень 2-ки и при этом не слышали про операторы сдвига )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *