Корпоративная магистратура Яндекса работает в ИТМО уже второй год. Конечная цель программы ― еще на этапе обучения дать практический опыт, необходимый для работы в коммерческой разработке. Магистранты программы решают не абстрактные задания из учебника, а реализуют проекты, которые потом попадают на прод в проектах Яндекса ― в том числе в Open Source. В статье рассказываем, как всё устроено и над чем работают студенты.
Почему появилась магистратура
Российские университеты уже давно стараются сотрудничать с крупными компаниями: проводят совместные хакатоны для школьников и студентов, открывают базовые кафедры и совместные образовательные программы. В идеале от партнеров вузы получают практиков отрасли и реальные задачи для студентов, а компании от университетов ― кадры, которых не надо переучивать после диплома.
По такому пути идет и Университет ИТМО. Вуз сотрудничает со многими IT-компаниями России. И партнерство с Яндексом ― одно из самых длительных и разнообразных. Оно включает в себя совместные образовательные программы ― в университете с Яндекс Практикумом реализуется ускоренный бакалавриат, студкемп по «Software Engineering» и программа стипендиальной поддержки лучшим студентам факультета информационных технологиях и программирования (ФИТИП). А выпускники ИТМО, в свою очередь, еще на этапе обучения попадают на работу в Яндекс.
Хотя сотрудничество уже развивалось по нескольким направлениям, учебной программы, посвященной именно высоконагруженным системам, на уровне магистратуры до недавнего времени не было. Так что решение о начале новой совместной инициативы было вполне органичным.
Магистратура «Программное обеспечение высоконагруженных систем» реализуется на базе Института прикладных компьютерных наук. Учебная программа стала точкой пересечения двух запросов. С одной стороны, запроса индустрии на сильных разработчиков, с другой ― самих студентов на то, чтобы выходить по итогам обучения не джунами, а мидлами. Чтобы это реализовать, подход академической дискуссии, реализованный в ИТМО, сочетается с практикой на базе коммерческой компании (в данном случае ― Яндекса).
Как устроено обучение
Очная совместная магистерская программа работает полностью онлайн. Половина команды программы ― сотрудники Яндекса, половина ― преподаватели ИТМО. Лекции и практические занятия ведут и те, и другие ― это дает сразу два взгляда на вопрос ― и с фундаментальной стороны, и от бизнеса.
Яндекс предоставляет платформу для организации дистанционного обучения (календарь, ссылки на уже проведенные лекции, FAQ, успеваемость), а также финансово поддерживает преподавателей программы и студентов, выплачивая дополнительные стипендии. Первичный отбор заявок и прием на программу ведет ИТМО. Студенты указывают приоритеты по проектам, на которые хотят попасть, после чего Яндекс проводит дополнительные интервью.
В рамках обучения студенты разбиваются на команды или работают индивидуально под руководством наставников из Яндекса. Кураторство Яндекс полностью взял на себя ― специалисты компании еженедельно встречаются с магистрантами и обсуждают результаты, полученные с последней встречи, подсказывают оптимальные решения.
В качестве учебных проектов используются задачи не только из внутренней кухни самого Яндекса, но и из продуктов, которые компания выкладывает в открытый доступ. Этот опыт помогает студентам пополнять портфолио и получать обратную связь от внешних пользователей и, как следствие, быстрее профессионально развиваться.
Например, в этом году команда студентов с помощью специалистов Яндекса работала над проектом DivKit ― это опенсорсный кроссплатформенный фреймворк для backend-driven UI (BDUI), который использует не только сам Яндекс, но и другие компании. Инструмент позволяет отрисовывать интерфейс с бэкенда, и, соответственно, обновлять его, не переделывая все приложение. Пару лет назад у Яндекса была статья, описывающая основные возможности DivKit на тот момент: подробнее прочитать можно здесь.
Как магистранты добавили поддержку SVG в DivKit
В бэклоге DivKit есть много интересных задач. Одна из них ― поддержка векторной графики SVG, ее и реализовали магистранты ИТМО в рамках семестрового проекта.
Ранее для устройств с разным разрешением экрана бэкенд присылал ссылки на уже готовые картинки в PNG или Webp, а иногда и закодированные в base64 изображения, если необходимо показать его без обращения к сети (например, важные иконки). Но разработчикам хотелось добавить поддержку векторных изображений, которая уменьшила бы время парсинга и сократила бы трафик.
Поддержку SVG ждали и в компании, и в комьюнити. Решением задачи занялись два магистранта первого года обучения, каждый работал со своей платформой (Android и iOS, соответственно).
Главная проблема с поддержкой SVG состоит в том, что готовых библиотек очень мало и ни одна из них не покрывает необходимую функциональность полностью. Для DivKit нужна была синхронизация между разными имплементациями (под iOS, Android и web), чтобы формат везде поддерживался одинаково. Заставлять клиентов ставить какие-либо сторонние библиотеки разработчики не планировали, а значит поддержка SVG должна была появиться непосредственно в ядре фреймворка.
Уже в процессе работы выяснилось, что реализовать поддержку SVG таким же образом, как это сделано для растровых форматов, не получится. В основном из-за ограничений, которые накладывает сама суть векторной графики. Одними из таких ограничений стали, например, трудоемкость наложения фильтров и изменение цвета изображения в runtime. Эти параметры закодированы в исходном коде картинки, и для их изменения необходима модификация кода с последующим повторным декодированием и рендерингом изображения, что неэффективно с точки зрения вычислительных ресурсов
Для решения задачи студенты предложили в отдельных случаях декодировать SVG в растровый формат и работать уже с ним (и это особенность самого векторного формата SVG).
Важной частью проекта стали исследования производительности разработанного решения. Со стороны Яндекса решение должно было пройти собственные тесты производительности команды и не ухудшить их. Ревью на GitHub провела команда DivKit, правок от сообщества не последовало.
Кроме того, выяснилось, что заявленный merge request портит обратную совместимость версий DivKit: нарушается бинарная совместимость вызовов, поскольку в одной из функций изменилось возвращаемое значение. Когда эту проблему исправили, поддержка SVG была внедрена в пайплайн отрисовки DivKit. Merge request.
Что в итоге
Это был первый проект подобного плана для команды мобильной разработки Яндекса. Команде Яндекса этот опыт помог разгрузить собственный бэклог. А студенты смогли поработать с фреймворком, нестандартным по меркам BDUI ― DivKit существенно отличается от других существующих решений. Проект выходил за рамки простой технологической задачи и помог поучаствовать в коммерческой разработке и предложить конкретное решение бизнес-задачи: участникам надо было не только много взаимодействовать с командой, чтобы синхронизировать реализации поддержки SVG между платформами, но и разобраться с лицензированием используемого готового кода, поскольку DivKit ― открытый проект, соответственно не любой чужой код можно внести в него без последствий с точки зрения лицензий.
Опыт с совместной магистратурой ее авторы как со стороны университета, так и компании оценивают как вполне успешный. Поэтому недавно были открыты и другие совместные программы ― по DevOps инженерии и UX-дизайну (программы реализуются совместно с Яндекс Практикумом).