Найти в Дзене

Математика для программистов. Зачем разработчикам школьная геометрия?

Прежде, чем ответить на данный вопрос сначала нужно определиться с рамками: каким программистам и какая математика?

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

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

Мы же посмотрим на эти вопросы немного под другим углом.

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

Всего рассмотрим четыре уровня:
1. Уже работающие программисты.
2. Взрослые люди, которые готовятся перейти в IT из других областей.
3. Студенты.
4. Школьники средней и старшей школы.

Теперь подробнее.

1. Уже работающие программисты.
Это могут быть как малоопытные разработчики, так и ветераны умственного труда.
У них обычно уже есть своё чёткое мнение о том, нужна ли в их работе математика.
Чаще всего они используют её в той мере, в которой это требуется для выполнения текущих задач.

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

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

Например, зададим простому линейному разработчику задачу про нахождение точки внутри многоугольника.
Это простая, даже рутинная задача.
Но без математики она решается путём жутких костылей и тормозящего кода. И то не факт, что все случаи будут рассмотрены.
А при знании вычислительной геометрии, можно вспомнить, что эта задача известна как PIP (Point in polygon) и решается двумя десятками строк кода.

2. Взрослые новички.
Для категории «войти-в-айти-после-30-ти» вопрос про математику в программировании не так актуален.
Им нужно вовсю учиться программировать с тем знанием математики, что у них есть.
Чем раньше они смогут начать работать, тем лучше.
Математика-для-программистов здесь отходит на второй план. Все силы нужно направить на решение учебных и практических задач, на изучение синтаксиса языков, среды разработки, фреймворков, библиотек и пр.
Главная промежуточная цель на этом уровне – попасть в коммерческий проект «хоть чучелом, хоть тушкой».
Банально нет времени улучшать свою математическую прошивку. Да и трудновато уже это делать, она такая какая есть.
Однако, есть люди, которые где-то вычитали, что в программировании без математики никуда, купили три томика Фихтенгольца и читают его по вечерам вслух и с выражением, параллельно решая задачи из Демидовича. Так они надеются, что программисткие боги смилостивятся и позволят им войти в IT через парадную дверь.
Это прекрасное, но бессмысленное времяпрепровождение. Тактика работы должна быть другой. Начинать с математики уже поздно.

3. Cтуденты IT-специальностей.
По тому, как программист работает, всегда видно, имеет ли он высшее образование или не имеет. Изучал ли он высшую математику или нет. А если и изучал, то в каком объёме.

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

а) Математический анализ – основа всех численных моделей, Computer Science.
б) Аналитическая геометрия, линейная алгебра – компьютерная графика, компьютерная геометрия, моделирование в 3D, GameDev, VR. Матрицы встречаются во многих задачах обработки информации и помогают представлять многомерные структуры и их взаимосвязь.в) Теория вероятностей, математическая статистика, теория случайных процессов – любой анализ данных и машинное обучение.
г) Дискретная математика – графы, комбинаторика, булева алгебра, конечные автоматы часто используются для разработки и применяются для представления структур данных;д) Дифференциальные уравнения, уравнения в частных производных – в связке с численными методами используются в предметном моделировании. Также нужны для анализа данных и оптимизационных алгоритмов.
е) Вариационное исчисление и методы оптимизации – игры и робототехника, в целом любое управление.
ж) Теория чисел – современная криптография.
з) Функциональный анализ (вещественный и комплексный) — полезны базисы семейств функций (ряды Фурье и другие). Требуется для распознавания образов. Через комплексные числа лучше описывается движение плоскости и сферы.
и) Высшая алгебра – пригодятся группы вращений или движений пространства, а также конечные группы/поля в связке с теорией чисел. Используется в разработке специфических алгоритмов.

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

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

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

Тем более от старшеклассников иногда можно услышать такое мнение: «Я не буду заниматься математикой. Мне она не нравится. Буду сразу учиться программировать».
Попробуем показать ошибочность такого подхода.

Итак, зачем нужна школьная математика будущим программистам.

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

ii) Учёба в вузе.
Мало просто поступить в вуз. Нужно там ещё и отучиться.
А для этого вам нужны будут не только баллы ЕГЭ или дипломы олимпиад, но и реальные математические знания.
Вышеобозначенный список разделов вышмата основывается на школьной математике. И тут вам пригодятся и производная, и интегралы, и теория множеств, и уравнения прямой.
В общем, всё, что было в программе, но вы откладывали со словами «зачем оно мне, если этого нет в ЕГЭ...»
Без крепкой математической базы никакой матан не освоить.

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

iv) Метанавыки.
Многим из вас математика для программирования действительно не пригодится. Однако, вам очень пригодятся метанавыки, полученные при её изучении.
Есть определённый стиль мышления, который развивают именно занятия математикой в школе.

Все подобные метанавыки можно разбить на две части: математические и общеобразовательные.

Математические метанавыки развиваются косвенным образом через типовые задания:

