Разработка → Как стать первым в спортивном программировании: Университет ИТМО делится опытом. Часть 2

itmo 27 декабря 2016 в 15:31 7,6k
Мы продолжаем рассказывать о курсе «How to Win Coding Competitions: Secrets of Champions», который Университет ИТМО запустил на платформе edX в этом году (первую часть материала читайте здесь).

Во второй части нашей беседы с авторами и инструкторами курса — Максимом Буздаловым и Павлом Кротковым, чемпионами ACM ICPC, и Дарьей Яковлевой, призером Google Code Jam for Women, речь пойдет о том, важен ли победителям олимпиад правильный настрой, как развить навык поиска креативных решений и кому будет полезен курс от чемпионов Университета ИТМО.


Michael Pollak / Flickr / CC

Настрой vs опыт: какую роль в победе играет психология


Максим Буздалов считает, что успех команды (или участника, если речь идет об одиночном соревновании) зависит от тренировок и слаженности работы, которые нарабатываются долгими часами практических занятий — чем больше участники тренируются, тем меньше их результат зависит от правильного настроя или его отсутствия.

Я бы не сказал, что «настрой» играет значительную роль в успехе. Чем выше уровень команды, тем выше интеллект ее участников, и тем реже работают методы самообмана, направленные на повышение уверенности в своих силах и на «поднятие духа»

— Максим Буздалов

А вот совместимость участников друг с другом, и их личные качества, по мнению Максима, играют очень большую роль. При этом некоторые из таких качеств — как положительных, так и отрицательных — могут проявиться только на финальном соревновании, от осознания ответственности: раньше команда отвечала только за себя, а в финале она представляет уже весь университет или даже страну. Пример из личного опыта Максима (чемпиона ACM ICPC 2009 года):

Разумеется, наличие встроенного в головы «боевого духа» может очень сильно помочь: так, наши соперники в 2009 году, команда университета Циньхуа, за последний час решили четыре, что ли, задачи, и вырвались на второе место, обеспечив себе золотую медаль и титул чемпиона Азии. Хороший пример…

… если бы не тот факт, что первое место заняли мы, которые, спустя несколько минут после начала последнего часа, сдали свою последнюю девятую задачу, и за оставшийся час не успели написать ничего толкового. Правда, мы, конечно же, не «опустили руки», просто ситуация сложилась таким образом, что все предыдущие четыре часа у нас были задачи в очереди на написание, а тут они внезапно кончились. Мы писали решение десятой задачи, но времени на нее нам не хватило

— Максим Буздалов



Команда Университета ИТМО-2016 на ACM ICPC: Адам Бардашевич, Антон Ковшаров, Андрей Станкевич (тренер) и Владимир Смыкалов

Павел Кротков уточняет — для команды профессионалов «заряженность на победу», возможно, и отходит на второй план, но вот начинающим участникам олимпиад без нее не обойтись:

Мой опыт говорит, что основное [для новичка] — это все-таки психология и стрессоустойчивость. Андрей Станкевич в шутку говорил, что для развития своей карьеры как тренера ему нужно получить образование психолога/психиатра

— Павел Кротков

Дарья Яковлева подчеркивает: если этап соревнования сразу не задался, у участников действительно могут «опуститься руки» — но бороться с проблемой эффективнее всего помогают дополнительные тренировки, а не какие-либо психологические приемы. Однако хорошее настроение и самочувствие перед началом соревнований отходят на второй план, если команда или кто-то из ее участников не испытывает особого интереса к процессу.

Люди, не испытывающие удовольствия от решения задач, конечно, не получат никаких призовых мест, просто не имеют шансов

— Максим Буздалов

Лайфхаки и советы


Мы предложили авторам курса «Как побеждать в соревнованиях по программированию: секреты чемпионов» поделиться советами и приемами, полезными в олимпиадном программировании — получилось несколько больших тем:

Практика

Практика, практика и ещё раз практика. Главный лайфхак — решать по одной задаче каждый день, даже в выходные, и не пропускать ни одного дня

