Текст уведомления здесь

Кодить как дышать

Главное в программировании вовсе не код, а алгоритм

Школьники и студенты из России уже несколько лет занимают первые места на престижных мировых турнирах по спортивному программированию. Уже с 14 лет за ними начинают охотиться крупные IT-компании, а еще несколько лет спустя для них открывается путь в Кремниевую долину. «Чердак» попытался разобраться, как вырастить гениального программиста, и поговорил с тренерами и педагогами.
Добавить в закладки
Комментарии

Откуда появляются такие таланты, кто и как их учит? Растут сами по себе? Не совсем так. Оказывается, компании не только «хантят» уже подготовленных юных программистов, но и создают условия для того, чтобы их становилось все больше, оказывая поддержку учителям информатики. Так, например, ВКонтакте при поддержке Промсвязьбанка учредила стипендиальную программу VK Fellowship для преподавателей программирования, создавших авторские образовательные программы. В программе могут принять участие преподаватели из всех субъектов Российской Федерации, за исключением (увы) Москвы и Санкт-Петербурга; прошедшие конкурсный отбор получают стипендию и принимают участие в летних и зимних школах.

Программирование как спорт

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

И второе, очевидное для тех, кто программированием занимался, и совсем не очевидное для остальных: главное в программировании вовсе не код, а гениальный алгоритм.

Михаил ТихомировФото предоставлено пресс-службой МФТИ

«Теория алгоритмов, которая занимает центральное место на нынешних олимпиадах, — это на самом деле область математики, хотя не все участники об этом задумываются», — говорит тренер российской национальной школьной сборной по программированию, тренер победителей студенческого турнира ICPC 2016—2018 годов, преподаватель МФТИ Михаил Тихомиров.

«Задачи по программированию предполагают наличие умений по формализации условий, представлению решения в виде некоторой математической модели, выбору структур данных, алгоритмов и, конечно, реализации программы на языке программирования», — добавляет директор липецкого Центра поддержки одаренных детей «Стратегия», стипендиат VK Fellowship Инесса Шуйкова.

А ВОТ ВАМ ПРИМЕР   
Экспедиция   
Планируется отправить экспедицию к соседней звездной системе. Были отобраны n кандидатов, пронумерованных от 1 до n, среди которых необходимо выбрать участников экспедиции. Организаторы хотят отправить в экспедицию как можно больше кандидатов. Среди кандидатов был проведен опрос, в процессе которого каждый мог указать не более чем одного из остальных кандидатов, с которым он не готов отправиться в экспедицию. Результатом опроса для первого кандидата является целое число ai, которое равно номеру кандидата, с которым i-й кандидат не готов отправиться в экспедицию, либо −1, если первый кандидат готов отправиться в экспедицию в любом составе. Теперь организаторы должны выбрать, кто из кандидатов отправится в экспедицию. Решено было выбрать участников экспедиции так, что если туда входит некоторый кандидат i, и ai ̸= −1, то туда не входит кандидат ai. Организаторы хотят выбрать максимальное количество участников экспедиции. Требуется написать программу, которая по заданным результатам опроса кандидатов определяет максимальное количество кандидатов, которых можно отправить в экспедицию.   
(региональный тур Всероссийской олимпиады школьников по программированию, 2019 год)

Так что путь в олимпиадном программировании начинается с хорошего знания математики. «Математические способности и способности к программированию очень тесно связаны. Как правило, хороший программист всегда хороший математик. При этом в олимпиадах по программированию часто используются знания областей математики, выходящие далеко за рамки школьной программы», — добавляет лауреат VK Fellowship, университетский преподаватель из Красноярска, основатель самой известной платформы с задачами по программированию acmp.ru Сергей Беляев.

Язык же программирования, по словам экспертов, не имеет особого значения, по крайней мере на начальных этапах олимпиадной «карьеры». Для решения задач ты можешь написать код хоть на «бейсике», лишь бы твоя программа работала эффективнее, чем у конкурентов. По словам Михаила Тихомирова, язык становится важен на поздних этапах соревнований: тут C++ и Java оказываются предпочтительнее Python, с которого чаще всего начинают учиться «кодить» современные школьники. А вот уже на международной олимпиаде (IOI) написать программу можно только на одном из трех языков — C++, Java или Pascal.

А ВОТ ВАМ ПРИМЕР
Интервальные тренировки
В академии физической культуры разработали новый метод интервальных тренировок спортсменов. В соответствии с этим методом спортсмен должен тренироваться каждый день, однако рост нагрузки должен постоянно сменяться ее снижением и наоборот. План тренировки представляет собой набор целых положительных чисел a1, a2, . . . , am, где ai описывает нагрузку спортсмена в i-й день. Любые два соседних дня должны иметь различную нагрузку: ai ̸= ai+1. Чтобы рост нагрузки и ее снижение чередовались, для i от 1 до m − 2 должно выполняться следующее условие: если ai<(ai+1), то (ai+1)>(ai+2), если же ai > ai+1, то ai+1 < ai+2. Суммарная нагрузка в процессе выполнения плана должна составлять n, то есть a1 + a2 + . . . + am = n. Ограничения на количество дней в плане нет, m может быть любым, но нагрузка в первый день тренировок зафиксирована: a1 = k. Прежде чем приступить к тестированию нового метода, руководство академии хочет выяснить, сколько различных планов тренировок удовлетворяет описанным ограничениям. Требуется написать программу, которая по заданным n и k определяет, сколько различных планов тренировок удовлетворяют описанным ограничениям, и выводит остаток от деления количества таких планов на число 109 + 7.
(региональный тур Всероссийской олимпиады школьников по программированию, 2019 год)

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

