Регистрация на Яндекс.Алгоритм и дискуссия о спортивном программировании

Все этапы третьего чемпионата Яндекса по программированию пройдут в онлайне на платформе Яндекс.Контест, так что поучаствовать в нём смогут и те, кто не готов куда-то ехать. Алгоритм состоит из нескольких отборочных раундов, в каждом из которых нужно решить пять задач за 100 минут. В финал, который состоится 6 августа, выйдут 25 лучших по результатам отбора. Тренировочный раунд, до которого стоит зарегистрироваться, пройдет 3 мая.Пока мы писали правила и составляли расписание этого Алгоритма, Питер Норвиг рассказал о своем исследовании, которое выявило негативную корреляцию между победами человека на олимпиадах для программистов и его успехами в работе. По его мнению, спортивное программирование приучает концентрироваться на сиюминутных задачах, тогда как на работе надо думать о будущем проекта.

[embedded content]

Конечно, он не первый, кто поставил под сомнение пользу, которую приносит спортивное программирование в промышленной разработке. Спорят об этом давно. В Яндексе, как всегда, на этот счет тоже много отличающихся мнений. И мы попросили коллег, которые как участвовали и побеждали на различных контестах, так и нет, поделиться своим ответом на вопрос: «Помогает ли опыт в спортивном программировании в программировании промышленном? «Роман Удовиченко, Минск.Разработчик геосервисов. В Яндексе — три года.

Работает в Яндекс.Картах над различными задачами, решение которых позволяет улучшать читаемость карт и делать их более удобными для ориентирования. Окончил факультет прикладной математики и информатики БГУ в 2013-м году. Серебряный медалист студенческого чемпионата мира ACM ICPC 2013, финалист и призер еще множества различных соревнований. Автор задач финала Яндекс.Алгоритма 2013 года.

6d34ab447c724e1d911c629ddc405ccf.jpg

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

Михаил Парахин, Москва.Директор по поисковым технологиям. В Яндексе — год

После окончания МИФИ начал работать в ЗАО НТЦ «Модуль». В 90-х это было почти единственное место в Москве, где занимались системами автоматического обучения. Потом ушел в компанию Parascript, которая фактически является монополистом в области распознавания рукописного и печатного текста. Долгие годы работал в США. Последние семь лет — в Microsoft, пять из которых возглавлял в Bing подразделение мультимедийных поисковых сервисов. Прошлой весной пришёл в Яндекс директором по поисковым технологиям.

image

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


Павел Сухов, Нижний Новгород.Младший разработчик систем хранения геоданных. В Яндексе — год.

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

image

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


Алексей Толстиков, Минск.Разработчик факторов, куратор минского филиала Школы анализа данных. В Яндексе — 3 года.

Многократный участник чемпионатов ACM ICPC, занял 20-е место в составе команды БГУ в финале 2010 года в Харбине. Полуфиналист Google Code Jam, дважды финалист Russian Code Cup. Победитель TopCoder Belarus College Tour. Окончил БГУ, где и преподает.

e9ad21e165354e86a30db2d5d01d1593.jpg

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

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

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

Владислав Малаховский, Минск.Руководитель бригады интерактивных технологий. В Яндексе — 2 года.

Занимается разработкой Яндекс.Браузера. Учился на факультете компьютерных систем и сетей Белорусского государственного университета информатики и радиоэлектроники. Первые программы на бейсике пробовал писать в 10 лет в кружке Дворца пионеров.

e46cbcf2476244598f79f39e33b5b8cc.png

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


Андрей Черепаха. МинскРазработчик интерфейсов. В Яндексе — 1 год.Занимается разработкой интерфейсов поиска Яндекса. Недавно завершил работу над интерфейсами поиска для старых браузеров, которыми до сих пор пользуется значимое количество людей. Учился в Минском государственном колледже электроники. До Яндекса тоже занимался фронтендом. Начал официально работать программистом в 17 лет.

89a14308a45a44d185d8f4b849975c42.png

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

Сергей Силаев. МинскРазработчик. В Яндексе — 1 год.

Занимается анализом и обработкой больших объемов внешних данных. Параллельно преподает в Белорусском государственном университете и Школе анализа данных Яндекса в Минске. Окончил магистратуру факультета прикладной математики БГУ.


7085826c0278428b9544027d237580c5.png

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


Алексей Сикорский, Минск.Руководитель минского офиса Яндекса. В Яндексе — 3 годаКроме того, что Лёша курирует наш офис разработки, он ещё и руководит сервисом toloka.yandex.ru, которое имеет в своём названии и белорусские корни. Закончил ФПМИ и эконом БГУ и магистратуру Академии наук по прикладной математике.

