Насколько программист должен знать математику?

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

    Для начала следует заметить, что математика в нашей жизни присутствует практически везде. Физика без математики немыслима — здесь, я думаю, всё ясно, и пояснять нет надобности. Химия тоже. В биологии влияние математики заметно меньше, но и там она присутствует (взять, например, растительные структуры, многие из них — квазифракталы). Музыку можно представлять в математическом виде. Немыслим без математики дизайн — обязательно присутствует геометрия — раздел математики. Да что там — даже историку и то нужна математика (хотя бы для того, чтобы даты считать).

    Правда, есть здесь одно «но»: а что вообще представляет собой математика? Вопрос вовсе не праздный, ибо сам вопрос «насколько нужно знать математику» довольно расплывчатый. Математика представляет собой комплекс наук: сам фундамент — арифметика, затем идёт алгебра, элементарная геометрия, мат. анализ, аналитическая геометрия. Высшие её разделы — дискретная математика, булева алгебра, топология, теория чисел (высшая арифметика) и многие другие разделы, а также теория вероятности и статистика. Теперь уже возникает более чёткий вопрос: что из этого надо знать программисту?

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

    А вот дальше всё немного сложнее — те разделы математики, которые нужны программисту, определяются спецификацией того, что он пишет. Если написать надо музыкальную студию а-ля Cubase — обязательно нужно знать физику звука и разделы математики, связанные с ней. Если же речь идёт о графической студии — профессионально знать геометрию (а если студия трёхмерная, то также топологию и матричную алгебру). А если речь идёт о трёхмерной игре, то надо знать векторную алгебру и вдобавок ньютоновскую механику.

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

    Так нужна она или нет?


    А я вообще так скажу: если, скажем, в античные времена программирование уже существовало бы, программист того времени не просто хорошо знал бы математику. Такой «программист» также умел бы боксировать, фехтовать, устраивать скачки на лошадях, мореходствовать, мастерить, говорить на восьми иностранных языках, сочинять фуги и токкаты, знал, что такое гексаметр, прекрасно писал (с ударением на А) картины и много чего ещё. Причём иногда он делал это одновременно, да с такой скоростью, что любой современный «интел кор» тихо покуривает в сторонке.
    Поделиться публикацией

    Комментарии 30

      +1

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


      если, скажем, в античные времена программирование уже существовало бы

      Без всякого если, программирование существовало всегда с момента появления "homo sapiens" (человека разумноо). Почитайте великолепную книгу "От абака до компьютера", многого интересного откроете для себя.

        0
        Без всякого если, программирование существовало всегда с момента появления «homo sapiens» (человека разумного).
        Код одной из первых программ:)
        Заголовок спойлера
        "

          0

          Замечательный пример!

            +1
            Вовсе не факт, что это — одна из первых программ. Это — одна из популярных программ на момент изобретения данного способа бэкапа информации.
              0
              Одна из интерпретаций этих рисунков, по крайней мере части, символическая, или ритуальная. Первобытные охотники как-бы проигрывали процесс охоты, настраивались на нее, призывая духов на удачу. Так, что это действительно напоминает некий код программы действий.

              Что касается необходимости математики для программистов, то есть области, где без ее знания, из самых разных разделов, никак не обойтись. Например, в ПО связанным с постановкой экспериментов в научных исследования, и обработки их результатов. Более того, в некоторых случаях приходится разрабатывать, или развивать существующие мат. методы, чтобы решить возникающие задачи, если имеющихся методов не достаточно для решения.
            0

            Исчисление предикатов? Обязательно? Вы точно знаете, что это такое? Может за многие годы я подзабыл. Расскажите как вы его используете в работе?

              –2
              Логика первого порядка Логика первого порядка, называемая иногда логикой или исчислением предикатов — формальное исчисление, допускающее высказывания относительно переменных, фиксированных функций и предикатов.

              Исчисление предикатов расширяет логику высказываний. В свою очередь является частным случаем логики высших порядков.


              Если вы подзабыли, значит давно не программировали. А без логики какое программирование. Кодирование в лучшем случае.

                +1
                Непосредственно first order logic я использую только тогда, когда пишу на хаскеле или идрисе и рассуждаю об экзистенциальных и universally quantified типах, о сколемовских нормальных формах (но это скорее деталь реализации) и прочих изоморфизмах Карри-Говарда.

                Для обычного программирования это все не нужно, только если вы не занимаетесь разработкой пруверов.
                  0

                  Это мне напоминает проектирование реляционной базы данных без понимания того, что такое третья нормальная форма.

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

                    Либо у нас очень разные понятия о том, что такое «знать». Для меня знать FOL — это понимать структуру выводов в этой логике, хотя бы в общих чертах понимать, почему стандартная система аксиом полна, уметь в элиминацию кванторов и понимать, как это связано с разрешимостью теории, суметь сыграть в игру Эренфойхта.

                    Я не думаю, что для программирования важны вопросы вроде такого, такого или такого.
                      –3

                      Я думаю для программиста не зазорно быть знакомым с трудами Никола́ Бурбаки́.

                        0
                        Безусловно. Но я бы не сказал, что это жуть как нужно для работы.
                          0

                          Согласен, тем более работа работе рознь, то бишь программирование

                            0
                            Ну, про разные его виды я уже писал выше. Хотя я и не на хаскеле всякие околоматанные вещи пишу, статистика там всякая, машинное обучение, пигдата, распределённая ерунда.
                              0
                              Хотя я и не на хаскеле всякие околоматанные вещи пишу

                              И на чем пишется машинное обучение?

                                –1
                                На С++. Иначе по производительности и памяти не оч.
                                  0

                                  Машинное обучение писать на C++? Чему же машинный человек обучает? На скриптах быстрей и эффективней писать.
                                  Проблема производительности и памяти — давно не слыхал. Есть проблема денег, это другое дело.

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

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

                                    По производительности и памяти — я могу взять в руки vtune и собственный здравый смысл и добиться того, чтобы случайный лес по паре десятков миллионов семплов с данными суммарно гигабайт на сто-двести строился на одной машине за минуту-две, например. И это даже иногда оказывается полезно.
                                      0
                                      Если же вы сами реализуете какой-то алгоритм с нуля (например, потому, что его до вас ещё никто не сделал), то на скриптах далеко не быстрей и не эффективнее.

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

                                        +1
                                        Это если она масштабируется хорошо на меньшие объёмы данных.

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

                                          Вот и пришли к консенсусу.

                                            0
                                            Почти :)

                                            На традиционных скриптовых языках я их тоже писать не буду, возьму что-нибудь компилируемое и с сильной системой типов. Хаскель тот же.
                                              0

                                              А для меня из скриптов так луше tcl, а для обучения еще и плюс tk, да еше классно интегрируется с C/C++ нетУ.

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


                        Конечно можно!
                        — Разработка систем моделирования и проектирования в машиностроении.
                        — Программирование всяких спутников и ракет.
                        — Занятия всевозможными системами распознавания изображения и звука. Обработки мультимедийной информации.
                        — Тонны всяческих разработок для естественных наук.
                        — Хранение и обработка данных в хайлоаде.
                        Тонна всего еще!

                        И это все, с чем сталкивается каждый разработчик ежедневно!

                        На самом деле областей множество. В том числе и тех, где не требуется знание математики выше уровня средних классов школы. Или мы фуллстек веберов, которые сайты пишут за программистов считать не будем? Разные автоматизаторы так же символописатели?

                        P.S. Не примите в укор — это сообщение я писал в поддержку вашей мысли, но решил ответить именно вам :)
                          0
                          Я довольно плотно ковыряю четвёртое и пятое, а также совсем чуть-чуть ковырял третье и как-то разок забавлялся моделированием нестационарных тепловых потоков в трёхмерном пространстве на тему первого, и матлогика там не сказать чтоб нужна, на мой взгляд.
                        0
                        Ваш коммент напомнил мне CRM в одной банковской организации, которую «пионеры» пытались делать на основе MongoDB…
                      +1
                      Ммм за более чем 10 лет работы ни разу не потребовалось исчисление предикатов. ЧЯДНТ?
                        –1

                        Вам повезло. Столяру с 40-летним стажем тоже они не потребовались ни разу.

                  +1

                  Да, если бы не этот способ бэкапа, то не известно где бы еще были! И популярность этой программы не падает!

                    +4
                    Для большинства задач большинства программистов достаточно знать самые начала арифметики и алгебры (столбиком уметь умножать необязательно) и азы булевой алгебры. И то, и другое совсем не нужно знать на академическом уровне, достаточного «бытового» понимания. Гораздо важнее высшей математики знание практической компьютерной «арифметики»: представление числовых данных в двоичном виде, особенности и ограничения различных типов представлений, понимания какие операции выполняются (с точки зрения здравого смысла) процессором непосредственно, а какие будут вызывать подпрограммы вычислений точных или приближенных, почему не следует по умолчанию для точных значений типа денежных сумм использовать типы с плавающей точкой, что такое переполнение и потеря значимых разрядов, и т.д., и т.п.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое