Эта статья адресована всем, кто хочет улучшить математические навыки, но в особенности программистам, желающим применять математические навыки в повседневной работе.
К счастью, если вы уже умеете писать код, это значит, что серьёзными математическими навыками вы уже обладаете, и математические идеи должны прийти вам на ум сами собой. Я считаю, что лучше всего изучать математику на основе высокоуровневого языка программирования. Спрогнозирую, что в недалёком будущем такой подход станет нормой на уроках математики.
Есть несколько конкретных идей, которые перелицовываются непосредственно из программирования в математику. Эти идеи напомнят вам о тех навыках, на которые вам уже доводилось опираться при изучении математики.
Использование формального языка
Один из первых уроков, который крепко усваиваешь при обучении программированию – что нельзя писать код так же, как пишешь текст на естественном языке. Например, если вы пишете электронное сообщение и слегка ошибаетесь в орфографии, то адресат, вероятно, всё равно поймёт, о чём вы пишете. Но при программировании любая синтаксическая ошибка или неправильно записанный идентификатор могут привести к обрушению программы. В некоторых языках программа не заработает, даже если просто не поставить точку с запятой в конце инструкции, которая в остальном написана совершенно верно.
Простой пример – присваивание переменной. Непрограммисту покажется, что две следующие строки на Python означают одно и то же:
x = 5
5 = x
Я мог бы прочитать обе эти строки так: «пятёрка обозначена через 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, функции являются данными, и этими данными можно как манипулировать независимо, так и передавать их другим функциям.
Иногда математика кажется страшноватой именно из-за своей абстрактности. Помните, что в любой качественной программе абстракция вводится не просто так: она помогает сообщить более масштабные и сильные идеи. Если вам удалось ухватить эти идеи и выразить их в коде, то перед вами откроются захватывающие возможности.
С книгой, послужившей источником вдохновения, вы можете ознакомиться здесь.
Комментарии (44)
sbw
00.00.0000 00:00+1Кому-то поможет, кому-то нет. Обычно считается, что математика должна помочь в изучении программирования. Но у меня один приятель в математике шарил, а программирование для него было сложно, так и не осилил. Лично я изучал программирование и математику в универе параллельно и независимо друг от друга ... Короче, всё сложно))
gsaw
00.00.0000 00:00Ну все примеры в статье и показывают, на чем могут споткнуться математики при программировании. Типа "тут вам не там".
Tyusha
00.00.0000 00:00+4Вы серьёзно? На 5 = x? Что за детский сад.
Neusser
00.00.0000 00:00Почему детский сад? Нет большой разницы между
5 = x
и популярными ошибками типаif x = 5
или
if x = 5 or 6 or 7
kertAW
00.00.0000 00:00+1Такие ошибки случаются разве что у самых новичков. Рядовой программист пишет подобные вещи не задумываясь
CTheo
00.00.0000 00:00Написал if x = 5 на прошлой неделе. C 20 летним опыт. Хорошо что в IDE было предупреждение, которое, правда, я заметил только через 5 минут после написания кода, уже работая над другим участком.
iig
00.00.0000 00:00А когда предлагаешь писать if 5 = x - все такие "фу, пережитки прошлого, как можно, IDE всё исправит"..
domix32
00.00.0000 00:00Всю статью ждал когда уже скажут "давайте писать на нормальных типах хаскеля". Не написали, что удивило.
edogs
00.00.0000 00:00+1К какой науке Вы бы отнесли, скажем, "решение задачи обработки входных данных с помощью последовательного применения правильных функций в нужном порядке и получении результата "? К математике или к программированию?
Математика и программирование в принципе одного поля ягода, в одной науке одни функции, в другой другие. И там и там есть входные и выходные данные. И там и там важно сколько операций нужно для решения задачи. И так далее. Функции разные? Дык в разных ЯП они тоже разные. Разные типы языков есть? Так и в математике есть разные разделы даже по способам решения задач.
rutexd
00.00.0000 00:00+1Вещи это не одни и теже. И не одного поля. То что вы описали это алгоритм в целом. Последовательность действий. Рецепт приготовления торта или рисование картины - точно такие же алгоритмы, где то проще - где то сложнее, с большим количеством факторов.
Что бы уметь писать код - не нужно знание математики. Достаточно лишь понимать что стоит за твоим кодом. Что стоит за числовой переменной, что за представлением строки, за функцией. И понимать банально control flow. Да даже по факту не нужно знать как процессор с числами работает и почему нельзя создать 1, 2 байта, условно. Главное просто принять правила и все. Готово. Вы умеете писать код. И если есть понимание алгоритма - есть умение всего остального. Можно продолжить тему что делает программиста хорошим программистом, но это вне данной темы уже
А что бы понимать математику - достаточно знать почему 1+2 * 3 =7? Если на совсем простом уровне - да. А завтра вас спросят что такое интегралы, теория графов, множеств и прочая радость математики. И хорошо если вы ещё ответить сможете - ведь после вашего ответа вам дадут уравнение с х неизвестными, где каждый параметр будет в совсем другом синтаксисе в двух или трех разных системам измерения одновременно как оно часто и бывает, где вам надо будет угадать что имеется в виду и под ваш вопрос самостоятельно подогнать параметры с замахом на квантовую механику и теорию струн, где даже сами учёные не знают ничего толком и ищут формулы досихпор. И вам что бы ответить хотя бы на несколько вопросов недостаточно будет понимать 1+2*3. Совершенно. И тут надо понимать и анализировать огромное количество данных и искать в них связь и пытаться как то отнести одно к другому, а не просто читать сверху вниз и пытаться быть биологическим процессором для поиска буквы среди известного множества букв.
Разумеется, я утрирую. Однако данный пример должен показать насколько это разные вещи и почему одно спокойно живёт без другого, в современных реалиях, если уж быть корректным. И почему писать под не быть (хорошим) программистом.
Я в свое время математику сильно загубил. И сейчас жалею.
edogs
00.00.0000 00:00Что бы уметь писать код - не нужно знание математики. у не нужно знать почему нельзя создать 1, 2 байта, . Главное просто принять правила и все. Готово. Вы умеете писать код Можно продолжить тему что делает программиста хорошим программистом, но это вне данной темы уже
Речь не шла о том, что надо уметь доказывать теорему ферма, вот вообще нигде.
Просто если нет понимания математики (не каких-то узкоспециализированных знаний, а общего понимания, которое невозможно без некоторых базовых знаний), то это сродни тому, как пешеход будет знать лишь "красный нельзя идти, зеленый можно", в таком случае без знания пдд пострадает либо он либо его окружение, хотя знание пдд его и не сделает хорошим пешеходом.
Простое "принятие правил" сделает из человека максимум ChatGPT, хотя не факт что и Copilot получится хотя бы. Это уровень crud без пнимания происходящего.
lair
00.00.0000 00:00Просто если нет понимания математики (не каких-то узкоспециализированных знаний, а общего понимания, которое невозможно без некоторых базовых знаний)
Что такое "общее понимание математики"? Это то, которое в обычной общеобразовательной школе дают, или что-то другое?
iig
00.00.0000 00:00+1Это то, которое в обычной общеобразовательной школе дают, или что-то другое?
Хотя бы да. Если человек научился умножать в столбик и раскрывать скобки - сможет научиться и обходу дерева. Смог выучить таблицу умножения - сможет синтаксис C выучить. Не смог? Ну, наверное, сложно ему будет..
edogs
00.00.0000 00:00Не очень знакомы с текущей образовательной системой в школе, но скорее это все же 1-2 курс универа. То есть когда не просто надо уметь решать задачу выбрав правильную готовую формулу, а появляется навык решения сложных задач с комбинированием формул и появляется необходимость доказывать новые теоремы в ходе решения самостоятельно. Так же, пожалуй, немаловажно разделение математики на подразделы и понимание связи между ними.
Игру в бисер читали? Вот там крайний случай связности наук, но в целом вектор примерно тот же что и в математике/программинге.lair
00.00.0000 00:00появляется навык решения сложных задач с комбинированием формул
Это было в школе. А еще навык решения сложных задач не уникален для математики.
появляется необходимость доказывать новые теоремы в ходе решения самостоятельно
А зачем это в общем программировании?
Игру в бисер читали?
Читал слишком давно, чтобы помнить.
Вот там крайний случай связности наук, но в целом вектор примерно тот же что и в математике/программинге.
Программирование (которое software engineering) - это, на самом деле, не наука. Но я думаю, что это разделение в данном случае не очень важно для дискуссии.
edogs
00.00.0000 00:00Программирование (которое software engineering) - это, на самом деле, не наука. Но я думаю, что это разделение в данном случае не очень важно для дискуссии.
Это разделение это собственно как раз то, из-за чего и есть разница во взлядах. С нашей точки зрения программирование это наука, а crud это не программирование, исходя из этого - математика отнюдь не лишняя для программиста. Если исходить из того, что программирование это не наука, а copilot программист, то тогда математика для программиста не нужна разумеется.
lair
00.00.0000 00:00программирование это наука
А эта точка зрения подтверждается каким-нибудь общепринятым определением, или это просто ваша убежденность?
crud это не программирование
...а это противоречит общепринятым определениям.
программирование это не наука, а copilot программист
А эти два тезиса не вытекают один из другого. Программирование - не наука, но copilot - не программист.
rutexd
00.00.0000 00:00Речь не шла о том, что надо уметь доказывать теорему ферма, вот вообще нигде.
Я снова утрирую, но а зачем еще существует математика если не для описания сложных вопросов? Как часто вы решаете проблемы 1+2*3 в вашем коде с использованием математики в громком смысле слова и тяжелых раздумий? Я могу предположить, что вы над подобными расчётами вы в вашем коде почти не задумываетесь и делаете их машинально. Затупы конечно у всех бывают, но не до такой степени :)
Если вы пишите код, скажем, в веб разработке - это вам не понадобится. Максимум, скажем, рассчитать высоту элемента, условно. Однако если вы работаете в какой либо математической \ физической области, вам будут нередко требоваться эти самые теории ферми, и может быть не доказывать их, но если вы пишите качественный код - то потребуется. Предположим, в околонаучных, околофизических сферах или просто в геймдеве. Да и для жизни, если вы занимаетесь чем то еще помимо кода в яркой форме, может пригодится - никогда не знаешь что случится завтра.
anka007
00.00.0000 00:00Учитывая, что математика во многом развивалась и вдохновлялась задачами из материального мира, то столкнуться с ней можно в практически любой области, взаимодействующей с физическим миром. И чем тоньше и глубже взаимодейтсвие, тем сложнее математика. Да и сфера чисто компьютерных абстракций уже развилась настолько, что для организации оптимальной работы требуются алгоритмы с не самой простой математикой (например big data и векторные вычисления). Правда последнее время вместо того, чтобы задуматься о лежащем в основе явления законе, предпочитают обратиться по API к AI.
randomsimplenumber
00.00.0000 00:00Что бы уметь писать код - не нужно знание математики.
Дык крутить ручку арифмометра тоже можно без знания математики ;) Делать какие-то вменяемые расчеты - придётся получить теорию.
Survtur
00.00.0000 00:00Что бы уметь писать код - не нужно знание математики.
Вот тут поддержу. Написание кода - это в большинстве случаев просто декомпозиция задачи на шаги и подзадачи. Фактически, да, это просто перевод на язык формальной инструкции, алгоритмизация. В некоторых случаях важна математика, но далеко не во всех.
Обязан ли я знать математику сортировки, чтобы запрограммировать вывод список чисел по убыванию, или я должен только знать, что это делает команда sort()?
iig
00.00.0000 00:00Написание кода - это в большинстве случаев просто декомпозиция задачи на шаги и подзадачи
В математике доказательство теоремы это тоже декомпозиция.
anka007
00.00.0000 00:00Так математика - это поиск решения задачи в строгих формальных правилах, и последовательная запись решения в строгих формальных правилах.
Survtur
00.00.0000 00:00ЕСЛИ то_что_вы_написали ТО программирование_это_математика
anka007
00.00.0000 00:00+1Ну кто ж так делает выводы! Прогуливали теорию множеств? Не всякая задача математики решается дискретной вычислительной машиной. Не всякая задача, решение которой описывается формальными правилами является математической задачей.
Survtur
00.00.0000 00:00Теорию множеств, как таковую, я не проходил нигде. Но понимаю, что "Петя - Человек", не означает, что "любой человек - Петя". И я сам люблю приставать к людям с такого рода замечаниями, поэтому лайк вам :-)
anka007
00.00.0000 00:00+17Это статья зачем нужно уметь делать простейшие математические операции, чтобы научиться программировать? Для учеников начальной школы? Так там обычно не "питон" учат, а блочные системы типа скретча.
prishelec
00.00.0000 00:00Если начать с математики свой путь в программирование, то я не думаю что много дойдет до:
x = 5
5 = x
Пожалейте хотя бы дальнобойщиков которые в возрасте после 30+ хотят перейти в IT. :)
sci_nov
00.00.0000 00:00про особенность присваивания я был удивлен классе так в 7-8 м на курсах по информационным технологиям (было это в 97-98 гг, называлось по другому, что-то вроде "Физика атмосферы и радиосвязь" :) ). Математика тут в стороне, как мне кажется. Уметь их соединять - другой вопрос.
vadimr
00.00.0000 00:00Думаю, что случайная путаница, возникающая от использования в некоторых языках программирования знака = в качестве оператора присваивания, не имеет отношения к общему сравнению программирования и математики.
sergey_privacy
00.00.0000 00:00+3Статья вообще не соответствует заголовку.
-
В реальности, работая на самых распространенных задачах, тебе продвинутая математика может не пригодиться и за 20 лет. Какие то мелочи, типа массивов и графов могут возникать в некоторых направлениях, но глубокое знание математики - это пустая трата времени для подавляющего большинства программистов.
Я написал свою первую программу на бейсике в 88 году. Потом было много всего: и асм, и С/С++, и РНР, и 1С и т.д. Бухгалтерия? Там какие то отчеты, запросы, выборки, отображение. Сайты? Получил, отпарсил, отфильтровал, положил в базу, выбрал из базы, отобразил. Битра? ООП, выборки, логика, отображение, доп.сущности. Ты сушишь голову несколько лет в институте разными аспектами высшей математики, а на практике ИТ и высшая математика очень редко пересекаются. Школьной программы "за глаза" для решения большинства задач.
sci_nov
00.00.0000 00:00так задачи разные; простому программисту особенно знать вышку и не надо, а вот тому, кто соединяет программирование с построением алгоритмов - надо. Линейная алгебра и мат. статистика / теория вероятностей - must have для "непростых" программистов, остальное - по мере надобности.
Azazazakot
00.00.0000 00:00Спасибо за мотивацию дальше учу математику✊
sergey_privacy
00.00.0000 00:00Не стоит. Чуть выше ответил:
-
В реальности, работая на самых распространенных задачах, тебе продвинутая математика может не пригодиться и за 20 лет. Какие то мелочи, типа массивов и графов могут возникать в некоторых направлениях, но глубокое знание математики - это пустая трата времени для подавляющего большинства программистов.
Я написал свою первую программу на бейсике в 88 году. Потом было много всего: и асм, и С/С++, и РНР, и 1С и т.д. Бухгалтерия? Там какие то отчеты, запросы, выборки, отображение. Сайты? Получил, отпарсил, отфильтровал, положил в базу, выбрал из базы, отобразил. Битра? ООП, выборки, логика, отображение, доп.сущности. Ты сушишь голову несколько лет в институте разными аспектами высшей математики, а на практике ИТ и высшая математика очень редко пересекаются. Школьной программы "за глаза" для решения большинства задач.
Я написал свою первую программу на бейсике в 88 году. Потом было много всего: и асм, и С/С++, и РНР, и 1С и т.д. Бухгалтерия? Там какие то отчеты, запросы, выборки, отображение. Сайты? Получил, отпарсил, отфильтровал, положил в базу, выбрал из базы, отобразил. Битра? ООП, выборки, логика, отображение, доп.сущности. Ты сушишь голову несколько лет в институте разными аспектами высшей математики, а на практике ИТ и высшая математика очень редко пересекаются. Школьной программы "за глаза" для решения большинства задач.
iig
00.00.0000 00:00+1Только в момент, когда школьной математики недостаточно, а высшей в багаже знаний нет - програмист даже не поймёт что гуглить.
-
EvgenyKlimov
00.00.0000 00:00"квадратная функция"? О, это что-то новенькое. Видимо, это интеграл от круглой функции
i360u
Статья о пользе математики в программировании, и ни слова о теории множеств, теории графов, теории хаоса, теории игр, нечеткой логике, генетических алгоритмах и даже о дифференциальном исчислении и асимптотическом анализе? Вы серьезно, калькулятор для складывания целых чисел?
nulovkin
Наверное, какой-то тролль, как с той статьей, где объясняли, как обвести qr-код ручкой по экрану.
iig
А что не так? Это тоже программирование. И немного математика ;)
vDyDHp8
Коты ещё (теория категорий), чистые функции.