2,1K подписчиков

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

1,1K прочитали

Этот простой вопрос часто задают себе как начинающие программисты, так и другие люди, желающие войти в нашу профессию. Горячие головы - вчерашние выпускники школ и новоиспеченные студенты ВУЗов - хотят прямо сейчас программировать крутые программы, покорять мир, зарабатывать миллионы и миллиарды - а не зубрить нудную и скучную математику с её бесконечными примерами. Интригующая надежда красиво зайти в профессию, минуя её фундаментальные основы, манит и влечёт очень многих.

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

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

Математика и программирование - науки, тесно связанные друг с другом. Можно ли быть хорошим программистом, не зная математику? Давай разбираться!
Математика и программирование - науки, тесно связанные друг с другом. Можно ли быть хорошим программистом, не зная математику? Давай разбираться!

Такая разная наука

Начнем, пожалуй, с важного уточнения - "про какую именно математику мы говорим"? Да-да! Хотя математика это одна единая наука, разделов-то у неё великое множество. Только на википедии их около 20 по списку. Так вот штука в том, что надо как раз понимать о какой именно математике мы говорим, для чего она нужна конкретно в IT, и что вообще из себя представляет.

Если говорить о российских ВУЗах и колледжах, то самые часто изучаемые разделы это пожалуй: (1) математический анализ, (2) дискретная математика, (3) математическая логика, (4) теория вероятностей и математическая статистика, и наконец (5) теория алгоритмов. Именно такой набор, во всяком случае был у меня. Конечно, от одного учебного заведения к другому он может немного отличаться. Где-то, помимо основной программы, могут давать и что-то дополнительное. Но в общем случае, рельеф обучения везде примерно совпадает. Сейчас я предлагаю рассмотреть каждый раздел чуть поподробнее, и разобраться где он может применяться в прикладном программировании и информационных технологиях.

Математический анализ

Коротко говоря, это тот самый раздел, изучающий пределы, производные, интегралы. Многие из тех людей, кто изучал вышмат, наверняка вспомнят таблицы интегралов. Может быть, кто-то даже вспомнит теорему Лагранжа или теорему Коши. Это вот всё оно. Если говорить о применении, то применение в IT в целом достаточно широко. Это задачи, для решения которых может быть построена математическая модель.

Самые популярные сферы в IT, где оно может пригодиться это пожалуй data science, компьютерное зрение, криптография, моделирование. Например, популярный алгоритм A* (читается как "А звезда"). Этот алгоритм находит маршрут с наименьшей стоимостью от одной вершины (начальной) графа к другой (целевой, конечной). Если говорить простым языком, то это поиск оптимального пути из точки А в точку Б. Думаю, объяснения где это может пригодится тут излишни. Собственно, сам раздел пригодится в разработке игр (опять таки, А* например), картографических приложения и навигаторах.

Дискретная математика

Этот раздел изучает дискретные математические структуры. Проще говоря: графы, абстрактные автоматы, комбинаторика. Вот это вот всё. Этот раздел, тоже очень активно используется в IT и программировании в частности. Из примеров, самым известным практически всем будет аудиоспектр в большинстве музыкальных проигрывателей. Те самые анимации, показываемые в плеерах под музыку. В большинстве случаев, их алгоритм использует быстрые преобразования Фурье.

Математическая логика

