Прокачивайте математику – вот как это поможет при программировании
Пол Орланд исследует, как можно прокачать навыки программирования, развивая математическую подготовку и всё лучше разбираясь в том, как сохраняется связь между математикой и программированием.
Эта статья адресована всем, кто хочет улучшить математические навыки, но в особенности программистам, желающим применять математические навыки в повседневной работе.
К счастью, если вы уже умеете писать код, это значит, что серьёзными математическими навыками вы уже обладаете, и математические идеи должны прийти вам на ум сами собой. Я считаю, что лучше всего изучать математику на основе высокоуровневого языка программирования. Спрогнозирую, что в недалёком будущем такой подход станет нормой на уроках математики.
Есть несколько конкретных идей, которые перелицовываются непосредственно из программирования в математику. Эти идеи напомнят вам о тех навыках, на которые вам уже доводилось опираться при изучении математики.
Использование формального языка
Один из первых уроков, который крепко усваиваешь при обучении программированию – что нельзя писать код так же, как пишешь текст на естественном языке. Например, если вы пишете электронное сообщение и слегка ошибаетесь в орфографии, то адресат, вероятно, всё равно поймёт, о чём вы пишете. Но при программировании любая синтаксическая ошибка или неправильно записанный идентификатор могут привести к обрушению программы. В некоторых языках программа не заработает, даже если просто не поставить точку с запятой в конце инструкции, которая в остальном написана совершенно верно.
Простой пример – присваивание переменной. Непрограммисту покажется, что две следующие строки на Python означают одно и то же:
Я мог бы прочитать обе эти строки так: «пятёрка обозначена через x». Но на самом деле всё не совсем так, и лишь первый вариант корректен. Код Python x = 5 – это инструкция, обязывающая привязать значение 5 к символу x. С другой стороны, нельзя привязать символ к значению литерала 5. Может показаться, что это излишне педантично, но вы же должны знать, как правильно пишутся программы.
Другой пример, на котором прокалываются программисты-новички (равно как и опытные) – это ссылочная эквивалентность.
>>> class A(): pass . >>> A() == A() False
Если определить новый класс Python и создать два идентичных экземпляра этого класса, то они будут неэквивалентны. Логично ожидать, что два одинаковых выражения эквивалентны, но в Python такое правило, очевидно, не работает. Поскольку это разные экземпляры класса A, они одинаковыми не считаются.
Следите за новыми математическими объектами, которые выглядят, казалось бы, знакомо, а на практике проявляют неожиданные свойства. Например, если буквы A и B представляют числа, то A x B = B x A. Но так может и не быть, если A и B – не числа. Так, если A и B – это матрицы, то произведения A x B и B x A обычно будут отличаться. Может быть и так, что лишь одно из этих произведений является возможным, либо ни одно не является.
При написании кода мало просто обеспечить синтаксическую корректность инструкций. Чтобы идеи, выраженные в ваших инструкциях, были действительными, сами эти инструкции должны иметь смысл. Если писать инструкции в коде с той же тщательностью, что и математические выражения, то любые ошибки будут отлавливаться быстрее. Ещё лучше, если прямо в коде вы будете писать математические выражения – тогда с проверкой вашей работы вам поможет компьютер.
Пишем собственный калькулятор
Калькулятор — не редкость на уроках математики, ведь с его помощью удобно проверять работу. Вы должны уметь умножить в уме шесть на семь, но чтобы убедиться, что ответ действительно равен 42 – можно проверить его на калькуляторе. Также калькулятор помогает экономить время, когда концептуально предмет уже усвоен. Если вы занимаетесь тригонометрией и хотите узнать, сколько будет 3,14159 / 6, то калькулятор вам очень поможет, а вы сможете задуматься о смысле этого ответа. Теоретически, чем больше функций в калькуляторе реализовано «из коробки», тем полезнее он должен быть.
Калькулятор для учеников, которые учатся считать
Но иногда калькуляторы чрезмерно усложняются, что не идёт им на пользу. В старших классах мне потребовалось обзавестись графическим калькулятором, и я раздобыл TI-84. На нём было примерно 40 кнопок, и для каждой было предусмотрено два-три режима работы. Я умел работать примерно с 20 из них, так что освоить этот инструмент стоило большого труда. Такая же история была и в первом классе, где даже на простейшем калькуляторе были такие клавиши, которых я на тот момент не понимал. Если бы потребовалось изобрести калькулятор для студентов, то он выглядел бы примерно как на рисунке выше.
На этом калькуляторе всего две кнопки. Одна сбрасывает значение в 1, а другая делает переход к следующему числу. Подобный инструмент как раз «не парил» бы детей, которые учатся считать. Мой пример кажется слегка глупым, но вы, в самом деле, можете купить калькулятор, устроенный именно так. Обычно он механический и называется «ручной счётчик».
Калькулятор, на котором можно записывать и складывать целые числа
Итак, вы освоили счёт, и теперь хотите научиться писать числа и складывать их. Идеальный калькулятор, который понадобится вам на данном этапе обучения, может иметь уже побольше кнопок, на рисунке выше.
Нам пока не требуется кнопок для вычитания, умножения и деления, чтобы справиться с нашими задачами. Если у вас будет пример на вычитание, скажем, «5 — 2», то всё равно можно убедиться в правильности ответа 3 и на таком калькуляторе, убедившись, что «3 + 2 = 5.» Аналогично, можно решать и примеры на умножение, последовательно складывая множители. Далее можно усовершенствовать калькулятор так, чтобы на нём выполнялись все арифметические действия, после того, как напрактикуетесь с показанным выше.
Теоретически, было бы отлично добавлять на наш калькулятор новые кнопки по мере того, как мы будем готовы пользоваться ими, но в таком случае понадобился бы целый ворох запчастей под рукой. Также возникла бы и другая проблема: наш калькулятор должен был бы поддерживать не только числа, но и другие типы данных. В алгебре некоторые выражения содержат только нечисловые символы, а в тригонометрии и дифференциальном исчислении часто приходится оперировать функциями, чтобы получать новые функции.
Расширяемые калькуляторы, поддерживающие множество типов данных – пример слегка натянутый, но именно таким инструментом вы и пользуетесь, когда пишете на высокоуровневом языке программирования. В Python зашита арифметика, предусмотрен математический модуль, а ещё можно подтянуть множество сторонних математических библиотек, чтобы ваше рабочее окружение стало мощнее (если захотите). Поскольку язык Python является Тьюринг-полным, на нём (в принципе) вычислимо всё, что может быть вычислено. Для этого потребуется лишь достаточно мощный компьютер, достаточно умная реализация, либо и то, и другое.
Наилучший способ изучить, как Python может помочь вам с математикой – закопаться в язык и начать его использовать. Самостоятельная проработка различных реализаций – отличный способ закрепить представления о новой концепции – и вот, у вас в арсенале появляется новый инструмент. Опробовав инструмент самостоятельно, вы всегда можете заменить его на вылизанную мейнстримовую библиотеку (если захотите). В любом случае, новые инструменты, которые вы исследуете или импортируете, подготовят вам почву для исследования ещё более масштабных идей.
Построение абстракций из функций
В программировании вышеописанный процесс называется «абстрагированием». Когда вы устаёте раз за разом складывать числа, вы создаёте абстракцию умножения – и так далее.
Важнейший из всех способов создания абстракций в программировании, который применим и в математике – это создание функции. Функция в Python – это способ многократно выполнять некую задачу, которая может принимать на вход одно или несколько значений, а потом давать вывод. Например:
def greet(name): print("Hello %s!" % name)
Так можно выдать множество приветствий при помощи краткого выразительного кода:
>>> for name in ["John","Paul","George","Ringo"]: . greet(name) . Hello John! Hello Paul! Hello George! Hello Ringo!
Эта функция может быть полезна, но это не математическая функция. Математические функции всегда принимают входные значения и возвращают выходные, без побочных эффектов. В программировании те функции, которые обладают такими «математическими» свойствами, называются «чистыми функциями». Например, квадратная функция принимает число и возвращает произведение числа на эту функцию. Получаем 9. Это не значит, что тройка теперь изменилась и превратилась в девятку. Такую квадратную функцию можно изобразить как машину, во входную ячейку которой забрасывается число, а из выходной ячейки появляется результирующее число.
Это простая и удобная воображаемая модель. Что мне в ней особенно нравится – что функция изображается как вещь в себе. В математике, как и в Python, функции являются данными, и этими данными можно как манипулировать независимо, так и передавать их другим функциям.
Иногда математика кажется страшноватой именно из-за своей абстрактности. Помните, что в любой качественной программе абстракция вводится не просто так: она помогает сообщить более масштабные и сильные идеи. Если вам удалось ухватить эти идеи и выразить их в коде, то перед вами откроются захватывающие возможности.
С книгой, послужившей источником вдохновения, вы можете ознакомиться здесь.