Closed. This question is opinion-based. It is not currently
accepting answers.
Want to improve this question? Update the question so
it can be answered with facts and citations by editing this post.
Closed 1 месяц назад.
С недавнего времени меня очень зайтересовало олимпиадное программирование.
Я учусь на первом курсе.
Основы языка и несложные алгоритмы я уже выучил.
Но вот как мне дальше развиваться не знаю.
Что учить?
Где учить?
Где можно поучаствовать?
Какие-нибудь курсы?
Какие-нибудь форумы?
Буду очень признателен если кто-то поможет.
Ответы
Ответ 1
Выскажу своё мнение, так как много лет занимался олимпиадами и был участником чемпионата
мира по программированию (19-е место). Сейчас я программист-математик в довольно узкой
области, но владею этой областью как профессионала международного уровня. Не смог бы
стать таким профессионалом если бы вовремя не соскочил с иглы олимпиад.
Первое, что вы обязаны понимать: олимпиады - это игра. Она полезная, развивает некоторые
полезные навыки программирования и немаловажную способность к оптимизации. Когда я
закончил играть в эту игру лет 13 назад, я был удивлён тому, насколько лучше любых
других программистов я умею писать быстрый и эффективный код, который они даже представить
себе не могли (когда речь идёт о сложных задачах). Но главное в этой игре - ВОВРЕМЯ
УЙТИ. В один прекрасный момент вы должны понять, что наступила точка насыщения, после
которой вместо развития начинается деградация. Вы начинаете работать уже не на развития
своих навыков, а на оттачивание до совершенства именно соревновательных навыков, которые
на реальной работе не нужны и даже вредны.
Второе: олимпиадники не способны решать задачи, на которые нужно потратить больше
5 часов времени. Сколько я не преподавал, ни разу не попался человек, успешный в олимпиадах,
но при этом способный решать сложные научные задачи. Они привыкли, что можно написать
некий просто хороший код, эффективнее которого не смогут написать почти 100% обычных
программистов, и этого достаточно. Но нет, в научных расчётах попадаются такие задачи,
которые нужно пробивать месяцами упорного труда типа "написал - стёр - написал заново",
этот цикл может длиться десятки итераций и приходится применять те приёмы, которые
НЕ нужны в олимпиадах. Они этого не умеют. И, что ужасно, не могут себя заставить переучиться
с игры на кропотливый труд.
Третье: олимпиадники не способны писать грамотный промышленный код. Их можно этому
научить, но не всегда получается. Да, их код очень хорош в плане эффективности, они
чувствуют код как свою часть тела и знают как он будет работать. Многие из них даже
не делают ошибок в коде - он сразу запускается и работает правильно (так было у меня
лет 13 назад, код на домашних тренировках я писал в "блокноте" (без плюсов) и он сразу
компилировался и работал без ошибок, можно даже не проверять, но этот навык не нужен
и быстро теряется). Но одна беда: этот код не понятен другим людям, он не структурирован
так, чтобы в нём легко можно было разобраться, чтобы заменить одну часть кода другой,
его ВООБЩЕ невозможно поддерживать, можно только удалить и написать заново.
Четвёртое: из второго и третьего пунктов следует важная деталь - параллельно с олимпиадами
нужно работать над реальными задачами, имеющими практический смысл. Это могут быть
игры (обязательно по правилам разработки игр, а не самопал), могут быть научные расчёты
(обязательно по правилам той научной лаборатории, где работаете), могут быть промышленные
задачи (по ВСЕМ правилам промышленного кода и разработки программного обеспечения).
Только так вы не станете развитым лишь на один бок и не будете мучиться в своей профессиональной
карьере.
Пятое. Не впадайте в демонизм и не пытайтесь унижать своих собратьев, не прошедших
олимпиадную школу. Они никогда не напишут какой-нибудь алгоритм Форда-Фалкерсона так,
чтобы он работал быстро и правильно, у них в голове нет 70-100 алгоритмов, которые
вы можете быстро напечатать за несколько минут, они даже не слышали, что такое максимальный
поток, а вы знаете 15 алгоритмов его поиска наизусть. Это приводит к ощущению какой-то
возвышенности и важности. На самом деле вы должны понимать главное: в реальной жизни
вы - бесполезный мусор, если не умеете решать реальные задачи. Держите этот момент
в голове, если захотите кого-то унизить, кто не знает что такое динамическое программирование,
например.
Шестое. Развитие вас как олимпиадника должно быть постоянным, нельзя останавливаться.
Обязательно посещайте сборы программистов-олимпиадников, таких сейчас много, и когда
нет сборов, каждый день решайте задачи с разных серверов. В наше время были популярными
acm.timus.ru и acm.sgu.ru, сейчас я даже не знают, работают ли они, но сейчас полно
других вариантов: topcoder, codeforces (загуглите). Без сборов ваше обучения будет
очень слабым. Без каждодневных тренировок на серверах (пусть хоть полчасика в день) - тоже.
Седьмое. Как только поймёте, что дошли до точки насыщения и дальнейший рост в олимпиадах
приводит только к развитию навыков скорости и соревнования, а классические основы всех
алгоритмов вам уже известны, валите оттуда как можно скорее. Потому что с этого момента
начинается ваша деградация как человека практического. Сразу переключайтесь на реальную
работу, изучайте стандарты программирования, которые не смогли изучить в бытность олимпиадником
и беритесь за реальные задачи. Если вы проигнорировали совет делать это параллельно,
то придётся несколько лет переучиваться.
Восьмое. Игры затягивают в себя своим соревновательным духом, олимпиады насыщают
гордыню и подсаживают на чувстве значимости и особенности. Помните, что это иллюзия,
увод в сторону. Это хорошая школа для того чтобы научиться чувствовать код и компьютер,
изучить алгоритмы, но всё остальное (призы, места, победы и поражения, взгляды юных
девушек) - это туфта. Не ведитесь на неё, потом будет обидно.
Всё, желаю удачи, и да прибудет с вами здравый смысл :)
Ответ 2
Спортивная олимпиада поможет стать спортсменом. Математическая олимпиада поможет
стать математиком. Олимпиадное программирование - не поможет стать программистом. Хобби
- да. Как заменитель книг/игр - да. Как зарядка для ума - да. Как обучение программированию
- нет. Слишком разные подходы к коду. Слишком разные цели у олимпиады и production.
Поэтому, если хотите развиваться, советую участвовать в открытых проектах на github,
gitlab, bitbucket, sourceforge и так далее. Таким образом вы и сообществу поможете,
и получите опыт работы в команде, и получите опыт участия в реальных проектах. Да к
тому же будет что показать работодателю если попросят примеры кода.
Ответ 3
Имхо
Если Вы пишиете, и хотите продолжать писать на плюсах, то лучшее, что я могу Вам
посоветовать,
и что максимально поспособствует Вашему развитию (сугубо мое мнение), это написание игр.
Начиная с легких консольных игр в которых будет присутствовать какая-то игровая логика,
и двигаясь в сторону того, чтобы начинать изучать графические библиотеки, которые
смогут помочь
Вам постепенно лучше понять, как можно работать не только с консольными приложениями
под винду, линукс и пр., а и приложения, на которые лично Вам станет приятнее смотреть.
Как вариант, начните со змейки, крестиков ноликов, тенис и т.д.
Лично я начинал с SFML, но вариантов также достаточно много, гугл поможет выбрать Ваш.
В процессе, вероятнее всего, станет интереснее как написать более правильно, то что
Вы делаете
и тогда можно будет копнуть глубже в паттерны. Книг много и каждому больше подходит
свое.
Вместе с этим можно поднатаскать и навыки алгоритмов, но не стоит пытаться выучить
каждый,
т.к. профита от этого мало и большая часть либо выучится на практике, пока Вы будете
искать хорошее решение своей проблемы, либо же вовсе Вам не понадобится, в силу того,
что использовать приходится в большинстве случаев именно готовые решения.
Главное - не стоит сильно закапываться в эти темы без практики, т.к. сырая теория
в программировании дает невероятно маленький выхлоп, при этом без практики забывается
все это очень быстро.
Курсы
Выбор на рынке крайне большой, но в целом, можете посмотреть бесплатные лекции на
той же Курсере курс от Яндекса, есть чему научится.
Полезным и интересным мне показался курс про многопоточность/сокеты на Степике, опять
таки бесплатный и с достаточном хорошим уровнем задач где-то после 20-30% курса.
Полезно
Если Вы в универе на 1 курсе, то навык, который в какой-то степени уже можно начать
развивать, и который будет крайне полезен для Вас, как для программиста всегда - чтение
чужого кода.
Элементарно можете начать с помощи одногруппникам с его лабой, которая почему-то
не работает. Пытаясь понять его код (если он не будет у всех копипастой) Вы будете
понемногу, но учится работать с чужим кодом. Т.к. в этой професии работать с чужим
кодом зачастую приходится ооочень часто, то такой навык будет очень сильно упрощать
Вашу первую и последущие.
А еще, никогда не ленитесь дебажить, если что-то не работает, и сразу непонятно,
что именно сломалось, в первую очередь попытайтесь изучить (если еще не изучили), а
после применить свои скиллы дебагинга и найти корень зла в Вашей программе.
П.С.
Слегка сумбурно, скорее всего еще подкорректирую и дополню, но в целом, желаю успеха
в Ваших начинаниях.
Ответ 4
Вопрос был задан про развитие в олимпиадном программировании, а ответы про то, насколько
это бесполезно и т.д... Отвечу по теме. Во-первых надо смотреть по уровню. Лично я
с командой в начале тренировался на этом сайте: https://acmp.ru/. Там много простых
задач, и можно потихоньку увеличивать сложность. Некоторых задач можно найти разборы
на ютубе и в интернете. Так же изучайте алгоритмы! На том же сайте есть тренировки
алгоритмов, и хороший сайт с алгоритмами: http://e-maxx.ru/algo/. Там есть и графы,
и со строками, и на комбинаторику, и всё, что душа пожелает. А участвовать можно на
соревнованиях тут: https://codeforces.com/problemset . Тут самые похожие задачи с теми,
что на олимпиаде. По началу можете в архивах находить те, что с самой простой сложностью.
Когда повысите уровень, можете пробывать участвовать в соревнованиях. И вообще, олимпиадное
программирование мало похоже на профессиональное, но оно даст вам хорошую базу, и знание
алгоритмов. И когда мы ездим на олимпиады, всегда есть возможность завести новые знакомства,
и куча it компаний предлагают работу у себя. Так что это точно опыт, который не помешает.
Так что не слушай некого, и занимайся тем, что нравится))
Ответ 5
Мой любимий сайт с задачами по программированию, очень хорошо можно прокачать свой
уровень и главное увидеть прогресс.
Решая регулярно эти задачи можно подготовится к олимпиаде и не только, очень многое
вам пригодится в учебе и в будущей работе.
https://www.codewars.com/
Еще классний момент, сайт исходя из вашей инфы найдет других пользователей, которые
учаться с вами в одном универе. Можно найти новых друзей.
Удачи!