Добрый день!
Сегодня я наконец-то решила опубликовать мою статью, посвященную Центру олимпиадной подготовки имени Н.Л. Андреевой. Это структурное подразделение Саратовского государственного университета, ведущее подготовку студентов к соревнованиям по программированию.
Я занималась в ЦОППе все 5 лет моей учебы. После этого 6 лет преподавала в СГУ, при этом продолжала поддерживать связь с ЦОППом, помогала проводить олимпиады и тренировки. Этой статьей я хочу подвести некоторый итог моей деятельности, связанной с ЦОППом, и выразить бесконечную благодарность его прекрасному коллективу. К моей благодарности присоединяется Polichka, которая помогала с редактированием. Я попытаюсь ответить на следующие вопросы:
Чему полезному для будущей профессии можно научиться в ЦОППе? Какую роль ЦОПП играет в университетском образовании?
Надеюсь, и сообществу Codeforces, и людям, не связанным с олимпиадным программированием, будет интересно. Статья была написана во время моего преподавания в СГУ, в ней много сравнений студентов ЦОППа с обычными студентами, приходящими ко мне на пары.
Пару слов о том, как организован тренировочный процесс в ЦОППе. Прийти в ЦОПП может любой желающий студент СГУ. В основном занимаются студенты КНиИТа и мех-мата, всего 30-40 человек. Для них организуются личные и командные контесты, а также лекции — отдельно для нового набора, отдельно для студентов, тренирующихся больше одного года. Два контеста + одна лекция — это 12 часов в неделю. Довольно приличная нагрузка, даже если не считать время на дорешивание и выполнение домашнего задания к лекциям, которое заключается в решении задач в архив. Многие не справляются и уходят в течение первого года. Наиболее сильные студенты, ориентированные на результаты в международный соревнованиях, занимаются еще больше. Участвуют в раундах Codeforces и их подготовке, ездят на олимпиады и сборы, ходят на математический кружок. Летом проходят личные тренировки (конец июня — начало июля), сборы в Сазанке (начало августа) и, наконец, в конце августа школа в летнем лагере, в которой участвуют все студенты ЦОППа и где формируются команды на четвертьфинал.
На что эти ребята тратят свое время и что они получат в результате, кроме олимпиадных дипломов? Чему их научат в ЦОППе?
Попытаюсь ответить по пунктам.
1. Программировать. Писать работающие программы. Программирование — широкое понятие, поэтому поясню, что я имею в виду. Например, вы знаете, как складывать числа столбиком или как раскрывать скобки в арифметическом выражении. Я думаю, вы даже без особого труда сможете объяснить другому человеку, как это делается, или научить этому ребенка. Но вот запрограммировать эти алгоритмы может далеко не каждый студент или школьник, обучавшийся программированию. В чем трудность? Человеку достаточно объяснить метод на примере, для компьютера нужно его строго формализовать.
У всех студентов мех-мата и КНиИТа есть предмет, где их учат основным конструкциям языка программирования: ветвлениям, циклам, массивам и т.д. В результате студенты знают эти конструкции и понимают, как они работают. Однако формализации интуитивно понятных алгоритмов уделяют не так много внимания, в основном из-за нехватки времени. Это чисто практический навык, который можно развить, решая много задач. Чем и занимаются в ЦОППе! При подготовке к олимпиадам этот навык шлифуется до совершенства. Для олимпиадника очень важно уметь быстро реализовать тот алгоритм, который он придумал, а также довести программу до рабочего состояния путем тестирования и отладки.
Здесь не идет речь о продвинутых технологиях и фреймворках, о работе с большими проектами. Но умение писать работающий код — базовое. Вас не возьмут программистом ни в одну IT-компанию, если вы не можете приспособить хорошо известные вам средства (язык программирования) для реализации хорошо понятного вам алгоритма.
2. Использовать алгоритмы и структуры данных. Конечно, часть алгоритмов, которым посвящены лекции в ЦОППе, можно изучить и в рамках обычных университетских курсов, но в ЦОППе совершенно другой уровень их освоения. Например, Антонина Гавриловна Федорова на лекциях по информатике на первом курсе рассказывала нам про обходы в глубину и в ширину. Однако мы их не реализовывали на практике и в дальнейшем учебном процессе они не встречались, поэтому мои одногруппники благополучно забыли их после сдачи экзамена.
Я не вижу в этой ситуации ничего ненормального. Цель университета — дать обширные теоретические знания, чтобы выпускник имел кругозор и ориентировался в своей специальности. Практические навыки приходят и закрепляются, когда вы начинаете работать и используете их изо дня в день.
Студенты ЦОППа не просто учат алгоритмы, они используют их изо дня в день как инструмент. Они начинают чувствовать этот инструмент: для какой задачи лучше подойдет стек, а для какой — сбалансированное дерево; как модифицировать алгоритм для достижения своих целей; как оценить время и память для выбранного алгоритма. А динамическое программирование? Его принцип можно объяснить за одну лекцию, приведя при этом немало примеров. Но как научить использовать динамику при решении задач? Для этого нужно решить ни одну и ни две задачи. Даже олимпиаднику, решившему 100 задач на динамику, можно предложить 101-ю, которую он не решит. А такие задачи очень любят спрашивать на собеседованиях в компании. Это простой способ проверить умение человека думать.
Конечно, все предыдущие рассуждения могут не вызвать доверия, когда исходят от человека, не работающего программистом. Тем не менее, мое мнение разделяют мои друзья по ЦОППу, работающие в IT-компаниях. ЦОПП дает немало полезных навыков, которые могут пригодиться и в других профессиях, что я ощутила на себе.
3. Решать задачи. Я любила решать задачи с детства. Сначала это были олимпиадные задачи по математике, потом добавились физика, химия, дальше — программирование, в вузе — задачи по высшей математике, наконец — научные проблемы. В них используется разная теория, но каждый раз, переходя к новому типу задач, я чувствовала, как легко новые методы и приемы ложатся на универсальное умение решать задачи. Даже сложно описать, в чем оно заключается.
Любую задачу нужно сначала понять — что в ней дано, что нужно найти. Дальше — декомпозиция на более простые подзадачи. Перебор стандартных методов и аналогий. Не всегда первоначальная идея решения оказывается правильной, иногда нужно взглянуть на задачу с совершенно другой стороны. Долгие мучения и, наконец, озарение, догадка. Внезапная и нестандартная идея. Но это еще не все. Нужно не упустить ее, чтобы она не потонула в потоке других идей, развить и превратить в готовое решение. Я не знаю другого способа этому научиться, кроме как решать много задач. Чем и занимаются в ЦОППе.
4. Математически доказывать. По правде говоря, в ЦОППе не столько учат программированию, сколько математике. Для большинства студентов мех-мата, не ходящих в ЦОПП, доказательство теоремы — всего лишь часть лекции, которую нужно выучить. Или не нужно. Мало кто сам может что-то доказать. В ЦОППе умение доказывать играет очень важную роль. Хочется отличить правильное решение от неправильного до того, как будет потрачено время на его реализацию. Приходится обосновывать правильность работы алгоритмов. Нужно не только представлять, как это делается, но и мочь самому провести цепочку рассуждений, чтобы убедить товарища в правильности решения. И это даже не самое сложное. Еще сложнее, слушая чужое доказательство, обнаружить в нем ошибку... В ЦОППе студенты не просто учатся мыслить на математическом уровне строгости, но и понимают, зачем это нужно.
5. Работать в команде. На обычных парах преподаватели часто делят студентов на группы и дают групповые задания. Однако такая работа редко оказывается эффективной, потому что студенты в учебных группах очень разного уровня. Вся работа ложится на плечи сильных студентов, которые могут справиться с заданием в разы быстрее слабых, которые, в свою очередь, воспринимают объединение в группу как возможность халтурить.
В ЦОППе в команды собирают студентов близкого уровня. Вы чувствуете себя в коллективе крутых профессионалов, и сами являетесь ценным специалистом, очень нужным команда, и это здорово! Тем более, товарищи по команде часто становятся лучшими друзьями. Тренировки в ЦОППе учат распределять обязанности в команде, принимать совместные решения, компенсировать свои слабые стороны сильными сторонами товарищей. Вы осознаете себя частью команды не только в течение пяти часов контеста. Члены команды сообща решают вопросы об организации тренировок, поездок, о замене участников. Часто вместе с тренером обсуждают командную стратегию. Победа на олимпиаде — результат продолжительной совместной работы.
6. Вести профессиональную коммуникацию. Слушая доклады обычных студентов (не из ЦОППа) на парах и на защитах курсовых работ, я поняла, что у многих такие выступления вызывают проблемы. Студенты часто не ориентируются на аудиторию. Кто-то глубоко уходит в малозначительные детали, кто-то, наоборот, опускает важные подробности. Иногда встречается такое косноязычие, что докладчик ничего не может объяснить словами, только пишет формулы.
Решить проблему можно лишь многочисленными тренировками. Студентам ЦОППа приходится почти ежедневно объяснять друг другу решения задач индивидуально или проводить разбор у доски. Иногда приходится писать разборы задач, это развивает навык письменной речи.
Обычно после школы студенты хорошо умеют писать реферативный текст, а вот описывать собственные идеи или писать отчет о своей работе в школе просто не учат, что очень хорошо заметно по курсовым работам обычных студентов.
7. Бороться с волнением и усталостью. Все волнуются перед важным соревнованием и испытывают усталость к середине контеста. Главное, чтобы эти факторы не помешали показать высокий результат. Опять же, все достигается путем тренировок. Я встречала студентов не из ЦОППа, которые уже после 1,5-часовой контрольной от волнения и усталости, по их собственным словам, “уже ничего не соображали”. Полтора часа — это мало, в жизни будут и более серьезные испытания.
8. Читать тексты на английском языке. В ЦОППе нет занятий по английскому языку, но тем не менее... Я даю магистрантам второго года обучения на мех-мате задания по статьям на английском. Статью нужно прочитать и написать ее краткое содержание (выделить главное). Почему-то все магистранты сразу кидаются письменно переводить статьи на русский язык, то есть выполнять совершенно лишнюю работу! Стоит отметить, что в магистратуре английскому языку уделяется довольно много внимания. Помимо практики по английскому языку, многие преподаватели математических предметов требуют от студентов работы с англоязычной литературой, она также активно используется при подготовке магистерских диссертаций.
Я начала работать с математическими статьями на английском языке с третьего курса, и ни разу полностью не переводила их на русский. Смотрела переводы отдельных непонятных слов, значение некоторых фраз прояснялось благодаря формулам. Все потому, что в ЦОППе приходится читать английские условия задач, причем во время олимпиады совершенно нет времени их переводить. Нужно быстро понять, что требуется, и объяснить сокомандникам.
Каждый язык — это знаковая система. Нужно иметь в голове две отдельных системы — русскую и английскую. Установление соответствия между системами, то есть перевод, гораздо сложнее, чем восприятие текста в одной из систем. ЦОПП знакомит студентов с английским языком через профессиональную деятельность. В результате у них формируется правильный подход к его изучению, быстро осваивается профессиональная лексика, возрастает мотивация учить английский.
9. Организовывать и преподавать. Студенты ЦОППа часто привлекаются к проведению олимпиад и кружков для школьников, где можно развить свои организаторские и педагогические способности. Для меня этот опыт оказался весьма полезным.
По приведенным пунктам может показаться, что я очерняю процесс образования в СГУ, противопоставляя обычных студентов студентам ЦОППа. Это не так. Университет дает разносторонние теоретические знания, в то время как в ЦОППе на самом-то деле изучается совсем немного теории, необходимой для решения олимпиадных задач. Она включает далеко не все разделы Computer Science, не говоря уж о математике и информационных технологиях. ЦОПП не заменяет, а дополняет широкую теоретическую подготовку студента неотъемлемыми практическими навыками. В принципе, в стандартном университетском курсе есть практические занятия, и по приведенным мною примерам понятно, что преподаватели на них стараются развивать перечисленные умения у студентов. Но это не совсем успешно получается. Почему же?
Главная проблема вуза сегодня — в мотивации студентов. И я наблюдала эту проблему не только в российских вузах. А практическим вещам очень трудно учить без мотивации. ЦОПП мотивирует студентов благодаря соревновательности. Желание победить на олимпиаде заставляет полночи отлаживать непрошедшее на контесте решение. Многих мотивирует заниматься чувство ответственности перед командой. Ребята ощущают себя частью коллектива, состоящего из заинтересованных людей, с которыми приятно общаться.
Наверняка вы возразите, что перечисленные навыки развивать, конечно, нужно, но зачем тратить свое время на искусственные олимпиадные задачки? Можно пойти стажироваться в компанию, создать свой проект, присоединиться к какому-нибудь опенсорсному проекту или заняться научной задачей. Это тоже хорошие варианты. Но для них необходим некоторый начальный уровень. Студент вряд ли пойдет в компанию, если он умеет программировать на уровне среднего выпускника школы, и даже обучение в вузе не всегда может изменить ситуацию. А вот ЦОПП может.
В ЦОППе мы получили, фактически, дополнительное образование к обычному вузовскому курсу. Оно дополнило изучаемую на мех-мате и на КНиИТе теорию базовыми практическими навыками, позволившими освоить теорию на качественно другом уровне и стать востребованными специалистами. И еще один пункт из того, чему учит ЦОПП, я оставила напоследок.
10. Побеждать. Победы происходят не сразу. Порой случаются совершенно непредвиденные провалы. В 2007 году мы, команда Saratov SU #1 (natalia, Nerevar, stan), уже размышляли о поездке на финал в Канаду. Все более сильные команды СГУ отыграли, и этот сезон был наш по праву. Но… на полуфинале что-то пошло не так. В последний час мы решали три разные задачи и ни одну не решили, и в финал не прошли. Этот полуфинал стал серьезным ударом по нашему моральному духу. Мы стали меньше верить в свои силы. Кроме того, мы были на 3-4 курсах и уже начались предложения о работе, об учебе за рубежом. Но благодаря поддержке тренера Михаила Расиховича Мирзаянова (MikeMirzayanov) и руководителя Антонины Гавриловны Федоровой, мы продолжали заниматься.
Изменение командной стратегии позволило нам блестяще выйти в финал в следующем сезоне, выиграв полуфинал. Получив золотые медали в Стокгольме, мы даже радовались, что не прошли в прошлом году: “тогда было рано”.
Впереди был новый сезон с перспективой выступить в финале еще лучше. Но дальше нас ждал новый удар: необходимость срочной замены участника. Не буду здесь описывать в подробностях, как мы его выбирали за неделю до четвертьфинала, как заставляли учить элементарные алгоритмы, как мы уступили на чф нашей второй команде, как мы тренировались к финалу, который как назло в этот раз был в начале февраля, а не в апреле-мае как обычно. Серебряные медали в Харбине достались нам даже большей ценой, чем золотые.
Теперь другая история. Однажды я подала заявку на грант президента и не выиграла. Рассказывая об этом коллегам, я слышала в том числе и такие мнения: “Там нет смысла участвовать. Видишь, ты не выиграла, а нам тем более ничего не светит”. И это мнение людей, которые сами даже не пытались подавать заявки на гранты. Они сделали такие выводы даже не из своей собственной, а из чужой неудачи! Хотя если разобраться, ничего катастрофического не произошло. В том году я выиграла другой молодежный грант, а в этом году снова подала заявку на грант президента и выиграла его.
Общаясь с “неолимпиадными” людьми, я вижу, что для них бывает нормально сдаться после первой неудачной попытки или вообще не попробовав. Часто приходилось слышать мнения о том, что у нас провинциальный вуз, образование в нем по определению хуже чем в столицах, и мы никак не можем с ними конкурировать. Студенты думают, что они никогда не смогут устроиться работать в Google или Facebook, и даже в Яндекс, и даже поступить в зарубежную магистратуру.
Победив в соревновании международного уровня, вы имеете огромное преимущество перед другими — вы верите в свои силы, вы умеете не сдаваться. Ни после первой, ни после второй, ни после третьей неудачи. Если вы смогли победить в олимпиаде — значит, вы сможете выиграть грант, решить считавшуюся нерешенной задачу, устроиться в компанию своей мечты, создать успешный бизнес. ЦОПП научил нас побеждать.