2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4  След.
 
 Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:32 
Аватара пользователя


19/05/09
53
Москва
Здравствуйте, Уважаемые.
Заранее понимаю, что наверняка открываю тему-холливар. Хотя учитывая математическую направленность форума - вовсе не факт...

Уже больше дня спорю со знакомым, нужна ли дискретная математика программисту?

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

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

Причём не только на примере задач с условиями из разряда "идеально гладкий полый сферический объект завис в невесомости в абсолютном вакууме", а на реальных практических задачах, с которыми приходится встречаться среднему (и не только) программисту.

Как Вы считаете: нужна или нет? Почему да, а почему нет?

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:37 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
А что Вы в этом споре обозначили словами "дискретная математика"?

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:49 
Аватара пользователя


19/05/09
53
Москва
Хмм...
В общем-то я имел ввиду не только конкретно дискромат, но и другие разделы, которые традиционно считаются полезными для информатики и смежного.
Логика, теория графов, автоматом, ТАУ, лямбда-исчисления, рекурсия, разработка, анализ и проектирование алгоритмов, теория кодов, функции и матрицы, деревья, сети, алгебра (имею ввиду не ту, что в школе), комбинаторика, вероятность, теория множеств, чисел и т.д. и т.п.

Большую часть слов я даже не понимаю, оттого не берусь самостоятельно судить, что да к чему. :)

Но для пущей конкретности упрощу вопрос: "Нужна ли математика программисту?".

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:53 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
Mixo123 в сообщении #217303 писал(а):
Но для пущей конкретности упрощу вопрос: "Нужна ли математика программисту?".
Нужна.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:55 
Аватара пользователя


22/08/06
756
Я конечно не могу судить за программистов, но я думаю, что большинство этих разделов вводятся не для знаний, а для постановки правильного и мощного мышления. Самые лучшие программисты - математики. Не потому что они знают полезные вещи (си плюс плюс, ассемблер и т.д.), а потому что хорошо думают. Синтаксис - дело вторичное.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 17:58 
Аватара пользователя


19/05/09
53
Москва
Cobert, это факт. Знать синтаксис и не знать основ - это тоже самое, что знать все падежи, времена и прочие особенности синтаксиса русского (английского) языка, но при этом не уметь их применять.

Ведь в принципе все императивные языки пользуются примерно одним инструментарием - циклы, условия, арифметика, ввод/вывод и тем, что уже выводится из этих кирпичиков.

Но понимая это, я ловлю себя на мысли, что примера полезности фундаментальщины привести я всё-таки не могу.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 18:02 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
Возьмите любой современный учебник по анализу и построению алгоритмов, и да пребудет с Вами Сила знаний!

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 20:54 
Экс-модератор
Аватара пользователя


07/10/07
3368
Cobert в сообщении #217307 писал(а):
Самые лучшие программисты - математики.

Это нетривиальное утверждение.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 21:01 
Заслуженный участник
Аватара пользователя


01/08/06
3054
Уфа
Основы логики однозначно нужны. Основы теории алгоритмов --- наверняка тоже понадобятся (сортировка там, быстрый поиск в упорядоченном массиве --- эти задачи встречаются на каждом шагу).

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

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

Сложные математические теории, действительно, требуются не всем. Например, если Вам доведётся моделировать какие-то физические процессы, то не обойтись без знаний в области математического и функционального анализа, дифференциальных уравнений. Если будете разрабатывать язык программирования, нужны будут разделы математики, которые часто объединяют под термином "дискретная" --- конечные автоматы, формальные грамматики и т.п.

Т.е. дальше всё уже зависит от задач, которые перед Вами поставят работодатели/заказчики.
Однако следует иметь в виду, что при прочих равных условиях даже для решения относительно простых практических задач предпочтительнее будет выглядеть человек с хорошими знаниями в математике, чем без таковых. Вероятнее, он сможет решать эти задачи лучше и быстрее, чем человек с гуманитарным образованием или без (высшего) образования, хотя из этого правила бывают исключения. Кроме того, тренировка ума, даваемая математикой, может сослужить хорошую службу при изучении имеющихся инструментов и технологий программирования (хотя бы потому, что почти все эти инструменты и технологии преимущественно рассчитаны на человека математического склада ума).

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 21:20 
Заблокирован
Аватара пользователя


