Не было бы счастья, да спортивное программирование помогло

в 13:13, , рубрики: ACM ICPC, олимпиадное программирование, соревнования по программированию, Спортивное программирование, метки:

Месяц назад завершился очередной Чемпионат мира по программированию ACM-ICPC (результаты), на котором блестяще выступили команды Санкт-Петербурга и Екатеринбурга. Чуть хуже показали себя команды из Москвы, Перми, Новосибирска, Саратова и Самары. Прекрасный результат у команды из Томска, один лишь выход в финал которой для многих уже стал неожиданностью. Заметьте, что почти все города — миллионники, они располагают крупными вузами и интересными компаниями для работы. А теперь представьте, что вы всё детство живете в городе с населением 50 тыс. человек, затем переезжаете в соседний город с небольшим вузом с сомнительным качеством образования, и впереди маячит перспектива работать на заводе за 20 тыс. рублей в месяц. Эффективные способы сойти с этого мрачного пути есть, и один из них — ACM-ICPC. Я хочу поделиться своей историей, рассказать, как помогает опыт ACM-ICPC в повседневной работе и как эти соревнования стали моей путевкой в жизнь. Если вы студент первого-второго курса и выбираете между скорым заработком и подготовкой к турнирам по программированию, то, я надеюсь, эта статья поможет вам определиться.

Не было бы счастья, да спортивное программирование помогло - 1
Фото icpcnews icpcnews / CC

Сначала расскажу немного о себе. Я учился в самой обычной школе в самом обычном небольшом городке. Ни о каких соревнованиях по программированию я и знать не знал, пока не поступил в университет в соседнем городе. Названия города и вуза значения не имеют, поскольку эта история могла происходить в любой провинции. Мне повезло, что я вовремя присоединился к участникам ACM-ICPC, а в самом вузе об этих соревнованиях знали не понаслышке. Несмотря на то, что регулярно тренировалось не больше одной команды, что среди студентов не было никакой конкуренции, что среди них не было победителей всероссийских школьных олимпиад, команды несколько раз завоевывали медали Чемпионата мира. Вот и мне удалось проделать многолетний путь от деревенщины до финала ACM-ICPC, а после дорасти до тимлида в крупной федеральной компании. У моих сокомандников также жизнь сложилась удачно: один — ведущий программист в той же компании, а другой устроился в Google. Ребята из предшествующих нам команд прекрасно себя чувствуют как в России, так и за границей, работая в общеизвестных компаниях или открывая свои. Повторюсь: никто из них не проявлял какой-либо суперталант в школьном возрасте. Всё, что их объединяет, — огромное количество решенных задач по программированию за студенческие годы. И они являются ярким примером того, что, даже учась в самом обыкновенном вузе в бесперспективном городе, можно выбраться в свет.

Не было бы счастья, да спортивное программирование помогло - 2
Фото icpcnews icpcnews / CC

Итак, что же делать, если вы учитесь в вузе, который не способен вам дать достойное образование? Развивайтесь сами! Вам недостаточно записывать лекции, решать лабораторные и зубрить билеты. Читайте книги, изучайте технологии, углубляйте фундаментальные знания. В конце концов, вы можете заниматься спортом или играть в КВН, всё лучше, чем без толку прожигать свободное время. Один из способов развития — участие в соревнованиях по программированию. Можно участвовать от турнира к турниру, а можно заниматься этим профессионально, до пяти дней в неделю. Далее я буду говорить именно о профессионалах.

Иногда я езжу на турниры вместе со студентами и вижу, что зачастую после первого-второго курса они теряют интерес к соревнованиям и стараются как можно скорее устроиться на работу. У таких студентов ACM ассоциируется с алгоритмами и только с ними, а поскольку на работе они, вероятнее всего, никогда не пригодятся, то и участие в турнирах не несет практической пользы. Не раз и не два я слышал вопрос: «Вот ты несколько лет участвовал в ACM. И что, пригодились тебе эти алгоритмы?» Первое, что нужно усвоить, — классические алгоритмы — это лишь небольшая часть ACM-а. Это инструмент, который помогает решать задачи. Точно такой же, как язык программирования, без знания которого невозможно написать решение. Большая часть задач уникальна, их решение не строится на использовании какого-то известного алгоритма, для каждой задачи нужно изобретать свой алгоритм, встраивая в него классические как небольшую часть общего решения. Скорее всего, вам не придется на работе писать алгоритм Дейкстры или дерево отрезков, но и в ACM вы будете их использовать лишь как кирпичики, а не фундамент.

