среда, 13 января 2010 г.

[comp.prog.flame] Развернутый ответ CrystaX в споре “программирование vs математика”

Начал писать нижеследующий текст как ответ на комментарий CrystaX в предыдущей заметке. Но, поскольку объем стал получаться слишком большим для комментария, решил вынести в отдельную заметку.

Итак, CrystaX пишет:

Столько споров - и все ни о чем... Просто математика (по определению Дейкстры) - это искусство и наука эффективных рассуждений. А "множества R", "для каждого i", "подмножество элементов m, таких, что..." - это частности. Отчего такая узость взглядов?

Про узость взглядов не скажу, а вот про причины, которые толкнули меня на написание предшествующей заметки могу.

Давным-давно, учась в универе, часто приходилось слышать от преподавателей-математиков (особенно старой школы), что программирование – это простое нажимание кнопок, что этому даже обезъяну научить можно, а вот математика – это совсем другое дело. И что без знания математики нам, программистам, никуда. Поначалу это было обидно слышать, мы пытались спорить. Потом привыкли. Потом я вообще практически не встречался с такой точкой зрения. Мне казалось очевидным, что повседневное программирование – это дисциплина, с математикой почти не связанная.

И тем удивительнее было увидеть веру в то, что математика – это основа программирования. И что математики не могут не программировать. Поскольку, опять же, программирование – это часть математики.

Поэтому мне и захотелось громко сказать: “Эй, посмотрите на меня. Я нифига не математик, но нормально программирую!” Я думал, что такой пример будет достаточным для опровержения вышеупомянутых утверждений.

В споре о таких вещах я бы выделил две составляющие – отдельно вопрос о том, насколько программирование является разделом математики и отдельно вопрос о том, насколько математическое мышление (не)помогает в программировании.

Первый вопрос, о программировании как подразделе математики, выглядит очевидным (на первый взгляд). Поскольку даже “полнота по Тьюрингу” – это математическое понятие, то, вроде бы, все понятно. Мол да, математика находится в основе программирования и, соответственно, программирование – это часть математики.

Но с другой стороны, какие разделы математики и какой математический аппарат используется, скажем, при написании ТЗ на разработку какой-то программы? Когда мы беседуем с заказчиком и пытаемся выяснить (угадать), что ему действительно нужно и в каком порядке. Когда мы разбиваем задачу на части и решаем, какому разработчику какую часть можно поручить. Когда мы пытаемся объяснить разработчику, что именно он должен делать и когда мы пытаемся контролировать ход его работы. Когда мы оцениваем полученную программу по таким неформальным критериям, как:

  • соблюдение стандартов кодирования в исходном тексте;
  • понятность кода;
  • степень привязки к конкретной платформе и возможные последствия от этого;
  • степень зависимости от сторонних компонентов и перспективы развития этих сторонних компонентов;
  • предположительные затраты на доработку;
  • предположительная сложность найма и/или сложность передачи проекта на сопровождение новым разработчикам.

Я думаю, что во всех этих вещах математика используется, в лучшем случае, на уровне школьной арифметики. И гораздо большую роль играют приемы из других областей – от психологии до литературы.

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

А вот второй вопрос, на счет математического мышления, сложнее. Я не знаю, что такое “математическое мышление” в общепринятом смысле (сказывается дефицит банальной эрудиции). По мне это способность человека выполнять манипуляции над абстрактными символами в соответствии с абстрактными законами. Проще говоря – манипулировать цифрами на бумаге.

Тут, по-моему, очевидно, что программисту необходимо математическое мышление. Поскольку программа – это так же абстрактные символы, которыми нужно манипулировать по определенным законам. Но весь вопрос в глубине/широте/уровне этого мышления. С моей точки зрения, уровень математического мышления у программиста должен быть ниже, чем у математика. Именно так: должен быть ниже. И компенсироваться это должно другими видами мышления – образного, литературного и даже художественного (если такое вообще есть).

Это и служит для меня объяснением того факта, что далеко не все математики хорошо программируют – их математическое мышление, например, доминирует над чувством вкуса (неудобоваримые имена переменных и функций в коде) или способностями последовательно описывать свои мысли в виде текста (плохие комментарии в коде и плохая сопроводительная документация). С другой стороны, низкий уровень математического мышления не позволяет далеко продвинуться в математике, что и видно на моем примере. (Возможно, здесь сказывается соотношение между “левосторонним” и “правосторонним” мышлением, однако в этой области я совсем не копенгаген).

Такие дела.

