Спойлер: 4 из 6 набранных стажеров успешно завершили программу и были приняты на работу в UNIGINE.

Решение

Озарения возникают в UNIGINE часто и внезапно, и затея провести стажировку для программистов С++ не стала исключением. Нам не привыкать - летом мы организовали Open Air всего за 6 недель. До старта стажировки времени было столько же, и набрать нужно не 200 человек, а 10, так что мы засучили рукава и взялись за дело.

Что натолкнуло нас на мысль провести стажировку?

UNIGINE все время растет, и для осуществления всех намеченных планов нам нужен постоянный приток программистов. Приходя в компанию, разработчик любого уровня сначала проходит через этап изучения теории и зачет. Чтобы работать над созданием 3D-движка и проектов на нем, всем приходится постоянно чему-то учиться. Те, кто способен держать темп, быстро адаптироваться и впитывать информацию, остаются. Побочный эффект такого подхода - неизбежный рост. И мы подумали: если это работает на сотрудниках, это сработает и на студентах. Все, что им нужно - базовые навыки программирования на С++, а остальному научим. Это же win-win: они получают знания, компания получает программистов.

Набор

До старта набора на стажировку нужно было обрасти инфраструктурой, задачи которой сводились к следующему:

  1. Создать тестовое задание.

  2. Донести информацию о том, что представляет собой стажировка.

  3. Ответить на максимальное количество возникших вопросов на уровне контента сайта.

  4. Создать простой и понятный интерфейс личного кабинета.

  5. Дать возможность скачивать тестовое задание и загружать решения неограниченное количество раз.

  6. Автоматизировать проверку тестовых заданий.

  7. Хранить и выгружать данные.

Делать что-то впервые - часть нашей ежедневной рутины. Как и любой проект, этот был раздроблен на этапы, назначены ответственные, и работа закипела. Хватило 2 недель, чтобы выполнить необходимые задачи, и набор стартовал.

Тестовое задание

Изначально мы поделили направления на 2: tools и logic. Идея состояла в том, чтобы набрать две независимых группы стажеров, у каждой из которых есть свой куратор, и решать прикладные задачи в рамках направлений. Тестовых заданий было два, и кандидаты могли выбрать одно из них или решить оба, а с направлением определиться потом. 

Задание от отдела логики состояло в необходимости найти все возможные пересечения треугольников. Задача была взята из реальной жизни, из реальной боли, и была максимально приближена к той сфере, в которую мы все погружены. В 3D-графике треугольники - это основа, и нужно постоянно искать пересечения: машина столкнулась со стенкой, газета упала на пол, дождь капает на крышу - под крышей капать не должно. Даже если свести все к простейшей задаче, что капелька - это два треугольника, то нужно найти все пересечения капелек (а капелек - миллион, плотный такой дождь) за отведенное время, а на кадр оно очень маленькое - 16 мс при 60 fps, и это вся логика на всё приложение.

Решение такой задачи сразу показывало уровень программиста, какие подходы он использует. Видно, в первый раз кандидат взялся за многопоточное приложение или делал это раньше и хотя бы какие-то базовые вещи обработаны.

Первая проблема состояла в том, чтобы придумать техническое задание для тех, кто хочет стать стажером, и ту штуку, которая автоматически проверяет корректность выполнения этих задач. Пользователь может быть очень изобретательным , тем более, если это программист С++. ” - Александр Горбатов, куратор

В отделе инструментария задание придумали другое: нужно было написать программу, которая делает выборку файлов из большого массива данных по определенным критериям, но сама выборка не доступна для просмотра.

Главным показателем выбрали скорость выполнения программы, но и качество кода тоже оценивали. 

Для определения эталонного времени выполнения сначала решили опробовать задания на “своих”. В итоге, это вылилось во что-то вроде внутреннего хакатона. Решали не только программисты, подключились QA и DevOps, в какой-то момент даже экспериментировали с нейросетью. В общем, подготовка к стажировке коснулась практически всех, и равнодушными не оставила - ребята повеселились, размялись и потешили свой соревновательный дух.

Собеседование

Всего тестовое выполнили более 170 человек, многие из которых делали десятки попыток, стараясь улучшить итоговое время. Рекорд - 72 попытки от 1 кандидата. Из них каждый куратор отобрал топ-10 лучших решений, и эти кандидаты были приглашены на собеседование.

Это не было глубинное интервью: на каждую беседу отводилось по полчаса. Оценивали уровень знаний ребят, их способ мышления, навыки коммуникации. Задавали общие вопросы, чтобы понять, заинтересован ли человек в программировании, или он этим занимается, потому что модно сейчас “войти в IT”, горит ли человек действительно всей этой математикой, или может, он любит играть в компьютерные игры и решил, что хочет их делать. 

Проводить по несколько собеседований в день было довольно сложно, и запомнить всех кандидатов не удавалось, но в памяти всегда застревали те, у кого горели глаза. Лично для меня это один из главных признаков того, что человек станет классным программистом. У меня глаза горят до сих пор, я просто дышу С++. ” - Рудольф Гофман, куратор

Этапы и отсев

С самого начала наш посыл был четким: UNIGINE - не учебное заведение, мы приглашаем стажеров для того, чтобы с ними работать, и зачисление на стажировку не гарантирует, что кандидат дойдет до конца. Нет смысла кого-то “тянуть”, если видно, что он не справляется. Если мы понимаем, что вы не хотите с нами работать, мы просто расстаемся. Мы не заинтересованы в том, чтобы тратить время друг друга впустую.