— Дарья Яковлева

Максим Буздалов и Павел Кротков отмечают — постоянные тренировки помогают не просто добиваться успеха в решении задач, но и дают возможность предчувствовать правильный ход мысли. Однако одного онлайн-курса для развития такой способности будет явно мало (для его прохождения слушателям потребуется 4-6 часов в неделю) — придется ежедневно решать задачи (кстати, авторы курса в рамках занятий дают советы о том, как продолжать регулярные тренировки самостоятельно).

Чутье (или тонкая настройка в мозге эвристик, с помощью которых расставляются приоритеты в поиске направлений мысли) может быть развито только при решении очень большого числа задач. Нагрузка, предлагаемая курсом на эту тему — одна-три олимпиадных задачи в неделю в течение четырех недель — очевидно, недостаточна. Для развития чутья нужно длительно и регулярно решать олимпиадные задачи различной степени сложности (от субъективно легких до субъективно непосильных)

— Максим Буздалов

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

[Спортивное программирование] — это все-таки математика, и редко задачу можно решить методом, кардинально отличающимся от задуманного автором. Хотя и такое тоже бывает,  и чтобы это увидеть, опять же, нужно иметь опыт решения разнообразных задач

— Павел Кротков

Парное программирование

Еще один совет от Павла — практиковаться в парном программировании. Такой подход позволяет экономить время команды и добиваться синергетического эффекта (задачу сокомандники решают уже не каждый по отдельности, а сообща):

Понятно, что в такой ситуации количество «мозгов», работающих над решением, удваивается, и решение должно появляться быстрее/более качественным

— Павел Кротков

Тактические решения во время олимпиады

Максим Буздалов дает совет, вполне применимый и для работы команды «промышленных» программистов в условиях жесткого дедлайна (например, когда нужно решить сразу несколько заранее известных, но не тривиальных задач в очень сжатые сроки):

Предположим, идет пятичасовое командное соревнование. В этом случае, все участники команды должны прочитать все нерешенные задачи к концу первого часа. Именно так. Таким образом, вы 1) найдете все простые задачи, и 2) сможете обсуждать на равных сложные задачи.

Расширением этой техники является бумажка, размеченная в виде таблички, на которой строчками выступают задачи, а столбцами — участники. В ячейках участник отмечает, что он прочитал условие задачи, а также вносит краткие комментарии (например, «задача на динамическое программирование по подмножествам»). Решенная задача вычеркивается. Таким образом, текущее состояние команды становится обозримым для самой команды

— Максим Буздалов

Изучение смежных областей

Еще один совет от Максима касается развития творческого мышления: помимо постоянной практики (которая закладывает определенные «паттерны» решения задач) иногда полезно заставлять себя думать нестандартно. Лучше всего на достижение этой цели «работает» изучение смежных дисциплин – от очевидных до сравнительно экзотических.

Есть такая «полуолимпиадная» дисциплина, называется «теория решения изобретательских задач». Я не могу сказать, что я являюсь в ней профессионалом — скорее, я работаю в этой сфере интуитивно — но в ней предлагаются некоторые высокоуровневые идеи, которые могут помочь в оптимизации и де-стандартизации процесса мышления.

Мне в свое время очень сильно помогли олимпиады по математике. В них, во-первых, большое разнообразие способов думать над задачей, а во-вторых, они приучают думать не одним способом из перечня, а, скорее, «выпуклой комбинацией» этих способов. Таким образом, каждая новая идея, придуманная или где-то увиденная, увеличивает вашу способность решать задачи не на одну идею, а на бесчисленное множество идей, появляющихся в результате гибридизации новых знаний и того, что вам уже известно.

Много читайте, причем не только в выбранной вами предметной области (предположим, computer science), но и в разных других областях (например, биология). Эти знания помогут вам находить решения задач в одних областях, пользуясь идеями и знаниями из других областей — и тем самым потрясать мир радикальными новыми взглядами

