Добрый день! Я хотел бы обсудить такой интересный вопрос: должен ли программист знать математику? Является ли этот навык необходимым для простого кодера? Просто я выбираю куда поступать — в наш местный колледж энергетики, или ехать в большой город и поступать в серьезный институт с программой на уровне?
Казалось бы, причём тут битмаски...
А если по делу — если есть шанс — не вижу причин не попробовать.
А вам помогла математика?
Вообще не ясно, как можно отделить математику и программирование. В моём понимании, программирование это часть большОй математики.
На самом деле в этом возрасте очень полезно бывает проявить амбиции(а в вузе для этого явно больше шансов) — это сильно помогает мотивировать себя на большИе дела.
Ну вот просто не очень понятно, как уравнения помогают программировать. У меня есть опыт создания странгичек в Интернете, там это не надо было. А вот в серьезных проектах это как-то надо?
Можно порешать задачи здесь. Там примеров хоть отбавляй.
А вообще все эти бесконечные матаны, функаны и УМФы формируют не столько знания в конкретных областях, сколько математическое мышление.
Например, сейчас не могу сопоставить названия теорем с содержанием, но в общих чертах смогу доказать большинство из них.
Мне довольно часто кажется, что участие в ACM и решение всяких интересных задач(с того же КФ) развивает мышление не хуже матана и т. п. А что по этому поводу думают другие участники?
Правда? Неужели перепечатывание одного и того же набора алгоритмов развивает?
Простите, если чьи-то чувства задел:D
Ну тут же у нас не баян-задачи аля "напиши дейкстру", "реши баянистую задачку на дп" и т.д.
Искренне не понимаю негодования, вызванного моим комментарием. Неужели столько людей считают процесс печати искусством? Неужели кто-то считает себя творцом, обиженным художником? Может стоит посмотреть на себя со стороны? Возможно, в кодерстве действительно мало возвышенного? Я хотел бы услышать адекватные противовесное мнение, а не наблюдать за растущей цифрой напротив минуса.
Уважаемый Neodym, Вам довольно ясно ответили в этом посте. Можно немного развить эту мысль. Процесс решения задач уровня А-див2 это не искусство, даже более того, алгоритмов для этого знать не надо. А минусы Вы получаете, скорее всего за то, что, решая в основном задачи A-B-див2, говорите об алгоритмах так, будто давно их выучили и научились применять (заметим, что эти 2 вещи — не одно и то же).
Так вот, нет ничего мудрого в умении перекладывать кирпичи — любой дурак это осилит. Но из одних и тех же кирпичей можно строить хижины и трущобы, а можно — дворцы или хорошие дома. Они могут стоять 2 месяца и разваливаться, а могут простоять и 200 лет. Умение собрать из стандартного набора конфетку я считаю искусством, потому что необходимой информацией владеют все, а вот получают результат немногие.
Я понял, что вы имеете в виду. Спасибо за развернутый ответ. Хотелось бы думать, что все 70 проминусовавших имеют такое же мнение, а не просто ткнули кнопку. Конечно же, существуют красивые задачи и методы, имеющие под собой глубокие идеи, достойные заслуженного внимания. Я просто хотел намекнуть, что решение значительной части задач олимпиадного программирования — это именно подгон под эти самые базовые алгоритмы + реализация, что хотя и развивает необходимый навык, но имеет мало общего с развитием какого-то особенного мышления. Надеюсь, что теперь я написал это максимально необидно.
Что входит в "подгон под базовые алгоритмы"?
Попросите какого-нибудь топового участника выбрать 30-40 различных задач на потоки. Нахождение потока — это, как я понимаю Вашу терминологию — базовый алгоритм. Так вот, возьмите эти 30-40 задач, и попробуйте сказать, как решается каждая из них. Зная, что в каждой из них на самом деле надо найти какой-то поток. Как думаете, результат будет весьма удачным?
Если нет, то вопрос — а что нужно, чтобы результат был удачным?
Конечно, на банальном знании набора стандартных однотипных задач не трудно выйти на финал, а при определенном стечении обстоятельств — и взять там медаль. Но это ведь далеко не показатель топовости. И людей, которые прямо на контесте придумывают неизвестный им базовый алгоритм сами — тоже никто не отменял. И те, кто решал когда-то, когда еще почти не было никаких разборов... Или и сейчас почему-то не использует готовое, а ко всему приходит сам... У них творческое мышление тоже отсутствует?
Я без понятия, развивает ли АСМ специфический стиль мышления или нет, у себя такого точно не наблюдаю. Но факт, что на этом мышлении можно выезжать, если оно откуда-то у человека есть — это однозначно.
Сначала див2-А — не искусство... Потом приходит кто-то красный и говорит — див1 А..В это не искусство, какое искусство в том, чтобы написать очевидный бинпоиск, стандартную динамику или банальный перебор? Потом приходит еще кто-то, говорит — я смотрел задачи NEERC за такой-то год, на выход в финал ничего особенного не надо, несколько тупых халяв, какая-то скучная динамика, перебор, стандартная задача на бор.... Скукотище, словом.
Потом приходит еще кто-то, и говорит — а вот по поводу финала, там на медали достаточно быстро написать совсем безыдейные задачки вроде боянистой геометрии или минкост.
Ну и так далее...
Все относительно) И не надо так категорично о div2-А) Я бы привел пример какой-нибудь спортивной гимнастики — некоторые на кольцах даже подтянуться не смогут. И "со стороны" какой-нибудь подъем силой с самолета в обратный крест — это очень даже искусство, и заставляет тех, кто за этим наблюдает, удивляться возможностям человеческого тела. А если спросить профессионального спортсмена — он скажет, мол, ОК, подъем, да, есть такой, умею, ну элемент как элемент, о каком искусстве вы говорите?
А ещё для слона провести несколько линий по холсту — тоже искусство. Но мы-то не слоны.
Можно умиляться чудесами мироздания и радоваться тому, что умеешь ходить, дышать... ведь миллиарды анаэробных бактерий и на это не способны. Однако же я считаю, что на задачи стоит смотреть с точки зрения того, кто занимается олимпиадным программированием хотя бы чуть-чуть регулярно.
"Конечно, на банальном знании набора стандартных однотипных задач не трудно выйти на финал, а при определенном стечении обстоятельств — и взять там медаль."
по-моему, вы погорячились.
Просмотрел несколько прошлых полуфиналов наугад.
NEERC13, выход на финал — задача А, написать перебор того, что описано в условии, и навешать на него оптимизаций.
NEERC08, выход на финал — задача K, построить бор (ну и еще хэши для разнообразия).
NEERC11, выход на финал — задача C, очередная стандартная динамика; задача D — построить бор.
Можно полюбопытствовать, в скольких финалах лично вы поучаствовали?
Ни в одном. Более того, у меня есть весомые причины предполагать, что в своей жизни я больше не приму участие даже ни в одном полуфинале, не то что в финале, хотя у меня еще вроде бы куча сезонов. Но это не имеет никакого отношения к обсуждаемой теме.
Какая-нибудь задача "напишите Укконена" не становится менее стандартной от того, что большинство Укконена писать не умеют. И выше я привел несколько примеров полуфиналов, в которых "финальная" (т.е. наименее сдаваемая из тех, которых хватало для выхода в финал) задача — "стандартная" с точки зрения Neodym. И является искусством ровно настолько же, как приведенный мною выше пример с гимнастикой. Для наблюдателя — искусство. Искусство "знать такую задачу", искусство уметь это закодить, да еще и быстро. А для участника — инструмент для достижения результата и не более.
Развивает, но в другую сторону.
Матан и прочие позволяют спокойно рассуждать на уровне абстракций, которые сильно упрощают жизнь.
А задачи аля "заметь палево" или "выведи на бумажке формулу и пусть компьютер ее выведет" — развивают?
Определённо да. В жизни постоянно нужно замечать палево и очень часто — выводить формулы.
Вот тебе платят по 5 рублей за страничку, а тебе нужно 1000 собрать. Ты зарешал уравнение, и понял, что нужно сделать 200 страничек.
Для простого кодера на том же PHP не нужно даже уметь думать — этот инструмент разрабатывался специально для того, чтобы подходить как можно более широкой аудитории.
Если же рассмотреть поближе любой сложный проект, то Вы найдете там математику в немалом количестве. Например, для разработки графических движков для игр нужно хорошо знать геометрию (далеко за рамками школьного курса). Ранжирование запросов поисковыми системами основано на математической статистике. Поиск пути от точки А до точки Б на автомобиле с учетом пробок на улицах основан на теории графов. И таких примеров можно найти еще огромную кучу.
В-общем, если Вас устраивает быть кодировщиком быдлосайтов — смотрите первый абзац. Хотите заниматься чем-то хорошо оплачиваемым и, главное, интересным — тогда математика Вам однозначно нужна.
А при чем вообще здесь инструмент. Про джаву тоже самое можно сказать. Да и еще про кучу языков. Не смешивай инструмент и задачи.
А инструмент-то сам по себе и ни при чем, дело как раз в задачах, для решения которых он был создан. Тут и смешивать ничего не надо.
А пример я привел самый крайний из тех, что мне известны.
Но ведь почти все языки были созданы, чтобы быть доступными как можно более широкой аудитории... Ассемблер, чтобы не писать в машинных кодах. Си, чтобы не писать на ассемблере. Ну и так далее. Паршивость языка не говорит о паршивости задач, к которым его можно применить. А невероятная простота языка — это же наоборот круто!
P.S. Я на пхп не писал, но слышал про его косяки.
Из этой пламенной речи как-то напрашивается что сайты может ваять любой дурак и дедуктивный вывод что любой кто ваяет сайты — дурак :)
Имхо, неверно это. Программирование нынче настолько широко запустило ручищи свои в дела человеческие, что в нём возникло множество интересных отраслей, и не все из них действительно связаны с математикой.
Впрочем нужно сразу огорчить автора поста — все действительно интересные отрасли в любом случае требуют довольно много времени тратить на учёбу / практику / саморазвитие. :)
А вот не надо перевирать мои слова. Кодировщик быдлосайтов и разработчик серьезного веб-проекта — это совершенно разные вещи.
Готовы дать определение, показать разницу между серьёзными и быдлосайтами?
Дать определение не готов, т.к. то и другое — понятия с нечетким объемом, между которыми существуют переходные формы.
Только не заставляйте меня пересказывать лекции Яндекса про алгоритмы бинарной классификации как способ отделения одного от другого, лучше поищите информацию об этом сами...
Я не прошу чёткого разграничения. Просто "своими словами" выразите общий собирательный образ "быдлосайта", пожалуйста. Это, наверное, не так трудно?
На этот счёт не парьтесь, на курсере видел :D
В данном контексте я бы дал такое определение: сайт, созданный быдлокодером или группой таковых. Вспомните, какие из известных Вам сайтов были созданы подобными людьми (исходя из user experience, а не личного знакомства с авторами).
Исходя из user experience? Неожиданно.
Ну посмотрим например на иные сервисы гугла — google-code, google-sites, blogger — работа с ними у продвинутого юзера вызывает естественное раздражение.
Нужно ли сделать вывод что "их делали быдлокодеры"?
Из того, что небо голубое не следует, что все голубое — это небо
Программист, конечно, никому ничего не должен, но без специализации и познаний в сопутствующих предметных областях не очень понятно, почему ему будет легко найти интересную работу, ИМХО. Естественно, что какой-то специализации может сопутствовать, скажем, бухучет или чего-нибудь архитекторское, а не содержимое математических специальностей вуза. Есть смысл прикинуть, чем бы вы хотели заниматься в ближайшем будущем.
Субъективно, многим интересным инженерным занятиям релевантны знания по алгоритмам, структурам данных, автоматам, формальным грамматикам и сложности (список далек от того, чтобы быть исчерпывающим, конечно) — и после того, как убого все эти вещи были прочитаны в моем бакалаврате, мне трудно представить, чтобы их сносно объясняли в колледже.
К слову, "знать математику" — очень расплывчатое понятие, и не факт, что вам в работе понадобится именно та математика, которую вы или ваш вуз имеете в виду. В наших реалиях большинство математических специальностей имеют уклон в те или иные аспекты, условно говоря, "непрерывной" математики, а "дискретная" часть может ограничиваться несколькими курсами и быть (а) прочитана для галочки, (б) непонятно зачем нужной, хоть и кажущейся как-то связанной с информатикой, (в) тайком подменена на то, что интересно сошедшему с ума профессору (например, общую топологию). Впрочем, первые два года так или иначе обычно наполняются полезными курсами, а потом можно перевестись на другой факультет, если того потребуют ваши интересы.
Придется, наверное, как всегда все самому учить, раз оно того стоит
Если уж обращаться к теме математики и программирования — почему в некоторых задачах происходит полная подмена второго первым? Какой смысл в таких задачах? Взаимодействие этих наук может иметь лишь два вида: первое помогает второму, как уже было сказано, в геометрии или какой-нибудь криптографии. Второе первому — в решении разных задач оптимизационного характера, когда надо что-то найти(как здесь или здесь). Задачи с решением в стиле cout<<(a + 1)/b не удовлетворяют ни одному из этих типов — программерские навыки не развиваются, а математикам не нужны такие программы, ибо числа в формулу не так уж и сложно подставить
А если нужно сто раз подставить числа в формулу? А если тысячу?
Это самый простейший пример автоматизации процесса вычисления. На таких вот кирпичиках и строится всё остальное.
На этом все строится?
Конечно, и на этом тоже!
Любая сложная задача — это по сути своей несколько более простых как-то объединённых. И если вы не умеете оптимально и быстро решать такие простые задачи, как тогда собираетесь решать сложные?
Резон в ваших словах есть. Однако, мне все равно грустно, когда вся "математика" выглядит именно так
Ну это прямо вкусовщина какая-то. Если вам нравится какая-то другая математика — занимайтесь ей — возможностей масса.
Давно было интересно, зачем вы всегда пишете свои комментарии, оформляя их как код?
Просто человек очень любит моноширинный шрифт :)
Вдогонку к предыдущим комментариям: моноширинный шрифт лично мне читать намного труднее, когда вокруг всё написано стандартным и глаз привык. Лучше не надо так.
А код у вас в редакторе не моноширинным шрифтом?
P.S. Просто интересуюсь
Моноширинным. Но это код. Читать текст "подряд" гораздо удобнее, когда буквы не растянуты и не сжаты. Для сравнения:
Первые моноширинные шрифты были разработаны для пишущих машинок, так как реализация механической печати пропорциональным шрифтом требовала значительного усложнения печатающего узла. Существовали и наборно-печатающие машинки, использующие пропорциональный шрифт и изменение межбуквенных интервалов, но они применялись лишь в оперативной полиграфии.
Пользуясь случаем, хочу поинтересоваться) Кто-нибудь знает, что за шрифт используется на codeforces при просмотре кода?
Я тут посмотрел через chrome developer tools, шрифт в листинге задается тегом pre, а явно в CSS codeforces'а не прописан. То есть тут зависит все от браузера. У меня например в user agent stylesheet написано
font-family: monospace;
. То есть какой-то моноширинный, в моей системе это Consolas.А вы не могли бы сделать скриншот?)
Вот: http://i.imgur.com/EkibVBx.png