07/08/06

3474
А мне так кажется, что спорщики путаются в понятиях кодера и программиста. Это разные личности. Хотя чистых кодеров на своём веку мне видеть не приходилось, но чисто теоретически могу предположить, что кодеру для работы достаточно знания интерфейсов, предоставляемых библиотеками. Программист же по определению - инженер, он обязан уметь проектировать эффективные алгоритмы, для чего означенные выше математические знания - необходимы (я бы отнёс их к "финитной математике"). Хотя бы для того, чтобы не изобретать велосипеды, которые, к тому же, не ездят. Насчёт теории множеств и математики, связанной с бесконечностью - сомневаюсь что нужна, это больше искусство... Если только это не связано как-то с предметной областью.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 21:38 


13/05/09
8
если человек хочет всю жизнь реализовывать чужие алгоритмы, его воля, пусть не изучает фундаментальные науки.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение26.05.2009, 21:48 
Заслуженный участник


28/04/09
1933
Рискну высказать свое, достаточно скромное, мнение. Как известно, исторически сложилось, что первыми программистами были математики. Они не только придумали языки программирования, алгоритмы, базовые концепции, но и пошли гораздо дальше - практически весь теоретический аспект современного программирования был создан в математической или околоматематической научной сфере. Даже достаточно прикладные, далекие от математики как таковой, вещи появились в университетах, сильных прежде всего своей математической школой (я думаю каждому, кто более или менее сведущ в данном вопросе сходу сможет назвать не одну концепцию и не один университет).
Однако к настоящему момента складывается ситуация, при которой математика и программирование все больше расходятся друг от друга. Дело в том, что, как оказалось, система мышления грамотного и сведующего программиста должна серьезно отличаться от системы мышления представителя математической или сопутствующих наук. Действительно, программист должен во всяком явлении уметь усмотреть паттерн, абстракции предметной области поставленной задачи увязать в систему классов, попутно выделив в их (т.е. абстракций) действиях максимум общего (точнее, максимум схожих по смыслу операций), подготовив, т.о. почву для использования разного рода виртуальных функций и полиморфизмов (это я так, в шутку)...
Таким образом, система мышления у програмиста (продвинутого, конечно) совсем не та, что у рядового математика или представителя любой другой "классической" науки (физика, конечно, первым делом приходит в голову). Не обладая подобной системой мышления, человек просто не сможет создавать эффективно работающих и развивающихся программ. В математике, согласитесь, форма записи решения не так уж важна (конечно, хотелось бы, чтобы оно было лаконичнным, красивым и т.п.) - здесь главное результат (либо он есть - задача решена, теорема доказана, либо - нет; качество решения может лишь служить показателем математической зрелости и/или таланта). При создании современных крупных программных комплексов именно форма выходит на первый план - от нее зачастую зависит выживаемость проекта сегодня и в будущем (поэтому так часто можно услышать слова рефакторинг, разработка через тестирование и т.п.).
Все это приводит к мысли о том, что программист и математик - это не одно и то же. Что нельзя, хорошо зная одно, быть уверенным в другом. Традиция же, связанная с получением работы программиста выпускниками "фундаментальных" направлений (особенно в столицах), связана прежде всего с высокой степенью подготовленности (как по фундаментальным, так и по прикладным аспектам) таких выпускников по сравнению даже с окончившими профильные направления обучения (как это ни парадоксально). Впрочем, выпускники столичных вузов ценятся не только в программистской среде...

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение27.05.2009, 00:59 
Аватара пользователя


28/02/09
19
Евпатория
Смотря что разрабатывать, естественно, если формы с кнопочками делать, то не нужны, однако реально встают задачи, поэтому нужно знать основы, хотя бы для того чтобы знать где искать.
Цитата:
Логика, теория графов, автоматом, ТАУ, лямбда-исчисления, рекурсия, разработка, анализ и проектирование алгоритмов, теория кодов, функции и матрицы, деревья, сети, алгебра (имею ввиду не ту, что в школе), комбинаторика, вероятность, теория множеств, чисел и т.д. и т.п.

