Недавно я проходил собеседования в игровых студиях на младшего программиста графики. По итогу я узнал, каких навыков они ожидают от начинающего программиста и какие вопросы могут задать. В этой статье я собрал вопросы в удобный список. Смысл в том, чтобы другие начинающие программисты могли использовать его для подготовки, прежде чем идти на первое собеседование. Но хочу оговориться, что я не рекомендую просто запоминать ответы на эти вопросы. Темы в списке — это темы, которые следует понять и освоить, чтобы решать реальные проблемы программирования графики. Их нужно понять, а не запомнить ответы.
Вопросы делятся по темам: С++, математика, оптимизация и компьютерная графика. Очевидно, это главные темы в повседневной работе. C++ часто используется в реальных задачах, поэтому естественно, что на собеседовании задают много вопросов по нему. Кроме того, в программировании графики требуется лучшее знание математики, чем в большинстве других видов программирования, поэтому математические навыки имеют первостепенное значение. Наконец, для достижения 60 FPS и рендеринга с высокой графической точностью обязательными являются сильные навыки оптимизации. Давайте рассмотрим популярные вопросы в каждой категории.
Вопросы по C++
- Когда следует использовать виртуальные деструкторы? (Интервьюеры в совершенном восторге от этого вопроса!)
- В чём разница между выделением памяти в куче и стеке?
- Какие функции C++11 и C++14 вы используете?
- Для чего используются шаблоны?
- Объясните ключевое слово
inline
. - Что такое прямой и обратный порядок байтов?
- Объясните, что такое const-корректность.
- Какие накладные расходы связаны с вызовом виртуальной функции?
- Вероятно, в каком-то вопросе вас попросят выполнить некие трюки по жонглированию битами с помощью операторов вроде
&
,/
и им подобным. - Вероятно, в каком-то вопросе вас попросят что-то сделать со структурами данных, связанными указателями, вроде дерева. Например, обратить связный список.
- Каков размер указателя в C++ (то есть что показывает
sizeof
для указателя)?
Как правило, о продвинутых функциях языка ничего не спрашивают. Например, меня ни разу не просили выполнить метапрограммирование шаблонов, к счастью.
Вопросы по математике
На самом деле вопросы по математике довольно однообразны.
- Что такое скалярное произведение?
- Что такое векторное произведение?
- Почему следует использовать кватернионы вместо углов Эйлера?
- Как применить матрицы для преобразования объекта? Например, как с помощью матриц масштабировать, преобразовать и повернуть объект?
- Как рассчитать пересечение между лучом и плоскостью/сферой/треугольником?
- Объясните концепции пространства мира, пространства объектов и пространства камеры.
Вероятно, предложат решить некоторые практические задачи, связанные с использованием скалярных произведений, векторных произведений и кватернионов.
Вопросы по оптимизации
- Как применить иерархию ограничивающих объёмов (или octree, или что-то подобное) для ускорения трассировщика лучей?
- Расскажите о кэш-памяти (кэши L1, L2 и так далее).
- Что такое дизайн на основе данных?
- Объясните, как оптимизировать отсечение по пирамиде видимости с помощью многопоточности и SIMD (например, см. пост в блоге Андреаса Асплунда).
- У вас есть опыт использования инструментов профилирования производительности для GPU?
Похоже, игровые студии предполагают, что у вас должен быть опыт профилирования и оптимизации кода с помощью инструментов вроде NVIDIA Nsight, так что ознакомьтесь с ними. Вот ещё хорошая книга по компьютерной архитектуре, в том числе кэш-памяти.
Вопросы по компьютерной графике
- Какие вы знаете методы сглаживания (варианты: MSAA, MLAA, FXAA и TXAA)?
- Каковы типичные элементы движка рендеринга (например, система для обработки отсечения по пирамиде видимости, рендеринга теней, обработки источников света с чем-то вроде отложенного/прямого затенения, система обработки материалов в движке и проч.)?
- Какие вы знаете методы генерации теней (есть КУЧА техник генерации теней, например, разностные теневые карты, сглаживание порога с помощью экспоненциальной функции и более свежий метод моментов)?
- В чём плюсы и минусы отложенного рендеринга?
- Объясните, что такое физически корректный рендеринг?
- Можете объяснить, как работает уравнение рендеринга?
- Что такое BRDF? Что имеют в виду, когда говорят, что «BRDF сохраняет энергию»?
- Как сказываются на производительности ветвления в шейдере (подсказка: почитайте о концепции варпов в архитектуре GPU)?
- Какие преимущества у новых API, таких как Vulkan и DirectX 12, по сравнению со старыми OpenGL и DirectX 11 (подсказка: главное — сниженная нагрузка на драйвер)?
- Какую последнюю научную статью по графике вы читали, можете ли её объяснить (это довольно распространённый вопрос)?
- Опишите весь графический конвейер (вероятно, ответ будет довольно длинным. Вы расскажете о вершинном шейдере и фрагментном шейдере, о перспективно-корректной интерполяции, о Z-буфере, о двойной буферизации фреймбуфера, об альфа-смешивании, матрицах преобразования, однородных координатах, моделях отражения во фрагментном шейдере и так далее).
Последний вопрос особенно часто встречается в ходе собеседований. Если вы не совсем уверены во всех частях конвейера, то советую написать небольшой программный растеризатор. Такое упражнение позволяет получить глубокое представление о конвейере, поскольку создание программного растеризатора во многом похоже на реализацию графического конвейера с нуля.
Многое из перечисленного — это вопросы для разминки. После них последуют более глубокие вопросы (их я не буду раскрывать, чтобы не подставлять компании). Тем не менее, приведённый список вопросов даёт хорошее понимание, каких знаний работодатель ожидает от начинающего программиста.
Некоторые из вас ещё учатся и выбирают предметы учебной программы для работы в компьютерной графике. Мой совет — сосредоточить усилия в первую очередь на высокопроизводительных вычислениях и прикладной математике. Из предметов по программированию попробуйте освоить многопоточность, компьютерную архитектуру и GPGPU, а также другие темы, связанные с высокопроизводительными вычислениями. Из курсов математики — линейная алгебра, многомерное исчисление (думаю, в США этот курс называется Calculus III), теория вероятностей, численная оптимизация, дифференциальные уравнения и вычислительная геометрия. В первую очередь сосредоточьте внимание именно на прикладной математике, а не на более абстрактных математических темах, таких как топология и абстрактная алгебра, поскольку они не так нужны в компьютерной графике.
В общем, от вас не ожидают, что вы разбираетесь во всех нюансах компьютерной графики. Понятие «компьютерная графика» охватывает широкий диапазон тем, таких как глобальное освещение, отбраковка с учётом препятствий (occlusion culling), генерация теней, трассировка пути, жидкостное моделирование, обработка геометрии, GPGPU, физически корректный рендеринг и так далее. Было бы неразумно ожидать, что джун знает все нюансы этих тем. Но если вы что-то укажете в резюме, будьте готовы подробно ответить на эту тему.
Таким образом, не нужно знать ВСЁ о компьютерной графике. Часто бывает, что вас просят рассказать о главных проектах, над которыми вы работали. Затем интервьюер задаст много дополнительных вопросов и попросит подробно объяснить детали вашего проекта. Поэтому мой совет: перед собеседованием выберите несколько проектов, которыми особенно гордитесь — и готовитесь к подробному объяснению.
По-моему, лучший способ подготовиться к собеседованию — поработать в свободное время над большим количеством сторонних проектов. Демонстрация проектов, над которыми вы работали — хороший способ показать себя и продемонстрировать, что вы действительно увлечены этим делом. Наконец, работа над сторонними проектами позволит отточить навыки программирования. А это, в свою очередь, сильно поможет отвечать на все вопросы, которые я перечислил в этой статье.
Автор: m1rko