Содержание статьи
Введение
Некоторые студенты думают, что математика программисту не нужна вообще (обычно эта точка зрения свойственна веб‑разработчикам). Другие считают, что нужна, но они уже все и так знают, и дальнейшее развитие на этом поприще экономически бессмысленно. Третьи осознают громадное значение математики для развития человека в целом и программиста в частности, старательно вникая в лекции и решая РГР‑ки. Но лишь единицам удается освоить матан, матстат и дискрет на должном уровне, позволяющем эффективно применять эти науки для решения реальных профессиональных задач.
Апгрейд мозга
Можно много написать о том, какое магическое влияние оказывает на нейронные связи в мозгу разложение рядов Фурье. И о том, каким образом прокачанные подобным способом извилины обеспечат тебе высокое качество жизни до конца твоих долгих дней. Но, во‑первых, ты уже про это где‑то читал, а во‑вторых, ты и так умный, зачем тебе лишние нейронные связи?
Поэтому поясним, какие конкретно жизненно важные скилы можно развить с помощью занятий математикой.
Концентрация
Это качество является важнейшим для программиста (после скромности). Достаточно мочь сосредоточиться на одной задаче в течение 10–15 минут, чтобы уметь писать код. Но если ты хочешь создавать что‑то реально сложное и тратить минимум времени на разработку и отладку, то необходимо приобрести навык многочасовой гиперконцентрации. Он может быть врожденным или наработаться через энное количество лет работы (при наличии дедлайнов и необходимости решать нетривиальные задачи). Решение интегралов, дифуров, рядов, требующих длительных размышлений, сильно ускоряет процесс развития этой мозговой функции (особенно если решать по 20 штук сразу). Но надо подбирать максимально сложные и объемные задачи для твоего текущего уровня.
Возможно, у тебя бывают дни, когда крайне трудно сосредоточиться и код не пишется вообще. Я в таких случаях открываю задачник Сканави и решаю один‑два примера из первой части. И сразу мысли становятся на свои места, красивые решения приходят на ум и жизнь налаживается.
Есть легенда о том, что в особо важных подразделениях Microsoft (Google, Apple, Intel — подставить в зависимости от личных предпочтений) компьютер работника прерывается каждый час и предлагает человеку решить небольшую математическую задачу. Таким образом они повышают производительность труда. Представь себе: четыре утра, дедлайн, все уже готово, осталось отправить письмо заказчику. А тут — опа! Все выключается, и компьютер спрашивает что‑то из разряда «У Пети было пять карандашей, а у Васи?». Надеюсь, подобная система издевательства над людьми не получила массового распространения.
Терпение и настойчивость
Самое неприятное в работе программиста — затянувшийся процесс отлова ошибок. Самое приятное (из того, что вообще бывает в жизни) — найти ошибку в чужом коде после девяти часов поиска подряд.
Хакер #187. Обходим Blizzard Warden
Спортивное программирование
Ты наверняка слышал о чемпионатах по спортивному программированию. Такие соревнования помогают топовым IT-компаниям находить наиболее ценные кадры. Самые известные — TopCoder, Google Code Jam, Russian Code Cup, ICFP Programming Contest — являются в первую очередь состязанием на знание теории алгоритмов и умение применять ее на практике. Этот факт заставляет поверить в необходимость изучения этой науки для профессионального роста.
Для того чтобы успешно выполнять работу, требующую длительного психического напряжения (без получения сиюминутного подкрепления в виде растущего количества кода в редакторе), требуется недюжинная сила характера. Решение задачек со звездочкой, подразумевающих многочасовые или многосуточные размышления, — отличный способ развить такие способности.
Оперативная память
Британские ученые утверждают, что человеческий мозг способен одновременно держать в сознании не более семи единиц информации. Видимо, им в руки не попадался прокачанный мехматом российский инженер. Чем больше информации ты способен одномоментно удерживать в голове, тем меньше ошибок в твоем коде, выше продуктивность и способность к решению нестандартных задач.
Интуиция
Есть байка о том, как тренируют интуицию у агентов ФБР. Перед ними ставят две коробки, надо отгадать, в какой лежит искомый предмет. Если человек не угадывает — он получает легкий, но болезненный разряд тока. В итоге в нем просыпается невероятная способность выбирать верное направление действий и мыслей. Нечто аналогичное происходит и при решении математических задач. Если на каком‑то этапе (в ситуации равнозначного выбора) повести решение не по тому пути, то можно полчаса идти в никуда. После прохождения некой критической массы неудач ты начинаешь отмечать за собой в разы меньше отклонений от верного направления (даже при решении задач абсолютно незнакомого формата).
Стоит отметить, что врожденное наличие подобных качеств располагает к занятиям математикой и программированием.
А теперь перейдем к конкретным наукам и поочередно разберем точки их практического приложения.
Дискретная математика
Это самая интересная (на мой взгляд) из всех математических наук и самая полезная для программиста. Ее основа — взаимодействие теории чисел с математической логикой. Включает в себя множество разделов и подразделов.
Теория алгоритмов
Наиболее важный людям нашей профессии раздел дискретной математики. Любой логически осмысленный кусок кода по сути является алгоритмом. А значит, может быть оптимизирован и подвергнут оценке сложности с точки зрения теории алгоритмов.
warning
Решение задач и чтение математических книг — занятие весьма увлекательное и времясжигающее. Не забывай оставлять время на сон и работу!
Вклад великих программистов в математику (и наоборот)
Эдсгер Дейкстра
Один из создателей языка алгол и разработчик теории структурного программирования, автор множества великолепных статей. Отличился в дискретной математике. Он разработал алгоритм нахождения кратчайшего пути на ориентированном графе, известный как алгоритм Дейкстры.
Дональд Кнут
Я думаю, многие читатели хоть раз в жизни начинали читать его «Искусство программирования». Если ты дошел до четвертого тома — напиши мне, чем там все закончилось, и твое фото мы опубликуем в следующем номере на доске почета. Книга настолько тяжелая, что у самого Дональда пока не хватило терпения дописать ее до конца (издано три с половиной тома из обещанных семи). Как программист он отличился созданием TeX и METAFONT. Фундаментальных открытий в математике он не совершил, но проделал огромную работу по систематизации и популяризации знаний в области теории алгоритмов.
Ричард Карп
Основным вкладом этого ученого в программистскую науку было приложение руки к созданию алгоритма Рабина — Карпа (поиска строки в подстроке). В математике его основным достижением является вклад в теорию NP-полноты.
Ричард Хэмминг
Американский математик, разработал первый самоконтролирующийся код (очень актуальная тема при работе с перфокартами), названный кодом Хэмминга. Также является одним из основателей теории кодирования.
Сеймур Пейперт
Посвятил кучу времени теории искусственного интеллекта и внес в нее значительный вклад. Автор многочисленных статей по математике. Создал язык Logo для обучения школьников основам программирования (я с него начинал в 90-е! — Прим. ред.).
Кристен Нюгорд
Один из авторов концепции объектно‑ориентированного программирования. Создатель языка симула (первый язык с поддержкой ООП). Также внес вклад в теорию вычислительных систем.
Рекомендации по математическому развитию личности для младшего брата
Школьник
Чтобы твой брат‑школьник не пил ягу и не начал, на зависть старшему брату‑программисту, вести развратный образ жизни, надо его заранее обработать психологически. Склони его к следующему:
- перейти в школу с математическим уклоном;
- участвовать в олимпиадах по математике, информатике и программированию;
- нацелиться на поступление в очень хороший технический вуз (МГТУ им. Баумана, факультет бизнес‑информатики НИУ ВШЭ, ВМК МГУ и подобные);
- читать книги из разряда «занимательная математика»;
- параллельно с подготовкой к ЕГЭ заниматься по учебникам для поступающих в технические вузы, изданные до 1991 года (не только по математике, но и по физике).
Студент
Помимо профильного высшего образования (см. выше), студента хорошо бы озадачить:
- читать толковые математические книги англоязычных авторов (список — в сорсах к статье);
- участвовать во всевозможных соревнованиях по спортивному программированию;
- не лениться самостоятельно решать домашние задания по математическим дисциплинам (ну, иногда :));
- нацелиться на поступление в магистратуру очень хорошего технического вуза;
- пройти стажировку в научном учреждении, занимающемся математическими делами, — ИПУ РАН, ИСП РАН и подобных.
Практическое применение:
Алгоритмы шифрования с использованием теории чисел. Пример: знаменитый алгоритм RSA основан на сложности определения факторизации двух целых чисел.
Переборные алгоритмы, применяемые в тестировании, для решения олимпиадных и ускорения сложных вычислительных задач. Пример: задача про волка, козу и капусту, а также аналогичные ей решаются с помощью различных алгоритмов перебора.
Организация поиска и сортировки больших объемов данных. Пояснение: любой поисковый робот содержит в своей основе сложнейшие алгоритмы ранжирования, оптимизированные для работы с запредельными объемами информации.
Построение компиляторов, интерпретаторов и трансляторов. Пояснение: теория компиляторов является прямой наследницей теории алгоритмов, на которой и основываются правила преобразования высокоуровневых синтаксических конструкций в машинный код.
Оптимизация процесса отладки программ. Пример: когда ищешь ошибку в длинном отрезке кода, то интуитивно применяешь метод интервалов: сначала комментируешь нижнюю половину, смотришь, правильно ли выполняется программа до середины, если нет, то комментируешь еще четверть, если нет, то наоборот, освобождаешь 25 процентов от комментариев. И так пока не найдешь ту строку, в которую закрался баг.
Темы, на которые стоит обратить внимание:
- структуры данных (ознакомление с этим вопросом поможет быстрее и глубже понять принципы ООП);
- рекурсивные алгоритмы;
- критерии оценки качества алгоритмов.
Книги:
- Роберт Седжвик. Алгоритмы на C++. Фундаментальные алгоритмы и структуры данных.
- Роберт Седжвик, Кевин Уэйн. Алгоритмы на Java.
- Томас Кормен. Алгоритмы: построение и анализ.
- Диомидис Спинеллис. Анализ программного кода на примере Open Source.
Математическая логика
Без использования элементарных логических выражений (истинность которых проверяется с помощью оператора if) возможно написать разве что Hello world. Когда мы объявляем переменную типа Boolean, мы снова используем матлогику.
Практическое применение:
Низкоуровневое программирование процессоров (спойлер: читаем статьи Антона Сысоева в этом и предыдущем выпусках). Пояснение: контакты микросхем имеют всего два состояния — есть сигнал (1) и нет сигнала (0). И благодаря такому достижению человеческого разума, как матлогика, потоки нулей и единиц превращаются в нечто весьма осмысленное.
Оптимизация кода со сложными ветвлениями. Пример: построение таблицы истинности для всевозможных случаев, проверяемых в ветвлении в целях сокращения числа блоков if/else.
Написание тестов для кода со сложными ветвлениями. Пример: если таблица истинности не была построена программистом и код выполняет избыточное число проверок, тестеру следует самому построить ее для тестов, чтобы сократить их количество.
Программирование битовых операций. Пример: запись прав доступа в виде строки нулей и единиц (010100 — первая цифра — чтение файлов, вторая — редактирование и так далее) и их последующие изменения путем установки значений битов. Просто и максимально оптимизировано.
Распознавание образов. Пояснение: любой графический объект представляет собой совокупность битов и, следовательно, может быть сравнен с другим графическим объектом с применением побитовых операций.
Темы, на которое стоит обратить внимание:
- булевы функции;
- теория моделей;
- теорема Райса.
Книги:
- Алонзо Чёрч. Введение в математическую логику.
- А. К. Гуц. Математическая логика и теория алгоритмов. # Другие разделы
Дискретная математика включает в себя несколько десятков разделов и подразделов. Приведем примеры практического использования других ее достижений.
Практическое применение:
Мастеры для поиска ответа на вопрос пользователя (применяются в автоматизированных саппортах), представляющие собой классическую экспертную систему. Пример: реализация англоязычной базы знаний WolframǀAlpha, которой можно задавать вопросы на человеческом языке.
Реализация анализаторов текста в виде конечных автоматов. Пример: подпрограмма, реализующая поиск и удаление ряда строк из произвольного текста, может быть реализована в виде конечного автомата.
Проектирование реляционных СУБД. Пояснение: как гласит нулевое правило Кодда, «реляционная СУБД должна быть способна полностью управлять базой данных, используя связи между данными». Так вот, связи между данными в классической реляционной СУБД оптимизируются с помощью теории графов.
Темы, на которое стоит обратить внимание:
- теория графов;
- экспертные системы;
- асинхронная логика;
- формальные грамматики;
- конечные автоматы.
Книги:
- Род Хаггарти. Дискретная математика для программиста.
- С. В. Яблонский. Введение в дискретную математику.
- Н. Кристофидес. Теория графов: алгоритмический подход.
Акинатор
Есть такая замечательная онлайн‑игра — «Акинатор». Суть ее проста — загадывай любого персонажа, отвечай на 20 вопросов про него, и джинн выдает фотографию задуманного героя. Программа никогда не ошибается (если ее не дурить), угадывает даже Бьерне Страустрапа и Криса Касперски. Создается впечатление бесовского происхождения данной игры, но «Акинатор» всего лишь пример огромной самообучающейся экспертной системы.
info
Автор выражает благодарность Александру Самусенко за ценные комментарии к готовому тексту. Да и вообще, в одиночку мне было бы тяжело настолько брутально и авторитарно склонять читателя к занятиям математикой :).
Математическая статистика
Знание этой науки — must have для любого человека, занятого тестированием мало‑мальски сложных систем (грамотное применение этой науки способно сократить количество тестов на порядок). Также используется для анализа данных с целью получения практически полезных выводов.
Практическое применение:
- Выявление оптимальных классов эквивалентности в тестировании. Пояснение: класс эквивалентности в тестировании — это совокупность тестов, приводящих к одинаковому результату.
- Грамотная оптимизация pair-wise тестирования. Пояснение: pair-wise — это метод сокращения количества тестов путем одновременного тестирования двух параметров вместо одного.
- Построение выборок для исследования каких‑либо явлений или объектов. Пример: расчет количества тестов, которого было бы достаточно, чтобы в случае их правильного выполнения быть полностью уверенным в безотказности системы.
www
Отличные бесплатные англоязычные курсы по различным наукам (не только математическим):
Популярные лекции по математике
В СССР издавалось множество классных научно‑популярных книг. В том числе серия «Популярные лекции по математике», которая издавалась в период с 1950 по 1992 год. За этот период вышло в свет 62 брошюры (некоторые были многократно переизданы). Самые интересные из них (на мой вкус):
- Н. Н. Воробьев. Числа Фибоначчи (1950).
- А. С. Смогоржевский. О геометрии Лобачевского (1956).
- Н. А. Архангельский, Б. И. Зайцев. Автоматические цифровые машины (1958).
- А. Н. Костовский. Геометрические построения одним циркулем (1958).
- Е. С. Вентцель. Элементы теории игр (1958).
- А. С. Барсов. Что такое линейное программирование (1958).
- И. М. Соболь. Метод Монте‑Карло (1968).
- В. А. Успенский. Машина Поста (1979).
- В. А. Успенский. Теорема Гегеля о неполноте (1982).
Темы, на которое стоит обратить внимание:
- статистические методы;
- теория принятия решений;
- статистика случайных процессов и временных рядов;
- статистическое моделирование.
Книги:
- В. Е. Гмурман. Теория вероятностей и математическая статистика.
- А. А. Боровков. Теория вероятностей.
- Генри Уоррен, мл. Алгоритмические трюки для программистов.
Заключение
Мы не знаем, какова была твоя точка зрения на взаимоотношения математики и программирования, когда ты взял в руки журнал. Но надеемся, что после прочтения данной статьи ты:
- безоговорочно уверовал в необходимость изучения всех видов и подвидов математической науки;
- четко понял, какие именно разделы математической науки больше всего нужны программистам в целом и тебе в частности;
- составишь личный план математического селф‑девелопмента и воплотишь его в жизнь;
- станешь мегаклассным IT-спецом, внесешь вселенски значимый вклад в науку, заработаешь кучу денег и подаришь каждому члену редакции нашего журнала по спортивному автомобилю (список пришлем по первому требованию).