Pull to refresh

Comments 39

А я где-то слышал, что высшая математика программисту не нужна.
Вообще говоря, это то, что входит в понятие прикладной математики, но без высшей, конечно, тоже не обходится
А я вот нигде про высшую математику не слышал. Математический анализ — слышал, численные методы — слышал, всякие там дифференциальные уравнения — и про них слышал, а «высшая математика» — что за зверь такой?
Вот как раз математический анализ, дифференциальные уравнения и тому подобное попадают под термин «высшая математика».

Вообще, так сложилось, что под это определение относят всю математику, изучаемую в ВУЗах.
> всю математику, изучаемую в ВУЗах

В заборостроительных, что ли? Ну да, откуда выпускнику заборостроительного знать о существовании какой-то еще математики, помимо «изучаемой в ВУЗах».
Не всю. У нас была кафедра элементарной математики.
Причём тут пед? Мы — инженеры.
Я часто слашала, как студенты экономисты, психологи итд (абсолютно не хочу их обидеть) с многозначительностью называли свой курс высшей математики «вышка».
У меня же на радиофизическом факультете сей предмет называли МатАн.
Ну вообще говоря в «вышку» помимо матана много чего входит. Та же «линейка», которой вы пользуетесь, у примеру. Я тоже, к сожалению, пользуюсь математикой не так много, как хотелось бы, да и так себе я математик, если честно. Но есть области где математика используется активно. САПР например или тот же геймдев. Ну и одной «вышкой» математика тоже не ограничивается.
Честно говоря, многим программистам математика, пардон, не нужна. К примеру возьмём Web-разработчиков (да простят они меня, если я их нечаянно обидела).
Я, как инженер-программист, пользуюсь математикой, к сожалению, не так много, как хотелось бы (линейная алгебра в основном).
Но поскольку мне всю сознательную жизнь внушали, что математика важна — я продолжаю в это верить.
Вопрос: чем сейчас занимаются все эти монстры (в самом хорошем смысле это слова), преодолевшие огромные проходной бал на специальность «Прикладная математика», «МатМех», «МехМат»? Уверенна, что чем-то полезным.
Хотелось бы, конечно, увидеть статью «Я — математик-пограммист и математику применяю так-то». Может и есть, честно — не искала.
Граница водораздела очень проста.
Программисты (а скорее кодеры), которые в своей работе используют кирпичи из готовых библиотек/фреймворков и склеивают их тонким слоем собственного кода-раствора — в математике действительно не нуждаются.
Как только вам нужно сделать что-то новое и залезть в те области, которые до того были под капотом — математика вылазит из всех щелей, даже тех, откуда казалось бы не ждали. Даже в вебе.
Я например, писал внешне несложную визуализацию данных — считал двойные итегралы для корректного учета интенсивности цветов, ну а про матрицы вы и сами в курсе.
Выглядит как сравнение теплого с мягким, а не «граница водораздела», кмк.
Где-то влоб можно встретить злую математику в полный рост (криптография та же, моделирование физических процессов), а где-то хватит «вышмата» с гуманитарного факультета (дизайн с интегралами). На том же прикладном уровне «новизны».
Абсолютно вписывается и крипотография, и все остальное. Одно дело, если я пишу что-то в духе import std/crypto… hash(password)… encrypt(message)… — мне достаточно знания терминологии и поверхностного понимания что куда подставлять. И совсем другое, если нужно нечто новое и/или нестандартное — когда лезешь под капот, сразу понимаешь, как всё непросто на самом деле.
мне достаточно знания терминологии и поверхностного понимания что куда подставлять

Скорее это необходимость, чем достаточность. Один из самых ярких показателей квалификации программиста — это знание его инструментов именно «под капотом». Что конечно же не мешает ими пользоваться пользуясь прелестями абстракции и готового кода.

нечто новое и/или нестандартное — когда лезешь под капот

Если есть «капот», то это уже не новое и нестандартное. Например, работа с матрицами из вашего примера. Неужто вы велосипедили операции с ними, а не взяли готовые алгоритмы?
Есть очень существенная разница между взять готовую библиотеку и готовый алгоритм. Когда реализуешь алгоритм (даже, казалось бы, хорошо известный и понятный) самостоятельно — всплывает много интересных нюансов, о которых ранее просто не задумывался.
Академическую ценность переписывания готовых алгоритмов сложно переоценить, но едва ли это можно назвать хорошей практикой для профессионального программирования.
На колу мочало, начинай всё сначала.
Я и говорю, что когда стандартная реализация полностью устраивает — используют её. Но если по каким-либо причинам готовые решения не подходят или вовсе отсутствуют, приходится сооружать что-то своё.
И уж коль даже самостоятельно реализовать хорошо известное оказывается не каждому по зубам, то написание чего-то действительно нового ещё сложнее в разы.
Это бинарная логика — да/нет, черное/белое.

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

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


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

Надо сказать, математические библиотеки — это специфические такие кирпичи, с характером.
Там, можно сказать, общее правило — какой функцией ни пользуешься, на уровне алгоритма принцип работы нужно знать. Иначе на каких-нибудь входных данных она сломается, а ты даже не будешь понимать почему.
А иногда вообще лучше свой велосипед написать от греха подальше, чем пользоваться этими библиотеками.
Пример бага из мода Principia для Kerbal Space Program (это пишет автор, который в курсе тонкостей реализации, а для пользователя это «что происходит, всё зависло»):
Ошибка в интеграторе, используемом для предсказания траектории, вызвала небольшую потерю точности. В обычном случае это прошло бы незаметно, но в особых условиях <...> это вызвало превышение времени интегрирования траектории корабля (на один бит младшего порядка) над временем, до которого было проинтегрировано состояние солнечной системы

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