— Максим Буздалов


Robert Gourley / Flickr / CC

Как отдыхают победители олимпиад


Ежедневная практика, решение задач, изучение смежных областей знаний, учеба в вузе — кажется, что такие требования полностью исключают из жизни участников олимпиад какой-либо отдых. Максим, Павел и Дарья развеяли наши сомнения — хотя оказалось, что и во время отдыха чемпионов по программированию тянет кодить:

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

— Павел Кротков

Ребята любят играть в настольные игры, в которых нужно придумывать интересные стратегии, тактики для того, чтобы победить. Также программисты [-олимпиадники] любят активный отдых: футбол, волейбол, фрисби. Есть ребята, которые любят танцевать хастл. Участники очень разносторонние личности, и у каждого свои интересы

— Дарья Яковлева

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

Так, когда я участвовал в олимпиадах, из программистских хобби у меня были генетические алгоритмы (позднее выросшие в магистральное направление моей научной деятельности) и обработка звука. А «обычным» моим хобби уже больше десяти лет является игра на гитаре, сочинение музыки и свободная импровизация

— Максим Буздалов

Не только олимпиады: кому еще (кроме будущих чемпионов) полезен этот курс


Авторы курса отмечают: далеко не все из записавшихся собираются в ближайшем будущем участвовать в чемпионатах по программированию. Многие из тех, кто прошел курс, просто хотели узнать что-то новое в знакомой области или даже развить профессиональные навыки и сделать более привлекательным свое портфолио.

Да, курс полезен ИТ-специалистам. Он рассказывает о том, какие бывают соревнования по программированию, как в них участвовать, как решать олимпиадные задачи, какие методы использовать и как дальше развивать навыки решения задач. И все эти идеи можно применить и реализовать в ИТ-сфере

— Дарья Яковлева


Общение на форуме с некоторыми слушателями курса, показало, что некоторые ИТ-специалисты с помощью нашего курса вновь обрели веру в то, что программирование может быть интересным.

Как показывает опыт общения с различными программами и сайтами, многим ИТ-специалистам было бы неплохо пройти хотя бы базовый курс в области вычислительной сложности, чтобы хоть как-то понимать, на каких масштабах размеров данных их программы начнут тормозить, и что с этим делать. Этот курс (несмотря на название, разумеется) вполне может сыграть такую роль

— Максим Буздалов

Павел Кротков (который параллельно с преподаванием курса работает в Facebook) объясняет, почему ИТ-гигантам интересны программисты-олимпиадники:

С одной стороны, такие [олимпиадные] задачи, конечно, имеют мало общего с повседневной работой «промышленного» программиста. С другой, ведущие IT-компании (Google, Facebook – из мировых), Яндекс – из российских, как раз любят нанимать на работу людей с олимпиадами бекграундом. Более того, даже собеседования в эти компании имеют много общего с соревнованиями.

Я бы сказал, что прохождение такого собеседования (опыт успешного участия в соревнованиях) даёт возможность понять, что кандидат умеет «соображать» в условиях стресса и ограниченного времени.

В общем и целом, сам по себе курс скорее не поможет в повседневной работе, но может помочь начать лучше ориентироваться в области алгоритмов/математики тем, у кого в этой области есть пробелы. А само участие в соревнованиях, в целом, может помочь «не заржаветь» мозгам в случае, если работа иногда становится несколько скучной

— Павел Кротков

Добавим, что второй поток курса «Как побеждать в соревнованиях по программированию: секреты чемпионов» стартует 6 марта 2017 года, но записаться на него можно уже сейчас. Занятия продлятся 5 недель: для обучения понадобится знание английского и одного из популярных языков программирования (C++, Java или Python). Пройти обучение можно бесплатно (сертификат о прохождении обучения — если он вам понадобится — обойдется в $49). Ждем вас в числе слушателей курса и будущих победителей олимпиад!
Проголосовать:
+22
Сохранить: