iTechArt logo

Спортивное программирование: чем отличается от классической разработки и помогает ли в IT-карьере?

Company News

Олимпиады по информатике берут свое начало еще в 80-х. С тех пор утекло немало воды и строчек кода, да и спортивное программирование стало прерогативой не только профильных университетов. Теперь собственные турниры – распространенная активность IT-компаний.

Быть участником олимпиадного движения – значит уделять немало времени тренировкам. Стоит ли игра свеч, если написанный во время турнира код нельзя нигде применить? Являются ли школьные олимпиады по информатике весомым вкладом в будущую профессию? Взвесим все «за» и «против» вместе с Иваном Копейкиным, Software Engineer iTechArt, который знает олимпиадную систему изнутри.

Наш собеседник
Копейкин Иван.jpg

Иван Копейкин

Software Engineer iTechArt

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

Поясни, пожалуйста, в чём основная суть спортивного программирования

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

Пример таких ограничений для задачи на codeforces:

F. Хороший граф
ограничение по времени на тест: 2 секунды
ограничение по памяти на тест: 256 мегабайт
ввод: стандартный ввод
вывод: стандартный вывод

Важный момент: В задаче дается такое условие, что если решить ее «в лоб», то программа будет работать слишком долго, либо ей не хватит памяти. В таких ситуациях и нужны алгоритмы. Самый распространенный пример: у нас есть разные алгоритмы сортировки чисел. Один алгоритм работает медленно, а другой быстро. С нашими вычислительным мощностями мы можем быстро сортировать 100-500-2000 чисел, но когда их много (миллионы или, даже, миллиарды), медленной сортировке понадобятся годы (!), зато быстрая сортировка сделает свою работу за доли секунды.

Когда ты начал участвовать в олимпиадах по программированию? Что было основным мотивом?

Я заинтересовался олимпиадами еще в классе 7-8. Тогда активно обсуждали успехи Гены Короткевича, а мне было интересно начать программировать и решать какие-то задачи, чтобы видеть результат своих трудов. Думаю, Гена своим успехом сделал великолепную рекламу олимпиадного программирования. Еще в школе мой учитель информатики подталкивал попробовать себя в этом и настаивал обратиться к Михаилу Семеновичу Долинскому, его знают многие в нашей стране. В то же время я решился сходить на школьную олимпиаду и дошел до областного этапа, просто решив среди сверстников больше задач. Думаю, такие результаты показали, что есть к чему стремиться. К своей первой олимпиаде готовился недели две от силы. Написанный код оставлял желать лучшего :)

Нашел фотографию, где мой тренер Михаил Семенович и я думаем о чем-то насущном (я справа, с энергетиком)

тренер Михаил Семенович и автор справа

В каких олимпиадах по программированию ты участвовал? 

Я участвовал в абсолютно разных олимпиадах. И от частных компаний, и в белорусской республиканской олимпиаде, и в питерской олимпиаде для школьников от Андрея Станкевича.

Главным событием для ребят из Беларуси является белорусская республиканская олимпиада школьников по информатике. Проходит в течение всего учебного года, в октябре-ноябре стартует школьный этап, а весной заканчивается республиканским (заключительным) этапом. Успехи этого соревнования зачтутся в баллы при поступлении для 11 классов (кто-то и вовсе получит возможность поступить без вступительных экзаменов), а ребята из топа получают возможность съездить на IOI – международную олимпиаду по информатике. Я получил свои дипломы с заключительных этапов этой олимпиады, даже тортик выиграл, но на международную олимпиаду так и не попал. :)

Участие в частных олимпиадах (спонсором олимпиады выступает какая-нибудь компания, например, Google) принесли мне пару прикольных футболок и предложения о работе. Мотивы для участия в таких олимпиадах разные: у кого-то хороший призовой фонд (на Google Code Jam за 1 место можно получить $15 тысяч), а где-то просто спортивный интерес.

Иван Копейкин. Software Engineer iTechArt