1) Устный и рациональный счёт.
Как таковой сам счёт не нужен. Точные цифры в реальной жизни проще получить на калькуляторе или через ячейки в табличке Excel.
Но правильно поставленный устный счёт учит делать быструю оценку возможного результата.
А во многих областях деятельности перед выполнением задачи важно прикинуть итоговый результат.
Взять хотя бы в программировании оценку сложности алгоритмов.
Её нужно уметь проводить в любой ситуации.
Прежде чем писать какую-либо программу, вам надо суметь ее оценить. Причем до того, как вы напишите код.
Возможно, вам не нужно решать задачу в лоб, а следует использовать другой алгоритм или какой-то принципиально иной подход, чтобы решение было более эффективным.

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

3) Упрощение алгебраических выражений.
Это самая недооцененная тема школьной математики.
Тру-математикам она дико не нравится. Ещё считают бесполезной именно в математическом плане и поэтому стараются выдавить из школьной программы.
Однако, в будущем программисте (и не только программисте) эта тема вырабатывает важный навык упрощения выражений.
Напомню, что в заданиях на упрощение алгебраических выражений на вход идёт многоуровневое выражение и требуется посчитать его результат при конкретном значении переменной.
Можно явно подставить это число в исходное выражение. Ответ сойдётся, но вычисления будут занимать кучу времени.
А можно постепенно, шаг за шагом, избавляться от шелухи и делать конструкцию всё проще и проще. И получив свёрнутое выражение, уже в него подставить исходные данные.

Тем самым будущий программист, который многократно проделал подобные упражнения, будет по умолчанию стремиться к упрощению и писать как можно меньше кода и как можно содержательнее.

"Программист" же без подобного навыка будет писать как попало. Для него высшая доблесть – наклепать как можно больше кода. Две тысячи строк в день и всё – он герой-стахановец.
А то, что в его коде невозможно разобраться, его не сильно волнует: «Вы все дураки!»
Хотя сам буквально через день не может понять свои же записи.

В программировании, как и в школе в 7-8-9 классах, в основном делают то же самое – упрощают всё таким образом, чтобы готовый код выполнял то же самое, что и исходный, но был простой и понятный.
Причём это делается непрерывно, так как любое добавление функционала может потребовать пересмотра всей конструкции.
Такая польза от математики неочевидна, но это совсем не значит, что её нет. Это просто означает, что в работе программиста будет меньше велосипедов.
Искусство рефакторинга закладывается здесь, в 7-9 классах, когда школьники преобразовывают многоэтажные выражения.
Когда говорят, что математик сделает лучше, чаще всего имеют в виду, что он всегда будет стремиться в первую очередь упростить задачу.

4) Геометрия.
Ценность геометрии кроется не только в чёткости рассуждений и строгой логике решения. Да, идея доказательства важна, но для будущих программистов она не так актуальна.
Геометрия нужна для школьников, т.к. каждая содержательная задача воспитывает навык работы с небольшой системой.
С одной стороны в каждом решение есть некоторая последовательность рассуждений. И их нужно очень аккуратно проводить, чтобы не нарушить цепочку.
В программировании так же. Приложение не будет работать, если где-то произошёл разрыв в алгоритме. И нужно уметь по шагам проследить всю его реализацию.
С другой стороны, в начале решения задачи мы смотрим на неё целиком. Наше решение может использовать разные факты и теоремы, мы можем двигаться разными путями, но всё равно конечным результатом должен быть непрерывный логический ход рассуждений.
В ходе решения мы не всегда идём прямо. Часто приходится так декомпозировать задачу, что вроде и в конце решения много чего доказано, и в начале продвинулись, но всё ещё есть пробелы, которые обязательно нужно устранить.
И здесь также есть сходство с программированием. Инструменты могут быть разные, реализации алгоритмов – тоже. Мы также можем сначала реализовать лишь часть задачи, а уже потом дописать недостающее.

5) Задачи на построение.
Ещё один недооценённый раздел математики.
Построения циркулем и линейной – это не просто какое развлечение или дань исторической моде с выходом на три классические задачи древности.
Подобные задачи в школе позволяют ученикам придумывать формальные алгоритмы вне уроков информатики.
Это не только расширяет понимание геометрии и показывают её с необычной стороны, но и учит определённому стилю мышления.

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

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

2) Составление моделей
Когда школьник решает задачи, он для удобства может нарисовать чертёж и заполнить таблицу.
Причём руководствуясь правилом «это должно помогать решению».
Когда проектируется и реализуется база данных на несколько таблиц, тоже необходимо продумывать их состав и набор полей в них. Далее нужно приводить их к удобному виду, чтобы количество таблиц и связей между ними были минимум, строить схемы, зависимости, анализировать общий результат.
Нужна программисту в математике не столько математика, а умение строить модель из всего на свете.

3) Честность.
Математика, как и программирование, довольно объективная область деятельности.
Если профессор не правильно решил задачу, то любой даже совсем неопытный студент сможет указать на ошибку и будет прав.
Нет такого субъективизма в стиле «автор своим произведением хотел сказать именно это». Авторитетом здесь задавить не получится.
Если же код не компилируется, если приложение не запускается, то даже сторонний человек понимает, что что-то идёт не так.
Хотя на практике встречаются люди, у которых программа не работает, а они с пеной у рта всем доказывают, что на самом деле она работает...

