Начать карьеру программиста можно через участие в школьных олимпиадах, которые развивают IT-навыки. Иван Пискарев, студент ВШЭ, дважды золотой медалист международной олимпиады по информатике и выпускник Кружка Яндекса для талантливых школьников, поделился со «Снобом» опытом участия в соревнованиях, алгоритмами решения сложных задач и советами по выбору первого языка программирования.
Помогает ли олимпиадное программирование стать хорошим программистом в реальной жизни?
Олимпиадное программирование помогает развить навыки решения сложных задач и работы с алгоритмами, дает опыт написания достаточно сложных программ и базу по абстрактным понятиям, которые напрямую связаны с программированием — все это полезно в любой области программирования на будущее.
То есть участие в олимпиадах помогает увидеть потенциальные ошибки в коде или способ реализовать алгоритм наиболее эффективно. Например, быстро придумать, как декомпозировать большую задачу на несколько мелких и перевести их решения в код.
Что такое олимпиада по программированию?
Смотрите, есть Всероссийская олимпиада по математике для школьников. В ней участники решают задачи на листе бумаги. В олимпиадах по программированию такие математические задачи нужно решать с помощью кода — то есть написать программу, а проверка решения происходит автоматически на компьютерах. И нужно не просто знать математику, но и уметь писать программы, разбираться в алгоритмах решения и быстро писать такой код, чтобы ответ задачи посчитался достаточно быстро.
В общем, большая часть олимпиадных заданий ближе именно к математике. Прикладные задачи требуют больше времени на реализацию и знаний в специфических областях, поэтому их на олимпиадах не задают.
Как проходит олимпиада, за что идет борьба?
На Всероссийской олимпиаде школьников по информатике дают четыре задачи, которые нужно решить за пять часов. В каждой можно набрать максимум 100 баллов (обычно большая часть участников не набирает столько, поэтому решения оцениваются частичными баллами). Так как итог зависит от набранных очков, очень важно в каждой задаче выжать максимум.
После — формируется рейтинг победителей. Например, на Всероссийской олимпиаде по информатике лучшие 8% финалистов получают диплом победителя, 45% следующих — диплом призера, а остальные остаются просто участниками финала. Так что борьба идет за каждый балл.
Сложность олимпиадных задач — не первостепенный фактор. Бывают задачи, которые никто не может решить, и это нормально. Главную роль играют баллы, поэтому важная часть соревнования — решить задачу лучше других участников. Нужно выбрать для себя наиболее подходящие, которые можно сделать и быстро, и хорошо — те, где ты знаешь, как написать алгоритм, чтобы получить за решение больше баллов.
Вообще, разделять время на задачи очень важно. Если какая-то задача непонятна, лучше вообще переключиться пусть на более простые, но точно решаемые. Более того, есть ограничение по времени не только для решения задачи: программа должна вычислить решение за определенное время, обычно 1–2 секунды.
Как ты подходишь к решению сложных задач? Приведи свой алгоритм.
Как вариант — разбивать задачу на какие-то компоненты и применять абстракции. Например, подумать, на какие функции можно разбить код, чтобы программа работала оптимально, продумать архитектуру программы. Еще посмотреть, все ли варианты написания кода мы разобрали, так как всегда есть несколько вариантов решения задачи, и нужно выбрать лучший.
На каких языках пишут код на олимпиадах?
На большинстве олимпиад есть заранее оговоренный список поддерживаемых языков. Обычно это C++, Python и Java, но бывают олимпиады, где доступен только C++. Зачастую его и используют, так как он очень быстрый, отлично подходит под специфику задач и справляется с ограничениями по времени. Другие языки, вроде Python, используются реже, потому что они медленнее.
Как выбрать свой первый язык программирования?
В начале разница между языками не так критична. Важно просто освоить основы, а язык подойдет любой — что C++, что Python, главное, чтобы он поддерживался на олимпиадах. Если ты уже знаешь один язык, перейти на другой будет не так сложно, так как в олимпиадном программировании используются только их базовые возможности, чтобы производить математические операции.
Важно ли для олимпиадного программирования знать низкоуровневые языки, типа Ассемблера?
Нет, на старте это точно не нужно. Гораздо важнее разбираться в алгоритмах и структурах данных и писать код на том же C++. Помимо языка программирования, важно хорошо разбираться в математике, так как задачи часто завязаны на математические методы. Знание Ассемблера может пригодиться как вспомогательный инструмент, чтобы потом писать более быстрые программы на C++, но не более того.
Как улучшать свои навыки и отслеживать прогресс?
Все зависит от цели. Если хочется участвовать в олимпиадах, чтобы успешно поступить в вуз или просто для «ачивки», нужно смотреть на решения, прорешивать олимпиады прошлых лет, устраивать себе виртуальные соревнования. Например, выделить себе 5 часов и за это время пытаться набрать как можно больше баллов. То есть приблизить себя к условиям олимпиады прошлых лет и потом сравнить свои результаты с результатами настоящих участников.
Можно использовать Codeforces и другие сайты, где решают задачи и получают рейтинг за их выполнение. Там порой проходят онлайн-соревнования — это помогает отследить свои успехи на явных метриках. После каждого соревнования рейтинг пересчитывается.
Как лучше — заниматься самому или искать единомышленников?
Вообще, очень важна практика, которую можно пытаться получить самостоятельно, но если вы только начинаете решать задачи, то вряд ли знаете, как это делать и что вообще решать. И тут сильно помогают олимпиадные кружки и сборы. На сборы приглашают уже по результатам олимпиад, так что нужно начинать с кружков — есть локальные в городах, а есть большие кружки, которые проводят IT-компании.
На Кружок Яндекса каждый год поступают тысячи школьников. В течение всего года систематически проводятся занятия, где преподаватели разбирают какую-то тему, а потом дают по ней задачи, разбирают их. И так как все это происходит в группах, можно отслеживать и свой прогресс, и видеть успехи других участников. Это сильно поддерживает мотивацию, так как хочется если не быть лучше других, то хотя бы не отставать.
Еще одна важная основа Кружка Яндекса — это его преподаватели, которые готовят к олимпиадам. Обычно на Кружке преподают опытные олимпиадники, которые уже сами участвовали и побеждали, поэтому они точно знают, что нужно изучать и к чему готовиться. Не просто дают новые знания, но и помогают разбираться с проблемой, объясняют, как эффективно подойти к решению задачи, как вести себя на олимпиадах, как бороться со стрессом.
Я уже говорил, что главное — это как можно лучше и быстрее решить задачу, чтобы заработать больше баллов. И таких знаний не получить, занимаясь подготовкой самостоятельно. Так что кружки экономят много времени и сил и помогают направить себя в нужную сторону с помощью преподавателей.
Можно ли научиться программированию «из-под палки», чтобы поступить в университет через олимпиады?
Так делают, но это рискованно. Всероссийская олимпиада хоть и дает ультимативное поступление в университет, но на ней слишком большая конкуренция. Из-за ее весомости и привлекательности в ней участвуют все. Поэтому ребята, которые идут на олимпиады ради простого поступления, участвуют в разных соревнованиях уровнем пониже, чтобы где-то победить и попасть в университет.
Большинство успешных олимпиадников начинают готовиться заранее, с 9 или 10 класса школы. Важно участвовать в региональных олимпиадах, в которых можно победить — а потом тебя позовут на сборы и кружки, где можно качественно подготовиться уже ко ВсОШ как раз к 11 классу.
Ведь большую часть успеха занимает подготовка — занятия, разбор задач, поиск новых методов решений, новых алгоритмов. Это требует огромного количества времени и усилий, так что без внутренней мотивации участвовать в олимпиадах все равно будет сложно.
Но скорее в олимпиадах участвуют школьники, которым это правда интересно, у кого это получается и кто хочет заниматься математикой или программированием в будущем.
Беседовал Александр Юдин
Свежие комментарии