Здесь как с хакатонами: мероприятие сильно выматывает, обстановка напряженная, но люди на нем, общие интересы, общение — вот в чем сила.

Как устроены данные олимпиады, какие основные правила? Там предусмотрен индивидуальный зачёт или командный?

Да, олимпиады по информатике есть с индивидуальным зачетом и командным. В индивидуальном зачете ты наедине с собой и своими задачами в течение 5 часов, а в командном на 3-4 человека один компьютер, пока один пишет код, остальные устраивают брейншторм для решения задач. Конечно, условия проведения олимпиад отличаются друг от друга, но идея такова: нужно решить как можно больше и быстрее различные задачи, уложившись во все условия. Как правило, здесь не поможет скорость языка или тривиальное решение, нужно хорошо подумать, как найти достоверно правильный ответ за оптимальное время. Еще и протестировать все это, чтобы решение не упало. Интересный факт: в командном зачете дебаг происходит на листочке бумаги :)

Какие задачи в основном рассматриваются на таких турнирах?

Условия задач абсолютно разные. Будет одна задача, чтобы просто размять пальцы, где особо думать над решением не нужно. Условия строятся таким образом, чтобы вдохновиться каким-то алгоритмом, а затем реализовать решение, отталкиваясь от него. Здесь уже бывают задачи на графы, построение деревьев, динамическое программирование и так далее.

Пример условия довольно простой задачи:

Пример условия довольно простой задачи

Твой личный опыт – как готовиться к олимпиадам по программированию, на что делать особый упор?

Больше практики. Выучить абсолютно все невозможно, но с опытом приходит навык поиска решения проблемы. Михаил Семенович Долинский, мой тренер, проводит каждое воскресенье занятия. Мы начинали в 9 утра и заканчивали около 14:00. Кто желает больше — пожалуйста, можно прийти раньше или закончить позже.

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

Вот лог решений, когда я активно готовился к республиканской олимпиаде:

Лог решений, когда Иван активно готовился к республиканской олимпиаде

Какие языки используются в спортивном программировании?

Ребята, с которыми я учился и тренировался, в основном писали на Turbo Pascal или С++. На заключительных этапах 1-2 человека писали решения на Java. Я для себя выбрал С++ и решал задачи на нем. Этот язык позволял мне распоряжаться памятью так, как я хотел, за что иногда платился ошибками c “Runtime error”. Также важным преимуществом была стандартная библиотека, в которой содержались уже готовые алгоритмы, например быстрая сортировка. На Pascal же приходилось писать быструю сортировку самостоятельно :)

Что общего у классической коммерческой разработки и спортивного программирования?

Из общего, наверное, только дедлайн. В обоих случаях время на реализацию задачи ограничено.

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

С началом работы в IT ты попрощался с этим увлечением?

Не совсем, сейчас периодически решаю задачки на leetcode. Я давно слышал про этот сайт, но когда начали выходить статьи о том, что с помощью этой платформы люди готовятся к собеседованиям в FAANG (прим. - аббревиатура, обозначающая компании Facebook, Amazon, Apple, Netflix и Google), решил сам попробовать. Это не столько сложившаяся привычка, сколько желание размять мозг, думать, искать решение и изучать что-то новое. Например, я на практике мало использую Golang, но leetcode – отличная площадка, чтобы что-то написать и протестировать. Таким образом убиваю двух зайцев: прошелся по алгоритмам и поработал с чем-то новым. :)

Чувствуешь ли ты, что олимпиадный опыт помог в профессии? Если да, то как именно?

Однозначно помог. Я смог сделать свой выбор и определиться с тем, что мне нравится, а именно изучать проблему, проводить анализ, а затем реализовывать решение. Все олимпиадное движение драйвило меня. Олимпиадное программирование свело меня со многими классными людьми, которые, также как и я, увлечены этим. Помимо прочего, это еще научило решать проблемы, уметь концентрироваться на них и не теряться в стрессовых ситуациях. Думаю, основной навык любого специалиста — умение решить проблему.