Особенности мышления программиста. Математика, логика, алгоритмы.

История одного преподавателя информатики. Задача: посчитать площадь треугольника по заданным параметрам. Студент показал результат. Корень квадратный из минус 18.
— Вас ничего в результате не настораживает?
— Нет. Все же откомпилировалось без ошибки…

Обсуждения «Нужна ли математика программисту» ведутся регулярно на многих интернет-ресурсах. Они чаще напоминают спор, а не обсуждения. Основной аргумент спорящих: некоторые разделы математики нужны очень небольшому проценту программистов, а поскольку спорящие себя к ним (пока) не относят, то и математику считают ненужной нагрузкой. Но это только некоторые разделы нужны единицам. А вообще в математике очень много тем для изучения.

 

Задача по математике, взял у дочери, 7ой класс общеобразовательной школы:

 

Отметить на координатной оси t область значений t >= 8; t <= 20;
Отметить на координатной оси t область значений за пределами области t >= 8; t <= 20;

Ну это же скука скучная. Сделал кое-как, списал у соседа, получил троечку. А после школы решил в гаму погамать. Засиделся с ней до самого вечера … и тут случилось страшное! Интернет пропал. Звонишь провайдеру — а там никто не отвечает, только автоответчик повторяет одно и то же механическим голосом: «Нет доступных операторов, позвоните пожалуйста в рабочее время с 8 утра до 20 вечера».

Кто-то из программистов провайдера сделал так, чтобы во время отсутствия персонала отвечал автоответчик. Рабочее время с 8 до 20, то есть область времени t >= 8 и t <= 20. А нерабочее время — за пределами области рабочего времени, то есть время меньше 8 и больше 20.

Вот она, математика.

Задачи про множествах и области — это раздел «дискретная математика».

Задачи, в условиях которых встречаются слова «не», «и», «или» — это раздел «математическая логика».

Выполняются некие замеры событий, которые оказывают некоторое воздействие. События происходят нерегулярно. Воздействие имеет разную интенсивность. Есть таблица с распределением времени начала событий, длительности и интенсивности воздействия. Нужно узнать, какая средняя суммарная интенсивность воздействия будет за месяц.

Капец скука. Да вапще фиг знает как считать. Кому это надо, блин?

В летние каникулы решили с друзьями замутить интернет-магазинчик. Через некоторое время, по разным причинам, магазин начал давать доход, ура. Но продажи нерегулярные, иногда раз в сутки, иногда несколько раз в сутки. И сумма покупок разная. Сколько же зарабатывает магазин за месяц?

Так. Сравним с скучной задачей выше. Покупки — это события. Они случаются нерегулярно. Сумма покупки — это воздействие. Оно разное. Ну, давай, считай, сколько ты зарабатываешь.

Указанная задача относится к разделу «статистика».

В резервуар объёмом 1000 литров через две трубы втекает 5 и 10 литров воды в секунду, а через пробку «подтекает» наружу 0.5 литра в секунду. За какое время наполнится резервуар.

Опять этот чёртов бассейн. Пробку нормальную не могут вкрутить уже 100 лет. Когда же он наполнится-то?

У тебя два интернет-магазина, каждый из которых приносит приблизительно 5 и 10 тысяч рублей в сутки. А на хостинг и рекламу приходится тратить в среднем 0.5 тысячи рублей в сутки. Явно видно, что ты в профите, но попробуй сам определить, за сколько дней получится накопить на новую игруху для PlayStation или на гиро-скутер, на которые ты постоянно заглядываешься в магазине.

Это классическая задача «скорость-время-расстояние». И обычная алгебра.

 

Составь алгоритм вычисления площади и периметра треугольника со сторонами a, b, c (a, b, c — вещественные положительные числа).

Ну периметр я, предположим, посчитаю. А как площадь посчитать — я даже представить себе не могу. А ещё написать алгоритм… Как заставить машину посчитать за меня эту задачу?

Так, может быть начать с алгоритма «как составить алгоритм решения задач»?

1) Прочитать задачу.
2) Выписать известные и неизвестные нам переменные в «дано»
В этой задаче к известным переменным относятся стороны: a, b, c; к неизвестным — площадь S и периметр P
3) Вспомнить либо составить необходимые формулы
Периметр треугольника — это сумма всех его сторон
Формула периметра треугольника по трём сторонам
Площадь треугольника по трём сторонам — это хитрая формула
Формула площади треугольника по трём сторонам
4) Составить блок-схему или словесное описание действий
Нам надо как-то получить значения трёх сторон, посчитать и вывести результат пользователю.
5) Записать решение на языке программирования
В языке программирования есть какие-то функции, которые позволяют реализовать ввод данных (через командную строку или через графический интерфейс), выполнить математические вычисления (корень квадратный), а также вывести результат.

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

Итак, у школьника в начале этой статьи получилось площадь равна корень квадратный из минус 18. Значит у него одна из сторон треугольника слишком длинная, но он не добавил проверку на возможность расчёта. И этим расстроил преподавателя.

Сделать программу, которая запустится — это 1% от навыков программиста. Сделать программу, которая решает проблему — это 59% от навыков программиста. Куда делись ещё 40%? Об этом в другой раз.

Таких примеров скучных задач, которые встречаются на практике, очень-очень-очень много. Математика, логика и алгоритмы для программиста — это как еда, воздух и вода. Без них прожить можно, но недолго. На практике это выглядит так: без проверки знания основных разделов математики, логики и алгоритмов тебя могут взять на испытательный срок в софтовую контору, но долго ты там не удержишься. Либо не справишься с практической задачей, либо взорвётся мозг. И как следствие — не справишься с практической задачей.

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

Общее

Цели:

  • Понимать, что программирование — это второстепенное
  • Понимать, что программа должна решать задачи пользователей
  • Понимать, что существуют разные решения, уметь находить решения, уметь сравнивать их между собой
  • Уметь делать свои программные решения понятными, стабильными, быстрыми, гибкими

Литература:

Алгоритмы

Цели:

  • Понимать основы теории информации и алгоритмов
  • Уметь составить алгоритм на словах или в блок-схемах
  • Уметь читать алгоритмы
  • Уметь определять алгоритмы в чужие программах

Литература:

Видео

Изображение для обложки Variation Investigation 2 позаимствовано у Mobilelectro

Павел Волынцев

Уже более 15 лет занимаюсь разработкой веб-проектов. Fullstack Senior Developer. IT евангелист — доношу свет знаний об информационных технологиях. Профессиональные цели: Дать людям возможность дать людям больше.

Читайте также: