Последнее время на страницах Codeforces дважды появлялись скептические мысли относительно полезности студенческого спортивного программирования. Ответить захотелось развернуто, так что пишу эту заметку.
Сразу же отмечу, что у меня преимущественно положительный взгляд на этот вопрос. Конечно, мои рассуждения и аргументы не будут беспристрастны, но я к этому и не стремлюсь.
Итак, зовут меня Мирзаянов Михаил Расихович. Если кто не в курсе — я являюсь руководителем Центра олимпиадной подготовки программистов в Саратовском государственном университете. И да, наверное вы знаете, что я являюсь основателем и руководителем проекта Codeforces. Его большая часть кода написана мной, но с радостью отмечаю, что я не единственный разработчик — у нас есть команда, и это здорово. Спортивным программированием я занимаюсь довольно давно, примерно с моего первого курса в университете. Были успехи на финалах ACM-ICPC, потом были и значительные успехи в качестве тренера школьников и студентов. Короче, я являюсь инсайдером спортивного программирования. В дискуссии вокруг программирования часто всплывает термин "промышленное программирование", это мне тоже близко: полтора года я руководил группой разработки SaaS-продукта в компании GridDynamics. Замечу, что и сам Codeforces во многом является промышленной и инженерной разработкой.
Теперь, собственно, по теме. Более 10 лет я в той или иной степени и форме занимаюсь спортивным программированием и составил определенный взгляд. Если коротко, в большинстве случаев студенческое спортивное программирование очень даже нужно и полезно. Попробую высказаться по пунктам, но не придерживаясь особого порядка.
- Соревнования по программированию учат алгоритмам. За исключением олимпиад в нашей стране алгоритмы почти не преподают. Вероятно, есть какие-то единичные исключения. Однако, спортивное программирование является массовым движением, с помощью которого учащиеся узнают, что такое динамическое программирование, структуры данных, потоки, строковые алгоритмы и многое другое. Обратите внимание, что для многих участников настольной книгой является книга Кормена "Алгоритмы: построение и анализ" — изложение западного курса по алгоритмам. Как минимум в нашей стране (уверен, что и за пределами) подобный курс, настолько подробно, с соответствующей практикой фактически не преподается.
- Соревнования по программированию для многих становятся стартом в программирование. Я знаю довольно большое количество моих ребят, кто по складу не совсем программист. Кто-то больше математик, кто-то больше геймер. Но в настоящий момент программирование является перспективной и быстроразвивающейся индустрией, в которой неплохо работать. Подготовленный выпускник ВУЗа гарантированно трудоустраивается, получает нормальную зарплату. Для таких ребят олимпиады стали возможностью познакомиться с программированием через около математические задачи/фан контеста. Я уверен, что без олимпиад им бы пришлось проделать значительно более неинтересный, менее продуктивный путь в программирование (или даже они не стали бы заниматься этим).
- Спортивное программирование развивает навыки писать код без багов, думать о крайних случаях, о производительности. Оно не учит организовывать код. Я неоднократно видел картину, когда разработчик пишет код, затем обновляет в браузере страницу (куда-то кликает, заполняет формы), затем говорит "черт", правит строчку, и все повторяется. А вот олимпиады отучают дебажить, они учат сразу писать правильный код.
- Спортивное программирование дает опыт работы в команде, коллективе. Работать в одиночку и в коллективе — это две большие разницы. Далеко не все умеют конструктивно совместно что-то обсуждать, совместно вырабатывать решения. Командные олимпиады учат этому. Учат слышать людей, принимать во внимание их сильные и слабые стороны, индивидуальные особенности. Если вы научились руководить ACM-ной командой, то это непременно зачтется в плюс в вашем будущем менеджерстве. В некоторой степени дело не только в командности студенческих олимпиад: у многих умных молодых людей своеобразный социальный тип поведения, общение в сообществе идет им на пользу. Они осоциализируются что-ли.
- Спортивное программирование учит фундаментальным основам, которые очень часто теряют те, кто развивается отдаленно от академической среды. Я не однократно проводил собеседования по приему на работу — довольно многие могут кое-как сказать, что такое индексы в базах данных, а вот как они реализованы (хотя бы примерно), знает совсем мало кто. Вы скажете, что это не нужно знать? Еще интересный пример. На собеседование приходили люди, кто знал много аббревиатур, концепций, архитектур, паттернов и т.п. Иногда я спрашивал такой вопрос: пусть у вас есть хэш-мэп и вы туда в цикле по случайному ключу (например, строчка длины символов 10) кладете случайное целочисленное значение. Сколько за секунду вы сделаете таких присвоений. На каком компьютере? Да на моем, вот он стоит. Угадайте хотя бы крайне примерно. Каких только ответов я не слышал: отвечали сто, было и тысяча, был и миллиард.
- Спортивное программирование может принести медали/дипломы, которые помогут найти хорошую работу.
- Спортивное программирование введет вас в очень интересный круг общения. Мои лучшие друзья — мои коллеги по команде, люди с кем я вместе учился, кого учил. Это очень интересные, образованные и хорошие люди, с кого приятно брать пример.
- Спортивное программирование введет вас в очень полезный круг общения. Знакомства — очень полезная в жизни штука. Это слабо ощущается пока ты школьник, студент, но со временем это становится очевидным.
- Спортивное программирование дает возможность немного попутешествовать. Как-то в самолете я разговорился с американцем и перечислил ему все американские города, где побывал. Он был удивлен и грустно сказал, что они с женой уже давно собираются на Гавайи.
- Спортивное программирование учит думать и быстро соображать.
- Существует не так много областей человеческой деятельности, где Россия (или ваш ВУЗ) впереди планеты всей. Если у вас получается внести свой вклад в значимые достижение страны (города, ВУЗа), то это, в самом деле, почетно и заслуживает уважения. Когда мои воспитанники поднимаются на сцену получить заслуженные призы, я по-настоящему ощущаю, что такое патриотизм. И всех тех, кто приносит славу стране, я считаю патриотами. Такие победы несомненно важны — они создают тот положительный имидж, без которого сложнее сотрудничать, привлекать инвестиции, показывать потенциал региона.
- Спортивное программирование тесно дружит с преподаванием в ВУЗах. Существует практика, когда в прошлом участники соревнований остаются в ВУЗе и преподают там. Это очень нужно и правильно. Мы много говорим о том, что программирование очень динамичная область знаний, что пыльные профессора не могут дать актуальные знания по программированию. Привлечение молодых преподавателей в ВУЗы — единственный способ повышения уровня IT-образования. Практика показала, спортивное программирование способствует тому, что вчерашние выпускники не покидают ВУЗы. Это очень здорово.
- Спортивное программирование это просто очень интересно! Я еще не забыл тот драйв, когда сдав очередную задачу, ты видишь себя на первой строчке мирового рейтинга, но знаешь, что китайцы дышат тебе в спину. Я мало знаю таких интересных и одновременно полезных занятий.
- Спортивное программирование не мешает промышленному. Конечно, есть уникумы, кто не вписывается в промышленную разработку ПО. Но мой опыт показывает, что если даже вчерашние олимпиадники упустили в своем обучении какие-то аспекты промышленного программирования, они быстро осваиваются. Умение обучаться, думать и программировать позволяет им очень быстро наверстать упущенное. Более того, мой опыт говорит об очень четкой положительной корреляции в успехах в спортивном программировании и карьерным ростом в промышленности.
- Спортивное программирование учит решать задачки, которые очень часто спрашивают на собеседованиях в различных IT-компаниях. Все компании хотят получить людей, кто не просто знает определенный framework или язык, а умеет думать.
Наверное, я что-нибудь упустил. Пишите в комментариях что я пропустил, с удовольствием дополню список. Касательно нападок на именно студенческое спортивное программирование. Здесь могу отметить, что, в самом деле, есть крайне небольшая группа школьников, кто добился значительных результатов на олимпиадах, благодаря таланту, работоспособности и учителям познакомился со всеми алгоритмами и методами, что встречаются на контестах. Да, для таких школьников ценность студенческих олимпиад падает. Но надо помнить, что студенческие олимпиады явление массовое, и есть огромная армия студентов, для кого это интересно, полезно и нужно. Не решайте за них. Если вы считаете, что олимпиады лично вам уже немного дадут, то просто ими не занимайтесь :)
Напоследок отмечу, что в Саратовском государственном университете в Центре олимпиадной подготовки занимается довольно большое число студентов. В основном, мы набираем тех, кто практически (или вообще) не занимался в школе. Мы читаем лекции, проводим тренировки. Я вижу, как растут со временем люди и негодую, когда пишут, что студенческие олимпиады не нужны. Передо мной 30+ контрпримеров. Я уверен, что для всех вовлеченных в обучение, это полезно и нужно. Большая часть наших студентов не станет финалистами, но все они получают значительный набор знаний и навыков. В Центре они нашли интересный способ бесплатно получить все это по специальности. Такое дополнительное образование дает конкурентное преимущество при поиске работы в будущем. Не это ли самый правильный вариант студенческого образования?
Прошу прощения за сумбурность текста — на часах почти четыре ночи. Замечания о синтаксисе и пунктуации прошу отсылать мне через личные сообщения.
MikeMirzayanov
Согласен с выше написанным.
Олимпиадное программирование - во многом полезное. Если бы оно не приносило пользы - разве кто-то занимался бы этим?
Раз уже "задели админа" - значит, и в самом деле, слишком много разговоров на эту тему.
Тут получается, как в том анекдоте старом - "не качайте эту игру... Геймплей примитивный, графика - лажа... Я знаю, что говорю, я в нее уже 5 лет играю!" Вот и здесь, народ программирует-программирует, и между делом занимается обсуждением того, как это бесполезно, и что за это время лучше потратить на хобби/работу/девушку.
Прям как клуб анонимных алкоголиков:)
В самом крайнем случае - нас тренер научила - ими мыть пол хорошо, там материал как раз подходящий.
И при этом моя XL была намного больше от M тиммейта; да, меряли: +1 см в шее и неполные +2 см в длину:)
Зато весело было меняться:)
Мне вот в Харькове достался уникальный пакет от Яндекса - "ндекс". У всех была первая буква красная, остальные черные, а у меня первой просто не было.
Вспоминаю как в универе на соревнованиях, где спонсор давал свои футболки 5 цветов (рэндомно), было забавно смотреть на тех, у кого уже 3 или 4 из 5 есть дома в коллекции.
Футболки можно коллекционировать, обменивать, дарить, использовать вместо тряпок... А вам - носить да носить... Неинтересно:)
Совет выполнен!
class SegmentsTree {
Только преподаватели не делали квадрытные глаза. Т.е., конечно, можно и полезно, но вот я лично сам догадался, что проще писать один класс, чем мучиться с глобальными переменными.
Представь урок литературы... Или что-то другое, чем тебе очень не хочется заниматься, например реферат по истории...
И для того, чтобы не заниматься делом, человек целенаправленно раздолбайствует. :-)
Может олимпиадник и не хочет работать в Google, Microsoft...
Разве это критерий счастья или успеха для человека?
ППКС
Предлагаю считать этот пост основополагающим в подготовке молодых бойцов. Убийственное оружие против тех, кто считает олимпиадников бездельниками.
От себя добавлю к пункту про "учит думать" - спортивное программирование учит думать о том, о чем в другой логике никто не задумывается. Меня в жизни десятки раз выручало умение видеть ограничения, правильно их понимать и оценивать, замечать исключения, быстро приводить контрпримеры и многое другое, чему я научился за 8 лет программерского спорта. Причем это всё в отраслях, зачастую даже не связанных с IT.
У меня при компиляции GNU g++ 4.5.2 (MinGW-TDM) random_shuffle на массиве работает 0.3 секунды с указанными константами. Кажется, что слишком долго.
Профайлер говорит, что std::iter_swap <int *, int *> (int *, int *) вызывается как раз 99 * 100,000 раз, так что “индусы” тут ни при чём, функция random_shuffle работает как раз линейное время.
А тормозит, как обычно, встроенный сишный rand (). Со своим генератором становится быстрее в 2–3 раза, получается уже вполне разумное время.
Что-то слышал про gprof.
Делаем g++ <some-options> -pg prog.cpp -o prog.exe.
Далее запускаем prog.exe (так, как нам нужно).
Появляется файл gmon.out.
А теперь запускаем gprof prog.exe >log.txt и читаем этот log.txt. В нём написано, кто сколько раз вызывал какую функцию, а также сколько примерно времени программа провела в каждой функции и её детях.
Если компилировать с оптимизациями, то можно сильно удивиться тому, что половина функций заинлайнилась, а другая половина вызывается неизвестно откуда.
Кстати, я так понимаю, что бывает более подробная профилировка, с информацией по каждой строке. Но я так не умею. Если кто-то умеет — расскажите, как.
В частности:
===========================================
Ух ты, здорово, спасибо большое!!! Надо бы попробовать разобраться ;)
Я бы не стал ограничивать олимпиаду по программированию только студенчеством. У меня все начиналось еще со школьных олимпиад. Еще в 90-х на республиканских школьных олимпиадах задания по сложности не уступают сегодняшним, которые я вижу здесь.
Этот текст возник в контексте обсуждения, что школьные олимпиады по программированию полезны, а вот полезность студенческих соревнований у отдельных личностей вызывала сомнение.
Is there any English version of this post? I clicked on English but it's not being translated.
Можете сказать мне пожалуйста в какой возраст лучше заниматься этим. Например я сейчас усиленно изучаю Java SE. Возможно ли потом после того , как я выучил джаву научиться спортивному программированию? И имеет ли это смысл изучать олимпиадное программирование после джавы или какого либо другого языка?
Тут дело скорее не в возрасте, а 1) в предрасположенности к решению олимпиадных задач и 2) в наличии большого количества свободного времени. Ну и Java вполне сойдет как язык для спортивного программирования.
Нет вы не поняли. Я выбрал сторону разработки на Java. После этого стоит идти на спортивное программирование ?
Только если решение олимпиадных задач доставляет удовольствие.
Спасибо