Распространено мнение (1, 2, 3), что бывшие ACM-щики пишут ужасный код, потому что они так привыкли на соревнованиях, где время поджимает и некогда думать над качеством. Однако, с тем же успехом можно сказать, что автогонщики не умеют ездить по городу по правилам, а фигуристы — кататься на катке по кругу вместе со всеми. Во-первых, это индивидуально. Во-вторых, зачастую для решения нужно написать столько кода, что просто невозможно экономить на качестве: на исправление ошибок потом уйдет уйма драгоценного времени (и чемпионы мира придерживаются такого же мнения). Кроме того, современные среды разработки стимулируют писать прилично и позволяют легко и быстро это делать. ACM-щики же — неглупые ребята, и понимают, что на реальном проекте код должен быть качественным, и быстро учатся у коллег соблюдению этого качества. Уж как минимум не медленнее, чем студенты, которые ничего в жизни кроме лабораторных работ не видели. На нашем проекте четверть разработчиков — ACM-щики, и все они, как правило, безболезненно проходят ревью кода.

Так что же дает ACM? Во-первых, фундаментальные знания и математический аппарат. Нам на лекциях не рассказывали про сложность алгоритмов, мы не изучали теорию графов, не имели дела с методами оптимизации. ACM закрывает этот гигантский пробел благодаря огромному количеству задач на вычислительную и дискретную математику, теорию вероятностей, различные темы из теоретической информатики. Каждая задача требует анализ вычислительной сложности алгоритма и заставляет задумываться об эффективности используемых структур данных. Благодаря опыту ACM-щики не задумываются над сложностью операций встроенных структур данных — эти значения они достают из кеша своей памяти. Они знают их устройство и тонкости работы, потому что не раз натыкались на какую-нибудь особенность реализации в той или иной версии компилятора. На собеседованиях я поражаюсь, что даже опытные разработчики зачастую считают, что добавление в хеш-таблицу в .NET разных ключей с одинаковыми хешами перетирает данные, а на практике коллизии практически не случаются, и потом с удивлением узнают про парадокс дней рождения. Многие кандидаты вообще не понимают, как устроено то, чем они ежедневно пользуются, подозревая, что под капотом у List<T> связный список и обращение по индексу — медленная операция. Ни о каком устройстве баз данных даже говорить не приходится.

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

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

В-четвертых, достигнув существенного развития в ACM, вы без труда сможете пройти собеседование во многие мировые IT-компании. В Google и Яндексе, например, собеседования почти целиком состоят из ACM-подобных задачек. Даже если вы не хотите устроиться в эти компании, съездить на интервью очень даже круто. Так, например, я впервые побывал за границей благодаря приглашению Google на собеседование в Цюрих.

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

Не было бы счастья, да спортивное программирование помогло - 3
Фото icpcnews icpcnews / CC

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

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

Если вы студент малоизвестного вуза в богом забытом городе, то задайте себе вопрос: «Какие у меня перспективы?» Если вас не устраивает ответ, если вы хотите в «крутую компанию», если вы готовы ставить перед собой амбициозные цели и решать сложные задачи, а не заниматься рутиной, если вы хотите гордиться своей работой, а не просто ее выполнять, если не хотите впустую потратить студенческие годы, то ACM-ICPC даст вам огромный шанс всего этого достичь. Начните с участия в турнирах на Codeforces — самой популярной в России площадке для проведения и обсуждения соревнований по программированию. Найдите руководителя, соберите команду, участвуйте в региональных турнирах, тренируйтесь. Ваше участие в ACM продлится всего несколько лет, но его отголоски будут давать о себе знать еще очень и очень долго. Для меня ACM-ICPC стал главной инвестицией в жизнь, для вас же он как минимум превратится в полезный и увлекательный опыт.

Автор: RuslanGt

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js