Технічна співбесіда з Unity Developer. 150+ запитань для Junior, Middle і Senior
Ми продовжуємо рубрику, присвячену технічним співбесідам у геймдеві. Цього разу наводимо список запитань і приклади тестових завдань для Unity-розробників рівнів Junior, Middle і Senior.
Радимо використовувати цей список лише як орієнтир, що допоможе знайти свої слабкі місця й успішно пройти чи провести співбесіду. І сподіваємось, цей матеріал стане в пригоді всім спеціалістам з Unity, які шукають роботу та наймають фахівців у команду.
⭐ Junior Unity Developer
Читайте також:
🔵 Теорія C# і ООП
- Які патерни об’єктно орієнтованого програмування ви знаєте? Які застосовували?
- Які принципи програмування ви знаєте? Про що вони?
- Що таке рефакторинг? Які прийоми рефакторингу ви знаєте?
- Що таке збирач сміття (Garbage Collector)? Що таке покоління збірки сміття?
- Чи працювали ви з асинхроними методами? В яких випадках вони використовуються?
- Що ви знаєте про впровадження залежності? Для чого це потрібно?
- В чому різниця між структурою і класом?
- Розкажіть про роботу типів-посилань і типів-значень?
- Модифікатори доступу в C# — які вони бувають, в чому між ними різниця?
- Що таке Override та заміщення методів?
- Яка різниця між abstract і virtual?
- Чим відрізняється тип за значенням, та за посиланням? В чому різниця між модифікаторами ref та out?
- Що таке перегрузка методів?
- Що таке необовʼязкові параметри, в чому буде різниця в роботі з необовʼязковими параметрами та перегрузкою методів?
- Що таке івенти? Що таке делегати? Яка між ними різниця?
- Що таке Struct (структура)?
- Що дає модифікатор static? В чому різниця між статичним класом та звичайним?
- Що таке Boxing/Unboxing?
- Що таке UpCast/DownCast?
- Що таке приведення типів? Які варіанти існують цієї операції? Чи можна привести тип char до int?
- Що таке SOLID? Розшифруйте та поясніть три принципа SOLID.
- Що таке Linq? Які запити ви знаєте?
- Що таке асинхронна таска? Як можна зупинити виконання асинхронної таски?
- Чи можна в асинхронній тасці дочекатись виконання методу, якщо так то як?
- Що таке MVC і які патерни цього сімейства ви знаєте?
- В чому різниця між патерном Фабрика та абстрактна Фабрика?
- Що таке DI?
- Що таке рефлексія і навіщо вона використовується?
- Чи можливе множинне наслідування классів в С#?
- Що таке анонімна функція?
🟢 Теорія Unity
- Які основні принципи архітектури Unity ви знаєте і як вони впливають на розробку ігор?
- Які механіки фізики ви використовували для створення реалістичних рухів об’єктів в іграх?
- Що дає компонент Rigidbody?
- Що дає компонент Collider, які типи Collider існують? В чому різниця між колайдерами в режимі IsTriggered і звичайному.
- Що дає компонента SpriteRenderer?В чому різниця між Order In Layer i Sorting order?
- Назвіть основні методи життєвого циклу MonoBehaviour.
- Як працюють юнітівські методи Awake, Start, Update, FixedUpdate?
- Для чого краще використовувати методи Update(), FixedUpdate(), LateUpdate()?
- Чи можна змінити частоту роботи FixedUpdate, для чого це варто робити?
- Яка різниця між методами Awake() і Start()? Для чого вони використовуються?
- Що таке ScriptableObject? Який патерн програмування він реалізує?
- Що таке PlayerPrefs? Які типи даних туди можна зберігати? Які способи зберігання даних ви використовуєте в Unity?
- Що таке корутина? Коли буде виконуватись перевірка можливості відпрацювання корутини? В якому потоці виконуються корутини?
- Які способи створення 2D-анімації ви знаєте? Які в них недоліки?
- З якими анімаціями ви працювали?
- Що таке Draw Calls, та як зменшити їхню кількість? Як працює батчинг?
- Що таке SpriteAttlas? Коли варто просити художника впакувати спрайти в спрайт атлас, коли це краше робити в редакторі?
- Як можна оптимізувати розмір застосунку?
- Які шляхи оптимізації використання оперативної памʼяті ви знаєте?
- Що таке Unity events?
- Які SDK ви інтегрували в Unity?
- Чи працювали ви з Firebase, які там є сервіси?
- Якщо б вам було завдання зробити «синю зону» з гри жанру battle-royal як би ви її реалізовували?
- Що таке Raycast?
- Чи знаєте ви що таке Spine?
- Чи працювали ви з системою частинок? Які задачі можна вирішити використанням систем часток?
- Які системи частинок ви використовуєте для створення ефектів вогню, диму або вибухів в іграх?
- Що таке канвас? Скільки канвасів одночасно може існувати на сцені? Коли виникає потреба робити більше одного Canvas?
- Які Render Mode полотна (Canvas) ви знаєте? Для чого використовується кожен з них?
- Як буде визначатися порядок відмальовування UI елементів? За допомогою чого можна ним керувати?
- Якби вам дали на вибір 2 розширення, під які UI дизайнер має відмалювати референс екрану, що це були б за розширення?
- Чи працювали ви з Text mesh pro? Який його недолік?
- Чи працювали ви з DotWeen?
- Які інші сторонні розширення ви використовували для Unity?
- Що таке префаби? В чому різниця між префабом і сценою?
- Які основні компоненти Unity?
- Які типи файлів можна завантажити у Unity?
- Чи займалися ви версткою UI? Які знаєте проблеми в роботі з цим?
- Які спеціальні папки, імена яких зарезервовано Unity, ви знаєте? Для чого вони використовуються?
- Які інструменти профілювання в Unity Editor ви знаєте?
- Чи знаєте ви про Layer Collision Matrix і для чого вона застосовується?
- Що таке unit testing? Чи використовували ви Test Runner в Unity?
- Яка ситуація з асинхронністю в Unity? Які є підводні камені?
- Які типи рендерингу ви знаєте? Які в них відмінності?
- Що таке запікання світла?
- Що таке Render Pipeline? Які пресети RP ви знаєте?
- Що краще — 1000 обʼєктів які викликають окремий Update, чи 1 обʼєкт який викликає 1000 апдейтів? Чому?
🟡 Загальні запитання
- Як ви розумієте поняття СI/CD?
- Чи є у вас власні проекти на git-hub, кодом якого ви б могли поділитись?
- Чи є у вас є пет проджекти завантажені на PlayMarket/AppStore чи будь-яку іншу платформу?
- Чи є у вас досвід командної розробки? Чи брали ви участь хакатонах чи геймджемах?
- Які плагіни ви використовували в своїй роботі чи пет-проєктах? Для яких цілей?
- Опишіть найскладнішу задачу, з якою стикалися під час розробки? Чому вона була складною? Як ви впоралися з нею?
- Що ви вважаєте своїм великим технічним досягненням на цей момент?
🍰 Задачі на логіку
- Як трьома розрізами поділити торт на 8 рівних шматочків?
- У вас є 3 ящика з фруктами(апельсини, яблука, мікс-апельсинів і яблук), на кожному з ящиків є наклейка з одним з фруктів/міксом. Кожна наклейка неправдива (в ящику не можуть бути фрукти, які зображені на наклейці). Ви можете засунути руку в один з ящиків, дістати фрукт і по ньому сказати що в інших двох ящиках. В який ящик ви засунете руку?
- У вас є 25 коней, за яку мінімальну кількість забігів ви зможете визначити 5 найшвидших?
- У вас є 9 монеток, одна з них зіпсована (легша або важча за решту). За яку мінімальну кількість зважень, шальковими вагами ви знайдете зіпсовану монету?
📙 Приклад тестового завдання для Junior Unity Developer
Провідний розробник-початківець проєктує застосунок. Він точно знає, що в ньому буде такий метод:public static void MarkCheater(Player player) =>
player.Name = «Cheater»;
Що виведеться в лог у такому коді, якщо Player буде struct, а також у випадку, якщо Player буде class?
var player = new Player { Name = «Player 1» };
MarkCheater(player);
Log(player.Name);
де Log — будь-який зручний метод логування.
Після базового знайомства з HR студія може студія може дати як тестове Unity-проєкт зі всіма потрібними асетами. Кандидат має реалізувати мінігру під мобільні платформи від першої особи. Всі задані критерії щодо гравця, ворогів, меню/UI прописані в завданні. Таке тестове можуть дати і джуніор і мідл-спеціалісту — все залежатиме від фінальної реалізації.
Після виконання студія спершу перевіряє відповість всіх критеріїв, якість реалізованих механік і наскільки фінальний білд готовий до гри (грабельний). Тоді відбувається глибша перевірка, де звертають увагу на чистоту коду і структуру. Після цього відбувається детальніша співбесіда з HR (щодо попереднього досвіду, мотивації, зацікавленості в геймдеві, організаційних моментів), співбесіда з CEO і Dev-командою.
⭐Middle Unity Developer
🔵 Теорія C#
- Розкажіть про багатопотоковість та асинхронність
- Що таке куча та стек? Відмінності та принцип роботи.
- Для чого потрібні try, catch, finally? В якому випадку може не виконатися блок finally?
- Що таке замикання (closure)? Як воно реалізується в C#/.Net?
- Чим відрізняється Value Type від Reference Type?
- Як працює стек? В які саме моменти він використовується?
- Де зберігається Value Type яке є полем в класі?
- Що буде якщо упакувати int value та розпакувати в int-овий enum?
- Які є методи класу Object?
- Для чого потрібен метод GetHashCode()?
- Що саме робить yield інструкція?
- Чи працювали ви з IoC-контейнерами?
- Як ви відрізняєте модифікацію та розширення у Open/closed принципі?
🟢 Теорія Unity
- Питання про UI: чи займалися ви версткою? Які знаєте підходи до оптимізації UI?
- Розкажіть, які найкращі практики при роботі з UI ви знаєте?
- Чи стикалися ви з проблемами продуктивності застосунку? Які інструменти використовували для локалізації проблеми?
- Які дані в собі зберігає меш?
- Як ви розумієте графічний пайплайн?
- Які компоненти Unity використовуються для керування рухом об’єктів? Поясніть різницю між Transform, Rigidbody і CharacterController.
- Що таке mipmap рівень і які його переваги та недоліки?
- Є гілка feature/some_ticket_id, успадкована від develop. Тестувальник перевірив гілку, і дав зелене світло на її merge у develop. Ви сіли мержити і виявили конфлікт із високою небезпекою регресії. Ваші дії?
- Тестувальник завів баг, але з його кроків ви не можете його відтворити. Продуктові дебаглоги також не дають вам чіткого розуміння про походження бага. При цьому тестувальник може відносно стабільно відтворити баг. Ваші дії?
- Чим відрізняються Update, FixedUpdate та LateUpdate?
- LateUpdate запускається до рендерінгу кадру чи після?
- Як працюють ваші скріпти на інших платформах, наприклад на Android?
- Розкажіть про ваш досвід у профайлінгу.
- Розділяти інтерфейси ви починаєте на етапі проектування чи коли інтерфейс розростається? Які критерії ви використовуєте для розуміння потреби розділення інтерфейсу?
- Як працює багатопоточність в Unity?
- Чи доводилось вам писати шейдери? Використовували Shader Graph?
- Що таке .asmdef і навіщо вони потрібні?
- Як реалізувати систему яка б дозволяла додавати в гру контент без оновлення додатку? Які механізми для цього можна використати?
- Наведіть приклад використання патерну «Стратегія» в грі?
- Чи доводилось писати Editor-розширення? Якщо так, то які?
- Як ви працюєте з колізіями в Unity? Як виявляти зіткнення між об’єктами і як уникнути фізичних проблем, таких як проникання (clipping) або неправильна обробка зіткнень?
- Які інструменти Unity ви використовуєте для розробки мультиплеєрних ігор? Розкажіть про декілька можливостей мережевого програмування в Unity.
- Які кращі практики ви застосовуєте для керування структурою коду в Unity-проектах? Як ви організовуєте код, щоб підтримувати його читабельним і легко розширюваним?
🟡 Загальні запитання
- Наведіть приклад порушення/неправильної реалізації принципу підстановки Барбари Лісков.
- Чим фреймворк відрізняється від бібліотеки?
- Поясніть що таке бібліотека OpenGL, DirectX в метафорах дуже простими словами (щоб зрозумів навіть учень молодших класів у кількох реченнях).
- Як конвертувати біти у десяткові числа? Наприклад яке число вийде з 0×0...0011?
- Як від’ємне число записується в бітовому представленні?
- Чи працювали ви з графами (математична модель)? Які засоби представлення графа ви знаєте?
- Що таке dot-product, cross-product векторів?
- Що таке кватерніони і чим вони кращі за кути Ейлера?
- Що таке інкапсуляція? Які ще принципи ООП ви знаєте?
- Ви завжди дотримуєтесь принципу Single responsibility чи є винятки? Як визначити грань, що буде порушувати принцип?
- Які існують способи приведення типу та у чому їх відмінності? У яких випадках використовувати той чи інший?
- Що таке Reflection по своїй суті? Да краще її використовувати?
- Що значить інверсія залежності у назві принципу Dependency inversion?
📙 Приклад тестового завдання для Unity Middle Developer
Провідний розробник-початківець проєктує застосунок. Він точно знає, що в ньому буде такий метод:
public static void MarkCheater(Player player) =>
player.Name = «Cheater»;
що виведеться в лог у такому коді у випадку, якщо Player буде struct, а також у випадку, якщо Player буде class?
var player = new Player { Name = «Player 1» };
MarkCheater(player);
Log(player.Name);
де Log — будь-який зручний метод логування.
Після відповіді доповнити задачу. Що зміниться, якщо структура буде реалізовувати інтерфейс?
IPlayer player = new Player { Name = «Player 1» };
public static void MarkCheater(IPlayer player) =>
player.Name = «Cheater»;
⭐ Senior Unity Developer
🔵 Теорія C#
- Як працює garbage collector?
- У чому різниця між Array, List. Яка структура даних використовується під капотом у List?
- Що таке колізії в Dictionary, як він вміє з ними працювати?
🟢 Теорія Unity
- Draw Calls та Batching — що це таке та як працює?
- Чи стикалися ви з проблемами продуктивності застосунку? Які зміни застосовували для покращення показників?
- Ваші дії для локалізування проблеми просідання фпс на мобільному девайсі? Якщо в редакторі проблема не відтворюється?
- Як визначити і які дії потрібні щоб виправити Memory Leak?
- Який архітектурний патерн найбільше підходить для реалізації користувацького інтерфейсу в Unity? Чому?
- Як ви реалізуєте системи фізики в Unity? Розкажіть про ваш підхід до моделювання фізичних взаємодій об’єктів у грі.
- Які стратегії ви використовуєте для забезпечення кодування гри в Unity? Чи використовуєте ви якісь патерни проектування або архітектурні підходи?
- Розкажіть про ваш досвід у розробці штучного інтелекту (AI) в іграх з використанням Unity. Які алгоритми ви використовуєте для моделювання поведінки NPC (некерованих персонажів)?
- Які навички та практики ви використовуєте для підтримки кодування гри в Unity великими командами розробників?
🟡 Загальні запитання
- Чи працювали ви з MVC, MVP, MVVM? Розкажіть про кожен окремо.
- Чи працювали з паттерном ECS? Які в нього особливості і коли доцільно його використовувати?
- Розкажіть, з чого починаєте новий проєкт?
- Які сторонні бібліотеки одразу додаєте, які підходи використовуєте?
- Розкажіть про ваш досвід у розробці мультиплеєрних ігор з використанням Unity. Які методи ви використовували для синхронізації стану гри між різними пристроями?
- Розкажіть про ваш досвід у розробці мультиплеєрних ігор з використанням Unity. Які методи ви використовували для синхронізації стану гри між різними пристроями?
📙 Приклад тестового завдання для Senior Unity Developer
Провідний розробник-початківець проєктує застосунок. Він точно знає, що в ньому буде такий метод:
public static void MarkCheater(Player player) =>
player.Name = «Cheater»;
що виведеться в лог у такому коді у випадку, якщо Player буде struct, а також у випадку, якщо Player буде class
var player = new Player { Name = «Player 1» };
MarkCheater(player);
Log(player.Name);
де Log — будь-який зручний метод логування.
Після відповіді доповнити задачу. Що зміниться, якщо структура буде реалізовувати інтерфейс?
IPlayer player = new Player { Name = «Player 1» };
public static void MarkCheater(IPlayer player) =>
player.Name = «Cheater»;
Також розробника можуть попросити навести приклад задачі, якою кандидат пишається або була найбільш цікавою. Деякі студії не практикують тестові завдання і можуть попросити про приклад коду, який показує стиль архітектури кандидата. Або ж прикладом може бути тестове завдання для іншої компанії / власні напрацювання, які не підпадають під NDA.
💙 Дякуємо за питання і рецензію
Із підготовкою цього матеріалу допомагали:
- Віктор Антоненко — Seniour Unity Developer, GGG Games;
- Олесь Дібрівний — Unity Developer Genesis Tech, Keiki;
- Іван Бондаренко — Lead Unity Developer Paga Group;
- Unity Team Lead компанії SUITSME;
- Гліб Челях — Unity Developer RetroStyle Games;
- Вероніка Синчук — Human Resources Manager RetroStyle Games;
- Дмитро Гедзь — Technical Lead iLogos Game Studios;
- Єгор Піскунов — Head of Development iLogos Game Studios;
- Владислав Городнянський — Tech Lead iLogos Game Studios.
4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів