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

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


Фото icpcnews icpcnews / CC

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


Фото 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 вносит в жизнь разнообразие.


Фото icpcnews icpcnews / CC

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

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

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

Комментарии 43

    +3
    На мой взгляд все же среднестатистическому студенту не стоит идти в ACM в рассчете на кучу призов и поездки на финал, поскольку из сильного вуза крайне сложно пройти (квота на финал — не более 1 команды на вуз), а в слабом негде тренироваться и сложно достичь высокого уровня мастерства.

    Зато вот где реально офигительно помогает олимпиадный опыт (причем не только ACM, но и школьных олимпиад) — это при прохождении собеседований.
    Даже здесь, на хабре, раз в месяц появляются статьи из серии «смотрите, какую сложную задачу мне дали в CompanyName», собирающие сотни комментариев о том, что такими задачами нельзя оценить мастерство программирования. А теперь представьте на минуту, что вы можете решить любую такую задачу за время чтения условия. Причем здесь даже «решить» — термин неправильный, поскольку никакого осознанного процесса поиска решения не происходит, оно просто само появляется в голове еще в процессе чтения условия задачи. И остается лишь записать его, причем это чисто механический процесс записи, в это время вы вполне можете, скажем, обсуждать с интервьювером хитрые случаи и стратегии тестирования задачи или вслух доказывать корректность и время работы алгоритма.
    Если вы хотите, чтобы собеседование в условный Google в зарубежный офис проходили по этой схеме — участвуйте в ACM. Решите десять тысяч задач, и с трудоустройством у вас больше никогда не будет проблем.
      0
      Да, мне тоже ситуация видится именно так. С этой точки зрения, полезная практика
    • НЛО прилетело и опубликовало эту надпись здесь
        +1
        Все работы хороши, я не имею ничего против заводчан. Я их часто собеседую и вижу, насколько сильно заводы проигрывают в сравнении с IT-компаниями: жесткий график, отсутствие интернета, суровая бюрократия, развитие разработчиков зачастую быстро упирается в потолок, и 20000 — это, к сожалению, вовсе не начальная зарплата.
        0
        Решите десять тысяч задач, и с трудоустройством у вас больше никогда не будет проблем.

        Прямо никогда? Я не помню среди всех собеседований, которые у меня были за 15 лет, чтобы практические задачи занимали больше 20-30% времени собеседования (и почти все их можно было решить просто подумав, без особого натаскивания на алгоритмы и т.п.).


        Толку если на собеседование в условный гугл вы решили все задачи, но не смогли рассказать как работает сборщик мусора JVM или чем патерн MVM отличается от абстрактной фабрики?


        P.S. ИМХО, с точки зрения затрат времени на подготовку, очень хорошо выучить теорию своего языка и фреймворков, архитектуры и правил чистого кода чаще поможет на собеседование чем умение решать десять тысяч разных задач. Нет умение решать задачи тоже полезно, но если вы "поплывете" в теории того, в чем должны быть экспертом и постоянно решать на текущей роли это почти гарантированный провал, как бы вы не решали задачи (обратное не верно)

          0
          Думаю, это сильно зависит от компании.
          В декабре был на собеседовании не в условном, а в самом что ни на есть реальном Google в Лондоне. Суммарно было 8 раундов собеседований (телефонное + 5 раундов очно + еще 2 раунда по телефону). Из них 6 раундов (телефонное + 4 очных + еще 1 телефонное) были на алгоритмические задачи. Еще 1 очный раунд был на проектирование распределенной системы (посмотрите раздел system design на interviewbit.com, вот примерно такая задача там была), а еще 1 телефонный раунд — это проектирование асинхронного API.
          Конечно, понимать теорию языка и знать фреймворки полезно, но, на мой взгляд, этот опыт однозначно говорит о том, что в крупных западных компаниях умение решать олимпиадные задачи ОЧЕНЬ важно при прохождении собеседований.
            +2
            этот опыт однозначно говорит о том, что в крупных западных компаниях умение решать олимпиадные задачи ОЧЕНЬ важно при прохождении собеседований.

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

              +1
              Можете привести хотя бы парочку названий таких компаний? Потому что я тоже собеседовался отнодь не только в Google (из более или менее последнего, скажем, Bloomberg), и немало общаюсь с уехавшими товарищами, и никогда даже не слышал о собеседованиях, в которых были бы не важны алгоритмические навыки.
              Разумеется, всегда подбираются задачи, которые теоретически можно решить и без олимпиадной подготовки — скажем, никогда не будет «реализуйте алгоритм Флойда», а вот какую-нибудь динамику — запросто. Но если ты на такую задачу не тратишь времени вообще (сверх чтения условия), а кто-то другой — тратит полчаса и решает не всегда, шансы на прохождение собеседований у этого кого-то другого резко уменьшаются.
                0
                в которых были бы не важны алгоритмические навыки.

                Я не говорю, что они совсем на важны, знать основные алгоритмы сортировки, деревьев, хаш мап, пару алгоритмов в задаче коммивояжера/графах + что такое O(n) очень полезно в любом случае, но это самые основы основ.


                Вот смотрите, я недавно искал работу Java разработчиком в Германии, в подавляющем большинстве давали задание на кодилите/хакер ранге, причем задания довольно простые (пара заданий уровня развернуть строку или составить простой sql запрос) и одно задание на подумать (но в большинстве случаев удавалось решать без использование хитрых стандартных алгоритмов), либо вообще задание вида написать прототип микросервиса без всяких алгоритмов. При этом на задания на кодилите или хакер ранге давали от 1,5 до 3 часов на своем компе и с IDE, там при желание и нагуглить алгоритм можно было за такое время.


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


                Можете привести хотя бы парочку названий таких компаний?

                Ну те где проходил, но по каким-то причинам не прошел приводить не буду (так как то что мне из 3 интервью не дали задачек, не значит, что их не было бы на последнем), но сейчас я работаю в этой компании, до этого работал тут


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

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


                P.S. Может быть мы просто в разных мирах, вы ищете вакансии вида Си программист, который будет постоянно заниматься алгоритмами. В моем мире промышленной Java, если бизнесу нужен специалист который собаку съел на Больших данных, машинном обучение, разработки больших выскопроизводительных приложений, фул. стек разработчик, то ИМХО большого значения умение применить очень хитрый алгоритм роли по сравнению с остальным опытом не сыграет. Бизнесу нужно ехать, а не шашечки, главное чтобы программист умел программировать, писать хороший качественный код и владел нужной экспертизой.

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

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


          Ещё стоит отметить про "крутость" и "качественный код". Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования.


          а после дорасти до тимлида в крупной федеральной компании.

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


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

          Я был одним из таких студентов. Правда, я всё таки два раза ездил на полуфинал. Но я не жалею, что не стал заниматься этим профессионально, ибо я:


          1. Всё равно попал в одну из пресловутих "компаний мечты", но при этом я получил бесценный опыт работы в самых различных организациях — от работы в подвале, где нет солнечного света, до удалённой работы дома. И я никак не могу назвать эти годы "упущенными". Наоборот, я узнал, насколько многогранен этот мир и встретил множество интересных людей.
          2. Достаточно хорошо знаю стандартные алгоритмы и могу решить большинство задач с Яндекс.Алгоритм, Google Code Jam и подобных. Просто на одну задачу уйдёт не 5 минут, а может час или несколько дней.
          3. Развил узкую специализацию, которая позволяет выбирать то, над чем я буду работать, а не уповать на то, что на следующем месте работы меня не закинут в отдел ранжирования или биллинга.

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

            +1
            Ещё стоит отметить про «крутость» и «качественный код». Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования.

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

            Касательно самой темы, мне кажется, главный профит в том, что мозг просто тренируется, это как зарядка для него. Мне интересно решить пару небольших олимпиадных задач перед тем, как заняться чем-то существенно продолжительным: проектированием или написанием какого-либо кода для проектов.
              +1
              Собеседующий олимпиадник задаёт задачу, решением которой является алгоритм Флойда-Уоршелла
              Это, конечно, бессмысленно и неправильно. У нас такой проблемы не возникает, поскольку задачи на собеседование проходят контроль большого количества разработчиков, и запись собеседования доступна всем командам.
              Чем занимается компания? Что входит в ваши обязанности?
              Создаем веб-сервисы для бизнеса, в основном высоконагруженные, но это уже выходит за рамки исходной темы. Идея в том, что я мог выбирать среди интересных компаний, а не идти по пути большинства одногруппников — пойти туда, где возьмут.
              Как участие в ICPC помогает в ежедневной работе?
              Ровно так, как я описал в пунктах 1-3: понимание структур, скорость, сообразительность, внимательность, TDD.
              Какие-то интересные и нетривиальные решения вы придумали благодаря олимпиадному программированию?
              Специфика решаемых задач (бизнес-сервисы) не предполагает какого-то изобилия нетривиальных решений. Иногда приходят в голову интересные решения, но я не могу сказать, благодаря олимпиадному программированию это или нет. Стопроцентно благодаря ACM-у решение было лишь однажды за 4 года опыта, когда пришлось использовать систему непересекающихся множеств.
                +1
                Ещё стоит отметить про «крутость» и «качественный код». Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования

                Я не знаю, что такое «отдел ранжирования», но на всякий случай скажу, что надо разделять обычную разработку с исследовательскими задачами. Я бывал по обе стороны баррикад (правда, в исследовательских задачах очень недолго, поэтому гарантированно утверждать не могу) и смысл в том, что в исследовательских задачах очень сложно соблюдать «хорошую структуру кода». Это сложно объяснить, но это так и есть. Например, в ней очень сложно вынести одинаковый код в отдельную процедуру. Так как сейчас этот код одинаковый, но уже через час может оказаться, что в одной из копии кода нужно что-то изменить. Да, всегда можно понапридумывать всяких параметров, фабрик и прочее, но тогда, вместо того, чтобы тратить время на исследование, придется тратить время на разгребание вот этих всяких «фабрик», за это время мысль вполне уже может успеть убежать из головы.
                0
                Подскажите, где взять задачи для решения? Просто ВУЗ — это хорошо, но мне уже 27 и я учусь программировать :)
                  0
                  Codeforces.com(на русском), codewars.com, CodeFights.com, HackerRank.com, и это далеко не полный список.
                    0
                    Я не олимпиадник, только увлекаюсь этим в свободное время, поэтому не вините, если что.
                    Классика, это конечно http://codeforces.com и https://arena.topcoder.com
                    Лично мой любимый сайт — codefights.com. Есть не только набор олимпиадных задач, но и соревнования вида «исправь баг/допиши код».
                    https://www.hackerrank.com мне нравится широким спектром задач. Так же есть задачи на языки программирования.
                    В Яндексе на собеседовании советовали https://www.codewars.com, но личного опыта с ним мало
                      0
                      лучше всего codeforces.ru
                      там регулярно проходят раунды
                      Если с ангийским всё хорошо — можете попробовать topcoder
                      насколько помню, где-то раз в неделю в codeforces проходят раунды — для Вас это может стать «треноровчкой» между работой-домом
                      Вот следующий контест контест
                        0

                        Ещё есть acmp.ru

                          0
                          interviewbit.com. У них на сайте есть список тем, и по каждой — подробное видеообъяснение алгоритмов и задачи с реальных собеседований, причем по задачам дается разное количество баллов в зависимости от скорости реализации решения, его оптимальности, количества неверных попыток, сложности задачи и использованных подсказок — все, как на настоящем собеседовании. А если пройти все темы, они будут рекомендовать вас на работу в зарубежные компании.
                            0
                            Еще в мое время было популярно
                            acm.timus.ru
                            +10

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


                            Ребят, вместо того, чтобы зарабатывать себе строчку в резюме участием в олимпиадах, выберите задачу, у которой нет хорошего решения с открытым кодом и смело его пилите вместе с сообществом. Вам не хватает софта какого-то — напишите его!
                            Нерешенных практических задач — вагон и маленький бронепоезд, нужных открытых проектов — огромное количество, ваши усилия нужны там, а не соревнованиях по знанию алгоритмов!
                            Участвуйте в жизни сообщества, попробуйте поучаствовать в Google Summer Of Code, пишите код и статьи — и за это вам будут плюсы и в карму, и в резюме, и люди вам скажут большое спасибо за софт, который решает их практические задачи, а не выдуманные. Заодно вы научитесь код не только писать, но и поддерживать, отлаживать, рефакторить и удалять.


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

                              –4
                              Более глупее комментария я не видел. Олимпиадные задания позволяют систематизировать знания, развивать логику, а самое главное на мой взгляд помогают в будущем учиться строить мост между заказчиком и разработчиком.
                              Как правило, заказчик не понимает тех детали и говорит вам на языке обывателя что ему надо, вы же как программист должны уже в первые же минуты понять что надо сделать сколько времени это займет. В задачах тоже самое, если бы вы их решали то не могли не заметить, что все задачи типа Вася купил, Дед Мазай везет зайцев и т.д., а в итоге задача сводится к сортировке массива или перебора данных.
                                +5
                                Если вы хотите хорошо играть в футбол, давайте прыгать на прыгалке. Прыгалка развивает ноги, координацию движений, и что очень важно в футболе, задействует зрение: нужно ведь следить, где находится верёвка, чтобы вовремя её перескакивать.

                                А если серьёзно, то, конечно, польза от решения задачек очевидна, но вся эта деятельность имеет весьма опосредованное отношение к «строению мостов между заказчиком и разработчиком». Зачем эти лишние звенья? Идите сразу к заказчикам и учитесь разговаривать.

                                Кстати, в олимпиадных задачках техзадание никогда не меняется по ходу работы, а это и есть самая большая головная боль на практике.
                                  +1

                                  Аналогично.


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

                                    +2
                                    Открытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются соревнованиями по решению задач, решение которых уже известно и никому не нужно
                                    Открытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются в вузе лабораторными и курсовыми, решение которых уже известно и никому не нужно

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

                                    Где та грань, когда стоит подвинуть учебу на второй план и начать жить по-настоящему? Кому-то покажется хорошей идеей устроиться на работу в 10 классе, а кто-то постарается взять от образования максимум возможного, потому что потом просто не будет времени из-за забот взрослой жизни. И тот, и другой путь имеют право на существование, главное не забывать оценивать риски.
                                  0
                                  Безусловно, пилить реальный продукт в студенческие годы — хороший путь для развития, но всё-таки обладает высоким порогом вхождения. Главное — не рассчитывать, что в вузе всему научат, надо чем-то заниматься самостоятельно.

                                  Выхлоп от участия в жизни сообществ очевиден, но и выхлоп от участия в соревнованиях по программированию тоже есть и дает о себе знать в долгосрочной перспективе. Понятно, что задачи на турнирах далеки от реальных, но ведь то же самое можно сказать и про школьную математику, и про некоторые предметы в вузе. Почему-то никто не спешит убирать из школьной программы кубические уравнения, а из вузовской — дифференциальные. Соревнования по программированию — это как дополнительное образование, возможность получить знания и навыки, которые не даст вуз или офис.
                                    +2
                                    Не обладает. Я уже семь лет ментор в GSoC, и семь лет перед GSoC отбирал для него задачи (с переменным успехом). У нас (MariaDB, до этого — MySQL) задач полно самой разной сложности. Есть на три месяца, для GSoC, есть и на пару дней. Есть и на год.

                                    Так что, если высокий порог вхождения — надо просто попросить другую задачу.
                                    0
                                    Как бывший АСМщик, могу заметить, что вы не совсем понимаете суть соревнований по программированию. Прежде всего соревнования — это прежде всего фан. Соревновательный навык может успешно сопутствовать «серьезной» разработке. Хотя эти вещи ортогональны, умение собраться и быстро решить задачу помогает в критических случаях и на работе. И участию в оупен-сорсах спортивное программирование тоже никак не мешает.
                                    +7
                                    Это очень показательная заметка и, к сожалению, очень грустная. Недавно тут обсуждали победы российских/польских/китайских команд на олимпиадах, повторю свой комментарий оттуда:
                                    Тут скорее возникает вопрос, почему польскому/российскому/китайскому студенту такой вот своеобразный киберспорт интереснее своей непосредственной специальности: ведь ясно, что чудес не бывает, и время, потраченное на прокачку навыка решения задачек на время, отнято у какой-то другой деятельности. И тут у меня довольно грустное наблюдение: в спорт (любой) часто в принципе идут люди из не самых благополучных страт общества, потому что для них это социальный лифт. Сегодня ты один из миллиона беззвестных китайских студентов, а завтра ты чемпион мира, и тебя берут в любой фейсбук/гугл. А студенту MIT этот путь попросту неинтересен, да и связан с высоким риском неудачи, студент MIT и так в жизни не пропадёт.

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

                                    Не, конечно, я желаю им всяческих успехов в жизни и надеюсь, что в «крупных федеральных компаниях» действительно требуются навыки олимпиадного программирования и решения сложных задачек. Но в целом приходится с грустью констатировать, что социальные лифты столь плохи, а образование столь некачественно (в среднем), что люди начинают скакать через обручи ради получения шанса на собеседование в условный Гугл (хотя казалось бы, где связь, и почему выпускникам MIT этого не требуется...)

                                    Причём в известном смысле ситуация только усугубляется, т.к. «эти успехи являются чуть ли не единственным заметным достижением регионального вуза, руководство начинает идти навстречу в сложных вопросах, преподаватели закрывают глаза на несданные лабораторные работы.» Если бы ко мне как к преподавателю пришли с просьбой «закрыть глаза», я бы послал такого человека нафиг, потому что при всём уважении к его хобби (будь то КВН, футбол или ACM), всё это к моему предмету отношения не имеет, да и к уровню развития вуза тоже. А руководству вуза, конечно, проще выдать успех отдельно взятой маленькой группы ребят за собственный успех, вместо того, чтобы планомерно поднимать качество науки и образования в вузе вообще.
                                      0
                                      Если бы ко мне как к преподавателю пришли с просьбой «закрыть глаза», я бы послал такого человека нафиг
                                      Конечно, бывают принципиальные преподаватели, и многие предметы приходится сдавать наравне со всеми. Но часто преподаватели сами живо интересуются успехами и понимают, что пользы от их несложных лабораторных работ будет намного меньше, чем от соревнований, поэтому и не возражают против допуска до экзамена без их сдачи.

                                      А в остальном, всё действительно так. Среди сотен технических вузов России условные MIT можно по пальцам пересчитать.
                                        +2
                                        Дело не в принципе, а в том, что я ставлю оценку именно за мой предмет, который никоим образом не пересекается с олимпиадами. Если я преподаю условные алгоритмы и структуры данных, наверно, можно учесть, что речь примерно об одном и том же, но если предмет про операционные системы, многопоточность или машинное обучение, то увольте, связи никакой, и ставить оценки было бы очень странно.
                                          +1
                                          У нас по некоторым предметам допуск до экзамена давался вообще всем, но если не писал контрольные и лабораторные, то придется решать на экзамене задачу по соответствующей теме.
                                          Считаю, что это самая правильная система — если студент предмет знает (и может показать это знание, сдав экзамен и решив задачи по всем темам), то какое кому дело, сколько он там лабораторных посетил?
                                            0
                                            Да, согласен, если студент реально разбирается в предмете, придирки ни к чему.
                                        0
                                        С точки зрения студента, который уже эдакий «парень из гетто», пытаться выбраться из него таким образом — вполне разумный вариант действий. А вот нам с вами на будущее, конечно, стоит попытаться развить российское высшее образование. Только непонятно, как.
                                          0
                                          Насчет выпускников MIT вы не правы, если посмотреть список финалистов, то там можно найти почти полный список топовых мировых технических университетов включая и MIT.

                                          Насчет закрытия глаз на лабы — это проблемы конкретного ВУЗа. Мне за олимпиады никогда ничего не засчитывали «нашару».
                                            0
                                            «Список финалистов» — это вы кого имеете в виду? Финалистов много. Давайте отсечём хотя бы первые 20-30 вузов в итоговом списке и посмотрим, много ли там брендов.
                                              +1
                                              Довольно много, включая и MIT. В этом году они на 20-м месте, но в какой-то другой год я видел их в пятерке. Да, вы правы в том, что в основном в 20-ке ВУЗы Восточной Европы, бывших республик СССР и Китая, но утверждение, что MIT игнорирует олимпиады потому что им это не надо, далеко от реальности.
                                                0
                                                Я думаю, что MIT (как учреждение) в целом игнорирует олимпиады, это частная клубная история отдельных людей там, которым это интересно.

                                                Университет, где я работаю, занимает неплохое для его размера и статуса место, так вот у нас это полностью частная инициатива (руководство денег подкидывает на поездки, но не более того).
                                                  0
                                                  Наверное это верно для любого большого ВУЗа, разве нет? Да что там, даже в небольших ВУЗах только и подкидывают денег, но большинство и преподавателей и студентов скорее всего и слухом не слыхивали о том, что кто-то там что-то занял. Да что там, 90% и про АСМ-то не знают.

                                                  Но это не значит, что вот у нас олимпиады это воооо! А у них всем пофиг, потому что никому это не надо.
                                                    0
                                                    Ну, наверно, в среднем да, но тут смотря что понимать под «вооооо!»
                                                    Насколько мне известно, в ИТМО чуть ли не по региональным школам ездят и пытаются агитировать толковых ребят поступать — с прицелом на олимпиаду. В СПб Политехе «развитие олимпиадного движения» — чуть ли не личный проект ректора, ну и так далее. Короче говоря, это воспринимается как важная часть пиара на уровне руководства вуза. Я думаю, если бы MIT воспринимал это аналогичным образом, уж выше двадцатки подняться бы сумел.
                                                      +1
                                                      Скорее всего это началось точно так же на уровне личной инициативы. а потом взлетело. В Киевском Политехе это было инициативой кафедры моего факультета, которая внезапно успешно выстрелила, и получила поддержку на уровне факультета.

                                                      На самом деле, все эти олимпиады были и в СССР популярны, там же не только программирование, но и математика, физика и прочее.

                                                      Могу добавить еще, что в западных ВУЗах занимаются и другими видами спорта. Например Кембридж и Оксфорт ежегодно уже сотню лет соревнуются в гребле по Темзе. В США популярен футбол, наверняка футбольной команде MIT уделяет больше внимания, чем соревнованиям по ACM.
                                          +1
                                          Можно бесконечно долго рассуждать о том, насколько далеко спортивное программирование от реальности, но факт остается фактом — для того, чтобы добиться успеха, необходимо проявлять себя в чем-то кроме учебы. И не важно, будь то участие в соревнованиях, Open Source или работа над собственным проектом.

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое