С какого возраста можно обучать ребенка программированию и какой язык лучше выбрать? Как попасть на самые крутые IT-направления в лучшие вузы? Становятся ли дети разработчиков разработчиками? Как попасть на стажировку в Яндекс или на работу в Google?
Обо всем этом нам рассказывает Михаил Рубинчик — лидер и главный тренер по спортивному программированию в Уральском федеральном университете и основатель онлайн-школы по спортивному программированию SPGuide.
Расскажи немного о себе. Как ты попал в спортивное программирование и почему остался в нем?
Все началось еще в детстве. В начальных классах я учился в деревенской школе и уже тогда очень любил решать разные загадки, задачки и головоломки. Я не знал, где их искать, но очень радовался, когда они попадались мне на глаза :)
В 5 классе я поступил в лицей №1 города Кунгур. Там было принято участвовать в олимпиадах по математике, и я стал ими заниматься. Так я попал в олимпиадную среду и остался в ней, потому что любил решать задачи.
В 9 классе я случайно зашел на кружок по программированию. Тренер (который был всего на 4 года старше меня) рассказал мне и моему однокласснику про спортивное программирование, и мы стали пробовать решать задачи. Получается, как участник я занимался спортивным программированием 9 лет: 3 года школы и 6 лет университета.
Почему я остался? Наверное, потому что мне всегда нравилось преподавать. В 10 классе я начал вести кружок по математике для 5-6 классов, а в 11 классе вел кружок по программированию. Даже когда я поступил в УрФУ и переехал в Екатеринбург, я продолжал ездить в свой лицей по выходным (4 часа на поезде в одну сторону!) и обучать школьников. Когда я был на третьем курсе, мои ученики поступили в УрФУ и я начал тренировать уже студентов. Сейчас я отошел от преподавания и ушел в менеджерскую работу, которая мне не менее интересна.
Расскажи о своей работе сейчас. Что ты делаешь общественно-полезного и чем занимаешься для себя?
Сейчас я занимаюсь двумя крупными проектами: развиваю спортивное программирование в УрФУ и свою онлайн-школу по программированию Sport Programming Guide (или путеводитель по спортивному программированию).
В УрФУ спортивное программирование по большей части бесплатно. Финансово нас поддерживает университет и спонсоры, первым из которых стал СКБ Контур. В компании поняли, что можно начать сотрудничать с университетом и создать на Урале институт спортивного программирования. Все начиналось с выплаты грантов (в частности, на мою зарплату тренера), а сейчас в Контуре есть целый отдел, занимающийся развитием спортивного программирования. Помимо Контура и УрФУ, нас поддерживают и другие местные компании: Naumen, Targem Games, Eastwind, ProSoft и т.д.
Еще один важный спонсор — фонд "Золотое сечение". Он существует под эгидой Министерства образования Свердловской области и поддерживает школьников. Вместе с фондом мы проводим олимпиадные лагеря для ребят из Свердловской области. Подробнее можно прочитать в группе Вконтакте. Проект преимущественно социальный, и можно сказать, что я его идейный лидер и архитектор этой системы :)
Второй проект — онлайн-школа спортивного программирования. Он не такой масштабный, и мы занимаемся им вместе с женой: она решает организационные задачи, а я методические. Наша школа — это команда преподавателей, завучей и не только. В отличие от спортивного программирования в УрФУ с лагерями, тренировками и кучей поездок, в школе все проще. Ученик с преподавателем в формате индивидуальных занятий (занятие в школе длится 1 час) обсуждают и решают задачи, готовятся его к школьным и студенческим олимпиадам. Еще в нашей школе можно подготовиться к собеседованиям в IT-компании — мы учим решать задачи, подобные тем, которые дают на собеседованиях.
Чем твоя школа отличается от онлайн-школ программирования без приставки "спортивное"?
Первые ученики появились у нас в 2016 году. Если бы тогда меня спросили, чем моя школа отличается от других, я бы ответил, что олимпиадному программированию кроме нас не учит никто. Сейчас ситуация изменилась, на рынке обучения программированию выделилось несколько крупных сегментов. Первый — школы промышленной разработки (Яндекс.Практикум, GeekBrains, Skillbox), которые ориентированы на взрослых учеников. Там учат языкам, конкретным технологиям и фреймворкам. Второй сегмент — онлайн-школы программирования для детей, где ребят помладше обучают визуальному программированию (типа Scratch), а более старшим ученикам преподают Python. Навскидку это школы вроде Кодиум, Kodland, Алгоритмика. Обучение языкам в них часто идет на стыке с робототехникой. Попыток бесшовного перехода от игрового программирования и изучения языка к промышленной разработке на рынке очень мало.
SPGuide отличается и от первых, и от вторых школ. Мы не ставим перед учениками цель выучить язык программирования, потому что непонятно, что делать дальше.
Игровое начало обучения у нас есть, но только для тех, кто пока не может программировать без игр. Затем мы плавно переходим на настоящие языки программирования и начинаем готовить учеников к олимпиадам и соревнованиям, параллельно изучая необходимую математику. Для младших школьников и тех, кто только начинает программировать, мы даем Python. После Python мы постепенно переводим ребят на C++ (или даем сразу его, если видим, что ученику “заходит”). Он не самый простой для изучения, но это самый быстрый из высокоуровневых языков, и в какой-то момент он занял нишу олимпиадного программирования. Примерно 80% всех решений на олимпиадах пишется именно на C++.
И C++, и Python изучаются в нашей школе на уровне базового синтаксиса. Мы считаем, что для решения задач ученикам полезнее знать алгоритмы, чем разбираться во всех структурах языка.
Как выглядит решение олимпиадной задачи?
Вам нужно написать код, который считывает входные данные с консоли и выводит выходные данные в консоль. Технологически это делается легко, нужен всего лишь экзешник или скрипт, который сделает все за вас. Сложность в том, чтобы быстро обработать считанные данные. Вы можете прочитать задачу и придумать программу, которая будет работать 100 лет, а вам нужно написать код, который будет работать 1 секунду. Олимпиада — это про то, как увеличить скорость выполнения программы. И в нашей школе, помимо игрового программирования, Python и C++, учат ускорять алгоритмы. Мы специализируемся именно на этом.
Где применить навыки решения олимпиадных задач?
Олимпиадные задачи встречаются в трех местах:
Школьные олимпиады — Всероссийская олимпиада школьников (самая крутая в стране) и олимпиады из перечня РСОШ (Российского совета олимпиад школьников). Победители и призеры этих олимпиад могут поступить в вуз без экзаменов или получить 100 баллов за ЕГЭ по профилю олимпиады.
Студенческие олимпиады, в основном турнир ICPC. Это командное соревнование, которое длится 5 часов. В течение олимпиады команда из 3 человек, сидящая за 1 компьютером, должна решить определенное количество задач. За каждую решенную задачу команда получает 1 балл. Чтобы участвовать в ICPC, нужно учиться в вузе и подходить по году рождения.
Собеседования в крупные IT-компании. Чтобы попасть на стажировку в Яндекс, нужно решить реальный контест с олимпиадными задачами. На собеседовании в Google и Facebook тоже дают подобные олимпиадным задачи.
Так получилось, что студенческие олимпиады не очень привлекательны с практической точки зрения. Конечно, на соревнованиях вас могут заметить интересные IT-компании и позвать на работу, да и в целом участие в ICPC можно воспринимать как тренажер для подготовки к собеседованию в компании с мировым именем. Но если вы хотите пройти на чемпионат мира, вам нужно иметь уровень гораздо выше, чем нужно для собеседования. И такие серьезные цели уже не коррелируют с практической полезностью "здесь и сейчас".
Давай остановимся на практической пользе подробнее.
Выгода от собеседования понятна. Вы получаете работу в компании, где мечтали работать вы и еще десятки тысяч ваших конкурентов.
У школьников тоже много выгоды. Во-первых, это поступление в университет. Призерам заключительного этапа Всероссийской олимпиады школьников даже ЕГЭ сдавать не надо, они и так могут поступить без экзаменов почти в любой российский вуз. Что же касается призеров РСОШ, то их поступление зависит от уровня олимпиады и баллов на ЕГЭ. Если призер РСОШ сдаст ЕГЭ по профилю олимпиады на 75 и более баллов, он поступит в университет без экзаменов. Но это работает не для всех олимпиад и университетов.
Поясню, как это происходит. Олимпиады РСОШ бывают 3 уровней: первого, второго и третьего. И каждый вуз сам решает, призеров каких олимпиад принимать без экзаменов. Один универ берет исключительно победителей олимпиад первого уровня, а призеров (не говоря уже о победителях и призерах второго и третьего уровней) уже не возьмет без экзаменов. Другой вуз возьмет победителей и призеров олимпиад первого уровня и только победителей второго. Есть вузы (и это 99% университетов страны), которые берут победителей и призеров всех трех уровней.
Конечно, многие школьники стремятся в “престижные” университеты, и поступить на ряд их специальностей без олимпиад невозможно. Самые популярные среди олимпиадников университеты — это МГУ, СПбГУ, МФТИ, ИТМО и ВШЭ.
Ты замечал какую-то зависимость: дети программистов становятся программистами?
Пока я знаю мало таких случаев, но думаю, что так и будет. Сейчас мы видим, что зарплата разработчиков в разы выше, чем средняя зарплата в стране. Любой родитель хочет, чтобы его ребенок был успешен, поэтому он по возможности будет влиять на ребенка и помогать ему добиваться высот. В том числе отдавать его на специальность, находящуюся на подъеме.
А кто приводит ребят к тебе в школу? Или они приходят сами?
Ко мне приходят даже взрослые разработчики, которые говорят: "Я крутой разработчик, у меня все хорошо. Но я хочу в Google/Facebook, а для этого требуется подучить алгоритмы". Такие люди учатся у нас, успешно проходят собеседования и остаются благодарны школе.
К примеру, у нас учился Илья Щукин. Он жил в Тель-Авиве, работал в местной IT-компании и целый год пытался попасть в Google, но никак не получалось. После полугода обучения в SPGuide он прошел отбор.
Но в основном мы, конечно, ориентируемся на школьников. Их можно условно разбить на две категории:
Олимпиадники, которые хотят побеждать на соревнованиях. Они уже знакомы со спортивным программированием и участвуют в олимпиадах, но не так успешно. Ребята постарше (примерно 9 класс) в основном приходят в школу сами, более младших олимпиадников приводят к нам родители.
Ребята, которые никогда не участвовали в олимпиадах и хотят заниматься программированием или олимпиадной информатикой. Таких ребят обычно приводят родители.
Для всех ребят мы проводим вводное ознакомительное занятие. Олимпиадников знакомим со школой, показываем нашу платформу, решаем задачи, чтобы посмотреть исходный уровень. Ребятам, которые только хотят участвовать в олимпиадах, также рассказываем о плюсах, минусах и вызовах, которые стоят перед олимпиадниками. Плюсы я уже называл выше (поступление в крутой вуз без экзаменов), а про минусы обычно говорим так: "Ребята, придется пахать. Если вы придете к нам и будете ждать, что преподаватель занесет знания в ваш мозг — ничего не получится. Толк появится, только если вы постоянно будете решать задачи самостоятельно”.
Сколько времени в неделю нужно уделять решению задач, чтобы добиться успехов?
Я понимаю, что людям всегда хочется получить точный ответ в часах, но, к сожалению, я не могу его дать. Расскажу, какие факторы влияют на затраты времени и результат.
Во-первых, имеет значение возраст, в котором ученик начал заниматься олимпиадным программированием. Например, человек без опыта математики и программирования приходит к нам летом после 9 класса и говорит, что хочет стать призером Всероссийской олимпиады. В этом случае я скажу, что нужно жестко пахать — около 40 часов в неделю. Даже так: я отвечу, что не уверен, что у него получится стать призером Всероссийской олимпиады, даже если он будет пахать по 40 часов в неделю. Потому что 2 года в таком случае — это очень мало, учитывая то, что первые этапы Всероссийской олимпиады начинаются осенью, и у этого школьника есть всего 1 год на подготовку и 1 шанс стать призером (уже в 11 классе).
Есть более реалистичные цели, например, стать призером олимпиады 3 уровня. С нормальной школьной подготовкой по информатике и математике можно спокойно прийти к этой цели за 2 года, занимаясь 10 часов в неделю.
Во-вторых, эффективность занятий зависит от особенностей ученика. Кто-то более усидчивый, кому-то легче даются алгоритмы. Мы не раз наблюдали, как разные ученики достигают очень разных результатов за 1 час занятия.
Хайповый вопрос: зависит ли результат от пола?
Нет. В этом вопросе я феминист. Если от пола что-то и зависит, то только по социальным причинам. Когда родители (учителя, друзья) говорят девочке, что программирование — это для мальчиков, у нее пропадает мотивация, снижается уверенность в себе и результаты становятся хуже. Хотя для для некоторых девчонок это становится вызовом, они думают: "Я вам покажу, что тут не женское дело!" и добиваются успехов.
Да, олимпиадников-девочек по-прежнему гораздо меньше, чем мальчиков, но ситуация меняется. Раньше девочки единично участвовали в олимпиадах по программированию, хотя по математике их было довольно много. Сейчас девочек в олимпиадной информатике стало существенно больше.
Назови, пожалуйста, признаки, по которым в определенном возрасте можно понять, что ребенку стоит заниматься программированием на более серьезном уровне, чем в школьной программе.
Тоже очень острый вопрос!
Думаю, можно ответить не про программирование, а вообще про все. Ребенку должно быть интересно. Если ребенку интересны танцы, ему надо заниматься танцами. Если интересно программирование, нужно заниматься программированием. Вопрос в том, как понять, ЧТО нравится ребенку и не перепутать его желания со своими. Потому что если родитель хочет, чтобы ребенок стал программистом, а у ребенка нет к этому склонности и желания, шансы очень маленькие. Можно потратить кучу нервов и денег и сделать из ребенка программиста, но будет ли он счастлив?
Если вы заметили, что ребенку в первом-втором классе интересно решать математические задачки, попробуйте привести его на кружок по визуальному программированию. Увидите, что глаза горят — значит, можно попробовать что-то посложнее. Главное — поддерживать и направлять, а не навязывать.
Какой идеальный путь должен пройти юный программист, чтобы в будущем легко найти работу по душе?
Я думаю, оптимальный сценарий — поступить в как можно более сильный университет. Сейчас популярно мнение, что вуз — это просто корочки, на которые можно забить, но я знаю немало IT-направлений в российский вузах, где отлично учат разработчиков и дают практически полезные знания. Я сам приложил руку к ФИИТ УрФУ и знаю, что даже в регионах есть сильные вузы и направления.
Главная цель в школьном возрасте — попасть на одно из таких направлений. Чтобы попасть, нужно участвовать в олимпиадах. И преимущество тут у того, кто начинает заниматься раньше. Общая рекомендация: как можно раньше начинайте учить Python — это самый простой язык для обучения. Если не получается, начните с чего-нибудь визуального, а потом переходите на Python.
Продолжи фразу: "Спортивное программирование - это шанс ..."
Я думаю, что это не шанс, а возможность. Спортивное программирование — это социальный лифт в программирование вообще. Есть вопрос "Как стать программистом?" и есть 1000 разных ответов, каждый из которых имеет свои нюансы и особенности. Но если вы пришли в спортивное программирование, то вы вне сомнения сможете стать программистом.
Три основных навыка, которые вы тренируете у ребят в школе?
Я даже не буду называть три, потому что есть один самый главный. Это умение думать и рассуждать. Важно то, как мы это делаем.
Есть классический способ обучения всему и везде: прочитать лекцию и дать задачки. Мы считаем этот подход плохим. Потому что лекция — это пассивное восприятие информации. А мы "топим" за активное восприятие. Поскольку наши занятия проходят один на один, мы имеем возможность дать ученику задачу на тему лекции еще до лекции. А потом намекать, подсказывать так, чтобы он нам рассказал, как эту задачу решать, а не мы ему. Мы его только подталкиваем в тех местах, где сложновато. Если очень сложно, мы говорим: "Давай отложим тему и обсудим задачу попроще, а к этой вернемся потом".
Расскажи пару впечатляющих историй про своих учеников из серии "было/стало"
Про Илью Щукина я уже говорил. А вот общий формат изменений будет полезно описать.
Иногда бывает так. Человек приходит и говорит, что был в куче лагерей, прослушал 1000 лекций, проходил онлайн-курсы, знает вообще все темы, которые нужны, чтобы стать чемпионом мира, но с олимпиадами у него не складывается. Это классический портрет человека, пришедшего к нам "с опытом". И все его лекции, курсы и лагеря сработают только тогда, когда у него будет достаточно практики. Поэтому мы учим через практику, помогаем перейти от "я понимаю" к "я умею". Именно это изменение происходит с учениками в нашей школе.
Расскажу про еще один тип историй, которые всегда меня радуют. Приходит человек, который вообще не умеет программировать. Он даже не понимает, что такое переменная. Не в математике, а в программировании. Он не знает, как сложить два числа и вывести на экран. А через пару лет смотришь, а он участвует в олимпиадах и решает базовые задачи. Да, он пока не призер, но эта метаморфоза настолько мощная, что очень меня радует.
Ты упомянул, что спортивное программирование — социальный лифт, который поможет попасть в престижный вуз. Что ты посоветуешь ребятам, у родителей которых нет денег, чтобы заниматься в твоей школе?
Тоже классный вопрос. Тут все зависит от мотивации школьника. История примерно такая:
Если у родителей нет денег, а у ребенка мотивации — ничего не получится.
Если у родителей есть деньги, а у ребенка нет мотивации нет — сделать из него олимпиадника можно, но сложно (дорого и нервно для всех участников процесса).
Если у родителей нет денег, но у ребенка есть мотивация — это неплохой сценарий, и ничего страшного в нем нет!
До какого-то уровня мотивированный школьник может дорасти и сам, решая задачи без помощи наставников и преподавателей. Конечно, нужна дисциплина и усидчивость, но это вопрос привычки и желания заниматься олимпиадной информатикой. Есть много полезных онлайн-ресурсов. Например, сайт Timus с архивом задач по олимпиадному программированию. Очень советую. Сначала решаете как можно больше задач, и только потом участвуете в соревнованиях. Например, на CodeForces.
Можете поискать различные олимпиады школьников в своем регионе и поучаствовать в них. На олимпиадах можно встретить единомышленников, с которыми можно обсуждать различные задачи и делиться знаниями.
Также в развитии очень помогают лагеря и сборы, которые часто проводятся бесплатно или за не очень большие деньги. Например, есть российский лагерь "Сириус", и в нем смены Сириус Регионы и Сириус Юниоры. Юниоры - это 5-8 классы. Отбор проходит через онлайн курс. Вы регистрируетесь на сайте Сириуса и проходите курс, где фактически проверяется ваша усердность. Старт где-то в конце зимы, начале весны.
В нашей группе ВКонтакте мы выкладываем статьи, в которых даем советы по обучению олимпиадной информатике. Заходите, читайте, узнавайте полезную информацию.
В общем, если есть желание, возможности найдутся :)
В заключение
Мы благодарим Михаила за интервью. Надеемся, оно показало вам, как работает система олимпиад по информатике и соревнований по спортивному программированию, и как вы можете эту систему использовать. Если у вас есть вопросы Михаилу, можно писать ему сюда.
Также благодарим Михаила за помощь в организации RustCon Contest 2021 — онлайн-соревнования по решению задач на языке Rust. Кому интересен Rust — welcome в чат RustCon Russia.