Чему не учат в школе

Сегодня стандартный учебный план в «обычной» школе предусматривает всего один-два урока информатики в неделю. Очевидно, что для побед на олимпиадах этого недостаточно. Но дело даже не только и не столько во времени.

«Главная проблема не в количестве часов, а в их качестве. Если постараться, то и за один урок можно немало сделать. Может, к олимпиадам и не подготовить, но заложить фундамент для будущих побед вполне возможно. А как показывает практика, в 90% школ уроки информатики сводятся к рисованию открыток на каждый праздник до самого окончания школы, и связано это с дефицитом преподавательских кадров», — рассказывает еще один стипендиат VK Fellowship, школьный учитель из Челябинска Антон Деникин.

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

Завершение работы летней школы по компьютерным наукам НИУ ВШЭ и Центра «Стратегия». Инесса Шуйкова — в центре.Фото из архива Инессы Шуйковой

«Я бы сказала, что в таких школах, лагерях, центрах учат принципиально иначе. Например, тематические образовательные смены предполагают интенсивную подготовку, полное погружение в предмет. Лекции, тренировки (решение контестов), разбор задач, спецкурсы и мастер-классы — расписан по минутам весь день, с утра до ночи. Преподавательский состав на таких образовательных сменах творит, выдумывает, экспериментирует, подзаряжается новыми идеями, задачами, методиками», — рассказывает Инесса Шуйкова, один из руководителей смены по программированию в «Сириусе».

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

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

А ВОТ ВАМ ПРИМЕР
Платные дороги
Города в Японии соединены дорожной сетью. Сеть состоит из городов и дорог. Каждая дорога соединяет пару различных городов. Никакие две дороги не соединяют одну и ту же пару городов. Города пронумерованы от 0 до N-1, а дороги пронумерованы от 0 до M-1. По каждой дороге можно проехать в любом из двух направлений. Из любого города в любой другой можно добраться по дорогам. За проезд по каждой дороге необходимо заплатить пошлину. Пошлина на каждой дороге зависит от загруженности этой дороги. Загруженность дороги может быть слабой либо сильной. Пошлина для слабо загруженной дороги составляет A йен (японских денежных единиц), а для сильно загруженной дороги — B йен. Гарантируется, что у вас есть устройство, которое по заданной вами информации о загруженности всех дорог вычисляет наименьшую суммарную пошлину, которую необходимо заплатить для проезда между городами S и T (S не равно T) при такой загруженности дорог. Ваше устройство еще находится в стадии разработки. Значения S и T зафиксированы внутри устройства и вам неизвестны. Вы хотите найти S и T. Для этого вы собираетесь воспользоваться устройством в нескольких сценариях загруженности дорог и, пользуясь полученными из устройства значениями пошлин для проезда, определить S и T. Поскольку управлять устройством сложно, вы хотите воспользоваться им не слишком много раз. 
(Международная олимпиада школьников по программированию IOI в Японии, 2018)

Педагог или тренер?

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

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

В большинстве случаев школьный педагог работает над задачей, прописанной в учебном плане, над формированием информационной и алгоритмической культуры. Это то, что нужно и с практической точки зрения для жизни в нашем цифровом мире, и для развития мышления в целом.

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

Антон ДеникинФото предоставлено Антоном Деникиным

Но до того, как школьник попадает в руки тренера, на его пути все же обычно встречается увлеченный и талантливый школьный учитель. «Задача педагога в школе — заинтересовать детей предметом, дать знания, замотивировать на успех, который, кстати, не обязательно может быть связан именно с олимпиадным программированием», — говорит Антон Деникин.

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

«Там, где есть обучение, всегда важна связь «человек—человек», какие бы прекрасные автоматизированные системы ни были созданы», — уверена Инесса Шуйкова.

Олимпиады и профессия

Про школьников-олимпиадников нередко можно услышать мнение, что победы на турнирах — их самоцель и, вырастая, они находят себя только в той же сфере, но уже становясь тренерами. Действительно ли спортивное программирование так далеко от того, что востребовано индустрией? Эксперты опровергают этот стереотип.

«Спортивное программирование вовсе не оторвано от жизни. Часто люди думают, что спортивное программирование — это человек выложился три-пять часов и все, больше ничего не может. На самом же деле за этим стоят годы интенсивной подготовки, требующей не только таланта, но и собранности, силы воли и других так называемых soft skills, очень востребованных в профессиональной сфере», — говорит руководитель национальной сборной России по программированию, проректор по международным программам и технологическому предпринимательству МФТИ и основатель олимпиадных школ МФТИ Алексей Малеев.

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

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

То же, по мнению Алексея, подтверждает и зарубежный опыт: в штате и Google, и Facebook, и в других технологических компаниях найдутся чемпионы и участники крупных программистских турниров.

Мало того, успешно работать в IT-индустрии российские школьники иногда начинают, еще не окончив школу.

Добавить в закладки
Комментарии
Вам понравилась публикация?
Расскажите, что вы думаете, и мы подберем подходящие материалы