Полностью соглашусь.

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

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

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

Вы могли бы пояснить, что именно хотели донести этой фразой?

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

Словом, есть задачи, в которых она нужна, и есть в которых нет. Но математика совершенно точно не является необходимым или достаточным условием быть программистом.
Я думаю, здесь скорее обратный принцип: если ты владеешь математическим аппаратом, то скорее всего, ты в конце концов найдёшь себя на позиции, где математика нужна. Аналогично с физикой. Если же ты в процессе обучения осваивал только лишь написание кода по тьюториалам, разумеется, никто тебя за разработку физического движка или рендеринг четырёхмерной геометрии не посадит, и математика с физикой тебе никогда в жизни не пригодятся.
Таким образом, отметая для себя при обучении в ВУЗе матан и физику, вы существенно ограничиваете область применения своих знаний и скорее всего будете претендовать на те же позиции, что и выпускники колледжей.

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

Вопрос только — за чей счёт? Чудес не бывает: на то, чтобы стать специалистом в какой-то теме, нужно по меньшей мере нескольких тысяч часов, которые одними свободными от работы вечерами не нагнать.
Потом, обучение гораздо быстрее проходит при плотном общении со специалистами в соответствующей области. ВУЗ как сообщество специалистов — наиболее комфортная среда для обучения чему бы то ни было. Конечно, можно самому создать себе препятствие в виде отказа от получения образования, а потом героически его преодолеть… но зачем?
Само собой, это не отменяет необходимость постоянно самостоятельно обучаться в процессе работы, но эффективнее делать это, когда есть какая-то база. Скажем, я без проблем возьмусь на работе за программирование метода Ньютона, хотя на лекциях по численным методам мало чего о нём понял, но даже близко не подойду к криптографии, потому что на то, чтобы вникнуть в одни только основы, нужно несколько месяцев усердного обучения.
Это очень спорное утверждение. Я программист и работаю в геймдеве. За свою карьеру я несколько раз писал модули интегрирования ОДУ и мне приходилось досконально вникать в различные методы численного интегрирования и проводить собственные исследования. Про линейную алгебру и матричное исчисление даже говорить не буду, без этих навыков в геймдеве делать нечего.
Если рассматривать понятие «программист» в целом, то может быть и не нужна.

Вот, например, у нас есть аж целых 2 программиста на предприятии. Работают с «1С». Пишут всякие обработки, скрипты для создания отчетов и пр.
Вот им математика, действительно, нужна в последнюю очередь. Но один — специалист по MS SQL, а второй имеет второе высшее образование по специальности «Бухгалтерский учет и финансовый аудит».

Это я к тому, что каждому программисту (если он в самом деле программист, а не кодер) нужны знания именно в той предметной области, с которой он работает. Если это бухгалтерия, то нужны знания именно бухучета — методы, законы, акты, счета, статьи, проводки. А если экономика, то тут уже без математики не обойтись.

Так что, спорить о необходимости знания программистом математики/физики/химии/алхимии/астрологии — это бессмысленный холивар.

Но по большому счету, чтобы стать специалистом в какой-то области программирования, надо не только кодить уметь, но и разбираться в соответствующих предметных областях. Хотя бы на уровне начал.
Вы рассмотрели методы, которые хороши на равномерной сетке. Но, во-первых, не всегда имеется равномерная сетка, но интергал посчитать хочется, а во-вторых, существуют методы, которые дают безумно хороший результат при малом числе узлов (квадратура Гаусса, например)
Слова «базовые алгоритмы» в название вынесены не просто так. Я так и написал, что всё относится к интегрированию функций, которые можем вычислить по требованию, и на равномерной сетке.
Что значит «не всегда имеется равномерная сетка» — не понял, в этом контексте. Если функция табулированная, то без дополнительных предположений о существовании и ограниченности высших производных методы высоких порядков лучше и не применять, поэтому будет достаточно интерполировать функцию сплайном и его уже проинтегрировать (аналитически, конечно). Если вы о том, что для каких-то функций равномерная сетка — не лучший выбор, — то, я думаю, у кого эти функции часто встречаются, знают, какой заменой переменных интеграл можно привести к более удобному для вычисления виду.
Квадратуры Гаусса штука хорошая, но если их давать не в виде чёрного ящика «считайте функцию вот в этих точках с вот такими весами, и будет счастье», то математическое обоснование выходит за рамки «ресурса для широких кругов программистов и сочувствующих». К тому же, в книге Штёра-Булирша обращается внимание на невозможность априорной оценки нужного порядка формулы Гаусса, т.е. приходится перебирать порядки до сходимости (а предыдущие точки использовать для следующего порядка нельзя), из-за чего привлекательность по сравнению с методом Ромберга уже теряется. Итого, тоже специфическая тема, про которую те, кому она актуальна, и так должны знать из других источников.
В книгах из списка литературы можно прочитать и про гауссовы квадратуры, и про преобразование несобственных интегралов, и даже про автоматическую замену переменных для устранения особенностей на краях отрезка. Но это всё-таки продвинутые и специфические темы.
Давно ждал подобной статьи) И как статья хороша, и как шпаргалка, чтобы объяснять. Очень жду подобное на неравномерных сетках и multigrid`ах, в идеале бы еще реализации на numpy с его особенностями, было бы прекрасно)
Sign up to leave a comment.

Articles