Всем привет! Меня зовут Лида, и я провожу соревнования по программированию уже 12 лет. (Привет, Лида!) В этом году я присоединилась к Команде ВКонтакте и теперь курирую VK Cup. Целых 5 сезонов это был чемпионат только по спортивному программированию. Но настала пора серьёзных изменений.
Мы убрали большую часть ограничений, отменили парный формат и добавили три новых направления. VK Cup 2019 — это онлайн-соревнования для олимпиадных программистов, мобильных разработчиков, дизайнеров и специалистов по машинному обучению с грандиозным офлайн-финалом в Санкт-Петербурге.
В этой статье я расскажу, что нового мы придумали, а мои коллеги дадут рекомендации для участников. Регистрация на VK Cup открыта по ссылке vk.cc/cup до 4 декабря — осталась всего неделя! Все подробности о треках и этапах — под катом.
ВКонтакте для олимпиадников
Свои соревнования проводят многие IT-компании — это способ рассказать про интересные задачи, с которыми они сталкиваются. Команда ВКонтакте одной из первых в 2012 году стала устраивать собственные турниры. Инициировали их сами разработчики — в VK всегда работали победители международных соревнований по программированию. Четыре чемпиона мира в Команде и сейчас.
Движки, которые создают разработчики, — фундамент ВКонтакте. Именно в них особенно важна эффективность, на счету — каждая миллисекунда. Как достичь максимальной производительности? Глубоко знать алгоритмы и структуры данных, а ещё укладываться в заданные ограничения по памяти. Именно такие высокие требования и предъявляются к коду участников VK Cup.
С 2012 года формат немного менялся, но суть оставалась прежней: в олимпиадном программировании соревновались участники от 14 до 23 лет, в одиночку или командами из двух человек. Если дважды прошёл в финал, то снова участвовать не можешь. Пришло время меняться.
Долой ограничения
VK Cup 2019 пройдёт в соло-формате. Убираем верхнюю планку по возрасту и ограничение на количество финалов — так что в этом году вернуться в чемпионат смогут лучшие участники прошлых лет и опытные специалисты. Но главное — кроме спортивного программирования можно будет посоревноваться в машинном обучении, мобильной разработке и дизайне. Участвовать можно в нескольких треках одновременно — если, конечно, хватит времени.
Каждый трек будет состоять из трёх раундов:
- Квалификация пройдёт онлайн с 6 по 16 декабря и будет открыта для всех. В следующий раунд пройдут 256 лучших участников в каждом треке.
- Отборочный этап тоже проведём онлайн — в феврале 2020 года. Здесь участников ждут более сложные задачи и короткое время. В финал пройдут 40 авторов самых удачных решений в каждом треке.
- Финал состоится в Санкт-Петербурге в апреле 2020 года. В очном противостоянии участники будут бороться за главный приз каждого трека — 524 288 рублей (2^19).
Трек Engine
Квалификация. Участники будут решать задачи на платформе Codeforces на любом удобном языке программирования. Можно даже решать задачи руками, разбирая каждый отдельный тест.
Отборочный этап. Важно будет решить каждую задачу как можно скорее, чтобы набрать больше баллов и получить приглашение в финал.
Финал. Участники будут соревноваться по стандартным правилам Codeforces: смогут получить дополнительные баллы, если найдут ошибки в решениях других участников.
Советы от Бориса Минаева
Боря — чемпион мира по программированию ICPC 2015, 2 место VK Cup 2015, руководитель Команды баз данных ВКонтакте.
- Решайте задачи в порядке увеличения их сложности. Выбирайте ту, которую сдало больше всего участников.
- Не зацикливайтесь на задаче, если она вам не поддаётся. Сразу поставьте себе ограничение: «Если не продвинусь в решении за 15 минут, то перейду к следующей».
- Тестируйте решение перед посылкой. Обязательно запустите его на граничных случаях. Перед этим перечитайте раздел с ограничениями на входные данные.
- Иногда идею решения можно придумать исходя из ограничений в условии. Например, у вас задача, в которой дано n объектов. Если n < 10, то, возможно, в решении необходимо перебрать все перестановки объектов. Если n < 20, то написать рекурсивный перебор за 2^n. Если n < 1000, то придумать динамическое программирование за n^2. А если n около миллиона — скорее всего, нужно думать в сторону линейного решения.
- Если вы получили WA, перечитали код несколько раз, а ошибку всё ещё не видите, то попробуйте написать более простое решение. Затем сравните на маленьких тестах, всегда ли исходное и новое решения выдают одинаковый ответ. Если же решаете задачу на неподвешенном дереве, то просто запустите решение ещё раз, но выберите другой корень.
- Используйте среды разработки вроде CLion или IDEA. Они умеют находить стандартные ошибки вроде неинициализированных переменных или недостижимых кусков кода.
- Добавляйте больше assert-ов в ваш код. Находить причину RE гораздо проще, чем WA.
Трек Mobile
Квалификация. Будем проверять знания простых алгоритмов, которые часто нужны для реализации стандартных экранов мобильных приложений, а также теоретические знания своей мобильной платформы. В следующий тур пройдут по 128 участников от каждой платформы.
Отборочный этап. Нужно будет грамотно расставить приоритеты. Что лучше — успеть как можно больше или проработать каждое задание максимально тщательно? В финал пройдут по 20 лучших разработчиков.
Финал. Каждый участник должен будет продемонстрировать свои продуктовые навыки: придумать, реализовать и представить новый проект, используя только экраны, разработанные в предыдущем раунде.
Советы от Олега Смирнова
Олег руководит Командой Android ВКонтакте и составил задания для трека по мобильной разработке VK Cup.
- Убедитесь до начала соревнований, что у вас настроена IDE (Android Studio), подключены необходимые плагины, работает эмулятор и есть настоящее устройство для разработки.
- Разберитесь с системой сборки Gradle и её настройками.
- Прочитайте условия и узнайте про минимальный SDK, который вам нужно будет поддержать. Не пишите универсальный код под все платформы, решайте задачу исходя из поставленных условий.
- Если нет острой необходимости, не используйте NDK в проекте. Практически любую задачу можно решить с помощью SDK.
- Уделите внимание правам приложения. Проконтролируйте, что все запросы на permissions будут сделаны.
- Следите за производительностью приложения: файловой системой, работой с сетью, плавностью UI-анимаций.
- Определите минимальный набор библиотек для работы. Используйте время для решения задания, а не для изучения библиотек.
- Полезно будет глянуть на работу VK SDK.
Трек Design
Квалификация. Убедимся, что участники умеют не только разрабатывать отдельные элементы дизайна, но и замечать ошибки.
Отборочный этап. Предложим разработать интерфейсы отдельных элементов ВКонтакте или самостоятельных сервисов. Важно будет найти компромисс между масштабностью идеи и временем на разработку.
Финал. Участники должны будут рассказать о своей идее и представить дизайн.
Советы от Алексея Мазелюка
Лёша — старший дизайнер ВКонтакте и победитель конкурса VK Designers в 2015 и 2017 годах.
- Разбейте задачу на более мелкие. Постарайтесь правильно распределить время и расставить приоритеты, чтобы всё успеть. Если что-то получится сделать быстрее, чем планировали, — появится время на фичи и доработки.
- Определите аудиторию и контекст.
- Обдумайте заранее инструменты, которые хотите использовать.
- Записывайте идеи. Выберите лучшие и продолжайте работать уже с ними. На все времени не хватит.
- Бумага и карандаш иногда работают лучше, чем графический редактор.
- Решайте задачу, а не рисуйте красивые картинки. Игнорировать тренды не следует, но всё должно быть уместно.
- С умом используйте наработки коллег. Иногда лучше взять что-то готовое, а не изобретать велосипед. Но помните, что новые удобные решения оцениваются выше, чем очередная копия.
- Займитесь детализацией, если на это осталось время.
- Презентация — это важно! Нужно продать решение членам жюри. Используйте простую и понятную подачу.
- Не перегибайте с количеством текста в презентации, используйте видео.
Трек ML
Квалификация. В качестве ответа нужно будет загрузить обработанные данные, причём каждое решение будет оцениваться с помощью заранее определённой метрики. Данные из задания можно обработать в офлайне или даже вручную.
Отборочный этап. Код для подхода, который разработают участники, будет загружен в тестирующую систему — все решения проверятся на одинаковой инфраструктуре, в условиях ограниченных вычислительных ресурсов.
Финал. Участники будут решать сложную практическую задачу.
Советы от Данилы Савенкова
Даня вошёл в топ участников конкурса от «Мерседес» на kaggle. А ещё он старший программист-разработчик ВКонтакте.
- Для локальной валидации попытайтесь воспроизвести тот же принцип разбиения, который использован при выделении тест-сета организаторами соревнования (обратите внимание на время, если оно есть, и на ID). Если возможно — используйте кросс-валидацию. Этот метод практически из коробки умеет оценивать значимость изменений метрики. Обязательно фиксируйте сид при разбиении датасета.
- Обучайте и усредняйте разные модели. Это может работать лучше одной модели — вспомните центральную предельную теорему. XGBoost с разными сидами — это тоже разные модели (главное — не забыть сделать subsample<1 и/или colsample<1). XGBoost, CatBoost и LightGBM — тоже разные модели в этом контексте.
- Используйте sklearn.Pipeline. Когда model.fit включает в себя весь пайплайн от предобработки данных до получения предиктов, становится намного легче жить и намного меньше шансов ошибиться с локальной валидацией.
- Если хотите постэкать — обратите внимание на cross_val_predict, эта функция сильно поможет.
- Делайте фичи. Стэкинг, блэндинг, настройка гиперпараметров — это могут почти все. Побеждают те, кто придумал самые успешные фичи. Ну или те, кто нашёл лик. Или те, кому повезло. А чаще срабатывает комбинация из этих факторов ;)
Если у вас остались вопросы о VK Cup, пишите в личные сообщения сообщества ВКонтакте: vk.com/cup. Там же можно найти правила и следить за ходом чемпионата.
Надеюсь, вам понравится новый VK Cup и с некоторыми читателями мы встретимся на финале в Санкт-Петербурге. Всем удачи!
suffix_ixbt
Существует мнение что "спортсмены" показывая отличные результаты на олимпиадах достигают весьма скромных высот как в работе так и в науке. Ибо полностью "заточены" именно на олимпиады с их соревновательностью, ограничением по времени и т.п. Так по крайней мере в научных дисциплинах по которым олимпиады проводятся.
А как с этим дела в спортивном программировании ?
agent10
Ды как, очевидно, что на практике задач, где нужны навыки «спортивного» довольно мало и достаются они далеко не всем) А остальных помещают в «кровавый энтерпрайз»)