Какие основные математические понятия должен знать хороший разработчик?[закрыто]

StackOverflow https://stackoverflow.com/questions/52176

Вопрос

Окончив в 2006 году очень маленькую школу с плохо составленной и устаревшей программой (я иностранец и в то время не знал лучшей школы), я понял, что упустил много базовых понятий из математическая и программная точки зрения, которые в основном являются основой других более высоких концепций.

Т.е.Я пытался слушать/смотреть открытые курсы MIT на Введение в алгоритмы но быстро понял, что мне не хватает нескольких математических понятий, чтобы лучше понять курс.

Итак, какие основные математические концепции должен знать хороший инженер-программист?Какие книги/сайты вы мне порекомендуете?

Это было полезно?

Решение

Другие советы

Булева алгебра имеет фундаментальное значение для понимания управляющих структур и рефакторинга.Например, я видел множество ошибок, вызванных программистами, которые не знали (или не могли использовать) закон де Моргана.Другой пример: сколько программистов сразу понимают, что

if (condition-1) {
    if (condition-2) {
        action-1
    } else {
        action-2
} else {
    action-2
}

можно переписать как

if (condition-1 and condition-2) {
    action-1
} else {
    action-2
}

Дискретная математика и комбинаторика чрезвычайно полезны для понимания работы различных алгоритмов и структур данных.

Как упоминал Балтимарк, математическая индукция очень полезна при рассуждениях о циклах и рекурсии.

Теория множеств лежит в основе реляционных баз данных и SQL.

В качестве аналогии позвольте мне отметить, что плотники обычно используют различные практические методы при строительстве таких объектов, как крыши и лестницы.Однако знание геометрии позволяет вам решать задачи, для которых у вас нет «стандартного» эмпирического правила.Это все равно, что учиться читать с помощью фонетики, а не узнавать с листа базовый словарный запас.В 90+% случаев особой разницы нет.Но когда вы сталкиваетесь с незнакомой ситуацией, ОЧЕНЬ приятно иметь инструменты, позволяющие найти решение самостоятельно.

Наконец, строгость/точность, требуемая математикой, является очень полезной подготовкой к программированию, независимо от конкретной техники.Опять же, многие ошибки в программировании (или даже спецификациях), которые я видел за свою карьеру, имеют в своей основе небрежное мышление.

Я бы выбрал поля, о которых заявил Лэндон:

Дискретная математика, линейная алгебра, комбинаторика, вероятность и статистика, теория графика

и добавить математическую логику.

Это даст вам возможность освоить большинство областей CS.Если вы хотите заняться специальными областями, вам придется погрузиться в некоторые области, особенно:

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory

В порядке важности:

  • Подсчет (необходим для циклов)
  • Сложение, вычитание, умножение, деление.
  • Алгебра (на самом деле требуется только для понимания использования переменных).
  • Булева алгебра, булева логика и двоичная система.
  • Экспоненты и логарифмы (т.понимать обозначение O(n)).

Все, что более продвинуто, обычно зависит от алгоритма или предметной области.В зависимости от того, какие области вас интересуют, также могут быть актуальными следующие вопросы:

  • Линейная алгебра и тригонометрия (3D-визуализация)
  • Дискретная математика и теория множеств (проектирование баз данных, проектирование алгоритмов, проектирование компиляторов).
  • Статистика (ну, для статистических и/или научных/экономических приложений.возможно, также полезно для разработки алгоритмов).
  • Физика (для моделирования).

Понимание функций также полезно (не помню, как называется математический термин для этой области), но если вы умеете программировать, вы, вероятно, уже это делаете.

Моя точка зрения такова:Десятилетний ребенок должен знать математику достаточно, чтобы понимать программирование.Для базового понимания вещей на самом деле не требуется много математики.На самом деле все дело в логике.

«Доказательство по индукции» — это основная математическая концепция, которую должны знать программисты.

Обозначение большого О в общем анализе алгоритмов и в отношении стандартных коллекций (сортировка, поисковая вставка и удаление)

Для дискретной математики здесь это потрясающий набор из 20 лекций от Университета Арсдигита.Продолжительность каждого около часа двадцати минут.

Начните с того, что мы, ребята из компьютерной науки, называем «дискретной математикой».Исчисление и линейная алгебра также могут оказаться весьма полезными, поскольку они открывают путь ко многим областям применения.Как только вы освоите эти три, займитесь теорией вероятностей.Эти 4 позволят вам освоить 95% (я это придумал) областей применения.

Конкретная математика охватывает большинство основных тем.Хорошая книга по дискретной математике, вроде книги Розена. Дискретная математика и ее приложения, восполню любые пробелы.

Я думаю, это зависит от вашего внимания.Несколько лет назад я купил набор «Искусство компьютерного программирования» Дональда Кнута.Посмотрев книги, я понял, что почти все — это доказательства математических вычислений.Если вы заинтересованы в разработке собственных общих алгоритмов и доказательств для них, я рекомендую вам разобраться в вышеупомянутых книгах, поскольку именно с ними вам придется иметь дело в этом мире.С другой стороны, если вам нужно/нужно использовать только различную сортировку/поиск/дерево/и т.д....подпрограммы, то как минимум большая нотация O, булева математика и общая алгебра подойдут.Если вы имеете дело с 3D, то также с геометрией и триггером.

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

Я бы сказал, булева логика.И, ИЛИ, исключающее ИЛИ, НЕ.Я обнаружил, что мы, программисты, используем это чаще, чем остальные математические понятия.

Основы алгебры и статистики — хорошая отправная точка и основа для многих других областей.

Вот простой пример, который меня сбивает с толку, когда я вижу разработчиков, которые этого не понимают:
- Порядок действий

Глава 1 «Искусства компьютерного программирования» призвана предоставить именно это.

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

Еще в школе один из моих преподавателей сказал, что для бизнес-приложений все, что вам нужно знать, — это складывать, вычитать, умножать и делить.Все остальные формулы запрашивающий будет знать и сообщать вам, что необходимо.Теперь поймите, что это предназначено для финансирования школы, ориентированной на отчетность и приложения.По сей день это остается верным для меня.Мне никогда не требовалось знать больше, чем это.

Проверьте книгу Основы информатики
Автор этой книги:Аль Ахо и Джефф Уллман, а также вся книга доступна в Интернете.

Вот что говорят авторы в предисловии о цели этой книги:

"Основы информатики охватывает темы, которые часто встречаются разделенными
между курсом дискретной математики и последовательностью второкурсников по компьютеру
наука о структурах данных.Нашим намерением было выбрать математический
оснований с прицелом на то, что действительно нужно пользователю компьютера, а не
что может выбрать математик».

сайт для изучения математики:http://www.khanacademy.org/

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

Дискретная математика
Линейная алгебра
Комбинаторика
вероятность и статистика
Теория графов

  • Булева алгебра
  • Теория множеств
  • Дискретная математика

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

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

  • Булева алгебра
  • Теория множеств

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

Я думаю, что алгоритмы и теория имеют большое значение.Уметь быстро придумать и правильный Решение — это то, что отличает хороших программистов от остальных.Кроме того, не менее важна возможность доказать свой алгоритм (используя стандартные методы доказательства — индукцию, противоречие и т. д.).

Да, я бы сказал, что базовое понимание индукции помогает вам понять, что представляет собой n в алгоритмах.Также будут полезны некоторые логические и дискретные структуры.

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

Я рассказываю об основах в своей книге "Вычисляем свои навыки» Сообщение в блоге, в котором я обсуждаю, как работает алгоритм ранжирования и подбора игроков TrueSkill в Xbox Live.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top