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

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

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

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

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

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

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


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

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


  1. saipr
    29.07.2018 13:33

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


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

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


    1. phenik
      29.07.2018 15:02
      +1

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


      1. saipr
        29.07.2018 15:46

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


      1. Serge78rus
        29.07.2018 16:00

        Вовсе не факт, что это — одна из первых программ. Это — одна из популярных программ на момент изобретения данного способа бэкапа информации.


        1. phenik
          30.07.2018 05:54

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

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


    1. petuhov_k
      29.07.2018 17:47

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


      1. saipr
        29.07.2018 18:43
        -1

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

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


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


        1. 0xd34df00d
          29.07.2018 19:08
          +1

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

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


          1. saipr
            29.07.2018 20:04
            +1

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


            1. 0xd34df00d
              29.07.2018 20:27

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

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

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


              1. saipr
                29.07.2018 20:32
                -1

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


                1. 0xd34df00d
                  29.07.2018 20:35

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


                  1. saipr
                    29.07.2018 20:43

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


                    1. 0xd34df00d
                      29.07.2018 20:47

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


                      1. saipr
                        29.07.2018 20:53

                        Хотя я и не на хаскеле всякие околоматанные вещи пишу

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


                        1. 0xd34df00d
                          29.07.2018 21:00
                          -1

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


                          1. saipr
                            29.07.2018 21:14
                            -1

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


                            1. 0xd34df00d
                              29.07.2018 21:24

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

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

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


                              1. saipr
                                29.07.2018 21:47

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

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


                                1. 0xd34df00d
                                  29.07.2018 21:55

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

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


                                  1. saipr
                                    29.07.2018 21:59

                                    какой-нибудь парсер или компилятор я на них писать не буду

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


                                    1. 0xd34df00d
                                      29.07.2018 22:02

                                      Почти :)

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


                                      1. saipr
                                        29.07.2018 22:09

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


              1. ZaEzzz
                29.07.2018 20:53

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


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

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

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

                P.S. Не примите в укор — это сообщение я писал в поддержку вашей мысли, но решил ответить именно вам :)


                1. 0xd34df00d
                  29.07.2018 21:03

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


            1. AlexLeonov
              29.07.2018 20:27

              Ваш коммент напомнил мне CRM в одной банковской организации, которую «пионеры» пытались делать на основе MongoDB…


        1. Welran
          30.07.2018 14:14

          Ммм за более чем 10 лет работы ни разу не потребовалось исчисление предикатов. ЧЯДНТ?


          1. saipr
            30.07.2018 14:53

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


  1. saipr
    29.07.2018 16:14

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


  1. VolCh
    29.07.2018 21:56
    +1

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