Первый этап: зачет

Неделя ушла на чтение документации, затем состоялся зачет. Кураторы не просто задавали вопросы, но и рассказывали, как это устроено в UNIGINE и в других движках, об особенностях работы, о понятиях, применимых ко всей индустрии разработки игр: что такое init, update, shutdown, что update крутится каждый кадр, что на кадр есть “бюджет”, есть физика, логика, рендер-части, как в целом устроены игровые движки, куда писать свой код, когда его вызывать, что такое delta time, и как с этим жить. Не все кандидаты серьезно отнеслись к изучению документации, было много пустых мест, где-то думали, что выедут на старых знаниях, где-то терялись в каких-то элементарных вещах, и, конечно, скорость восприятия информации тоже очень важна. Наверное, это самое основное - насколько быстро ты соображаешь и как быстро адаптируешься. По результату теоретического зачета мы отсеяли двоих.

Остальные ребята, конечно, напугались и отнеслись ко второму этапу более серьезно.

Второй этап: практическое задание 

Теперь они должны были воплотить на практике то, что изучили до этого. Стажеры делали простенькую игру на движке. Почему они параллельно не программировали и не изучали движок? Потому что перед тем, как ты начнешь что-то писать, нужна база, чтобы не застрять на каком-нибудь тупом случае, который уже описан в документации и подробно расписано, как его избежать или как с ним жить. 

Все справились с разными результатами, но в целом неплохо. Честно сказать, первую половину стажировки я был настроен скептически, потому что ребята - студенты, и программировали они только в рамках учебы, были пробелы в базовых вещах.” - Александр Горбатов, куратор

На создание “игры” ушло две недели, затем стажеры начали работать с семплами: писать новые и переписывать старые. Каждому давали сделать какой-нибудь небольшой пример на физику, рендеринг, движение, работу с камерой, работу с анимациями - в общем, все попробовали себя в разных сферах.

Третий этап: выпускной проект

На третьем этапе ребята приступили к выполнению выпускного задания. Задача заключалась в том, чтобы макнуть стажеров в пайплайн продуктовой разработки от технического задания до прототипа, и протащить их по всем этапам. К кураторам подключилась менеджер проектов Анна, и все стало совсем по-взрослому. 

Кейс реального клиента был упрощен и адаптирован, чтобы с ним могли справится стажеры. 

Можно сказать, что проект стажеров - это proof-of-concept, и такой подход мало чем отличается от обычного пайплайна, когда приходят потенциальные клиенты и спрашивают, можно ли сделать что-то под их запрос. 

Мы собираем небольшой проект (драфт, прототип, как хотите), чтобы показать, что да - это работает, движок подходит для разработки такого проекта, и они покупают либо лицензию, либо разработку проекта под ключ.

Прототип у стажеров получился - он отвечает тем требованиям, которые к нему предъявлялись. Выглядит он довольно неказисто, но мы сознательно пошли на упрощение и переиспользование сэмплов, чтобы уложиться в срок и обойтись имеющимися ресурсами. Естественно, их пришлось как-то интегрировать, так как эти кусочки все из разных мест, и чтобы собрать все это в кучу, стажерам пришлось взаимодействовать друг с другом, спорить между собой, в чьем коде косяк: когда кто-то что-то меняет в своей части, а в чужой части что-то отваливается, и нужно доказать, кто прав. 

Во второй половине стажировки мое мнение о них изменилось, я в них уже поверил - они показали, что могут работать и снизил уровень контроля, когда понял, что с многими вещами они уже справляются сами. Что-то у них уже получается и это радует. К концу стажировки некоторые уже могли бы претендовать на джунов, я думаю, наше собеседование на эту позицию они бы уже прошли: они и подогнали язык, т.к. за языковые штуки мы их бьем по рукам, заставляем делать правильно. В случае логики показываем примеры, какие подходы есть, и они их пробуют реализовать, понять, разобраться, и сейчас они уже довольно неплохие джуны.” - Александр Горбатов, куратор 

Выводы

  1. Тулзовики и программисты логики мало, чем отличаются друг от друга, и на втором этапе стажировки начали работать коллективно и не делить задачи по направлениям. Поскольку эта стажировка была первой и для UNIGINE, некоторые изменения вносились прямо на лету. Быть гибкими и адаптироваться к условиям - это норма.

  2. Кураторство занимает до половины рабочего времени. Это больше, чем мы рассчитывали на этапе подготовки.

  3. Можно взять ребят с базой С++ и за 3 месяца дотянуть их до джунов.

  4. Студенты ВУЗов и техникумов не отличаются по скиллам. 90% успеха - это самостоятельное изучение материалов. Учебное заведение не заставит вас программировать, если вы этого не хотите. А если захотите, вам не помешает ничего.

  5. Некоторые ошибки стажерам нужно совершить самим. Невозможно предупредить о том, чего они не переживали. Сделать ошибку и расплатиться за нее - это тоже часть обучения. 

Итоги

Нам понравилось. За месяц до конца первой стажировки мы запустили следующий набор. По итогам презентации выпускного проекта 4 стажера, оставшиеся после отсева, получили предложение стать частью команды, и, к нашей радости, они их приняли. Happy End!

Отзывы стажеров:

Комментарии (1)


  1. MasterMentor
    13.01.2023 15:08
    +1

    Очень хорошая статья! Планка статей Яндекса и Сбера скоро будет взята!