Еще добавлю, что пока писал этот текст, мне стало понятно, что я жалею, что меня учили программированию именно математики. Нас прессовали математикой и только математикой. Жалко, что не было курсов, на которых бы учили связно записывать свои мысли (кажется, Алан Голуб где-то об этом писал). И что не было курсов, посвященных психологии и взаимоотношениям между людьми в проектных командах.

12 комментариев:

Quaker комментирует...

Про математику и программирование недавно появилась статья Страуструпа, почитать перевод которой можно здесь:
_http://dbarashev.habrahabr.ru/blog/80623/
Точнее, там не только про математику, но и про обучение программированию в вузах.

eao197 комментирует...

Я начал читать ее на английском, когда ссылка появилась на RSDN в Философии программирования. Думаю, что в ближайшее время разрожусь отдельной заметкой об обучении программированию. Давно хотел, а тут такой повод подвернулся.

CrystaX комментирует...

Во-первых, спасибо за внимание к моей скромной персоне.

Во-вторых, причины примерно понятны, но это и было сутью моего вопроса - "отчего такая узость взглядов?"
Еще раз. Математика - это искусство и наука _эффективных_ рассуждений. Конкретные выражения этих рассуждений в виде формул, теорем, специфических теорем и т.д. - это частности. Суть — именно в типе мышления. Программирование без математического мышления — невозможно. Просто потому, что такой тип мышления необходим для максимально точного и четкого представления всех деталей. В быту часто сталкиваешься с тем, что просьба об уточнении какого либо высказывания воспринимается как аггрессия. Но не в случае, если ты говоришь с программистом или человеком иной специальности, требующей математического склада ума. Т.к. в этом случае просьба об уточнении воспринимается очень естественно. В этом и есть коренное отличие — максимальное внимание к деталям. Отсюда и эффективность рассуждений.

Касательно уровня мат. знаний, необходимых при составлении ТЗ, соблюдении стандартов кодирования и прочих занятий, необходимых в производственном программировании. Человек с туманом в голове, неспособный к четким формулировкам, вряд ли будет хорошим программистом (я лично уверен в обратном). Мозг, как и тело, нуждается в тренировке. И математика — именно такая тренировка для ума, как тренажеры — для тела. Я более чем уверен, что человек, освоивший только арифметику и остановившийся на этом, никогда не будет успешным программистом (даже если ничего сверх этого уровня в реальной работе ему не понадобится). И если Вы, оглядываясь назад, видите, что «математический высший пилотаж» вам ни разу не потребовался, не следует думать, что он и не был нужен для того, чтоб стать успешным программистом. That's it.

eao197 комментирует...

2CrystaX:

>Математика - это искусство и наука _эффективных_ рассуждений.

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

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

И как раз такая высокая степень отвлечения от реальности и погружения в "чистые абстракции", имхо, мешает математикам программировать.

>И математика — именно такая тренировка для ума, как тренажеры — для тела.

Абсолютно согласен. Впрочем, аналогичной тренировкой может служить и дедукция и упражнения соченительстве (попробуйте, например, выразить свои мысли наиболее лаконичным способом, не теряя информативности, понятности и выразительности). Просто разные типы тренировки развивают разные извилины.

>И если Вы, оглядываясь назад, видите, что «математический высший пилотаж» вам ни разу не потребовался, не следует думать, что он и не был нужен для того, чтоб стать успешным программистом.

Ну я, как раз, уверен, что математика весьма сильно повлияла на мои способности программиста. Но в моем случае по другому просто и быть не могло. Однако, практика показывает, что хорошими программистами становятся и лингвисты, и спортсмены, и врачи.

PS. На RSDN, помнится, мы на "ты" общались. Предлагаю не прекращать эту традицию. А то обращение на "Вы" уж слишком официально. :beer:

CrystaX комментирует...
Этот комментарий был удален автором.
CrystaX комментирует...

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

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

> Для меня как раз отличие математического мышления от остального заключается в том, насколько хорошо человек может оперировать абстрактными понятиями по абстрактным законам. Без оглядки на окружающую реальность.

Безусловно, это необходимое условие для занятий математикой. Но, с другой стороны, много ли связи с реальностью в понятии «число»? Мы познакомились с этим понятием в детстве, узнали основные законы, по которым им можно оперировать и теперь нам кажется, что это абсолютно естественное и не требующее объяснений явление. Таким образом, возможность оперирования абстракциями — это общее свойство человеческого мозга. Просто у одних оно изначально выражено ярче, у других — хуже. Но в любом случае, без тренировки ничего не получится.

