Какие основные математические понятия должен знать хороший разработчик?[закрыто]
-
09-06-2019 - |
Вопрос
Окончив в 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.