Какая математика нужна программистам

Разбираемся с вечным вопросом.
01 июля 2016ThumbЮлия Фролова413172233

Опытные разработчики рассказывают нужны ли программисту знания математики и на какие ее разделы следует обратить внимание. Спойлер — каждому свое. Для разных типов задач нужны (или не нужны вовсе) свои разделы царицы наук. Подробнее об этом мы поговорим на бесплатном интенсиве по основам программирования.

Александр Баталов, технический директор Zavento:

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

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

Ярослав Никонов, аналитик департамента разработки программного обеспечения компании «Аэроклуб ИТ»:

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

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

Разберу пример из моего недавнего проекта в компании «Аэроклуб». Задача состояла в построении дешёвых или быстрых маршрутов из города А в город Б, используя перелёты и ж/д поездки. С одной стороны, задача выглядит довольно простой, ведь мы можем построить ориентированный граф, где вершинами являются города, а ребра — перелётом или ж/д переездом, где вес ребра — это стоимость или время. Далее можно воспользоваться алгоритмом поиска кратчайшего пути, например, алгоритмом Дейкстры. Но есть несколько сложностей:

  1. Цены не статичны и могут отличаться в зависимости от дат.
  2. Хранить данные о ценах на каждую дату за год практически невозможно (за сутки осуществляется более миллиона перелетов).
  3. Получить данные о ценах по всем направлениям на заданную дату очень долгая процедура (измеряется в 10-ах минут, и пользователь обычно не готов столько ждать).
  4. Нужен не самый дешевый маршрут, а несколько дешевых маршрутов (т.к. пользователь хочет увидеть несколько вариантов и выбрать тот, которым ему будет комфортнее добираться).

Проблема, описанная в 3 пункте, не решается известными алгоритмами быстрого поиска кратчайшего пути, так как практически все они ищут один путь, а нам необходимы несколько. На помощь в таких случаях может прийти теория графов — один из разделов дискретной математики, и хорошее логическое мышление. Проблемы под пунктами 1, 2 и 3 можно решить математической статистикой.

Поскольку мы не можем хранить довольно большой объем данных, необходимо его сократить. Каким образом можно сократить данные? Скажем, хранить только одну стоимость за сутки из города А в город Б, но при этом эта цена должна быть правдоподобной по сравнению с ценами перелетов из других городов, т.е., если цены из А в Б дешевле цен из А1 в Б1, то и единственная цена должна быть дешевле. 

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

Правильный выход при подсчете цены за сутки из пункта А в пункт Б должен быть относительным, и строиться относительно цен из других пунктов. Для таких оценок помогает математическая статистика. Построив относительные цены по разным направлениям за сутки, мы решаем проблемы пунктов 1, 2 и 3 и расставляем ровно один вес на каждое ребро, соединяющее вершины графа (города). А используя дискретную математику (теорию графов) можем построить эффективный алгоритм поиска нескольких дешевых (быстрых) маршрутов из пункта А в пункт Б.

Михаил Вайсман, CEO студии мобильной разработки Trinity Digital:

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

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

Алексей Смирнов, технический директор ИТ-компании «Нетрика»:

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

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

Николай Добровольский, вице-президент Parallels:

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

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

Подобные навыки можно получить на курсах product management, program management и других дисциплинах. Десять, двадцать, тридцать лет назад слово «программист» объединяло в себе все, что так или иначе было связано с компьютерами, системами связи, программированием и так далее. Сейчас же все очень быстро развивается. Огромное количество технологий появляются каждый день. Что-то появляется, что-то умирает достаточно быстро.

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

Правило «10 000 часов», предполагающее трансформацию специалиста из «чайника» в профессионала» через практический опыт никто не отменял. Если говорить о книгах, то, на мой взгляд, одна из интереснейших работ в области эргономики была написана Дональдом Норманом и называется «Дизайн привычных вещей» (Designer everyday things). Написанная в 1988 году, она и по сей день дает основные ответы на вопросы создания удобных вещей. 

Андрей Хромышев, старший программист-разработчик ПО компании Acronis:

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

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

Стоит отметить, что многое зависит от задач, над которыми трудится программист: кто-то программирует сигнальные процессоры, а кто-то специфическое ПО для работы с ДНК.

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

Роман Моисеенко, технический директор и сооснователь Мерката:

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

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

Павел Чистов, руководитель отдела обучения компании «Инфостарт»:

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

Для разного уровня программирования полезны свои разделы математики. Для низкоуровневого программирования, для 3D моделирования, для задаче-ориентированного программирования — будут полезны свои разделы. Кому геометрия, кому дискретная математика. К примеру, без знаний линейной алгебры и статистики невозможно программировать в области шифрования.


Даже без математики: профессия «Веб-разработчик».

Спасибо,
что читаете наш блог!
Posts popup