> И как раз такая высокая степень отвлечения от реальности и погружения в "чистые абстракции", имхо, мешает математикам программировать.

У меня складывается впечатление, что, говоря о математиках, ты имеешь в виду классический образ «сумасшедшего ученого». Безусловно, каждому из нас присуща своя степень безумия, но неужели не доводилось встречаться с более-менее «нормальными» математиками?

> Однако, практика показывает, что хорошими программистами становятся и лингвисты, и спортсмены, и врачи.

Только если у них есть склонность к математически точным размышлениям (кто ясно мыслит — ясно излагает). Программирование неточностей не прощает.

> PS. На RSDN, помнится, мы на "ты" общались. Предлагаю не прекращать эту традицию. А то обращение на "Вы" уж слишком официально. :beer:

Уже. :)

Rustam комментирует...

Я согласен с Евгением, программирование и математика требуют разных хотя и пересекающихся способностей.

Ну и само математическое мышление может быть весьма различным, раз доходит до таких например крайностей http://ru.wikipedia.org/wiki/Конструктивизм_(математика) и http://ru.wikipedia.org/wiki/Интуиционизм

eao197 комментирует...

>В программировании такие неверные выводы, запечатленные в коде, называются багами. Очевидно, что это - не эффективность.

Математики так же частенько ошибаются. Помню, бывали лекции по матану, когда мы зачеркивали целые страницы вывода формул из-за ошибки преподавателя где-то в самом начале.

Просто ошибки в математических выкладках и программах по разному проявляются. В программе -- сами по себе, в расчетах через перепроверки.

>но неужели не доводилось встречаться с более-менее «нормальными» математиками?

С разными доводилось встречаться, я же четыре года в своем универе в НИС-е отработал, и три года из них в аспирантуре оттрубил.

Большинство было такими же посредственными специалистами, как большинство программистов. Самостоятельно мало что могли сделать, работали под присмотром своих научных руководителей.

Один профессор мне по пьянке рассказывал, что больше всего "безумных" математиков как раз в столице оседает. Это очень талантливые люди, но не совсем от мира сего, и увлечены какими-нибудь идеями-фикс. Чем более провинциональный ВУЗ, тем нормальнее в нем люди :)

>Только если у них есть склонность к математически точным размышлениям (кто ясно мыслит — ясно излагает).

Ну вот, этого я и боялся :) Если человек умеет логически мыслить, значит он обладает математическим мышлением ;)

Кстати, далеко не все очень умные люди, с которыми мне доводилось встречаться, могли связно и четко описывать свои мысли словами. В виде программы или формул -- запросто. А вот словами...

CrystaX комментирует...

> Математики так же частенько ошибаются.

Все ошибаются. Однако многие ошибаются всегда. Другие же (благодаря умственным тренировкам в том числе) - значительно реже.

> Большинство было такими же посредственными специалистами, как большинство программистов

Ну вот, посредственность == нормальность. Ну, а как-нибудь иначе, чтоб талантливость не была обязательно связана с асоциальностью?

> Если человек умеет логически мыслить, значит он обладает математическим мышлением ;)

Exactly. Это следует из самих определений логики и математики.

eao197 комментирует...

>Все ошибаются. Однако многие ошибаются всегда. Другие же (благодаря умственным тренировкам в том числе) - значительно реже.

Ну уж как ошибаются программисты, так много вообще мало кто ошибается ;)

>Ну, а как-нибудь иначе, чтоб талантливость не была обязательно связана с асоциальностью?

Сильно сомневаюсь. Талант -- это же отклонение от нормы (т.е. от большинства, т.е. от посредственности). В развитие таланта нужно вложить очень много труда. А это время и силы, которые могли быть вложены в развитие социальных связей.

Но бывает по всякому.

>Exactly. Это следует из самих определений логики и математики.

Тут есть какое-то противоречие. Поскольку математическое мышление вроде как присутствует, а понимание математики -- отсутствует ;) (на моем примере хотя бы)

Надо, наверное, вводить степень математичности мышления :)

Игорь Говоров комментирует...

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

Это не математическое мышление, это логика. Да, я в курсе что матлогика это часть математики (а ещё логика это часть философии кстати). Лично знаю людей, которые ненавидят и плохо понимают математику, но у которых замечательно с логикой.
А внимание к деталям - это внимание к деталям, никакой математики.
Так что давайте называть вещи своими именами, а не теми, которыми хочется.

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

bsivko комментирует...

Одно из мнений на тему "программирование vs математика".