7bd21c5076d44211a7bcd3cf8868fd84.jpg

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

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

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

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

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

Да, олимпиадник не всегда может построить хорошую карьеру. Но часто люди перестраиваются.

Михаил Лопаткин, Нижний Новгород.Разработчик ядра мобильного браузера. В Яндексе — 2 годаПишет мобильный Яндекс.Браузер под Андроид. До Яндекса работал в разных аутсорсинговых компаниях. Окончил Нижегородский ГТУ и сейчас тренирует команду университета по олимпиадному программированию.

image

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

Алексей Чернигин, Нижний НовгородРазработчик мобильной геоплатформы. В Яндексе — год.

Окончил ННГУ им. Н.И. Лобачевского. Работал в телекоммуникационной компании, где занимался разработкой и поддержкой программного обеспечения для узлов сотовой связи. Затем разрабатывал системы видеонаблюдения и алгоритмы компьютерного зрения для розничных сетей. В Яндексе занимается разработкой мобильных геоприложений.

image

Люди, которые эффективно выступают на олимпиадах, зачастую достаточно тяжело адаптируются в промышленном программировании, потому что спортивное программирование — это больше математика, чем программирование. Сначала любую задачу нужно решить математически, то есть построить теорию, придумать решение и только потом уже превратить в код. Но поскольку здесь ключевым фактором являются скорость и эффективность решения, люди набирают код быстро. Человек, которые его посмотрит, просто не поймет, что там написано. Код должен быть такой, чтобы было сразу понятно, что тут происходит. Код, который написан олимпиадником, зачастую может быть быстрым, но люди потом будут долго в него смотреть и думать, что же тут происходит. Поэтому ребят приходится переучивать, точнее даже доучивать писать качественный код. Но, безусловно, они талантливые математики, талантливые программисты, и у них огромный потенциал.


Олег Игнатьев, Москва.Разработчик качества поиска Картинок. В Яндексе — год.Призер Всероссийской олимпиады школьников по информатике, победитель командного чемпионата Москвы. Четвертьфиналист ACM ICPC. Студентом занял седьмое место на полуфинале Россия. Окончил ВМиК МГУ.

037eff722f4d4c7197a8f3358e047ba5.jpg

Спортивное программирование даёт много вещей, которые помогают. Скажем, за полчаса я могу написать кучу кода и проверить какой-то прототип вместо того, чтобы потратить неделю на проверку. За 30 минут я могу понять, стоит ли мне чем-то заниматься неделю или нет. Без спортивного программирования я бы этому не научился. Плюс соревновательная часть помогает, просто потому что она есть. Соревновательная часть любого спорта помогает в жизни. Я считаю, что минусов в олимпиадном опыте нет, и часто оказываюсь защитником спортивных программистов в спорах.

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

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

Я видел много обсуждений исследования Норвига. Больше всего нравится замечание, что в нём задавали вопросы спортивным программистам и не спортивным, а интервью у Google действительно очень заточено на то, чтобы первые его очень хорошо проходили. В итоге, если человек не спортивный программист и справился с ним, то, скорее всего, он мегазвезда. Поэтому у не спортивных программистов результаты могли получаться лучше. Но есть еще миллион доводов, почему результаты получились именно такими. Конкретно в то, что спортивные программисты заточены на 5 часов работы я не верю. У меня есть много знакомых, которые постоянно занимаются какой-то деятельностью помимо работы, делают какой-то свой проект и им не жалко на это тратить несколько месяцев.

Михаил Левин, МоскваРуководитель службы анализа больших данных. В Яндексе — 5 летОчень большая часть деятельности — работа в наших академических программах. Он преподает в Школе анализа данных, участвует в создании программы обучения на факультете Computer Science Вышки и Яндекса. Дважды завоевывал медали на ACM ICPC в составе команды МГУ им. М.В. Ломоносова.

image

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

Иван Фефер, МоскваРазработчик ранжирования видео. В Яндексе — полгода.Учился в Саратовском государственном университете, где очень развиты факультативные занятия спортивным программированием. Участвовал ICL в Казани, Russian Code Cup, VP Cup, Яндекс.Алгоритме. В 2014 году был финалистом ACM ICPC в Екатеринбурге.

ad4717566fca47e496d1d926a9c382ab.jpg

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

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

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

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

К тому же, бывают командные соревнования, где члены команды читают код друг друга. Там тоже можно использовать, например, однобуквенные названия переменных, но всё равно внутри формируется свой стиль. Мы всегда знаем, что переменная с названием g означает граф. Конечно, на работе я не называю переменную g, я называю её graph, но для этого мне не пришлось специально переучиваться.

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

© Habrahabr.ru