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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Такие дела.

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

Отправить комментарий