Всё зависит от языка, от приложения.
Графы безусловно - в системном программировании, например в приложениях работы с сетью, это просто букварь. Алгоритмы - безусловно в системном и прикладном программировании, потому что инструментов не хватает, иногда приходиться всё делать самому. Лямда-исчисления - это уже факт, который имеется в C# и в др. языках, не быть знакомым с основами уже не серьезно.
Теория кодирования - вперёд в криптографию, архивация, конвертирование и т.д. - безусловно данные типы приложений нужны. Деревья - к теории графов.
Комбинаторика - реально нужна, например может потребоваться генерировать полный перебор значений, например я давно делал такой перебор, чтобы пройти уровень в игре "Таинственный остров". Уж логика никак не поддавалась, пришлось программно генерировать все комбинации, в итоге так и не получилось пройти, по видимому из-за неверного комбинаторного алгоритма.
Некоторые предметы очень важны, для других достаточно знать основы и где искать информацию. Для серьёзных приложений нужна соответствующая подготовка.

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

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение27.05.2009, 07:49 
Аватара пользователя


19/05/09
53
Москва
worm2, спасибо за чёткий и развёрнутый ответ. :)
А с формулировкой того, что эти инструменты изначально были созданы для математиков, как сказано в посл. абзаце, я вообще столкнулся впервые, однако мысль сильная. :)

И ещё, конкретно подразумевается под основами логики?
Только логические операции, условные высказывания, таблицы истинности и упрощение лог.выражений (как мне кажется, для практики именно этого из логики и достаточно), или в том числе какие-нибудь дополнительные понятия вроде аксиоматические систем, умозаключений и предикатов тоже нужны?

Спасибо также за примеры. :)

AlexDem, ух... Что есть программист - это вообще отдельный разговор, причём очень часто перерастающий в многостраничный флуд чуть ли не из разряда "какой язык круче". :)
А вообще, конечно, это действительно два разных понятия, которые, к сожалению, очень многие не различают в принципе, отчего считают, что программирование - тривиальная задача. Пример тому - многие школьники, научившиеся делать ввод/вывод в паскале, которым потом кажется, что море по колено и вообще ничего сложного в программировании нет (ну как же, конечно! Ведь всё есть, по сути, I/O).
Впрочем, поговорка "чем меньше знаем мы, тем кажется, что больше" работала, работает, и, к сожалению, довольно долго ещё будет работать.

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

Что же, получается, чистый кодер умеет? Выкликивать мышкой GUI и ставить ему на ивенты скопированный из сети код? Не лучший, на мой взгляд, вариант...
Тем более, как уже сказал delphiec, не всегда код в сети оказывается достаточного качества.

EtCetera, в общем-то согласен. Первыми программистами были чистые математики, но и задачи были чисто математические, отсюда и конфуз "математик - идеальный программист", хотя на деле программист - это совершенно другая специальность, но в которой всё же нужна математическая грамотность. Никто же не говорит, что идеальнейший физик или экономист - математик, хотя первые двое тоже оперирует множеством математических понятий. :) И всё же математик по разуму как физику, так и программисту ближе, чем, скажем, филолог или юрист.
Цитата:
ситуация, при которой математика и программирование все больше расходятся друг от друга

Как сказать... Они не столько расходятся, сколько над уже существующими методами программирования нарастают всё новые и новые слои надстроек. Когда-то, например, над языками ассемблера выросло структурное кодирование, а над ним однажды - объектно-ориентированное.
Так что в принципе она осталась, только мы её не так отчётливо видим. :)
Вспоминается недавний конфуз... Знакомый, работающий с JavaScript, попросил моей помощи - ему надо было отсортировать небольшой массив, который, скорее всего, уже будет частично упорядочен. Ну, первое что мне пришло в голову, коли он маленький и частично упорядоченный, это, разумеется, сортировка вставками. Начал я ему объяснять...
Потом оба долго смеялись, когда оказалось, что в JS есть встроенная функция sort(), правда она реализует не самый эффективный в данном случае алгоритм. :)
Был ещё один похожий случай, когда я писал парсер ini-файлов на php, а потом с невероятным ужасом обнаружил, что в языке есть встроенная функция parse_ini_file() и долго-долго ругался на впустую совершённую работу... Вот примерно в этом и заключается расхождения программирования от математики - в абстракциях парадигм и в том, что большая часть "стандартных" задач, не сверхтребовательных к производительности, уже реализованы в той или иной библиотеке.
Цитата:
Таким образом, система мышления у программиста (продвинутого, конечно) совсем не та, что у математика

