Как стать автором
Обновить

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

НЛО прилетело и опубликовало эту надпись здесь
Такое ощущение, что олимпиадников миллионы и у работодателей нескончаемый поток кандидатов, а те думают — брать или не брать?
Неужели не можете соотнести задачи олимпиады и реальной жизни и все встает на свои места, и не нужно писать такие опусы, рассчитанные не понятно на кого и зачем?
Если не соотнесли, то отвечаю — Причем тут олимпиада, если все зависит от человека?

Моё мнение: программист-олимпиадник — это, в первую очередь, математик-теоретик, а не программиист-практик. Разница почти как между разработчиком и системным администратором. Со стороны обоих незаывают программистами.

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

Лично я пошёл в науку: поначалу по инерции, потом оказалось, что это не так уж и плохо по деньгам выходит.
Олимпиадники собирают в голове решение задачи из вызубренных алгоритмов. Кто больше назубрил — тот и победил. В их деле нет творчества. Варятся в собственном соку и непонятно для чего они вообще это делают.
А много ли творчества у промышленного программиста? Найти нужные методы в манах (по фреймфорку/языку/ОС — неважно) и поставить их в нужной последовательности. Творчество в олимпиадном программировании зачастую состоит в том, что нужно свести задачу к какой-то формальной модели, которая поддается уже применению на ней вызубренных алгоритмов. И часто задачи можно смести к абсолютно разным моделям и подходам — одна и та же задача может быть решена, например, как с помощью графов, так и с помощью «динамики» или строковых алгоритмов.
И опять же — в чистом виде «по учебнику» алгоритмы на серьезных соревнованиях почти не встречаются — часто нужно придумать, как модифицировать стандартный алгоритм, чтобы он решал конкретную задачу.
Сам я занимался ACM с 8 класса школы, с переменным успехом участвовал и на всероссийских соревнованиях. Сейчас уже почти 2 года работаю над встраиваемыми системами, собственно на 4 курсе универа понял, что просто устал от олимпиад и прочего и хочется «прикладухи».
На практике, конечно, очень редко требуются сложные алгоритмы, но иногда, читая код коллег, ловлю фейспалмы. Потому что даже не используя какие-то хаки, которые делают код нечитаемым и неподдерживаемым, «олимпиадное» мышление позволяет писать более эффективный и красивый код.
И еще не нужно забывать про такой аспект олимпиадного мышления, как критическое отношение к коду. Умение находить самые сложные случаи для программы и видеть намного больше плохих случаев входных данных может избавить от многих часов дебага в поисках логической ошибки в программе. И когда «обычный» программист проверит программу на десятке самых популярных вариантах, олимпиадник сразу сгенерирует пол-сотни самых плохих случаев.
Расскажу на своём примере.

В 2001 году участвовал в ACM олимпиаде по программированию, добрался до такого уровня благодаря тому, что участвовал в районных, городских, областных олимпиадах. Первые места не занимал, но и иногда попадал в списки с призовыми местами, т.е. занимал 3, 6, 9 места. Так же посещал летние школы программирования от ИСИ СО РАН (ВЦ, Новосибирск, Академгородок).

Сейчас, уже более 10 лет работаю программистом, занимаюсь разработкой, проектированием.

Так вот, знания тех или иных алгоритмов редко, но всё же пригождается в решении некоторых нестандартных задач, которые в крупных проектах иногда возникают.

Наверное, мне в те послестуденческие годы помогло легко и быстро найти работу то, что вместе с алгоритмизацией, структурами данных, курсами по решению олимпиадных задач и прочей программистской математикой я пробовал свои силы в ООП, и на одной из олимпиад выиграл книгу «Приемы объектно-ориентированного проектирования. Паттерны проектирования» авторов Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес, и я довольно рано начал пробовать совмещать проектирование с алгоритмизацией в своих учебных разработках.

Моё мнение, что нужно учиться решать и олимпиадные задачи, учить математику для программистов, и так же учиться проектировать. Т.е. И то И другое важно, а не выбирать ИЛИ одно, ИЛИ другое.

Никогда не понимал этого спора:


  • Сотрудников нанимают не рядовые программисты, а кадровиков едва ли заботят подобные проблемы.
  • Вероятность пройти собеседование никак не изменяется от того факта, что человек занимался олимпиадным программированием.
  • Уровень задач в финале не сопоставим в уровнем задач на собеседовании.
  • В 95% случаев новые алгоритмы на работе никто не придумывает.
  • Работа в крупной компании не означает автоматически высокий уровень знаний конкретного сотрудника.
  • Для кого-то предел мечтаний — просто попасть в компанию Х, для других важна конкретная область
  • Никто не садит олимпиадников на исследовательские проекты (инфа 100%) без соответствующих знаний.

Сухая статистика:


  • Олимпиадники думают, что они круты везде, раз их охотно берут во всякие гуглы.
  • У не-олимпиадников батхёртит, что их не приглашают во всякие гуглы, а вместо этого они вынуждены читать книги "Как пройти собеседование в гугл" и решать дурацкие задачки.
  • Компании нанимают олимпиадников, чтобы укрепить свой статус крутой компании №1.
  • Over 100500 статей на тему "настолько ли круты олимпиадники в программировании?".
  • Олимпиадники приходят в гуглы и занимаются разработкой фронтальной страницы в google news.
  • Олимпиадники вырастают за несколько лет и занимаются тем же, чем и все остальные.
  • Все пишут говнокод (даже я, только тсссс!).

И это норма! Потому что на соседнем форуме про боевые искусства никак не утихнет спор "победит ли боксёр каратиста". И тот спор уж точно старее вашего.

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

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

Чему олимпиады действительно учат — это решать задачи быстро и просто (ака надежно). Почему? Потому что на олимпиадах обычно очень полные тесты, покрывающие действительно все случаи, штрафы за неправильные попытки и постоянный цейтнот. Ни один олимпиадник на контесте если ему необходимо, к примеру, проверить есть ли среди 100 отрезков на плоскости пересекающиеся не будет писать выметающую прямую, а напишет брутфорс за н квадрат.

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

P.S: я учился программировать исключительно учавствуя в олимпиадах. Закончил олимпиады в 2012. Сейчас — техникал лид в Гугле. Я не думаю, что я заметно улучшил свои навыки написания кода с момента начала работы в Гугле. Тоесть навыков полученных в олимпиадах мне полностью достаточно для промышленного кодинга.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории