Этот вопрос встает рано или поздно практически перед каждым человеком, который начинает изучать программирование. В интернете полно мнений: одни говорят, что без высшей математики программистом не стать, другие считают, что 90% программистов не знают как решаются простые интегралы. По этой причине многих охватывает сомнения в своих способностях и желании стать программистом. Вопрос актуален и не так однозначен, как кажется с первого взгляда.
Нужна ли математика программисту?
Ответ на самом деле банален: все зависит от направления, в котором вы хотите развиваться. Давайте разберемся.
Где и какая математика действительно важна?
В первую очередь стоит определиться, в каких направлениях математика действительно нужна. И какие разделы математики используются в тех или иных сферах.
Разработка игр
В геймдевt по большей части важны абстрактные понятия математики, ну и самая малость физики. В нем пригодятся следующие разделы:
Линейная алгебра (базовая и продвинутая) - рендеринг, анимация, камеры, работа со светом.
- Векторы и матрицы (перемещение, вращение, масштабирование объектов)
- Кватернионы
- Проекции и преобразования
- Операции над плоскостями и нормалями
Аналитическая и вычислительная геометрия - физика, столкновения, траектории.
- Коллизии и пересечения (AABB, OBB, сферические коллизии)
- Алгоритмы выпуклой оболочки (QuickHull, алгоритм Грэхема)
- Расстояния между объектами
Тригонометрия - камера, повороты, спецэффекты.
- Синусы, косинусы, тангенсы (вращение и наклон объектов)
- Полярные координаты (орбиты, дуги, повороты)
- Доплеровский эффект (реалистичный звук)
Физика и механика - игровые движки, симуляция физики, реализм.
- Законы Ньютона
- Импульс и сила
- Гравитация
- Жидкости и газ
Ну и немного теории вероятности для рандомизации событий и симуляции поведения.
Искусственный интеллект и машинное обучение
ИИ - это наверное то направление, в котором математика играет ключевую роль, на нем строится само понимание всего происходящего.
Линейная алгебра (основа нейросетей и работы с данными)
- Матрицы и векторы (представление данных, операции с признаками)
- Матричное умножение (работа с весами в нейросетях)
- Собственные значения и собственные векторы (PCA – метод главных компонент для уменьшения размерности)
- Квадратичные формы (функции потерь, оптимизация)
Математический анализ (оптимизация моделей и градиенты)
- Производные и градиенты
- Частные производные и Якобианы (обучение многослойных нейросетей)
- Интегралы (распределение вероятностей)
- Функции активации (ReLU, сигмоида, tanh)
Теория вероятностей и статистика (основа предсказаний и вероятностных моделей)
- Распределения вероятностей (Гауссово, Бернулли, Пуассона)
- Байесовская статистика (наивный Байесовский классификатор)
- Оценка параметров (метод максимального правдоподобия, MAP)
- Корреляция и ковариация (взаимосвязь между переменными)
Оптимизация (улучшение моделей)
- Градиентный спуск (SGD, Adam, RMSprop)
- Методы линейного программирования (регуляризация моделей)
- Функции потерь
Теория информации (обучение моделей и обработка сигналов)
- Энтропия Шеннона (количество информации в данных)
- Кросс-энтропия (метрика качества классификации)
- Кодирование Хаффмана (сжатие данных)
Теория графов (работа с нейросетями и связями)
- Обход графов (поиск кратчайшего пути – PageRank)
- Свёрточные графовые нейросети
- Алгоритмы кластеризации (k-means, DBSCAN)
Криптография и безопасность
В криптографии применяются довольно "увлекательные" разделы математики: линейная алгебра, комбинаторика, теория чисел, теория алгоритмов, теория вероятностей и математическая статистика.
Структуры и алгоритмы данных
Также хочется сказать пару слов об необъятном мире алгоритмов. В большинстве своем каждому будет полезным разобраться хотя бы в основах, а на самом деле и стоило бы углубиться, потому что алгоритмы развивают мышлении программиста. На выходе программист более чистый и оптимизированный код.
Ниже список, основы чего было бы хорошо понимать. Однако стоит подчеркнуть, что если вы просто хотите ознакомиться с самой базой алгоритмов подойдет и какая-нибудь книга по типу "Грокаем алгоритмы", там кроме знаний базовой алгебры и самых основ геометрии ничего не нужно.
Дискретная математика
- Логика
- Теория множеств
- Комбинаторика
- Теория графов
- Теория чисел
Алгебра
- Линейная алгебра
- Полиномиальная алгебра
Теория вероятностей и статистика
- Оценка сложности алгоритмов на основе вероятностей
- Байесовские методы
Математический анализ
- Оценка сложности алгоритмов через пределы и асимптотику (O-большое, Θ, Ω)
- Производные и градиенты в оптимизационных алгоритмах
Геометрия
- Вычислительная геометрия
- Векторная математика
В каких направлениях математика не нужна?
Несмотря на заявления многих, есть довольно много направлений, в которых можно достичь весомых результатов без какого либо знания математики. Конечно, ее знание пойдет только плюсом, но и без нее спокойно можно стать востребованным специалистом.
Вот эти направления:
- Веб-разработка (Frontend & Backend)
- Мобильная разработка
- Разработка ПО
- Тестирование
- Администрирование серверов, DevOps
- Системный администратор
Список довольно внушительный, не находите? Поэтому если вы хотите связать свой путь с чем-то из этого списка, не стоит биться об стену с оправданиями, что математика это не ваше.
Это еще один показатель того, что в нынешнее время порог входа в программирование как никогда низок. И сейчас лучшее время начать, будучи я в таком положении, я бы начал с онлайн курсов, по примеру нескольких моих знакомых, которые закончили курсы этой онлайн школы и устроились на работу с довольно хорошей зп.
Вывод
Как видите, математика нужна не всегда, и быть хорошим программистом можно и без глубоких знаний в ней. Конечно, было бы неплохо знать дискретную математику, те же алгоритмы, но и без этого тоже можно обойтись. Так что не слушайте тех, кто говорит, что если вы плохо знаете математику, у вас ничего не получится, они скорее всего вовсе ничего не понимают и брать их слова на размышление - глупость.
Люди научились придумывать массу отговорок, чтобы избежать каких-либо усилий.
-Джулиана Вильсон
А больше интересного в моем телеграм канале!