4) Навык обучения.
Когда вы самостоятельно или с репетитором готовитесь к ЕГЭ или олимпиадам, вы вырабатываете навык самообучения.
Один полностью проработанный томик Ткачука даст вам огромную фору вне зависимости от того затащили ли вы в итоге ДВИ или нет.
И кстати экзамены проверяют не только знание математики, но и то, как вы смогли себя организовать, чтобы освоить эту сложную дисциплину.
Для программиста очень важно уметь разобраться в предметной области в кратчайшие сроки и без посторонней помощи. Как бы полезна информация ни была, всё в голове не удержишь. Впрок знаниями не затариться. Неиспользуемое имеет свойство забываться, поэтому придётся много учиться и переучиваться.

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

1) Математический и инженерный подход.
Всё-таки математика – это далеко не то же самое, что и программирование.
У этой науки иной взгляд на многие вещи.
Как таковая разработка обычно скучна для чистых математиков.
Хороший код включает в себя кучу разных приземлённых факторов: тестируемость, логирование, безопасность, переносимость, баланс между производительностью и читабельностью и прочее.
Математики часто надо всем этим особо не задумываются. Их мозг обычно загружен более высокими материями.
Математику порой интереснее понять разрешимость задачи, чем на самом деле решить её. Придумать новый алгоритм интереснее, чем реализовать его через код.
Написать какой-то код интереснее, чем часами его отлаживать.
Это не значит, что математики по умолчании ужасные программисты. Но математики далеко не всегда становятся программистами просто из-за факта обладания сакральным знанием.

2) Команда.
Разработкой занимаются не отдельные люди, а команды программистов.
Хакер-одиночка, который из своего гаража взламывает главный компьютер Пентагона – это клише из голливудских фильмов.
В реальности такого уже не бывает.
Поэтому корректнее сравнивать именно группы разработчиков.
Так вот в любой цельной команде обязательно должен быть один или несколько человек, которые хорошо знают математику.
Остальным же программистам возможно и не нужно знать её на уровне математиков. Однако, всем нужны хотя базовые знания высшей математики, что общаться с теми, кто её глубоко понимает. Нужно уметь воспринимать ту информацию, которую передаёт собственно математик. Можно построить для программиста хорошую математическую модель. Но если программист не понимает сути, а тупо переводит её дословно в код, результаты получаются не очень.

3) Гуманитарный склад ума.
Есть задачи, в которых гуманитарное образование помогает сильнее, чем фундаментальное математическое.
Особенно там, где приходится работать непосредственно с пользователями.
Для разработки хорошего интерфейса, удобного для среднестатистического пользователя, глубокое математическое образование будет скорее мешать.
С гуманитарным образованием больше шансов стать хорошим техническим писателем или человеком, который сможет собирать требования с конечных пользователей.

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

5) Выбор.
Есть соблазн сказать, что математика в том объёме, который даётся в вузе, не нужна 99% разработчиков. И лучше учиться не на сферического программиста в вакууме, а сразу на узкопрофильного специалиста. Всё высвобожденное время, дескать, эффективнее потратить на практику.
Но вспомните себя в годы последних классов школы или поступления в ВУЗ. Вряд ли в этом возрасте можно более-менее осмысленно выбирать профессию на всю жизнь.
И далеко не каждый студент даже последних курсов хорошо понимает, в какой сфере он хотел бы в дальнейшем развиваться.
Да и выбор направления у будущих программистов часто опирается лишь на модные тенденции. Но тогда, следуя за всеми новыми веяниями, программы образования нужно будет переписывать чуть ли не каждый год.
Позавчера в тренде были робототехники и блокчейнеры, вчера это датасаентисты и нейросетевики, сегодня новостное пространство забито чем-то чат-gpt-подобным, завтра, возможно, будут какие-нибудь квантошифровальщики и дополненнореалисты.
Как ни крути, во всём этом есть некоторая базовая часть, которая понадобится в любом случае.
И вот для того, чтобы суметь сравнительно быстро перестроиться, чтобы иметь возможность попасть на интересный проект, вам будет нужна математика.
Знание математики расширяет пространство для выбора.
Причём иногда она требуется в самых неожиданных местах.
Например, на собеседовании у коллег на позицию разработчика спрашивали про сходимость в пространстве l₂, про суть марковского процесса, про тригонометрию и сферические координаты, про балансировку красно-чёрного дерева. И правильные ответы на эти вопросы помогли им попасть на интересные проекты, где все эти знания применялись.
Лично мне как-то на собеседовании задали задачу про проезда, которые с определёнными интервалами и с некоторыми условиями двигались навстречу друг другу. Это была по сути чуть докрученная текстовая задача.
Как мне потом объяснили, так проверяли умение читать и понимать написанное. А также какие-то элементарные знания из предметной области (это была вакансия в разработке ПО для железнодорожной логистики).

Несколько ресурсов и ссылок:
1. «Давайте объясню, Или зачем программисту математика» (Станислав Протасов)
2. «Программирование. Теоремы и задачи» (Александр Шень)
3. «Понятные книги по высшей математике»
4. Различные базовые задачи с сайта itmathrepetitor.