Pull to refresh
3
2.1

Специалист по теории типов USB-кабелей

Send message

К примеру, я хочу написать CAD для моделирования электрических схем какого-то сорта, но я хочу сделать 2 уровня моделирования, первый - грубый, чтобы отсекать заведомо негодные схемы до отправки на расчёт. Это - типичная задача для типов.

Если это не DSL для описания схем, то типы тут не очень помогут.

То есть, ты, конечно, можешь вычислительное ядро своего CAD'а обложить типами, чтобы оно не принимало некорректные задачи, но это всё равно потребует кода по «валидации» пользовательских схем (пусть даже мы валидируем в строго типизированные значения), и никто не помешает описать некорректные пользовательские схемы.

Если же ты хочешь делать DSL, то настоятельно рекомендую почитать algebra-driven design Сэнди Магвайра. Это не совсем про типы, но достаточно близко.

Насчёт непосредственно использования сильных типов в подобных задачах не для академиков я ничего сходу вспомнить не могу. Книжки уровня software foundations — перебор и слишком базовые (это по факту учебник по coq'у, на твой вопрос оно не факт что ответит), условные научные статьи с условного ESOP, как люди там типами проверяют ширину квантовых схем, например — это, ну, научные статьи, а не для народного хозяйства, и люди там придумывают свою очередную систему типов, в хаскеле/идрисе ты такое не запрогаешь (хотя там что-то было про квантовую либу для идриса — могу найти, если интересно).

Это что-то на уровне нацистской эстетики пресс-конференции Байдена?

Скрытый текст

Я выбираю сразу написать по моему главному правилу: невалидное состояние системы непредставимо в системе типов.

Только вы им не пользуетесь.

Когда у вас есть static optional<Singleton> instance() и есть какой-то class SingletonUser , который без синглтона жить не может, но конструктор которого не требует синглтона, то у вас в ваших типах представимо состояние «синглтон не создался, а SingletonUser создался», что ведёт к боли, страданию и проверкам внутри каждого такого SingletonUser , действительно ли синглтон создался.

Когда у вас нет никакого static optional<Singleton> instance(), а есть конструктор

class SingletonUser
{
public:
  SingletonUser(Singleton& instance);
};

то у вас состояние «синлтона нет, а клиент синглтона есть» непредставимо, как вы и хотели.

И вам даже нужно меньше проверок, потому что вы эти проверки делаете один раз и условно в main() вместо того, чтобы их делать каждый раз в каждом клиенте синглтона.

Во всём.

Во-первых, эта функция заточена на инты и массивы. Максимум может быть не только среди интов, не только в массивах (но и в мапах, например, или даже в optional'ах), да и хотелось бы уметь передавать произвольный предикат, чтобы хотя бы немножко почувствовать эту самую Ф при П. Ну, что-то вроде такого:

maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> Maybe a

Во-вторых, тип вашей функции показывает, что она скорее всего не будет работать для пустых массивов. И правда: array[0] ой сегфолт (в лучшем случае).

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

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

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

И это работает не только с девушками, на самом деле. Меня задолбала одышка от нескольких лестничных пролётов — я пошёл в тренажерку на кардио и избавился от неё (и это сильно более верный путь, чем ждать, пока она сама пройдёт). Меня задолбало, что у меня болит спина — я пошёл в тренажерку на силовые, и у меня больше не болит спина. Меня задолбало, что у меня хреновый режим сна — я пересмотрел потребление кофеина и сломал некоторые традиции, в которых он участвует.

У меня есть функция

find :: (a -> Bool) -> [a] -> Maybe a

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

но ... ведь это и есть метапрограммирование, причем в C++ это не внешний инструмент как ломбок, а мощнее

Угу, такой мощный, что spaceship пришлось вводить на уровне языка, а не библиотекой для метапрограммирования.

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

Я нигде не писал этого.

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

Почему такая разная реакция? Потому, что из его комментария не следует напрямую, что все эти разговоры про знание математики — клоунада и попытка возвыситься за счёт тупых макак, которые просто говнокодят и математику не знают, а из моего комментария это следует довольно прямо.

И что если вы не выводите доказательства то вы не знаете математику.

Да, всё так. Будете спорить?

Если на вакансии вы увидите требование "знание линейной алгебры" у вас будут спрашивать почему перемножение матрицы это строка на столбец, или всё же вопросы будут связаны с прикладной частью?

Я ожидаю, что будут спрашивать.

Собственно, я подаюсь на вакансии, где требуют знание теории типов, и ожидаю, что со мной поговорят про strong normalization у system f, например, и прочие подобные вещи. И, вы не поверите, говорят!

Ну то есть, если человек знает все свойства матриц и операций над ними, но не может сходу вывести перемножение

Повторю вопрос из недочитанного вами комментария:

Что означает «знать операции»? Зазубрить алгоритмы их выполнения? Уровень даже ниже grokking algorithms. Понимать, откуда они берутся? Сорри, для этого надо понимать, почему они умножаются как умножаются.

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

Это сново несовсем то высказывание что я имел в виду. Но и это в полне будит правдой, если руским языком я буду пользоватся не согласно правилам, но достаточна длятого, что бы вы магли меня панять.

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

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

Вы по прежнему не объяснили почему перемножение базисных векторов даёт преобразование, почему это в принципе работает?

Мне вам весь вывод расписать, что ли? В комментариях латех-форматирование до сих пор не завезли, для начала, а без этого это будет больно и уродливо для всех участников дискуссии.

Ну и для начало надо в принципе объяснить как работает перемножение.

Так, чтобы соответствующий морфизм из линейных операторов в матрицы был функториальным.

Если вы не понимаете как работает перемножение то как вы можете перемножать матрицы?

Как обезьянка.

Значит, не отличаете. Я же вам прямо написал, что разница в «уметь доказывать свойства» и «доказывать свойства каждый раз при их использовании», а вы продолжаете вести себя так, будто это одно и то же.

По тем пунктам, которые вы добавили в правке:

Ну и ответьте всё же на вопрос, чем это знание мне поможет?

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

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

Могу вывести, но считаю что это ненужно. Переубедите меня, зачем это нужно?

Мой поинт был в том, что это не аксиома, а выводимое утверждение, и что отсутствие необходимости выводить это утверждение на практике не делает его менее выводимым или более аксиоматичным.

Спасибо, что доказали мой поинт.

Ой как мы запели, нуда нуда. А по моему имеет непосредственное отношение, как вы можете использовать перемножение если не понимаете что за этим лежит.

А вы не отличаете «при каждом умножении вспоминать, как оно определяется, и почему оно коммутативно/ассоциативно» и «понимать, как вводится умножение и как доказываются его свойства»?

Ваш вопрос — первое. Мой исходный тезис — второе. Соответственно, вы либо не понимаете этой разницы (и это очень печально), либо намеренно подменяете тезис, либо просто не привыкли задумываться о таких тонкостях (к чему математика, кстати, могла бы привить привычку — если бы вы её знали).

Вы видимо сводите к абсолюту, и ровняете фразу "Нужна математика" к "Нужны знания математики во всех сферах её применения "

Попробуйте всё же дочитать комментарий, на который отвечаете, до конца.

Если для вас прикладное знание математики в определённой области и её применение

Потому что у зазубрившего перемножение матриц человека нет знания математики.

у нас видимо отличается представление о том что заложено в фразе «знание математики необходимо программисту»

Эх, а если бы вы дочитали до конца…

Для меня это использование мат аппарата

А я знаю лингвистику, если успешно пользуюсь русским языком?

А долюбится можно до чего угодно, вот вы дали например определение матрицы, но на вопрос почему именно строка на столбец перемножается не ответили.

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

Почему всегда так получается, что как поскребёшь сторонника «знание математики необходимо программисту», то там оказывается, что и не знание, и не математики, и не то чтобы необходимо? И, более того, этот сторонник сам начинает тебе доказывать, что это всё не нужно?

Я вам ответил почему, и да это понимание не нужно, также как не нужно понимание почему числа перемножаются как перемножаются.

Тогда непонятно, откуда взялся ваш ответ «примерно все».

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

Что означает «знать операции»? Зазубрить алгоритмы их выполнения? Уровень даже ниже grokking algorithms. Понимать, откуда они берутся? Сорри, для этого надо понимать, почему они умножаются как умножаются.

Причём тут история, вообще непонятно. Я это знаю не из истории математики, а из проработанной «linear algebra done right».

Отлично, а теперь вопрос, чем это заученное (или скорее всего скопированное откуда-то ) определение поможет мне в работе?

Почему заученное или, тем более, скопированное?

Я не занимаюсь матричным анализом, я использую линейную алгебру.

Вы используете матричный анализ. Линейная алгебра — это как раз про линейные операторы, в ней можно работать по большому счёту вообще без матриц.

Очевидно, что если она применяется постоянно, то конечно она берётся за базу, зачем выводит её каждый раз как встречается

Я спросил не про базу, а про аксиому. Дано ли нам богом свыше минус-бэ-плюс-минус-корень-из-бэ-квадрат-минус-четыре-ацэ-на-два-а (интонационные запятые досыпьте за меня)? И я не спросил, выводите ли вы это каждый раз. Я спросил, можете ли вы это вывести, или будете говорить, что это всё не нужно?

По вашему я так понимаю, что если человек не знает почему кватернионы например работают так как работают, но при этом успешно их использует, то он не использует математику.

По-моему в этом случае человек не знает и не понимает математику, да.

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

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

Так вы не ответили на вопрос, вы когда перемножаете два числа, каждый раз думаете как это работает?

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

Чтобы понять, почему умножение матриц происходит именно так, надо его вывести, например, исходя из того, что матрицы - это линейные операторы: в матрице просто записаны результаты действия оператора на базисные векторы, по столбцу на вектор

Это ровно то, о чём я писал выше.

Что касается вопросов знания или понимания: надо знать достаточно математики чтобы в ней ориентироватся, чтобы понять, а какую ее часть вообще надо в вашей задаче принимать. Потому что программирование - это написание алгоритмов, и этим занимается computer science, подраздел математики.

Угу, а бухгалтерия — это работа с числами. Надо бухгалтеру знать арифметику Пеано и чем она хуже (или лучше) арифметики Пресбургера?

Под ковёр из «достаточно» у вас тут очень много заметено. На практике достаточно уровня немногим выше хорошей школы, и книги уровня grokking algorithms достаточно для базы в 99% задач в 99% работ (и за невыполнение этого 1% с вами ничего не случится — я куда больше условной девопсни/техдоков/прочего делегирую другим и нормально живу). Более того, я знаю людей, которые и эту книгу не осилили, и которые на работе успешнее, чем я, зарабатывают больше, чем я глубоко математизированным программированием, и в целом счастливее, чем я.

Вызубрить ее всю без понимания невозможно, поэтому единственный оставшийся вариант - это математику все-таки понимать.

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

Лично знаю компанию, успешно занимающуюся реализацией теории абстрактной интерпретации.

Я работал в такой. LLM там применимо максимум как «сгенери парсер опций командной строки для нашего тестового бинаря». Правда, сделать то же на optparse-applicative занимает примерно столько же времени.

Согласен с предыдущим оратором, что FAANG — это так себе ориентир.

Дайте примеры нормальных компаний

А смысл? Они либо очень мелкие (и лично я их еле находил — какой-нибудь полустартап, пилящий язык смарт-контрактов с формальной верификацией их семантики), либо не на слуху (что вам скажет «worldquant», например?)

Математически матрицы умножаются строка на столбец, суммируется и получается один элемент матрицы результата.

Почему? Почему не строка на строку?

Но для больших матриц (примерно от 2000х2000) вторая и третья функции работают значительно быстрее - из-за кеша.

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

Но, опять же, обсуждаем мы не это.

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

Есть основания считать, что гитхаб радует большее количество интервьюверов, эйчаров и прочих.

Но вообще да, у меня есть знакомая, у которой хардскиллы так себе, но которая берёт адово прокачанными софтскиллами — от одежды до умения за минуту выяснить, что по жизни нравится интервьюверу (кофе, прогулки с собаками, дельтапланеризм, и так далее), и развести его на разговор на минут 10-15 на эту тему, после чего он уже очень положительно к ней настроен, и техническое интервью оказывается халявным.

Вывод: софтскиллы дают плюс (ломающие новости!)

Не попытка умалить ваше достижение.. ну вот, допустим, иногда смотрю собесы на ютубе и вот иногда попадаются собесы из серии дали +N денег. Вот скопипастил первое попавшееся - судя по всему, чел хотел 80к, вилка до 100к, оффер с кварталкой - 170к

Я не знаю, что такое кварталка и как это переложить на американские реалии.

Вот в плюсах реальная вилка на ваш уровень какая? Неужели 250 на сеньора?

Это была функциональщина и пиление блокчейна (и там ещё какой-то бонус их шиткоинами обещали, но я не помню точных цифр). И да, работа 4 дня вместо 5 тут поинтереснее 28%-превышения вилки.

А, и да, это ж США, поэтому это тысячи долларов в год, а не тысячи рублей в месяц.

А на плюсах от области зависит. От линкедина иногда приходит какая-то унылость с оперднями — там 150-200. В трейдинге — 300-500, если нет онколла, и до миллиона, если онколл и ночные дежурства есть.

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

Как такой разговор и ваша смена ответа на противоположный называется?

Эм... я думаю вы путаете использование математики, и создание на её основе чего-то нового.

Я думаю, что использование математики и есть создание чего-то нового на её основе (вне учебных задач), даже если это очередной 3D-движок. Если же вы говорите о научной работе в рамках математики и о создании чего-то нового внутри математики, то это совсем другой вопрос — мы же тут говорим о программистах.

Более того, я думаю, что знание [определённой области] математики (а что ещё имеется в виду под «программисту нужна математика»?) требует понимания, как мы это любим, на уровень вниз, откуда берутся те или иные вещи в вашей ветви математики. Если вы занимаетесь матричным анализом и претендуете на его знание, то неплохо бы понимать, что, действительно, матрица — это численное выражение линейного оператора, и чтобы операция композиции матриц (которую мы называем умножением) выражала композицию линейных преобразований, то матрицы нужно умножать строка на столбец (или столбец на строку, если у вас все матрицы и их «физический смысл» консистентно транспонированные — это изоморфно, разница между этими двумя вариантами — вопрос соглашения и традиции). Тонкости линейных операторов и общую теорию R-модулей, наверное, знать уже не обязательно (но всё равно полезно).

Более того, я думаю, что для использования математики знать её не обязательно — ровно о чём и был мой изначальный тезис, и вы его в очередной раз иллюстрируете (как и всегда происходит в таких разговорах о необходимости математики для программиста). Ну, просто уровень глубины понимания примерно такой же, как у человека, который прочитал в книжке «3D-графика для людей без математического образования», что матрицы перемножаются вот так вот, и точка.

Ну и да это всё принимают за аксиому потому что это база о которой не задумываешься потому-что применяешь её постоянно.

А если вы часто решаете квадратные уравнения, то формулу дискриминанта вы тоже принимаете за аксиому, или таки можете её вывести?

Может вы подскажите зачем мне задумываться при разработке почему матрицы перемножаются именно так?

Так зачем программисту математика? ;)

Вы же вряд ли задумываетесь почему числа перемножаются именно так как они перемножаются. Например почему -3 * -3 == 9 а не -9?

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

Information

Rating
1,191-st
Registered
Activity