Последнее время на страницах Codeforces дважды появлялись скептические мысли относительно полезности студенческого спортивного программирования. Ответить захотелось развернуто, так что пишу эту заметку.
Сразу же отмечу, что у меня преимущественно положительный взгляд на этот вопрос. Конечно, мои рассуждения и аргументы не будут беспристрастны, но я к этому и не стремлюсь.
Итак, зовут меня Мирзаянов Михаил Расихович. Если кто не в курсе — я являюсь руководителем Центра олимпиадной подготовки программистов в Саратовском государственном университете. И да, наверное вы знаете, что я являюсь основателем и руководителем проекта Codeforces. Его большая часть кода написана мной, но с радостью отмечаю, что я не единственный разработчик — у нас есть команда, и это здорово. Спортивным программированием я занимаюсь довольно давно, примерно с моего первого курса в университете. Были успехи на финалах ACM-ICPC, потом были и значительные успехи в качестве тренера школьников и студентов. Короче, я являюсь инсайдером спортивного программирования. В дискуссии вокруг программирования часто всплывает термин "промышленное программирование", это мне тоже близко: полтора года я руководил группой разработки SaaS-продукта в компании GridDynamics. Замечу, что и сам Codeforces во многом является промышленной и инженерной разработкой.
Теперь, собственно, по теме. Более 10 лет я в той или иной степени и форме занимаюсь спортивным программированием и составил определенный взгляд. Если коротко, в большинстве случаев студенческое спортивное программирование очень даже нужно и полезно. Попробую высказаться по пунктам, но не придерживаясь особого порядка.
- Соревнования по программированию учат алгоритмам. За исключением олимпиад в нашей стране алгоритмы почти не преподают. Вероятно, есть какие-то единичные исключения. Однако, спортивное программирование является массовым движением, с помощью которого учащиеся узнают, что такое динамическое программирование, структуры данных, потоки, строковые алгоритмы и многое другое. Обратите внимание, что для многих участников настольной книгой является книга Кормена "Алгоритмы: построение и анализ" — изложение западного курса по алгоритмам. Как минимум в нашей стране (уверен, что и за пределами) подобный курс, настолько подробно, с соответствующей практикой фактически не преподается.
- Соревнования по программированию для многих становятся стартом в программирование. Я знаю довольно большое количество моих ребят, кто по складу не совсем программист. Кто-то больше математик, кто-то больше геймер. Но в настоящий момент программирование является перспективной и быстроразвивающейся индустрией, в которой неплохо работать. Подготовленный выпускник ВУЗа гарантированно трудоустраивается, получает нормальную зарплату. Для таких ребят олимпиады стали возможностью познакомиться с программированием через около математические задачи/фан контеста. Я уверен, что без олимпиад им бы пришлось проделать значительно более неинтересный, менее продуктивный путь в программирование (или даже они не стали бы заниматься этим).
- Спортивное программирование развивает навыки писать код без багов, думать о крайних случаях, о производительности. Оно не учит организовывать код. Я неоднократно видел картину, когда разработчик пишет код, затем обновляет в браузере страницу (куда-то кликает, заполняет формы), затем говорит "черт", правит строчку, и все повторяется. А вот олимпиады отучают дебажить, они учат сразу писать правильный код.
- Спортивное программирование дает опыт работы в команде, коллективе. Работать в одиночку и в коллективе — это две большие разницы. Далеко не все умеют конструктивно совместно что-то обсуждать, совместно вырабатывать решения. Командные олимпиады учат этому. Учат слышать людей, принимать во внимание их сильные и слабые стороны, индивидуальные особенности. Если вы научились руководить ACM-ной командой, то это непременно зачтется в плюс в вашем будущем менеджерстве. В некоторой степени дело не только в командности студенческих олимпиад: у многих умных молодых людей своеобразный социальный тип поведения, общение в сообществе идет им на пользу. Они осоциализируются что-ли.
- Спортивное программирование учит фундаментальным основам, которые очень часто теряют те, кто развивается отдаленно от академической среды. Я не однократно проводил собеседования по приему на работу — довольно многие могут кое-как сказать, что такое индексы в базах данных, а вот как они реализованы (хотя бы примерно), знает совсем мало кто. Вы скажете, что это не нужно знать? Еще интересный пример. На собеседование приходили люди, кто знал много аббревиатур, концепций, архитектур, паттернов и т.п. Иногда я спрашивал такой вопрос: пусть у вас есть хэш-мэп и вы туда в цикле по случайному ключу (например, строчка длины символов 10) кладете случайное целочисленное значение. Сколько за секунду вы сделаете таких присвоений. На каком компьютере? Да на моем, вот он стоит. Угадайте хотя бы крайне примерно. Каких только ответов я не слышал: отвечали сто, было и тысяча, был и миллиард.
- Спортивное программирование может принести медали/дипломы, которые помогут найти хорошую работу.
- Спортивное программирование введет вас в очень интересный круг общения. Мои лучшие друзья — мои коллеги по команде, люди с кем я вместе учился, кого учил. Это очень интересные, образованные и хорошие люди, с кого приятно брать пример.
- Спортивное программирование введет вас в очень полезный круг общения. Знакомства — очень полезная в жизни штука. Это слабо ощущается пока ты школьник, студент, но со временем это становится очевидным.
- Спортивное программирование дает возможность немного попутешествовать. Как-то в самолете я разговорился с американцем и перечислил ему все американские города, где побывал. Он был удивлен и грустно сказал, что они с женой уже давно собираются на Гавайи.
- Спортивное программирование учит думать и быстро соображать.
- Существует не так много областей человеческой деятельности, где Россия (или ваш ВУЗ) впереди планеты всей. Если у вас получается внести свой вклад в значимые достижение страны (города, ВУЗа), то это, в самом деле, почетно и заслуживает уважения. Когда мои воспитанники поднимаются на сцену получить заслуженные призы, я по-настоящему ощущаю, что такое патриотизм. И всех тех, кто приносит славу стране, я считаю патриотами. Такие победы несомненно важны — они создают тот положительный имидж, без которого сложнее сотрудничать, привлекать инвестиции, показывать потенциал региона.
- Спортивное программирование тесно дружит с преподаванием в ВУЗах. Существует практика, когда в прошлом участники соревнований остаются в ВУЗе и преподают там. Это очень нужно и правильно. Мы много говорим о том, что программирование очень динамичная область знаний, что пыльные профессора не могут дать актуальные знания по программированию. Привлечение молодых преподавателей в ВУЗы — единственный способ повышения уровня IT-образования. Практика показала, спортивное программирование способствует тому, что вчерашние выпускники не покидают ВУЗы. Это очень здорово.
- Спортивное программирование это просто очень интересно! Я еще не забыл тот драйв, когда сдав очередную задачу, ты видишь себя на первой строчке мирового рейтинга, но знаешь, что китайцы дышат тебе в спину. Я мало знаю таких интересных и одновременно полезных занятий.
- Спортивное программирование не мешает промышленному. Конечно, есть уникумы, кто не вписывается в промышленную разработку ПО. Но мой опыт показывает, что если даже вчерашние олимпиадники упустили в своем обучении какие-то аспекты промышленного программирования, они быстро осваиваются. Умение обучаться, думать и программировать позволяет им очень быстро наверстать упущенное. Более того, мой опыт говорит об очень четкой положительной корреляции в успехах в спортивном программировании и карьерным ростом в промышленности.
- Спортивное программирование учит решать задачки, которые очень часто спрашивают на собеседованиях в различных IT-компаниях. Все компании хотят получить людей, кто не просто знает определенный framework или язык, а умеет думать.
Наверное, я что-нибудь упустил. Пишите в комментариях что я пропустил, с удовольствием дополню список. Касательно нападок на именно студенческое спортивное программирование. Здесь могу отметить, что, в самом деле, есть крайне небольшая группа школьников, кто добился значительных результатов на олимпиадах, благодаря таланту, работоспособности и учителям познакомился со всеми алгоритмами и методами, что встречаются на контестах. Да, для таких школьников ценность студенческих олимпиад падает. Но надо помнить, что студенческие олимпиады явление массовое, и есть огромная армия студентов, для кого это интересно, полезно и нужно. Не решайте за них. Если вы считаете, что олимпиады лично вам уже немного дадут, то просто ими не занимайтесь :)
Напоследок отмечу, что в Саратовском государственном университете в Центре олимпиадной подготовки занимается довольно большое число студентов. В основном, мы набираем тех, кто практически (или вообще) не занимался в школе. Мы читаем лекции, проводим тренировки. Я вижу, как растут со временем люди и негодую, когда пишут, что студенческие олимпиады не нужны. Передо мной 30+ контрпримеров. Я уверен, что для всех вовлеченных в обучение, это полезно и нужно. Большая часть наших студентов не станет финалистами, но все они получают значительный набор знаний и навыков. В Центре они нашли интересный способ бесплатно получить все это по специальности. Такое дополнительное образование дает конкурентное преимущество при поиске работы в будущем. Не это ли самый правильный вариант студенческого образования?
Прошу прощения за сумбурность текста — на часах почти четыре ночи. Замечания о синтаксисе и пунктуации прошу отсылать мне через личные сообщения.
MikeMirzayanov
Is there any English version of this post? I clicked on English but it's not being translated.