Когда и почему вы выбрали программирование и сферу геймдев?
Я несколько лет экспериментировал с разными сферами IT: попробовал себя в бэкенде, фронтенде, разработке десктопных приложений, геймдеве. В итоге обнаружил, что последний привлекает меня больше остальных – отчасти из-за открывшейся неприязни к Вебу и некоторым другим областям IT, отчасти из-за того, что геймдев выглядел разносторонним (ведь это гораздо больше, чем просто программирование), а в контексте программирования – потенциально низкоуровневым.
Как вы попали в компанию, в которой сейчас работаете?
На третьем курсе мне нужно было найти место для прохождения производственной практики. Я написал резюме, опубликовал его и начал искать подходящие предложения. В какой-то момент наткнулся на вакансию Unreal Engine 4 C++/Blueprint-разработчика. Тут важно сказать: хоть на C++ к тому времени я активно кодил около четырех лет и кое-что умел, опыта работы с UE4 у меня практически не было. Но я все-таки решил откликнуться и не зря: уже на следующий день меня пригласили на собеседование.
Как вы готовились к собеседованию?
Я не стал читать статьи вроде “96 популярных задач на собеседованиях”, а решил расширить и освежить в памяти знания о тех областях C++, в которых не чувствовал себя на 100% уверенно. Как оказалось, не зря: несколько вопросов на собеседовании касались как раз одной из таких областей.
Расскажите, чем занимается компания, в которую вы попали?
Некоторые считают, что раз компания аутсорсинговая, то у нас постоянно меняется заказчик (а значит, начальник и требования к работе), но это не так. На данный момент мы больше года работаем на нескольких проектах одной и той же студии: разные части команды занимаются каждая своим проектом.
Расскажите о ваших обязанностях?
Я программист, поэтому моя главная обязанность – программировать, закрывая вовремя свои задачи. Помимо этого часто приходится общаться с сотрудниками студии, на которую мы работаем, чтобы уточнить какие-то моменты, а иногда и помочь им с чем-то разобраться. Должен сказать, что общаться нужно не только с программистами, но и с разного рода дизайнерами – начиная от нарративных и заканчивая аудиодизайнерами. Это к тому, что иногда требуется объяснять программистские вещи неспециалистам. Ну и, разумеется, я обязан посещать ежедневные миты, но много времени это не отнимает.
Какие задачи доверяют младшему программисту?
Любые, с которыми по твоему мнению ты можешь справиться. Команда и тимлид лишены предрассудков о том, что джуниор должен красить кнопочки, так что задачи я беру те, что мне интересны ввиду их сложности или необычности.
Иначе говоря, если команда видит, что ты справляешься с задачами определённого уровня, то тебе без опаски начинают доверять задачи этого уровня, даже если он не джуниоровский.
Расскажите, насколько позволяет NDA, о проекте, над которым вы сейчас работаете?
Это драйвовая онлайн action-RPG для PC и консолей.
Какие технологии в нём используются?
В первую очередь Unreal Engine 4. Тут важно сказать, что мы используем во многих местах кастомизированную под проект версию движка, а не официальный вариант от Epic Games. Конечно вместе с UE4 идёт C++, но это не единственный язык на проекте. Помимо очевидных сопутствующих языков типа SQL, используется также Golang – для вещей, связанных с сервером, и Python – для скриптинга чего угодно. В некоторых задачах приходится использовать не связанные непосредственно с игрой API, начиная с Win API и заканчивая Google Spreadsheets API. В качестве системы контроля версий мы используем Perforce. Сервера – Amazon Web Services.
Многие боятся C++. Насколько глубоко нужно знать этот язык?
Достаточно глубоко. Необходимо ясно понимать, когда, сколько раз и при каких условиях создаются копии объектов, соответственно, без понимания конструкторов копирования, операторов присваивания и move-semantics – никуда. Что касается общего управления памятью, то тут собственные аллокаторы писать не приходится, но надо знать, как пользоваться умными указателями.
Очень важно отметить, что знания стандартной библиотеки C++ в контексте UE4 становятся по большей части бесполезными, так как в Unreal Engine есть свои аналоги практически всему из std. Однако некоторые общие техники и принципы из стандартной библиотеки используются и в Unreal, так что общее понятие о std и опыт работы с ней полезны.
В UE4 есть два способа написания логики: визуальный (через Blueprints) и традиционный (на C++). Какой из них чаще используется?
Важно сказать, что C++ и Blueprints не полностью взаимозаменяемы, так что всё зависит от конкретной задачи. Если нужно добавить/исправить чистую игровую логику, велика вероятность того, что это будет сделано с помощью BP, особенно учитывая, что внушительная часть подобного функционала уже реализована через BP.
Вообще-то BP должны использоваться только не-программистами. Однако в нашем проекте большое количество логики было написано на BP именно программистами. Это меня удивило, но тимлид объяснил, что так было начато нашими коллегами из студии, и пока оно никому не мешает, оно останется. Однако когда проект приблизится к релизу, в целях оптимизации вся BP-логика будет заменена эквивалентом на C++. По этой причине при выполнении задач, если это возможно, я всегда выбираю C++.
Правда ли, что в игровом программировании без математики не обойтись?
Отчасти. Математика – это слишком широко, чтобы ответить однозначно. Используются основы тригонометрии и линейной алгебры: векторное и скалярное произведения, матрицы.
Нужно ли знать английский для эффективной работы?
Как минимум необходим уровень беглого чтения технической документации; но документация – не единственное место, где нужен язык. Внутри команды мы используем русский, но с коллегами из студии общаемся исключительно на английском. Причем используется не только письменная речь, но и устная, т.к. созвоны происходят регулярно. Ежедневные миты также проходят на английском. Мой уровень английского – около C1, и в целом я чувствую себя уверенно.
Что вам особенно нравится или не нравится в работе игрового программиста?
Я рад, что попал в индустрию и у меня появилось большое количество знакомых соответствующего профиля. Ещё я давно хотел изучить UE4, но не доходили руки. Теперь же я постоянно углубляю свои знания движка, т.к. это критически важно для успешного выполнения работы.
Полученные в университете знания пригодились вам в работе?
Сразу стоит сказать, что моя университетская специальность – “Искусственный интеллект”, так что пересекаются лишь фундаментальные вещи: все та же линейная алгебра, тригонометрия и дискретная математика. Основы теории графов и теории формальных языков также пригодились: они упрощают понимание различных концепций, связанных с работой. Основы логики просто помогают программировать.
Какие ресурсы посоветуете для изучения необходимых технологий?
Книга “Foundations of Game Engine Development (FGED). Volume 1: Mathematics”, Eric Lengyel.
Пособие по линейной алгебре и не только для разработчиков игровых движков и игр. Автор дает материал подробно, однако соблюдая баланс: не уходит в академические дебри, но при этом не сводит всё к “подставьте здесь нужное число – и готово!”. К каждому “Что такое?” обязательно идёт “Зачем это надо разработчику игр?”. Рекомендую также вю серию FGED.
Книга Professional C++, Marc Gregoire.
1200 страниц подробного, последовательного и актуального описания всех возможностей C++. В начале 2021 года вышло 5-е издание, которое было расширено описанием новых фич языка.
Стоит сказать, что документация у UE4 достаточно слабая, так что если необходимо узнать подробности работы какой-то функции, могу порекомендовать не стесняться смотреть в исходной код движка.
Что вы посоветуете планирующим освоить профессию?
Выберите движок, с которым хотите работать, и начинайте изучать его вместе с языком, который в нем используется. Изучайте до тех пор, пока не начнете чувствовать себя более чем уверенно. После этого вы с легкостью пройдете любое собеседование (конечно, если вас не завалят вопросами о том, какой ваш любимый цвет). Удачи!