Comments 43
Зато вот где реально офигительно помогает олимпиадный опыт (причем не только ACM, но и школьных олимпиад) — это при прохождении собеседований.
Даже здесь, на хабре, раз в месяц появляются статьи из серии «смотрите, какую сложную задачу мне дали в CompanyName», собирающие сотни комментариев о том, что такими задачами нельзя оценить мастерство программирования. А теперь представьте на минуту, что вы можете решить любую такую задачу за время чтения условия. Причем здесь даже «решить» — термин неправильный, поскольку никакого осознанного процесса поиска решения не происходит, оно просто само появляется в голове еще в процессе чтения условия задачи. И остается лишь записать его, причем это чисто механический процесс записи, в это время вы вполне можете, скажем, обсуждать с интервьювером хитрые случаи и стратегии тестирования задачи или вслух доказывать корректность и время работы алгоритма.
Если вы хотите, чтобы собеседование в условный Google в зарубежный офис проходили по этой схеме — участвуйте в ACM. Решите десять тысяч задач, и с трудоустройством у вас больше никогда не будет проблем.
Решите десять тысяч задач, и с трудоустройством у вас больше никогда не будет проблем.
Прямо никогда? Я не помню среди всех собеседований, которые у меня были за 15 лет, чтобы практические задачи занимали больше 20-30% времени собеседования (и почти все их можно было решить просто подумав, без особого натаскивания на алгоритмы и т.п.).
Толку если на собеседование в условный гугл вы решили все задачи, но не смогли рассказать как работает сборщик мусора JVM или чем патерн MVM отличается от абстрактной фабрики?
P.S. ИМХО, с точки зрения затрат времени на подготовку, очень хорошо выучить теорию своего языка и фреймворков, архитектуры и правил чистого кода чаще поможет на собеседование чем умение решать десять тысяч разных задач. Нет умение решать задачи тоже полезно, но если вы "поплывете" в теории того, в чем должны быть экспертом и постоянно решать на текущей роли это почти гарантированный провал, как бы вы не решали задачи (обратное не верно)
В декабре был на собеседовании не в условном, а в самом что ни на есть реальном Google в Лондоне. Суммарно было 8 раундов собеседований (телефонное + 5 раундов очно + еще 2 раунда по телефону). Из них 6 раундов (телефонное + 4 очных + еще 1 телефонное) были на алгоритмические задачи. Еще 1 очный раунд был на проектирование распределенной системы (посмотрите раздел system design на interviewbit.com, вот примерно такая задача там была), а еще 1 телефонный раунд — это проектирование асинхронного API.
Конечно, понимать теорию языка и знать фреймворки полезно, но, на мой взгляд, этот опыт однозначно говорит о том, что в крупных западных компаниях умение решать олимпиадные задачи ОЧЕНЬ важно при прохождении собеседований.
этот опыт однозначно говорит о том, что в крупных западных компаниях умение решать олимпиадные задачи ОЧЕНЬ важно при прохождении собеседований.
Боюсь это говорит только о важности такого умения для работы в гугле. Мой опыт несколько десятков собеседований в крупных западных компаниях (несколько меньше гугла, конечно, но тоже вплоть до монополистов в своей области в мире) говорит что гугл чуть ли не единственное исключение в этом плане. В большинстве компаний дают задачки, который вполне может написать программист не знакомый с алгоритмами, но более-менее способный подумать (это лишь начальный этап для отсеивания совсем никаких людей), а потом проверяют реальные практические навыки, качество кода и т.п.
Разумеется, всегда подбираются задачи, которые теоретически можно решить и без олимпиадной подготовки — скажем, никогда не будет «реализуйте алгоритм Флойда», а вот какую-нибудь динамику — запросто. Но если ты на такую задачу не тратишь времени вообще (сверх чтения условия), а кто-то другой — тратит полчаса и решает не всегда, шансы на прохождение собеседований у этого кого-то другого резко уменьшаются.
в которых были бы не важны алгоритмические навыки.
Я не говорю, что они совсем на важны, знать основные алгоритмы сортировки, деревьев, хаш мап, пару алгоритмов в задаче коммивояжера/графах + что такое O(n) очень полезно в любом случае, но это самые основы основ.
Вот смотрите, я недавно искал работу Java разработчиком в Германии, в подавляющем большинстве давали задание на кодилите/хакер ранге, причем задания довольно простые (пара заданий уровня развернуть строку или составить простой sql запрос) и одно задание на подумать (но в большинстве случаев удавалось решать без использование хитрых стандартных алгоритмов), либо вообще задание вида написать прототип микросервиса без всяких алгоритмов. При этом на задания на кодилите или хакер ранге давали от 1,5 до 3 часов на своем компе и с IDE, там при желание и нагуглить алгоритм можно было за такое время.
А вот на самих собеседованиях с людьми если и были вопросы по коду, то вида вот кусок многопоточного кода на Java найдите все ошибки, практические вопросы по сложным алгоритмам во время собеседования (телефонно-скайпового или очных) мне не давали не разу, да и просто это слишком долго.
Можете привести хотя бы парочку названий таких компаний?
Ну те где проходил, но по каким-то причинам не прошел приводить не буду (так как то что мне из 3 интервью не дали задачек, не значит, что их не было бы на последнем), но сейчас я работаю в этой компании, до этого работал тут
кто-то другой — тратит полчаса и решает не всегда, шансы на прохождение собеседований у этого кого-то другого резко уменьшаются.
Не знаю, обычно если и давали более менее сложные задачки, то дома, с инетом и запасом времени. Да и не верю я про резко снижаются если задачка была действительно сложная, а программист показал умение мыслить и программировать, даже если в конце концов ее не решил, ИМХО. Сам собеседовал много людей и не встречал подхода не смог вспомнить и применить алгоритм Туля-Даруля — не подходит.
P.S. Может быть мы просто в разных мирах, вы ищете вакансии вида Си программист, который будет постоянно заниматься алгоритмами. В моем мире промышленной Java, если бизнесу нужен специалист который собаку съел на Больших данных, машинном обучение, разработки больших выскопроизводительных приложений, фул. стек разработчик, то ИМХО большого значения умение применить очень хитрый алгоритм роли по сравнению с остальным опытом не сыграет. Бизнесу нужно ехать, а не шашечки, главное чтобы программист умел программировать, писать хороший качественный код и владел нужной экспертизой.
Вот и мне удалось проделать многолетний путь от деревенщины до финала ACM-ICPC,
Всё скрыто в этих нескольких словах, к сожалению. Я работаю в одной из компаний, которые нанимают олимпиадников пачками и вижу, насколько раздуто их эго. Приведу пример с недавнего собеседования. Собеседующий олимпиадник задаёт задачу, решением которой является алгоритм Флойда-Уоршелла. Кандидат, у которого явно нет какого-то олимпиадного прошлого с горем пополам и подсказками пишет решение. Собеседующий ставит отзыв "не принимать на работу" с пометкой "Алгоритм написал, но с ошибками. Название функции не соответствует общему стилю в Python". Стоит ли говорить, что тот алгоритм едва ли где-то используется в промышленном программировании, и что без его знания собеседующий точно так же написал бы решение с ошибками. Если бы вообще написал.
Ещё стоит отметить про "крутость" и "качественный код". Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования.
а после дорасти до тимлида в крупной федеральной компании.
Вот про это я бы послушал. Чем занимается компания? Что входит в ваши обязанности? Как участие в ICPC помогает в ежедневной работе? Какие-то интересные и нетривиальные решения вы придумали благодаря олимпиадному программированию?
Иногда я езжу на турниры вместе со студентами и вижу, что зачастую после первого-второго курса они теряют интерес к соревнованиям и стараются как можно скорее устроиться на работу.
Я был одним из таких студентов. Правда, я всё таки два раза ездил на полуфинал. Но я не жалею, что не стал заниматься этим профессионально, ибо я:
- Всё равно попал в одну из пресловутих "компаний мечты", но при этом я получил бесценный опыт работы в самых различных организациях — от работы в подвале, где нет солнечного света, до удалённой работы дома. И я никак не могу назвать эти годы "упущенными". Наоборот, я узнал, насколько многогранен этот мир и встретил множество интересных людей.
- Достаточно хорошо знаю стандартные алгоритмы и могу решить большинство задач с Яндекс.Алгоритм, Google Code Jam и подобных. Просто на одну задачу уйдёт не 5 минут, а может час или несколько дней.
- Развил узкую специализацию, которая позволяет выбирать то, над чем я буду работать, а не уповать на то, что на следующем месте работы меня не закинут в отдел ранжирования или биллинга.
Я всем желаю преследовать не какие-то мифические идеалы, а заниматься тем, к чему лежит сердце. Будь то мытьё полов, работа на заводе или в Гугл. И пусть большинство идёт в другую сторону или даже смеётся над вашим статусом, занимаясь любимым делом, вы будете находиться в гармонии с собой, и вам не придётся покупать Теслу или Порш, чтобы только показать окружающим, что вы не хуже.
Ещё стоит отметить про «крутость» и «качественный код». Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования.
Согласен на счёт качества, стиля и поддерживаемости кода, многие просто пишут на «сейчас», а не с учётом того, что потом этот код будет кем-то ещё поддерживаться. Но, мне кажется, научить олимпиадника писать нормальный код проще (или быстрее), чем научить обычного программиста понимать сложные алгоритмы.
Касательно самой темы, мне кажется, главный профит в том, что мозг просто тренируется, это как зарядка для него. Мне интересно решить пару небольших олимпиадных задач перед тем, как заняться чем-то существенно продолжительным: проектированием или написанием какого-либо кода для проектов.
Собеседующий олимпиадник задаёт задачу, решением которой является алгоритм Флойда-УоршеллаЭто, конечно, бессмысленно и неправильно. У нас такой проблемы не возникает, поскольку задачи на собеседование проходят контроль большого количества разработчиков, и запись собеседования доступна всем командам.
Чем занимается компания? Что входит в ваши обязанности?Создаем веб-сервисы для бизнеса, в основном высоконагруженные, но это уже выходит за рамки исходной темы. Идея в том, что я мог выбирать среди интересных компаний, а не идти по пути большинства одногруппников — пойти туда, где возьмут.
Как участие в ICPC помогает в ежедневной работе?Ровно так, как я описал в пунктах 1-3: понимание структур, скорость, сообразительность, внимательность, TDD.
Какие-то интересные и нетривиальные решения вы придумали благодаря олимпиадному программированию?Специфика решаемых задач (бизнес-сервисы) не предполагает какого-то изобилия нетривиальных решений. Иногда приходят в голову интересные решения, но я не могу сказать, благодаря олимпиадному программированию это или нет. Стопроцентно благодаря ACM-у решение было лишь однажды за 4 года опыта, когда пришлось использовать систему непересекающихся множеств.
Ещё стоит отметить про «крутость» и «качественный код». Много олимпиадников идут работать в отделы ранжирования поисковых результатов. Я видел тот код и могу точно сказать — я бы лучше пошёл работать на завод, чем в отдел ранжирования
Я не знаю, что такое «отдел ранжирования», но на всякий случай скажу, что надо разделять обычную разработку с исследовательскими задачами. Я бывал по обе стороны баррикад (правда, в исследовательских задачах очень недолго, поэтому гарантированно утверждать не могу) и смысл в том, что в исследовательских задачах очень сложно соблюдать «хорошую структуру кода». Это сложно объяснить, но это так и есть. Например, в ней очень сложно вынести одинаковый код в отдельную процедуру. Так как сейчас этот код одинаковый, но уже через час может оказаться, что в одной из копии кода нужно что-то изменить. Да, всегда можно понапридумывать всяких параметров, фабрик и прочее, но тогда, вместо того, чтобы тратить время на исследование, придется тратить время на разгребание вот этих всяких «фабрик», за это время мысль вполне уже может успеть убежать из головы.
Классика, это конечно http://codeforces.com и https://arena.topcoder.com
Лично мой любимый сайт — codefights.com. Есть не только набор олимпиадных задач, но и соревнования вида «исправь баг/допиши код».
https://www.hackerrank.com мне нравится широким спектром задач. Так же есть задачи на языки программирования.
В Яндексе на собеседовании советовали https://www.codewars.com, но личного опыта с ним мало
там регулярно проходят раунды
Если с ангийским всё хорошо — можете попробовать topcoder
насколько помню, где-то раз в неделю в codeforces проходят раунды — для Вас это может стать «треноровчкой» между работой-домом
Вот следующий контест контест
Ещё есть acmp.ru
acm.timus.ru
Меня в олимпиадах по программированию смущает только то, что все усилия, направленные на решения задач, тратятся практически впустую, а само решение этих задач от обычного "боевого" программирования отличается так же, как морская свинка от дикого кабана.
Ребят, вместо того, чтобы зарабатывать себе строчку в резюме участием в олимпиадах, выберите задачу, у которой нет хорошего решения с открытым кодом и смело его пилите вместе с сообществом. Вам не хватает софта какого-то — напишите его!
Нерешенных практических задач — вагон и маленький бронепоезд, нужных открытых проектов — огромное количество, ваши усилия нужны там, а не соревнованиях по знанию алгоритмов!
Участвуйте в жизни сообщества, попробуйте поучаствовать в Google Summer Of Code, пишите код и статьи — и за это вам будут плюсы и в карму, и в резюме, и люди вам скажут большое спасибо за софт, который решает их практические задачи, а не выдуманные. Заодно вы научитесь код не только писать, но и поддерживать, отлаживать, рефакторить и удалять.
Практический опыт написания и поддержки программного продукта, на мой взгляд, намного ценнее опыта любых олимпиад, потому что для работы разработчика ПО нужен именно он.
Как правило, заказчик не понимает тех детали и говорит вам на языке обывателя что ему надо, вы же как программист должны уже в первые же минуты понять что надо сделать сколько времени это займет. В задачах тоже самое, если бы вы их решали то не могли не заметить, что все задачи типа Вася купил, Дед Мазай везет зайцев и т.д., а в итоге задача сводится к сортировке массива или перебора данных.
А если серьёзно, то, конечно, польза от решения задачек очевидна, но вся эта деятельность имеет весьма опосредованное отношение к «строению мостов между заказчиком и разработчиком». Зачем эти лишние звенья? Идите сразу к заказчикам и учитесь разговаривать.
Кстати, в олимпиадных задачках техзадание никогда не меняется по ходу работы, а это и есть самая большая головная боль на практике.
Аналогично.
Я не предлагаю не решать задачи совсем, я предлагаю решать практические задачи вместо олимпиадных, потому что от решения первых появляются навыки и полезное ПО, а от решения вторых — только навыки, а практически все написанное ПО — на выброс. Открытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются соревнованиями по решению задач, решение которых уже известно и никому не нужно. На мой взгляд, это печально.
Открытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются соревнованиями по решению задач, решение которых уже известно и никому не нужноОткрытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются в вузе лабораторными и курсовыми, решение которых уже известно и никому не нужно
Открытым проектам не хватает разработчиков, а потенциальные разработчики тем временем занимаются в 10 классе уравнениями и задачами на термодинамику, решение которых уже известно и никому не нужно.
Где та грань, когда стоит подвинуть учебу на второй план и начать жить по-настоящему? Кому-то покажется хорошей идеей устроиться на работу в 10 классе, а кто-то постарается взять от образования максимум возможного, потому что потом просто не будет времени из-за забот взрослой жизни. И тот, и другой путь имеют право на существование, главное не забывать оценивать риски.
Выхлоп от участия в жизни сообществ очевиден, но и выхлоп от участия в соревнованиях по программированию тоже есть и дает о себе знать в долгосрочной перспективе. Понятно, что задачи на турнирах далеки от реальных, но ведь то же самое можно сказать и про школьную математику, и про некоторые предметы в вузе. Почему-то никто не спешит убирать из школьной программы кубические уравнения, а из вузовской — дифференциальные. Соревнования по программированию — это как дополнительное образование, возможность получить знания и навыки, которые не даст вуз или офис.
Так что, если высокий порог вхождения — надо просто попросить другую задачу.
Тут скорее возникает вопрос, почему польскому/российскому/китайскому студенту такой вот своеобразный киберспорт интереснее своей непосредственной специальности: ведь ясно, что чудес не бывает, и время, потраченное на прокачку навыка решения задачек на время, отнято у какой-то другой деятельности. И тут у меня довольно грустное наблюдение: в спорт (любой) часто в принципе идут люди из не самых благополучных страт общества, потому что для них это социальный лифт. Сегодня ты один из миллиона беззвестных китайских студентов, а завтра ты чемпион мира, и тебя берут в любой фейсбук/гугл. А студенту MIT этот путь попросту неинтересен, да и связан с высоким риском неудачи, студент MIT и так в жизни не пропадёт.
Вот это печальное соображение автор и подтверждает: олимпиада — это своеобразный прямой путь наверх для этакого «парня из гетто». Для тех, у кого лучше развиты ноги-руки — это баскетбол или борьба, а для соображающих — олимпиады по программированию.
Не, конечно, я желаю им всяческих успехов в жизни и надеюсь, что в «крупных федеральных компаниях» действительно требуются навыки олимпиадного программирования и решения сложных задачек. Но в целом приходится с грустью констатировать, что социальные лифты столь плохи, а образование столь некачественно (в среднем), что люди начинают скакать через обручи ради получения шанса на собеседование в условный Гугл (хотя казалось бы, где связь, и почему выпускникам MIT этого не требуется...)
Причём в известном смысле ситуация только усугубляется, т.к. «эти успехи являются чуть ли не единственным заметным достижением регионального вуза, руководство начинает идти навстречу в сложных вопросах, преподаватели закрывают глаза на несданные лабораторные работы.» Если бы ко мне как к преподавателю пришли с просьбой «закрыть глаза», я бы послал такого человека нафиг, потому что при всём уважении к его хобби (будь то КВН, футбол или ACM), всё это к моему предмету отношения не имеет, да и к уровню развития вуза тоже. А руководству вуза, конечно, проще выдать успех отдельно взятой маленькой группы ребят за собственный успех, вместо того, чтобы планомерно поднимать качество науки и образования в вузе вообще.
Если бы ко мне как к преподавателю пришли с просьбой «закрыть глаза», я бы послал такого человека нафигКонечно, бывают принципиальные преподаватели, и многие предметы приходится сдавать наравне со всеми. Но часто преподаватели сами живо интересуются успехами и понимают, что пользы от их несложных лабораторных работ будет намного меньше, чем от соревнований, поэтому и не возражают против допуска до экзамена без их сдачи.
А в остальном, всё действительно так. Среди сотен технических вузов России условные MIT можно по пальцам пересчитать.
Считаю, что это самая правильная система — если студент предмет знает (и может показать это знание, сдав экзамен и решив задачи по всем темам), то какое кому дело, сколько он там лабораторных посетил?
Насчет закрытия глаз на лабы — это проблемы конкретного ВУЗа. Мне за олимпиады никогда ничего не засчитывали «нашару».
Университет, где я работаю, занимает неплохое для его размера и статуса место, так вот у нас это полностью частная инициатива (руководство денег подкидывает на поездки, но не более того).
Но это не значит, что вот у нас олимпиады это воооо! А у них всем пофиг, потому что никому это не надо.
Насколько мне известно, в ИТМО чуть ли не по региональным школам ездят и пытаются агитировать толковых ребят поступать — с прицелом на олимпиаду. В СПб Политехе «развитие олимпиадного движения» — чуть ли не личный проект ректора, ну и так далее. Короче говоря, это воспринимается как важная часть пиара на уровне руководства вуза. Я думаю, если бы MIT воспринимал это аналогичным образом, уж выше двадцатки подняться бы сумел.
На самом деле, все эти олимпиады были и в СССР популярны, там же не только программирование, но и математика, физика и прочее.
Могу добавить еще, что в западных ВУЗах занимаются и другими видами спорта. Например Кембридж и Оксфорт ежегодно уже сотню лет соревнуются в гребле по Темзе. В США популярен футбол, наверняка футбольной команде MIT уделяет больше внимания, чем соревнованиям по ACM.
Не было бы счастья, да спортивное программирование помогло