Комментарии 95
Если перефразировать, то вопрос гораздо понятней.
Зачем каменщику сопромат?
Или численные методы решения уравнений в частных производных.
Линейное векторное пространство над полем Галуа - каждый программист в мире каждый день пользуется 100500 миллионов раз.
Если математику знаешь и ориентируешься, то ты инженер-разработчик высокого класса.
Если не знаешь и не ориентируешься - ты кодер-техник, не более...
Ох что же я буду делать без титула такого классного
Да титул здесь не при чем.
А возможности устроиться на разнообразные работы и на разные уровни должности - с пониманием математики и без...
Лучше научиться читать реп, тоже возможностей открывает. Если клёво реп не читаешь, то ты лох без сучек и братвы, не более... А если знаешь и можешь выдать крутой флоу, то ты классный чел, респектовый эмси высокого класса
Тогда что вы делаете на программерском ресурсе ?
Идите учите реп...:)))))
Рынок читателей репа слишком мал, чтобы реально рассчитывать что-то на этом заработать.
А возможности устроиться на разнообразные работы и на разные уровни должности - с пониманием математики и без...
Около нуля разницы.
Есть основания считать, что я математику понимаю (диплом прикладного математика от первого вуза страны, примерно 8 лет ковыряний чистой математики после выпуска «для себя»), и на работе она используется примерно никак.
Более того, чем больше на работе серьёзной глубокой математики, тем меньше за неё платят. Обмазываться матлогом и пруверами для формальной верификации (и разработки методов формальной верификации в команде с PhD-чуваками из топовых универов мира) — сто тугриков в час, ваять фронтенды на реакте с двумя годами опыта за плечами и отсутствием формальной вышки — 200, быстро перекладывать байтики на C++ — 500.
примерно 8 лет ковыряний чистой математики после выпуска «для себя»
Расскажете поподробнее в каком темпе изучали и как удавалось совмещать с работой?
Зависит от учебника. Условные TAPL и LADR — по три месяца на каждую параллельно с работой. Рилевская Category Theory in Context — примерно два с половиной месяца, но это было вне работы, тратя на этак вторую половину книги часов по шесть в день, да и с теоркатом я был знаком в приложениях (поэтому первая половина была довольно халявной). Гольдблаттовские «Топосы» — где-то полтора года, если вычесть пропуски.
Совмещать с работой — ну как, есть же вечера и выходные.
У меня TAPL с похожей скоростью проходился (хоть и с меньшим постоянством чем хотелось бы) и Elements of Set Theory Эндертона где-то как у вас книга Рилевской.
Совмещать с работой — ну как, есть же вечера и выходные.
У меня work-life balance в сторону работы перекошен немного. Вы, емнип, в довольно жёстких и интересных местах работали типа стартапов и HFT. Там не было такого, что какие-то сложные задачи вытесняли всё остальное?
Вы, емнип, в довольно жёстких и интересных местах работали типа стартапов и HFT. Там не было такого, что какие-то сложные задачи вытесняли всё остальное?
Онбоардинг вытесняет, остальное — не очень (но я кроме работы и ботанья/пет-проектов и не занимаюсь толком ничем). Собственно, два больших перерыва, которые я делал в этих самых «Топосах», были как раз связаны с переходом на новую работу.
На жёсткой работе помогает теорию ботать в выходные, а задачи по ней решать в будние дни после работы. Задачи после рабочего дня как-то легче идут, чем теория.
"Если математику знаешь и ориентируешься" но пишешь при этом код сам,то всё равно кодер-техник.
До написания кода надо сначала понять, что именно писать... :)))
В наиболее модных направлениях (ИТ + DS) без математики вообще делать нечего.
А что, надо через "испорченный телефон" объяснять кодеру-технику, что он должен написать? Так себе идея.
Написать код самому - быстрее, и менее чревато ошибками.
За 15 лет вэб программирования обычно максимальное знание математики что требуется это посчитать какие-то проценты (например НДС). Но иногда попадаются интересные проекты в виде технических калькуляторов цены, и там для отрисовки графиков приходится вспоминать элементарную алгебру и геометрию, например найти корни квадратного уравнения, найти точку пересечения графиков, или длину кривой линии. Ну конечно если залезть в нейронные сети, то там уже придется вспоминать высшую математику, производные и первообразные. Так что думаю требуемая глубина знаний математики зависит от вашей сферы.
Естественно. Глубина использования математики зависит от задач.
Но знание математики раздвигает твои возможности по сферам работы.
Ты просто более конкурентоспособен становишься.
Не считая того, что математика "ум в порядок приводит".
А фронт-ендщики веб-программисты - это такие слесари, а не инженеры разработчики... :))))
Аналогично 15 лет в финтехе. И математики хоть отбавляй, даже производные нужны и численные методы решения нелинейных уравнений. Если интересно, можете посмотреть как считается эффективная процентная ставка для фин инструмента или всякие показатели МСФО.
зависит от того что вы программируете в текстовом редакторе может не нужны интеграллы, диференциалы, векторная/матричная, кватернионы
Программисту больше нужна дискретная математика и логика, а не вышмат в классическом понимании. За десять лет разработки, так ни разу и не было случая, куда можно было бы производную приладить.
Алгебра тож нужна. Многочлены, векторы, матрицы...
Линейное векторное пространство над полем Галуа - это оно. :))))
Шифрование и кодирование с защитой от ошибок - самое то.
Аналитическая геометрия - чтобы графику понимать...
Теория графов, теория вероятностей и статистика
Методы оптимизации, численные методы
Это навскидку.
Многочлены, векторы, матрицы...
Аналитическая геометрия - чтобы графику понимать...
Сколько людей, работающих даже, скажем, над 3D-графикой, понимает, почему матрицы надо умножать так, как они умножаются?
Более того, я не уверен, что средний выпускник Физтеха это понимает, потому что Беклемишев в своём замечательном (нет) курсе линала это просто постулирует.
Линейное векторное пространство над полем Галуа - это оно. :))))
Шифрование и кодирование с защитой от ошибок - самое то.
Я занимался блокчейном, и мне даже там это не пригождалось. Мне это вообще нигде не пригождалось.
Методы оптимизации, численные методы
Профессионально занимался машинным обучением, там это тоже не нужно. Берёшь библиотеку, загоняешь туда целевую функцию и максимум якобиан там какой-нибудь (что это такое, написано вот тут в справке по либе), и всё.
Теория графов, теория вероятностей и статистика
Достаточно почти-школьного уровня (см. выше — я занимался машинным обучением). Способный поступить в вуз человек способен это освоить на достаточном для практических задач уровне и после.
Не надо путать конкретные разделы математики, изучающиеся на вышке, как фильтр и косвенный признак (бро освоил теорвер, бро можно брать на работу), и как необходимые условия (если у бро нет диплома с галочкой нужной формы напротив теорвера, то бро непригоден к работе).
Берешь библиотеку - ключевое.
Если знаешь соответствующую математику - ПИШЕШЬ библиотеку.
Зачем её писать, если она вон уже готовая лежит? Чтобы было хуже, менее отлаженно и более тормознуто?
Так они и лежит потому, что ее КТО-ТО написал.
А не ты - ибо математики не знаешь...
Я сидел-ждал, когда её кто-то написал? Нет. Она была готовая уже до того, как я пришёл — моё знание математики тут не влияет примерно никак: для подавляющего большинства программистских задач серьёзные математические библиотеки уже написаны, и программисту не приходится писать свою математику.
Да и с чего ты взял, что я математику-то не знаю? Типа, если бы «знал математику», то бросился бы переизобретать все используемые библиотеки с нуля?
Интересно, а для обычных, нематематических библиотек это тоже работает? Типа, я использую std::unordered_map
потому, что не знаю, как работают хэшмапы (подсказка: знаю, всё равно использую std::unordered_map
)? Я использую либу для блумфильтров потому, что не знаю, как работают блумфильтры и почему там такая-то оценка вероятности коллизий (подсказка: знаю, всё равно использую готовые либы вместо написания своих блумфильтров)?
Сколько людей, работающих даже, скажем, над 3D-графикой, понимает, почему матрицы надо умножать так, как они умножаются?
Примерно все? Сам работаю с графикой, поэтому очень удивляет ваш вопрос. В работе используются и производные и интегралы и тервер, само собой вся линейная алгебра, иногда матан пригождается, преобразование Фурье, сферические гармоники (это из личного опыта). Так что если занимаетесь графикой (рендеры, игры, dcc) без хорошей математики никак.
Окей, почему матрицы умножаются как строка на столбец? Почему не строка на строку, например?
В моей практике не то что программисты 3D-графики, а те же выпускники Физтеха (успешно сдавшие линал на первом курсе) брали это как аксиому и определение умножения матриц.
Эм... я думаю вы путаете использование математики, и создание на её основе чего-то нового. И истории математики. По памяти я могу сказать что матрицы перемножаются таким образом потому что так происходит перенос из одного пространства в другое (вытекает из перемножения вектора на матрицу, каждая строка\ столбец в матрице в зависимости от gapi является базис вектором пространства) если вы это имели ввиду. Ну и да это всё принимают за аксиому потому что это база о которой не задумываешься потому-что применяешь её постоянно.
Может вы подскажите зачем мне задумываться при разработке почему матрицы перемножаются именно так? Вы же вряд ли задумываетесь почему числа перемножаются именно так как они перемножаются. Например почему -3 * -3 == 9 а не -9? Вот и тут также.
Давайте посмотрим на разговор ещё раз. Я изначально спросил про понимание, почему матрицы умножаются так, как умножаются (и изначально выделил слово «почему» курсивом, чтобы было видно, что это именно «почему», а не «как»). Вы ответили, что примерно все понимают, почему. Я переформулировал вопрос, сделав ещё больший акцент на «почему». Вы сказали, что это понимание не нужно (хотя ещё недавно у вас понимали примерно всё) и это я путаю там что-то.
Как такой разговор и ваша смена ответа на противоположный называется?
Эм... я думаю вы путаете использование математики, и создание на её основе чего-то нового.
Я думаю, что использование математики и есть создание чего-то нового на её основе (вне учебных задач), даже если это очередной 3D-движок. Если же вы говорите о научной работе в рамках математики и о создании чего-то нового внутри математики, то это совсем другой вопрос — мы же тут говорим о программистах.
Более того, я думаю, что знание [определённой области] математики (а что ещё имеется в виду под «программисту нужна математика»?) требует понимания, как мы это любим, на уровень вниз, откуда берутся те или иные вещи в вашей ветви математики. Если вы занимаетесь матричным анализом и претендуете на его знание, то неплохо бы понимать, что, действительно, матрица — это численное выражение линейного оператора, и чтобы операция композиции матриц (которую мы называем умножением) выражала композицию линейных преобразований, то матрицы нужно умножать строка на столбец (или столбец на строку, если у вас все матрицы и их «физический смысл» консистентно транспонированные — это изоморфно, разница между этими двумя вариантами — вопрос соглашения и традиции). Тонкости линейных операторов и общую теорию R-модулей, наверное, знать уже не обязательно (но всё равно полезно).
Более того, я думаю, что для использования математики знать её не обязательно — ровно о чём и был мой изначальный тезис, и вы его в очередной раз иллюстрируете (как и всегда происходит в таких разговорах о необходимости математики для программиста). Ну, просто уровень глубины понимания примерно такой же, как у человека, который прочитал в книжке «3D-графика для людей без математического образования», что матрицы перемножаются вот так вот, и точка.
Ну и да это всё принимают за аксиому потому что это база о которой не задумываешься потому-что применяешь её постоянно.
А если вы часто решаете квадратные уравнения, то формулу дискриминанта вы тоже принимаете за аксиому, или таки можете её вывести?
Может вы подскажите зачем мне задумываться при разработке почему матрицы перемножаются именно так?
Так зачем программисту математика? ;)
Вы же вряд ли задумываетесь почему числа перемножаются именно так как они перемножаются. Например почему -3 * -3 == 9 а не -9?
Я не говорю, что это аксиома, и я могу это вывести. При этом я не считаю, что я дофига понимаю абстрактную алгебру (ту её часть, где всякие там группы-кольца и прочие минусы-умножения), а в теоркате и теории типов минусов нет, есть только группа Гротендика.
Вмешаюсь в разговор. Чтобы понять, почему умножение матриц происходит именно так, надо его вывести, например, исходя из того, что матрицы - это линейные операторы: в матрице просто записаны результаты действия оператора на базисные векторы, по столбцу на вектор (можно было бы записывать и по строке, тогда умножение получилось бы "перевернутое"). А дальше надо просто подействовать на каждый базисный вектор двумя операторами подряд, все аккуратно расписать и получится матрица - результат перемножения именно так как это описано.
Это вытекает из того, что мы захотели сделать перемножение матриц полезной операцией. Его можно было бы опеределить как угодно, но тогда у такого умножения не было бы такого количества применений.
Что касается вопросов знания или понимания: надо знать достаточно математики чтобы в ней ориентироватся, чтобы понять, а какую ее часть вообще надо в вашей задаче принимать. Потому что программирование - это написание алгоритмов, и этим занимается computer science, подраздел математики.
Вызубрить ее всю без понимания невозможно, поэтому единственный оставшийся вариант - это математику все-таки понимать.
Чтобы понять, почему умножение матриц происходит именно так, надо его вывести, например, исходя из того, что матрицы - это линейные операторы: в матрице просто записаны результаты действия оператора на базисные векторы, по столбцу на вектор
Это ровно то, о чём я писал выше.
Что касается вопросов знания или понимания: надо знать достаточно математики чтобы в ней ориентироватся, чтобы понять, а какую ее часть вообще надо в вашей задаче принимать. Потому что программирование - это написание алгоритмов, и этим занимается computer science, подраздел математики.
Угу, а бухгалтерия — это работа с числами. Надо бухгалтеру знать арифметику Пеано и чем она хуже (или лучше) арифметики Пресбургера?
Под ковёр из «достаточно» у вас тут очень много заметено. На практике достаточно уровня немногим выше хорошей школы, и книги уровня grokking algorithms достаточно для базы в 99% задач в 99% работ (и за невыполнение этого 1% с вами ничего не случится — я куда больше условной девопсни/техдоков/прочего делегирую другим и нормально живу). Более того, я знаю людей, которые и эту книгу не осилили, и которые на работе успешнее, чем я, зарабатывают больше, чем я глубоко математизированным программированием, и в целом счастливее, чем я.
Вызубрить ее всю без понимания невозможно, поэтому единственный оставшийся вариант - это математику все-таки понимать.
Опять же, практика (и, в частности, этот тред) показывает, что можно именно вызубрить, и рассуждать в терминах линейных операторов для 3D-графики не нужно. Рассуждать в терминах линейных операторов оказывается не нужно даже для успешной сдачи экзамена по «линалу» на отл в топовом российском (и не только) вузе.
Вы сказали, что это понимание не нужно (хотя ещё недавно у вас понимали примерно всё) и это я путаю там что-то.
Я вам ответил почему, и да это понимание не нужно, также как не нужно понимание почему числа перемножаются как перемножаются.
Более того, я думаю, что знание [определённой области] математики (а что ещё имеется в виду под «программисту нужна математика»?) требует понимания, как мы это любим, на уровень вниз, откуда берутся те или иные вещи в вашей ветви математики.
Я считаю что в фразе «программисту нужна математика» имеется в виду владение мат аппаратом, в ключе матриц, это знать свойства матриц и операции над ними, а не историю создания и почему они умножаются как умножаются.
действительно, матрица — это численное выражение линейного оператора, и ....
Отлично, а теперь вопрос, чем это заученное (или скорее всего скопированное откуда-то ) определение поможет мне в работе? Когда мне нужно сделать чтобы персонаж выхватил меч из-за спины, я не буду думать об определении матрицы, я буду думать о том какой порядок операций над матрицами мне нужно сделать.
Если вы занимаетесь матричным анализом и претендуете на его знание
Я не занимаюсь матричным анализом, я использую линейную алгебру.
А если вы часто решаете квадратные уравнения, то формулу дискриминанта вы тоже принимаете за аксиому, или таки можете её вывести?
Очевидно, что если она применяется постоянно, то конечно она берётся за базу, зачем выводит её каждый раз как встречается?
Так зачем программисту математика? ;)
Эм.... Это всё равно что сказать зачем нужна машина если не знаешь детально как она работает.
Повторяюсь вы по моему путаете, математику из прикладной области где она используется как инструмент, и саму науку которая придумывает эти инструменты.
По вашему я так понимаю, что если человек не знает почему кватернионы например работают так как работают, но при этом успешно их использует, то он не использует математику.
Я не говорю, что это аксиома, и я могу это вывести.
Так вы не ответили на вопрос, вы когда перемножаете два числа, каждый раз думаете как это работает? А когда пишете код тоже каждый раз думаете как это компилируется? Если не можете написать компилятор то вы не программируете, так что ли?
Почему всегда так получается, что как поскребёшь сторонника «знание математики необходимо программисту», то там оказывается, что и не знание, и не математики, и не то чтобы необходимо? И, более того, этот сторонник сам начинает тебе доказывать, что это всё не нужно?
Я вам ответил почему, и да это понимание не нужно, также как не нужно понимание почему числа перемножаются как перемножаются.
Тогда непонятно, откуда взялся ваш ответ «примерно все».
Я считаю что в фразе «программисту нужна математика» имеется в виду владение мат аппаратом, в ключе матриц, это знать свойства матриц и операции над ними, а не историю создания и почему они умножаются как умножаются.
Что означает «знать операции»? Зазубрить алгоритмы их выполнения? Уровень даже ниже grokking algorithms. Понимать, откуда они берутся? Сорри, для этого надо понимать, почему они умножаются как умножаются.
Причём тут история, вообще непонятно. Я это знаю не из истории математики, а из проработанной «linear algebra done right».
Отлично, а теперь вопрос, чем это заученное (или скорее всего скопированное откуда-то ) определение поможет мне в работе?
Почему заученное или, тем более, скопированное?
Я не занимаюсь матричным анализом, я использую линейную алгебру.
Вы используете матричный анализ. Линейная алгебра — это как раз про линейные операторы, в ней можно работать по большому счёту вообще без матриц.
Очевидно, что если она применяется постоянно, то конечно она берётся за базу, зачем выводит её каждый раз как встречается
Я спросил не про базу, а про аксиому. Дано ли нам богом свыше минус-бэ-плюс-минус-корень-из-бэ-квадрат-минус-четыре-ацэ-на-два-а (интонационные запятые досыпьте за меня)? И я не спросил, выводите ли вы это каждый раз. Я спросил, можете ли вы это вывести, или будете говорить, что это всё не нужно?
По вашему я так понимаю, что если человек не знает почему кватернионы например работают так как работают, но при этом успешно их использует, то он не использует математику.
По-моему в этом случае человек не знает и не понимает математику, да.
Вообще во всех этих дискуссиях проблема в том, что высказывается тезис «программисту нужна математика», и он потом как дышло поворачивается куда надо по желанию. Нужна математика в смысле «пользуюсь некоторыми рецептами» (да, очевидно нужна) или «получил вышку хотя бы в прикладной математике и могу вывести эти рецепты» (нафиг не нужно, как я изначально говорил и как вы, похоже, согласны)? Математика — это околошкольное «законы де Моргана булевой алгебры и формула Байеса» (даже это не везде нужно, но добирается легко по необходимости), или околоаспирантское «алгебра Хейтинга произвольных топосов и разложение Хана вероятностной меры» (не нужно практически нигде)?
И вот, собственно, практика этих дискуссий снова показывает, что обычно люди имеют в виду понимание, откуда берутся рецепты, и достаточно высокий уровень самой математики (а кто не знает — тот кодер-макака и лох), а как начинаешь копать вглубь, так… короче, см. мой первый абзац.
Так вы не ответили на вопрос, вы когда перемножаете два числа, каждый раз думаете как это работает?
Данный вопрос не имеет отношения к моему исходному вопросу и является попыткой увести разговор в сторону ложной аналогией.
Почему всегда так получается, что как поскребёшь сторонника «знание математики необходимо программисту», то там оказывается, что и не знание, и не математики, и не то чтобы необходимо? И, более того, этот сторонник сам начинает тебе доказывать, что это всё не нужно?
Эм.. не стал даже читать дальше. Если для вас прикладное знание математики в определённой области и её применение, это не знание математики и не применение её, то спорить смысла нет, у нас видимо отличается представление о том что заложено в фразе «знание математики необходимо программисту». Для меня это использование мат аппарата, мне не нужно знать почему скалярное произведение векторов это корень из суммы произведений (конечно на это можно потратить время и вывести, но зачем?) мне достаточно знать как эту операцию выполнять и свойства этой операции. Если вы не считаете что это знание математики, то у нас с вами просто не совпадают взгляды. А долюбится можно до чего угодно, вот вы дали например определение матрицы, но на вопрос почему именно строка на столбец перемножается не ответили.
Почему заученное или, тем более, скопированное?
Потому что оно не отвечает на вопрос, почему перемножается столбец на строку. Ну и ответьте всё же на вопрос, чем это знание мне поможет?
Я спросил, можете ли вы это вывести, или будете говорить, что это всё не нужно?
Могу вывести, но считаю что это ненужно. Переубедите меня, зачем это нужно?
Данный вопрос не имеет отношения к моему исходному вопросу и является попыткой увести разговор в сторону ложной аналогией.
Ой как мы запели, нуда нуда. А по моему имеет непосредственное отношение, как вы можете использовать перемножение если не понимаете что за этим лежит.
Вы видимо сводите к абсолюту, и ровняете фразу "Нужна математика" к "Нужны знания математики во всех сферах её применения "и если человек например не знает биоинформатику то он не может говорить что использует математику.
Если для вас прикладное знание математики в определённой области и её применение
Потому что у зазубрившего перемножение матриц человека нет знания математики.
у нас видимо отличается представление о том что заложено в фразе «знание математики необходимо программисту»
Эх, а если бы вы дочитали до конца…
Для меня это использование мат аппарата
А я знаю лингвистику, если успешно пользуюсь русским языком?
А долюбится можно до чего угодно, вот вы дали например определение матрицы, но на вопрос почему именно строка на столбец перемножается не ответили.
Потому что если расписать представление базисных векторов, то строка на столбец и получится (ну или столбец на строку, опять же, если вы всё консистентно транспонировали).
Потому что у зазубрившего перемножение матриц человека нет знания математики.
Ну то есть, если человек знает все свойства матриц и операций над ними, но не может сходу вывести перемножение, то по вашему математику он не знает, ладно, тогда у вас со мной просто разный взгляд на это.
А я знаю лингвистику, если успешно пользуюсь русским языком?
Ну аналогично вашим рассуждениям, я могу утверждать что вы не пользуетесь русским языком, потому что не разбираетесь в лингвистике.
Потому что если расписать представление базисных векторов, то строка на столбец и получится
Вы по прежнему не объяснили почему перемножение базисных векторов даёт преобразование, почему это в принципе работает? Ну и для начало надо в принципе объяснить как работает перемножение. Если вы не понимаете как работает перемножение то как вы можете перемножать матрицы?
Ну то есть, если человек знает все свойства матриц и операций над ними, но не может сходу вывести перемножение
Повторю вопрос из недочитанного вами комментария:
Что означает «знать операции»? Зазубрить алгоритмы их выполнения? Уровень даже ниже grokking algorithms. Понимать, откуда они берутся? Сорри, для этого надо понимать, почему они умножаются как умножаются.
Ну аналогично вашим рассуждениям, я могу утверждать что вы не пользуетесь русским языком, потому что не разбираетесь в лингвистике.
Это сново несовсем то высказывание что я имел в виду. Но и это в полне будит правдой, если руским языком я буду пользоватся не согласно правилам, но достаточна длятого, что бы вы магли меня панять.
Свою коммуникативную функцию два предложения выше выполняют? Выполняют. Можете вы сказать, встретивши их в отрыве от контекста, что их автор знает русский язык? Ну хз, я бы не сказал.
И да, лингвистика изучает язык, а сам язык — это набор коммуникативных паттернов и рецептов. Я специально выбрал «лингвистику» в прошлом комментарии, потому что аналогично вашим рассужениям я знаю лингвистику, потому что могу применять предмет изучения лингвистики для достижения своих целей.
Вы по прежнему не объяснили почему перемножение базисных векторов даёт преобразование, почему это в принципе работает?
Мне вам весь вывод расписать, что ли? В комментариях латех-форматирование до сих пор не завезли, для начала, а без этого это будет больно и уродливо для всех участников дискуссии.
Ну и для начало надо в принципе объяснить как работает перемножение.
Так, чтобы соответствующий морфизм из линейных операторов в матрицы был функториальным.
Если вы не понимаете как работает перемножение то как вы можете перемножать матрицы?
Как обезьянка.
Что означает «знать операции»?
Это означает какие операции к ним применимы, и их свойства. Например скалярное произведение векторов и что это означает косинус угла между векторами помноженное на их длинны. Именно это даёт профит, а не умение доказывать что это так и почему это так работает, и откуда берётся. (само-собой есть исключения в виде научной деятельности например).
Но и это в полне будит правдой, если руским языком я буду пользоватся не согласно правилам, но достаточна длятого, что бы вы магли меня панять.
Ну нет, так не пойдёт. Если следовать вашей логике, то вы не используете русский. Да вы печатаете буковки, и вас понимают, и это работает, но увы русский вы не используете, просто потому что не разбираетесь в лингвистике, да и в принципе вам русский не нужен, по той же причине.
Свою коммуникативную функцию два предложения выше выполняют?
Не знаю, вы сначала диплом лингвиста покажите, а потом я смогу сказать используете вы русский или нет, а без этого никак.
Я специально выбрал «лингвистику» в прошлом комментарии, потому что аналогично вашим рассужениям я знаю лингвистику, потому что могу применять предмет изучения лингвистики для достижения своих целей.
А я не знаю лингвистику, значит я не пишу на русском и не знаю его, интересно как же вы понимаете меня?
Мне вам весь вывод расписать, что ли?
Естественно, желательно с доказательством и анализом, а то как я пойму математику вы мне объясняете, или же зазубренными аксиомами кидаетесь уровня grokking algorithms.
Так, чтобы соответствующий морфизм из линейных операторов в матрицы был функториальным.
Это ничего не объясняет, как говорил Фейнман "Если вы не можете что-то объяснить ребенку, то вы этого не понимаете сами" попробуйте объяснить мне почему -3 * -3 == 9 а не -9 это же база, но так как вы говорите что без выведений и доказательств это не математика, то докажите и выведите почему -3 * -3 == 9.
Как обезьянка.
Я думаю правильнее было бы 'Как обезьянке.' Ну а что поделать, вы же упорно уходите от вопроса который неудобен для вас.
Это означает какие операции к ним применимы, и их свойства.
Окей, принято. Только это зубрёж уровня зубрежа дат в школьной истории или стихотворений в школьной литературе. Собственно, школьный уровень, да, как я и писал изначально.
Ну нет, так не пойдёт. Если следовать вашей логике, то вы не используете русский.
Я на всякий случай напомню о том, что русский язык — это не наука, а набор соглашений, а лингвистика — ну так, наука немножко (на самом деле вообще настолько наука, насколько гуманитарная вещь может быть наукой). Поэтому у слова «использовать» во фразах «использовать русский язык» и «использовать лингвистику/математику» несколько разная семантика (ну, как у «побег», который сериал из нулевых, и «побег», который у растений).
Поэтому да, в предыдущем абзаце я использую русский язык, но определять «использую $science» или «знаю $science» так, чтобы предыдущий абзац был заодно примером использования лингвистики, очень странно (но если хочется считать себя лингвистом, то можно, конечно, и так определить, кто ж запретит).
И аналогично говорить, что я знаю математику русский язык, если я пишу неправильно, но носитель русского языка всё равно может меня понять (то есть, если я достигаю цели использования языка) — это тоже очень нетипичное использование термина «знаю».
Не знаю, вы сначала диплом лингвиста покажите, а потом я смогу сказать используете вы русский или нет, а без этого никак.
Вы всё ещё не отличаете «использовать результаты» от «знать, откуда они берутся»?
А я не знаю лингвистику, значит я не пишу на русском и не знаю его, интересно как же вы понимаете меня?
Начинаю подозревать, что я ошибался, и что математику надо знать не программистам, а вообще всем, чтобы они не делали таких логических ошибок, на которые я устал указывать (потому что мои указания вы систематически игнорируете).
Естественно, желательно с доказательством и анализом, а то как я пойму математику вы мне объясняете, или же зазубренными аксиомами кидаетесь уровня grokking algorithms.
А кто мне мешает скопипастить из учебника?
Это ничего не объясняет
Зависит от языка, которым вы пользуетесь. Если человек достаточно интернализировал понятие морфизма и функториальности, то ему это скажет более чем нужно. Если же нет — ну, тут каждый из этих терминов раскрывается в несколько предложений.
как говорил Фейнман "Если вы не можете что-то объяснить ребенку, то вы этого не понимаете сами"
Ну объясните ребёнку квантмех или ОТО, пожалуйста, а я на это посмотрю.
Вообще зря люди в вузах учатся, дипломы защищают, кандидатские потом всякие. Можно же просто объяснить ребёнку, и ребёнок поймёт!
попробуйте объяснить мне почему -3 * -3 == 9 а не -9 это же база, но так как вы говорите что без выведений и доказательств это не математика, то докажите и выведите почему -3 * -3 == 9.
Зависит от вашей формализации целых чисел (группа Гротендика, прямое построение как индуктивный тип поверх натуральных с двумя конструкторами nonneg : ℕ → ℤ
и neg : ℕ → ℤ
, или что-то ещё по вашему вкусу). Впрочем, во всех этих формализациях умножение дистрибутивно относительно сложения и коммутативно (что доказывается зависимо от формализации), а сложение формирует группу, где -x — (единственный, как и в любой группе) обратный к x, поэтому:
∀x, y. xy + (-x)y =[ дистрибутивность] (x + -x)y =[ -x обратный к x] 0y =[ определение умножения ] 0
⇒
(-x)y =[единственность обратного] -(xy)∀x, y. (-x)(-y) =[ п. 1 ] -(x(-y)) =[ коммутативность ] -((-y)x) =[ п. 1 ] -(-(yx)) =[ групповые свойства обратных ] yx =[ коммутативность ] xy
Инстанциируем для x = y = -3: -3 × -3 = 3 × 3 = 9.
Я здесь пропустил пару шагов, понятных человеку, но непонятных агде или коку, но если вы найдёте, к чему придраться, то вы заодно понимаете, что я опустил.
Правда, в некоторых формализациях (например, стандартной агдовской) умножение определяется как, упрощая, x × y = s(sign(x), sign(y)) × |x| × |y|, где s — очевидная табличная функция, выбирающая знак по знакам аргументов, и ваш вопрос имеет простой, но скучный ответ «по определению умножения», поэтому я выбрал отталкиваться от свойств умножения и сложения, реализуемых в любой формализации, опять же.
Я думаю правильнее было бы 'Как обезьянке.' Ну а что поделать, вы же упорно уходите от вопроса который неудобен для вас.a
Потому что вы в упор не видите разницы между вашим вопросом и моим вопросом, и я знаю, что будет, если я отвечу на ваш вопрос без указания на эту разницу: вы используете мой ответ на ваш вопрос как контраргумент против моего (совсем другого) вопроса. А так как разницу вы эту в упор не признаёте, то с чего б мне отвечать?
Тут недавно подборка статей хорошая была в тему
https://habr.com/en/articles/861174/
О, группа Гротендика.
С ней основная проблема в том, что целые числа там — это некоторый класс эквивалентности, а не напрямую единственным образом строящийся терм, а работать с классами эквивалентности в мейнстримных и устоявшихся пруверах исключительно больно, если кубы не гонять, но cubical type theory мы пока не очень понимаем. Возьмите любой результат из гугла по запросу «setoid hell» на ваш вкус.
Другой вопрос — причём тут вообще пруверы, но это уже моя профдеформация. На бумажке при разговоре с другим человеком с группой Гротендика всё норм.
Именно это даёт профит, а не умение доказывать что это так и почему это так работает, и откуда берётся.
Практика показывает, что люди, которые умеют это доказывать, в среднем чуть лучше пишут 3D-шный код. Впрочем, это, чаще всего, не шибко важно и я не считаю, что это нужно знать, чтобы успешно писать код.
По тем пунктам, которые вы добавили в правке:
Ну и ответьте всё же на вопрос, чем это знание мне поможет?
Я не считаю, что оно поможет. Но я не считаю, что программисту нужно знание математики и не считаю, что знание рецептов является необходимым или достаточным условием знания математики.
Собсна, именно поэтому я и задал вопрос о причинах такой формулировки умножения, как иллюстрацию моего тезиса, что знание математики не является необходимым.
Могу вывести, но считаю что это ненужно. Переубедите меня, зачем это нужно?
Мой поинт был в том, что это не аксиома, а выводимое утверждение, и что отсутствие необходимости выводить это утверждение на практике не делает его менее выводимым или более аксиоматичным.
Спасибо, что доказали мой поинт.
Ой как мы запели, нуда нуда. А по моему имеет непосредственное отношение, как вы можете использовать перемножение если не понимаете что за этим лежит.
А вы не отличаете «при каждом умножении вспоминать, как оно определяется, и почему оно коммутативно/ассоциативно» и «понимать, как вводится умножение и как доказываются его свойства»?
Ваш вопрос — первое. Мой исходный тезис — второе. Соответственно, вы либо не понимаете этой разницы (и это очень печально), либо намеренно подменяете тезис, либо просто не привыкли задумываться о таких тонкостях (к чему математика, кстати, могла бы привить привычку — если бы вы её знали).
Вы видимо сводите к абсолюту, и ровняете фразу "Нужна математика" к "Нужны знания математики во всех сферах её применения "
Попробуйте всё же дочитать комментарий, на который отвечаете, до конца.
А вы не отличаете «при каждом умножении вспоминать, как оно определяется, и почему оно коммутативно/ассоциативно» и «понимать, как вводится умножение и как доказываются его свойства»?
Да нет это вы как раз не понимаете разницу что использовать математику != прибегать каждый раз к анализу и доказательствам теорем.
Значит, не отличаете. Я же вам прямо написал, что разница в «уметь доказывать свойства» и «доказывать свойства каждый раз при их использовании», а вы продолжаете вести себя так, будто это одно и то же.
Да нет, это вы утверждаете что умение применять математику, и умение выводить доказательства это одно и тоже. И что если вы не выводите доказательства то вы не знаете математику.
Это же вы долюбились до формулировки про знание математики. Если на вакансии вы увидите требование "знание линейной алгебры" у вас будут спрашивать почему перемножение матрицы это строка на столбец, или всё же вопросы будут связаны с прикладной частью?
Да нет, это вы утверждаете что умение применять математику, и умение выводить доказательства это одно и тоже.
Я нигде не писал этого.
А вот соседний оратор (что забавно, заплюсованный, в отличие от меня) прямо писал, что математику надо понимать для того, чтобы ей пользоваться на практике.
Почему такая разная реакция? Потому, что из его комментария не следует напрямую, что все эти разговоры про знание математики — клоунада и попытка возвыситься за счёт тупых макак, которые просто говнокодят и математику не знают, а из моего комментария это следует довольно прямо.
И что если вы не выводите доказательства то вы не знаете математику.
Да, всё так. Будете спорить?
Если на вакансии вы увидите требование "знание линейной алгебры" у вас будут спрашивать почему перемножение матрицы это строка на столбец, или всё же вопросы будут связаны с прикладной частью?
Я ожидаю, что будут спрашивать.
Собственно, я подаюсь на вакансии, где требуют знание теории типов, и ожидаю, что со мной поговорят про strong normalization у system f, например, и прочие подобные вещи. И, вы не поверите, говорят!
Это потому что вы очередной Дедфуд, один на миллион?
Да, всё так. Будете спорить?
Конечно буду, например проблема уравнений Навье Стокса отсутствие полного понимания не мешает их использовать.
что все эти разговоры про знание математики — клоунада и попытка возвыситься за счёт тупых макак
Это ваши слова, не мои. Я считаю что математика нужна но не везде, и на разных уровнях.
Я нигде не писал этого.
Да в этом же сообщении чуть ниже
``И что если вы не выводите доказательства то вы не знаете математику.`
Да, всё так. Будете спорить?`
Я ожидаю, что будут спрашивать.
В этом и проблема нашего спора, ваши ожидания отличаются от того что происходит по факту (по крайней мере из моего опыта, ни на одном собеседовании не спрашивали, почему матрицы перемножаются так а не иначе, зато спрашивали кучу именно прикладных вопросов, впрочем и я не спрашиваю когда собеседую, ибо смысла от этого 0)
Собственно, я подаюсь на вакансии, где требуют знание теории типов, и ожидаю, что со мной поговорят про strong normalization у system f
Наверно потому что это непосредственно связанно с работой? Но вряд ли вас спрашивают, какой код будет сгенерирован при компиляции того или иного участка, если это не связанно непосредственно с работой. Как вы не знаете во что скомпилируется cout << "hello world" ну тогда вам ненужно программирование.
Конечно буду, например проблема уравнений Навье Стокса отсутствие полного понимания не мешает их использовать.
Слышал звон…
Отсутствие аналитического решения в общем виде именно что мешает их использовать. Приходится либо упрощать и решать аналитически при куче дополнительных упрощений, либо решать численно, и такие решения очень быстро разваливаются (о, хаос — сколько людей сходу знает, хотя бы в каких терминах формулируется определение хаотичной системы?).
Это ваши слова, не мои. Я считаю что математика нужна но не везде, и на разных уровнях.
Да, мои слова, потому что меня эта риторика в подобных тредах уже достала.
Что ваш коллега-преподаватель, попытавшийся выпендриться тормознутым кодом для умножения матриц совершенно не в тему здесь рядом (но при этом считающий, что я беру либу для умножения матриц не потому, что я знаю про эти тонкости, а потому, что я не знаю математики), и до того перечислявший красиво звучащие слова про векторные! пространства! над полями! Галуа!, что вы, не понимающий смысл вопроса «сколько людей понимает, почему …», что все другие рассказыватели необходимости вышки/знания хорошей (использованный непосредственно вами эпитет) математики/етц для программиста что на этой странице, что во всех других тредах — это всё, если поковырять, происходит из единого желания возвыситься над теми, кто «математику не осилил» (говорящие, правда, её тоже не осилили, но ведь у нас главное — казаться, а не быть).
Это происходит абсолютно каждый раз в таких тредах. Абсолютно каждый раз всё красиво начинается за здравие про необходимость математики (или pn-переходов, или RS-триггеров) для программиста, а то он зубрила/неуч/формошлеп/ещё что, и заканчивается за упокой про «да это всё не нужно, как мне это поможет?» и в лучшем случае переобуванием в прыжке про «ну эээ я имел в виду не прям знание математики а умение применять готовые формулы».
Никак не поможет, в том-то и суть. Просто ваше «знание математики» укладывается в одну-две странички книжки «3D-графика для чайников», где-то рядом с копипаст-кодом инициализации opengl (или что там сейчас модно). Это знание доступно каждому, кто закончил школу не со справкой, просто потому, что научить перемножать матрицы (как и брать производные, как говорил наш школьный препод по матану) можно даже обезьяну.
Впрочем, это всё меня достало во многом потому, что я повёлся на все эти рассказы про нужность математики и потратил на неё довольно много времени, а к счастью это меня не привело, только наоборот.
> Я нигде не писал этого.
Да в этом же сообщении чуть ниже
``И что если вы не выводите доказательства то вы не знаете математику
У меня заканчиваются нематерные и не прямо оскорбительные реакции на ваше систематическое непонимание разницы между «понимать математику» и «применять математику» (или «понимать доказательство коммутативности умножения чисел» и «каждый раз доказывать коммутативность при её использовании»). Это такой троллинг глупостью с вашей стороны?
Каждый человек, умеющий ходить, применяет неслабую теорию управления неустойчивыми системами, но подавляющее большинство умеющих ходить людей не то что эту теорию не знает, а даже не знает о её существовании. Означает ли это, кстати, что для ходьбы необходимо знать эту теорию? Олимпийский бегун, не знакомый с этой теорией, формо… тьфу, ногошлёп? И он, и вы пользуетесь её результатами, они у вас прямо в мозжечке и где-то там ещё прошиты!
В этом и проблема нашего спора, ваши ожидания отличаются от того что происходит по факту
Я экстраполирую свой опыт.
(по крайней мере из моего опыта, ни на одном собеседовании не спрашивали, почему матрицы перемножаются так а не иначе, зато спрашивали кучу именно прикладных вопросов, впрочем и я не спрашиваю когда собеседую, ибо смысла от этого 0)
Какие прикладные вопросы в линейной алгебре для 3D-графики вообще можно спрашивать? Просто из интереса.
Либо у вас там «линейная алгебра» — это эвфемизм для «зазубрил, что должно лежать в какой ячейке матрицы преобразования 4×4, как их перемножать и, если хорошо выспался, как посчитать детерминант».
Наверно потому что это непосредственно связанно с работой?
Да. В моём случае это не эвфемизм.
Но вряд ли вас спрашивают, какой код будет сгенерирован при компиляции того или иного участка, если это не связанно непосредственно с работой.
Ну да, линейные операторы и их матричное представление, и особенности компиляции конкретного кода конкретным компилятором с конкретными опциями под конкретную архитектуру — это вещи одного порядка фундаментальности.
И, кстати, в некоторых задачах спрашивают. Когда собеседуюсь во всякий лоу-летенси, например, там вообще норма написать какой-нибудь код и потом обсудить, во что можно ожидать, что он скомпилируется, какие у этого будут характеристики работы, и как можно сделать лучше (и у меня в резюме написано что-то про низкоуровневое понимание исполнения кода и производительности, поэтому эти вопросы я тоже ожидаю). Или однажды на позицию функциональщика попался интервьювер, с которым мы обсудили вообще всё, от влияния параметричности на рассуждения о хаскелевской функции поиска в связном списке и возможность усилить её тип в более продвинутых языках
lookup :: Eq a => a -> [(a, b)] -> Maybe b
через рассуждение о том, почему она плоха для процессора, до особенностей работы кэш-памяти, всякой там ассоциативности, MESI, и физических ограничений на её скорость. Помню, даже почему-то отличие групповой скорости от фазовой в проводниках обсуждали (но этот разговор я мог поддержать плохо).
Если на вакансии вы увидите требование "знание линейной алгебры" у вас будут спрашивать …
Это просто так сложилось у 3D-шников, что они свои трюки с матрицами называют «линейной алгеброй».
Если такую же формулировку увидеть, например, у физиков, то они, скорее будут спрашивать про собственные значения и всякую эрмитовость. Про матрицы могут даже не спросить.
Можно и строка на строку... :))))
Только надо внимательно посмотреть порядок индексов в циклах
Чтобы все-таки получалось правильное умножение матриц.
c[ij] = c[ij]+a[ik]*b[kj]
Вы либо вопрос не поняли, либо уже вам можно ответить «нет, строка на строку нельзя».
Не, все я понял.
Математически матрицы умножаются строка на столбец, суммируется и получается один элемент матрицы результата.
Но в программировании матрицы лежат в памяти.
И этот факт позволяет обрабатывать матрицы в другом порядке.
Не в математическом. Но результат получается именно такой, как требуется в математике
Смотри сюда
// -- Standard matrix multyply --
void multiplyIJK(const iMatrix &A, const iMatrix &B, iMatrix &R)
{ size_t N = A.size();
for(size_t i = 0; i < N; ++i)
{ for(size_t j = 0; j < N; ++j)
{ for(size_t k = 0; k < N; ++k)
R[i][j] = R[i][j] + A[i][k] * B[k][j];
}
}
return;
}
// -- Rows matrix multyply --
void multiplyIKJ(const iMatrix &A, const iMatrix &B, iMatrix &R)
{ size_t N = A.size();
for(size_t i = 0; i < N; ++i)
{ for(size_t k = 0; k < N; ++k)
{ for(size_t j = 0; j < N; ++j)
R[i][j] = R[i][j] + A[i][k] * B[k][j];
}
}
return;
}
void multiplyJKI(const iMatrix &A, const iMatrix &B, iMatrix &R)
{ size_t N = A.size();
for(size_t j = 0; j < N; ++j)
{ for(size_t k = 0; k < N; ++k)
{ for(size_t i = 0; i < N; ++i)
R[i][j] = R[i][j] + A[i][k] * B[k][j];
}
}
return;
}
Все функции дают один и тот же результат.
Но для больших матриц (примерно от 2000х2000) вторая и третья функции работают значительно быстрее - из-за кеша.
Математически матрицы умножаются строка на столбец, суммируется и получается один элемент матрицы результата.
Почему? Почему не строка на строку?
Но для больших матриц (примерно от 2000х2000) вторая и третья функции работают значительно быстрее - из-за кеша.
Не стоит вскрывать эту тему, потому что для больших матриц это всё очень плохие алгоритмы, и можно выиграть сильно много перфа, если бить на блоки, например. И, возвращаясь к соседней ветви комментариев (откуда вы ушли) — это одна из наглядных иллюстраций, почему не стоит переизобретать библиотеки, а лучше пользоваться готовыми (mkl там, например). Просто с точки зрения реализации (умножения матриц, вычисления CDF биномиального распределения, и так далее) наивные алгоритмы, следующие из стандартного курса матричного анализа/теорвера/етц, дико неэффективные.
Но, опять же, обсуждаем мы не это.
Мне случилось писать автодифференциирование, чтобы на криволинейных шкалах (заданных параметрически) штрихи подрисовывать.
Вот сидит математик, математическое представление оптимизирует-оптимизирует, за невыоптимизирует, почему программа не ускоряется.
А не ускоряется она потому что у него 100500 локальных структур, под которые выделяются и уничтожаются блоки в памяти - вот этим она всё время и занимается.
Их бы в глобальные перенести, выделить раз и надолго - но это не по-феншую, да и непонятно... )
Ваш вопрос подрывает рекламу курсов, что любой гуманитарий за неделю станет иг стециалистом на их курсах.
А где формальная логика, теория типов и прочий полиморфизм?))
Петр, не пиши больше. Не ваше это.
Если честно, не убедили. В большинстве случаев все это уже написано людьми и обернуто в библиотеки. Причем написано качественно. Если кому-то захочется работать с 3д объектами, например, никто не будет рассчитывать новые координаты вручную. Ну кроме математиков
Проблема программирования в том, что нужно знать много обо всем и лишь с какой-то вероятностью какое то знание пригодится.
Не каждый день нужна математика. Далеко не каждый. Но иногда это нужно. Нужно и придумать и сделать и обосновать. И в итоге все кто участвует так или иначе в дискуссии должны математику знать.
Это касается не только математики но и технологий. Но с технологиями легче. Про них можно прочитать и понять. Математика же может иметь уровень вхождения.
Я лично считаю, что хорошему разработчику нужно хорошо знать математику, чтобы раз в два года сделать хорошее решение, за которое действительно не стыдно.
Зачем байты в инт пихать? char (ну или что там ещё, uint8_t или что-то подобное) логичнее, меньше места жрет и & 0xFF не нужен.
Нужно ли знать машинный язык, программисту высокого уровня?
Пройти хотя бы начальный курс ассемблера и написать в нем простые программки - обязательно должен каждый программист. Это очень вправляет мозги и дает понимание того, как на самом деле работает процессор. А это программисты любого уровня знать должны. Ибо куча странных и непонятных вещей вдруг оказываются очевидными.
Для тех программистов, кто все же считает, что математику знать нужно, но сам не знает или уже забыл, есть пара интересных плейлистов:
https://www.youtube.com/watch?v=PB4YoeALD7U&list=PLQyMGME-L41NiZdmY_lVoFZ7mstK_9-Ky
https://www.youtube.com/watch?v=bPCBb1U56yw&list=PLQyMGME-L41Pokb8WFI2hgTEA2GhwL_Jy
https://www.youtube.com/watch?v=n3wEM7P11kI&list=PLQyMGME-L41NPK0U-XzRVmU6DKl0iePrT
https://www.youtube.com/watch?v=vkg55U9RBNo&list=PLQyMGME-L41OGDgTAB56jOUGq1b0KbNpD
Ппограммист с 20-летним стажем репортинг ин. Математика программисту не нужна (знаний школы с лихвой достаточно) , тему можно закрывать. Нужна логика и навыки разбирательства в чужом говнокоде и чужой говнодокументации. В статье и каментах какое-то писькомерство. Лучше бы посрались за свои ущербные ЯП в сравнении с бжественным 1С , где все есть искаропки. У, я полгода офигевал от ущербного Питона на курсах по нейросетям, ведь в нем банально нет самого важного типа данных - таблицы. Конечно же, потом оказалось что есть что-то подобное в тридевятом анальном пандоцарстве, причем архиущербное. Тяжело вам, чо, без нормальных человеческих типов данных, функций и процедур, которые работают по человеческой, а не Перельмановой логике. Отсюда и все беды.
Математику нужно знать на столько, на сколько требует от тебя среда твоего обитания.
Нужна ли программисту математика? Разбираем на примерах