Да, согласен. У хорошего программиста ещё должно и быть и какое-то эстетическое чувство, чувство стиля, так как написать код - это мало, надо ещё его поддерживать и развивать. А как его будешь улучшать, если архитектура изначально спроектирована так, что чтобы хоть что-то добавить приходится перелопачивать ровно треть, а то и половину, кода? И здесь как раз очень помогает в том числе и умение правильно абстрагировать и разделять вещи по каким-то схожим характеристикам.
Совсем недавно я видел код примерно на 1000 строк, где все переменные были названы a, b, c, ab, adfg, asdf (и это не названия переменных, содержащих длины и площади фигур) и так далее, а также не было ни одного отступа, хотя код реализовывал какой-то сложный мат. метод...
Вопрос - как долго кто-то, кроме самого автора (да и он тоже через 3-4 месяца), будет разбираться в этом коде и делать его понятным хотя бы специалисту в данной области? Увы, примерно 1/2-3/4 времени, которое квалифицированному читающему понадобилось бы чтобы написать эквивалентный, но читаемый код.
Словом, для промышленного программирования только математики действительно недостаточно хотя бы только из-за того, что на рынке доминирует парадигма ООП и всего лишь написать код - мало.
Системное программирование, в свою очередь, более близко к математике, так как оно ближе и к аппаратуре.
Вот именно поэтому я с вами абсолютно согласен. :) И ваше мнение не должно быть скромным - вполне похоже, что вы по профессии (бывшей али текущей) и есть программист, если оценивать по сказанному вами. :)

Цитата:
Смотря что разрабатывать, естественно, если формы с кнопочками делать, то не нужны

Прикол в том, что ~70% разработчиков только этим и занимаются, на более низком уровне всего лишь подключая чужие библиотеки к этим окошкам и кнопочкам. :)
Да и оно неудивительно - очень многим нынешним программистам работодатель ставит задачи из разряда "клонировать 1С специально для нашей фирмы", а тут, конечно же, уже есть наработанная база, состоявшиеся методики, технологии и удобные библиотеки. Вывод очевиден.

Цитата:
например я давно делал такой перебор, чтобы пройти уровень в игре "Таинственный остров"

Какая знакомая ситуация! :) Где-то 2/3 месяца назад факт того, что я не могу проходить игру "пятнашки" за приемлемое время, если не начинаю думать, меня так оскорбил, что я взялся писать программу для решения этой задачи методом "грубого подбора". :)

delphiec, вроде как-то так получается, что основная нужда программистов в математике находится в области системного программирования - компиляторов, операционных систем, работы с оборудованием, сетью и так далее, а для прикладного программирования достаточно основ?

Забыл сказать: сейчас же вроде как развивается так называемые параллельные вычисления, многоядерные процессоры и т.д. А что по этому поводу? Ведь в ближайшее время не предвидится сильно большой простоты в этом вопросе.

 Профиль  
                  
 
 Re: Нужна ли дискретная математика программисту?
Сообщение27.05.2009, 13:17 
Заслуженный участник
Аватара пользователя


01/08/06
3054
Уфа
Mixo123 в сообщении #217502 писал(а):
И ещё, конкретно подразумевается под основами логики?
Только логические операции, условные высказывания, таблицы истинности и упрощение лог.выражений (как мне кажется, для практики именно этого из логики и достаточно)
Да. Во всяком случае, мне из "сложной" логики пока ничего не понадобилось.

Mixo123 в сообщении #217502 писал(а):
Забыл сказать: сейчас же вроде как развивается так называемые параллельные вычисления, многоядерные процессоры и т.д. А что по этому поводу? Ведь в ближайшее время не предвидится сильно большой простоты в этом вопросе.
Вы правы. При исследовании т.н. параллельных вычислений математика используется весьма изощрённая, вроде "сложной" логики, теории типов, теории категорий и т.п. Вот, например, почитайте: http://antilamer.livejournal.com/268963.html
Правда, это касается именно теоретических исследований. На практике строго доказать, что тот или иной параллельный алгоритм корректен (а это очень актуальная задача), весьма непросто. В основном народ пишет как бог на душу положит, методом проб и ошибок, плача и колясь, но продолжая жрать кактус :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.

Модератор: Модераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group