Совсем простым языком - формализация знаний и рассуждений. Если чуть более точно, то в математической логике логические выводы исследуются посредством логических исчислений на основе математического языка. Это таблицы истинности, конъюнкции, дизъюнкции и т.д. На мой взгляд, очень важный и полезный для знания любому программисту (да и IT'шнику в целом) раздел.

Самый простой пример, любая конструкция в программе вида if else then это, можно сказать, мат. логика. Есть в программировании даже такой подход, считающийся очень плохим - когда множество if вкладывают друг в друга. Получается громадина с кучей "если если если", в которой очень сложно разобраться. Так вот, в математической логике как раз есть очень полезный раздел на эту тему - он как раз учит урезать сложные и длинные логические выражения до более простых.

Теория вероятностей

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

Математическая статистика

Раздел изучает методы систематизации и использования статистических данных для научных и практических выводов. Ей, в целом, пользуется много кто ещё помимо IT'шников. Это и ученые, и социологи, и маркетологи и т.д. И конечно, почти все эти вещи сейчас автоматизируемы, а значит и IT'шники используют всю ту же статистику. Это и все те красивые графики в рекламных кабинетах, тренды и т.п.

Теория алгоритмов

Этот раздел, как можно понять по названию, изучает собственно алгоритмы и разнообразные формальные модели их представления. Тут, пожалуй, даже из одного слова "алгоритмы" можно понять значимость раздела для программистов. Ведь по сути своей, что есть программа? Алгоритм. Большинство, закончивших ВУЗ по IT направлениям связанных с программированием скорее всего знаю про машину Тьюринга. Если коротко, то это абстрактная вычислительная машина, предложенная Аланом Тьюрингом в 1936 году. По сути, всякий интуитивный алгоритм может быть реализован с помощью некоторой машины Тьюринга. Я бы сказал, что понимание этой абстрактной машины очень неплохо "закаляет" понимание алгоритмов и того, как работают программы и компьютеры в целом. Кстати, в одной из наших прошлых статей мы упоминали язык программирования Brainfuck, и он как раз тесно связанно с принципом работы машины Тьюринга.

Подводя итог, можно сказать, что математика и многие её разделы очень широко используются в IT индустрии. В повседневной жизни, пользуясь всеми современными IT благами, мы по сути так или иначе с ней сталкиваемся, пусть даже и не замечаем этого. При этом, часто это может быть совсем не та математика, к которой мы привыкли в школе. И даже более, не всегда то, что может активно использоваться в IT, могут давать и в ВУЗах. Во-первых, потому, что образовательные программы далеко не всегда совершенны и поспевают за прогрессом. А во-вторых, попросту не получиться "впихнуть невпихуемое" - академические часы так или иначе ограниченны, и приходится чему-то уделять больше внимания а чему-то меньше.

И вот теперь, когда мы поняли что математика в IT нужна и многогранна, мы можем подумать и насчет того, а нужна ли она чтобы быть прикладным программистом - и если да, то какие её разделы применимы и насколько.

Удивительный мир математики - фундаментальная основа и практическое подспорье для ремесла программиста.
Удивительный мир математики - фундаментальная основа и практическое подспорье для ремесла программиста.

Немного о учебе и образовании

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

Возьмем например, "классическую" схему - когда молодой специалист получается проходя все круги ада на выходе из ВУЗа. Тут по большей части никто, что называется, и не спрашивает о желаниях юного специалиста. Есть учебная программа, есть зачеты и экзамены. Хочешь не хочешь, а учить всё это придется. Впрочем, я все же буду на стороне образовательных учреждений. Дело в том, что как правило, на выходе по большинстве "программистких" специальностей, в итоге получаются не просто программисты, а техники-программист или инженеры-программист. И вот в случае с инженером - необходимость знания математики, практически не вызывает вопросов.

И потом, кто бы что не говорил о наших образовательных программах, учебных заведениях, преподавателях и т.д. В России, именно теоретические знания (и как раз математику) преподают очень даже не дурно (а наоборот очень даже круто!). Я сам заканчивал колледж, а впоследствии и профильный ВУЗ. В обоих случаях, пожалуй лучшими и любимыми преподавателями как раз были математики. С другой же стороны, стоит сказать, что даже в лучших учебных программах иногда уделяют внимание достаточно странным для выбранной специальности вещам (ну правда, зачем инженеру рассчитывать ФОТ и экономику стартапа? Вот я лично для себя так и не понял и на практике ни разу не применил).

Молодой программист в процессе обучения в ВУЗе осваивает основное ремесло, и одновременно с этим математику. Обе науки гармонично дополняют друг друга.
Молодой программист в процессе обучения в ВУЗе осваивает основное ремесло, и одновременно с этим математику. Обе науки гармонично дополняют друг друга.

Ещё один вариант, это ныне популярные разного рода курсы. Вот тут все очень сильно зависит от самих курсов и преподавателей. Где-то, вам дадут и основы среди которых будут хотя бы базовые знания по математике, которые могут пригодится любому программисту: та же математическая логика, теория алгоритмов. В случае с Data Science и нейросетями, необходимые там теоретические знания будут давать несколько более подробно. Все же, эти специализации на этом более очевидно завязаны. Нейросеть, так и вовсе в своей сути математическая модель.

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

Если, допустим, браться только за самоучители каких-то конкретных ЯП (или технологий если мы говорим например о сисадмина, devops и т.д) то тут очевидно основы и теоретические навыки из перечисленных выше разделов математики вам никто скорее всего давать не будет. Все же, назначение таких книг обычно сугубо направленно на изучение чего-то конкретного плюс сопутствующих навыков. То есть, какие-то отдельные вещи по мнению автора вы конечно в таких источниках подчерпнуть можете, но я бы не рассчитывал что "в комплект" к сведениям о каком-то ЯП вам ещё и докинут скажем что-то про машину Тьюринга. Безусловно, все конечно зависит от автора и самой книги, но надо понимать, что материал рассчитывающий прежде всего рассказать о ЯП или какой-то технологии, методологии и т.д. будет прежде всего подавать именно это. Поэтому, при самообучении важно систематизировать и так сказать разложить по полочкам весь впитываемый в себя материал. И справедливости ради, хотя многие учебные заведения отстают от трендов современного IT, они все же очень неплохо учат собственно учиться.

Программирование и математика - две очень близких и тесно связанных между собой науки.
Программирование и математика - две очень близких и тесно связанных между собой науки.

А надо ли оно лично мне?

IT индустрия использует математику очень активно. Вариантов получить эти знания тоже предостаточно, тем более в наш век интернета. Но так ли поголовно каждому программисту нужны глубокие знания этой науки? Или может быть можно обойтись только самыми базовыми вещами? Строго говоря, ответы на эти вопросы можно искать бесконечно долго, и точного понимания подходящего сразу для "всех специалистов" все равно не найти. Можно даже сказать, что какую-то даже размытую грань будет провести очень непросто. Но мы попробуем!

Во-первых, не зря было упомянуто большое разнообразие разделов внутри математики. С одной стороны, какие-то из её разделов используются почти во всех сферах IT. С другой стороны, какие-то разделы математики достаточно специфичны и нужны будут скорее для решения каких-то частных задач. Вот возьмём например ту же теорию алгоритмов - её будет полезно знать любому программисту - хотя бы основы. Это в целом будет очень нужным подспорьем в работе а так же направит мышление в нужную сторону. Сюда же можно отнести математическую логику - так или иначе логические выражение дело частое во многих кусках программного кода. Остальное конечно тоже будет полезно - но скажем, вряд ли вам на ежедневной основе пригодится теория вероятностей, или математическая статистика.

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

Во-вторых, помимо вопроса о том, какую именно математику нужно знать - надо ещё и понимать насколько глубоко должно быть такое знание. И тут все опять зависит от того, кем именно хочет стать начинающий специалист и насколько высокие горизонты хочет покорить. Мне кажется, совершенно очевидно, что человеку чья конечная цель ограничивается хорошим уровнем заработной платы в каком-нибудь веб проекте aka среднестатистическая CRM навряд ли пригодится то же преобразование Фурье (спойлер: мне пока не пригодились). В таком варианте, будет вполне достаточно базовых знаний. Даже больше, в написании прикладного ПО этого почти всегда будет достаточно. Слышал даже такую историю о том, что 80-90% времени большинство программистов скорее будет решать достаточно рутинные задачи не сильно связанные с математикой. Другое дело, если вы захотите заняться низкоуровневым программированием и например писать компиляторы. А еще, математика и геометрия пригодятся например в разработке игровых движков, 3D редакторов (CADов). В общем, перечислять можно бесконечно. Коротко говоря, в большинстве сфер которые позволяют иметь адекватную зарплату глубокое знание математики не требуется.

Подводя итог всего вышесказанного, математика будет в целом очень полезным навыком для среднестатистического программиста. Но при этом, большинству хватит и базовых знаний, по сути должно хватить даже программы 11 школьных классов. Хотя в целом, лишними дополнительные знания тоже не будут. При этом, сама по себе математика (как это часто говорят) "направляет мозги в нужное русло". Поэтому, я бы не сильно переживал если вы не щелкаете примеры из высшей математики как орешки. Но при этом, совсем забрасывать её в пыльный угол я бы не стал. Особенно, если вы учитесь по специальности в ВУЗе, а не самостоятельно или на курсах.

Учите математику! Ведь с ней программирование заиграет совершенно новыми красками.
Учите математику! Ведь с ней программирование заиграет совершенно новыми красками.

Статью подготовил со-автор блога Андрей Сорокин. Редактура - Виталий П.

🔥 Понравилось? Подпишись! Победим восстание роботов вместе! 🔥

Этот простой вопрос часто задают себе как начинающие программисты, так и другие люди, желающие войти в нашу профессию.-6

🚀 P.S. Для тех, кто хочет не просто читать о программировании, а начать свой путь джедая прямо сейчас, приглашаю на Boosty! Там эксклюзивный обучающий материал по программированию для любого уровня подготовки. А ещё там можно посмотреть, как автор выглядит в жизни. Жми сюда и полетели!🚀

P.S.2 Ещё у меня есть Telegram-канал. Там посты чуть проще и веселее. Ссылка