Символическое в ООП — более воображаемое и нарративное. Оно создаёт красивую историю: «объекты взаимодействуют, как люди/вещи в мире».
Только для программирования нужна точность, а не красота и нарративность. Красота и нарративность хорошо подходят для книжки, почитать на ночь там что-нибудь этакое.
Это мощно, но когнитивно дороже для большинства.
Блин, я даже не знаю, какой вариант ответа на это выбрать:
Большинство людей не может создавать работающие программные системы, это просто медицинский факт. Когда мы пытаемся идти против этого факта, то получаем жрущий полтора гигабайта рамы у меня сейчас gmail, тормозящее дерьмо на электроне, приложения сбера на гигабайты, и регулярно сломанную форму и страницу комментариев на хабре.
Неужели держать в уме всю сеть взаимодействий между разными объектами и их методами когнитивно проще, чем когда побольше ограничений выражено в типах, и три четверти багов устраняется ещё при написании, даже до сохранения файла на диск, рефакторинг простой и понятный, и контрибьютить в очень нетривиальные кодовые базы можно на второй день?
Впрочем, эти варианты не являются взаимно противоречащими, поэтому можно выбрать их оба сразу. Пожалуй, так и поступлю!
Моя голова устает сильнее когда я программирую на ФП.
Моя голова устаёт, когда надо разбираться в ООП-лапше, потому что меняешь что-то здесь, а разваливается там.
А в случае ФП я могу прийти в новый нетривиальный проект вроде компилятора и продуктивно в него контрибьютить в первый же день. В худшем случае, в случае написанного в ФП-стиле кода на императивном языке, какого-нибудь там HFT-пайплайна на плюсах — в первую неделю.
А онбоардинг в ООП-проект может занимать месяц-другой, даже если его intrinsic-сложность на порядки меньше, и это не компилятор целого языка с тайпчекером, оптимизациями и доказательством корректности учёта газа (привет блокчейн), а, ну, не знаю, абсолютно простая хрень вроде «получи новость от Reuters и ещё десятка источников, сделай из неё bag-of-words-кодировку, посчитай расстояние Хэмминга с центрами имеющихся кластеров, найди ближайший, обнови». Это 500 строк на хаскеле в худшем случае, которые в ООП-стиле превращаются в 50 тыщ макаронов.
Ну как бы если любое движение от ассемблера считать движением в сторону ФП - то дальше спор смысла не имеет.
Я же явно написал «попытки разной степени успешности выйти из императивно-детализированной концепции в декларативную» (в прошлый раз без жирного, но, может, вы в этот раз заметите?). То есть, в сторону повышения способов выразить, что надо делать, а не как. Потому что когда вы пишете в своём императивном ООП animal.makeSound(), вы описываете, что надо сделать. Читатель этого кода не знает деталей реализации makeSound, процесса вывода байтиков на экране и смены состояния TTY, конкретного животного, да и особенностей работы виртуальных функций вообще и в данном конкретном случае тоже знать не обязан.
Но в сторону ФП тоже движение есть, что самое смешное, хотя я об этом не говорил! Оно настолько общепринято, что говорить об ФП в стиле 50-х, в смысле лиспа и «уау функции высшего порядка», в 2026-м не имеет смысла: это есть в подавляющем большинстве языков. И движение туда происходит в самых-самых мейнстримных иимперативных языках, начиная от евнух-версии в виде указателей на функции в C, и заканчивая делегатами в сишарпе, функторами в C++98 и целым STL, построенным на «в функцию-алгоритм передаётся произвольная функция», лямбдами в C++11, етц.
Никакого движения в сторону FP там не было.
kekw
Есть объекты реального мира. У них объективно есть состояние, которое меняется со временем по присущим им законам - или под внешним воздействием.
Или нету никаких изменений, а есть только функция s = s(x⃗, t).
Вы ещё не свыклись с мыслью, что вы просто живёте в четырёхмерном пространстве-времени (реальнее некуда)? А этой мысли уже больше ста лет.
Никто, щука, никогда не пытался представить модель мира как комбинацию бесчисленного количества чистых функций.
Смысл не в чистоте функций, а в том, что в типе функций указаны её эффекты.
Мастурбация на чистоту — это действительно молоток в руках вчера его освоившего.
В логике второго порядка это допустимо — но тогда немедленно возникает:Φ(Φ)⇔Φ∈{x∣Φ(x)}что структурно идентично парадоксу Рассела.
Вы там не докажите случайно, что любая импредикативная система неконсистентна, а то Жирар (и даже некоторые программисты) расстроятся — System F придётся выкидывать и папиры по этой теме перепсывать.
Неточность в том, что Φ(Φ)⇔Φ∈{x∣Φ(x)} — это определение нотации, и вместо значка ⇔надо использовать значок ≜ (или ≔, или что-нибудь подобное по вкусу). А с учётом этого высказывание — логическая тавтология, оно не может быть неверным, но и [расселоподобных] проблем влечь тоже не может.
Расселоподобные проблемы возникают тогда, когда при определении предиката (или подмножества, что одно и то же) разрешается использовать слишком неограниченный язык. ZF вроде как консистентна не потому, что там, не знаю, не выполняется Px ⇔ x ∈ { y | Py } (выполняется, конечно, это вопрос нотации и δ-эквивалентные вещи), а потому, что язык построения множеств сильно ограничен. System U неконсистентна не потому, что она «абстрактно импредикативна» (System F тоже импредикативна, и ей норм), а потому, что там эта импредикативность слишком мощная.
Социум без двойных стандартов потребовал бы системы, способной доказать собственную легитимность
Я думаю по той же причине почему формальная система не может быть одновременно полной и не противоречивой.
Может :]
Она при этом не может быть эффективно аксиоматизируемой. Совершенно очевидно, что пополнение аксиоматики Пеано множеством всех истинных формул теории арифметики Пеано даёт полную и непротиворечивую систему. Просто не существует алгоритма, который бы перечислил все её аксиомы (включающие счётно бесконечное множество истинных, но невыводимых из аксиоматики Пеано формул).
Но это так, повыпендриваться (надо же чем-то выпендриваться!), потому что по сути это ничего не меняет.
По сути — человеческая аксиоматика не обязана быть ни эффективно аксиоматизируемой, ни даже достаточно богатой для выражения арифметики.
Вот вы удивитесь - но если я кому-то буду рассказывать как я хожу в магазин - то это будет именно пошаговое перечисление действий: одеваюсь и оказываюсь одет
Это пошаговое описание именно в декларативном стиле. Ровно в том же смысле, как и, возвращаясь к программированию, «получить множество авторов статей в хабе “программирование” можно через nubOrd . map author . filter (λpost → "программирование" `elem` hubs post)». Вы можете переубедить меня, описав процесс надевания куртки в императивном стиле, с мутабельными переменными, циклами, явными условиями, и так далее. Чем меньше абстракций уровня «просовываю руку в рукав», тем ближе к императивщине.
Практически все попытки выше ассемблера (включая макроассемблер), все эти функции, ООП, структурное программирование, прочее — это попытки разной степени успешности выйти из императивно-детализированной концепции в декларативную. Эти все вот ООП-шаблоны, билдеры там, фабрики, стратегии — это попытка эмулировать декларативщину в императивной среде.
Без шуток - покажите мне человека который будет описывать поход в магазин как функциональное преобразование цифр в продукты… “А папа-мама не сумасшедши ли ?”
Сами придумали тезис («ФП/декларативщина — это когда поход в магазин представляется преобразованием цифр в продукты»), сами его оспариваете, сами победили. Как это называется? Это называется strawman argument.
Олсо, это ведь работает во все стороны: сколько людей описывает поход в магазин как ООП? Сколько людей… инстанциирует класс бумажника? обращается к синглтону бумажников? использует абстрактный класс ИбуМажник? Чей метод вызывается при обмене денег на товар — бумажника, денег, товара, продавца, или абстрактного менеджера сделок? Вы когда ребёнку будете объяснять процесс похода в магазин, будете рассказывать про абстрактный менеджер сделок?
Можно ли сделать вывод в вашем мире, что ООП — это академический зашквар?
Охотно верю - но знаете, идите на матфак работать с такими аргументами, что-ли ? Там любят таких… А я тут у мамы инженер.
Я нигде не говорил о красоте доказательства, я говорил о простоте и возможности. Императивный код особо не доказывают, там херак-херак и в продакшен обычно. Это да, это в императивщине и нетипизированной функциональщине делать проще.
Но я как-то всё-таки хотел бы использовать слово «инженер» как похвалу, а не как уничижительный термин.
Мне не надо чтобы красиво доказано - мне надо чтобы работало, и легко читалось.
И это быстрее происходит в типизированной функциональщине.
А когда один черт в коде клеится весь алгоритм, но пересыпается .apply() .with() .orElse() и прочей матерщиной (привет Kotlin!) - очень хочется дать по башке, и отправить копию новгородской грамоты чтобы лучше доходило…
Товарищ взял не предназначенный для ФП язык и удивляется, что ФП выглядит в нём паршиво. Ну, я не знаю, попробуйте в ООП-стиле на ассемблере писать и потом ругайтесь, что ерунда выходит, клятый ООП.
Аргумент про то, чтобы компилировать ФП в мутабельный код - это из серии “можно, но зачем?!”.
Оптимизирующие компиляторы вы не приемлите вообще, я так понимаю, или это только применительно к ФП такое неприятие?
Где обсуждается — не знаю. Но решение как в идрисе (когда ленивость явно помечается как Lazy) выглядит вполне себе дружественным к тайпчекингу и локальным рассуждениям. Ты, по крайней мере, знаешь, что именно у тебя ленивое.
Как с помощью IO пронаблюдать понятно, а как можно с помощью ST или seq?
ST — это обобщённый IO (в прямом смысле, IO ≅ ST RealWorld).
seq — так, для полноты. Его расходящийся результат тоже ненаблюдаем в этом же смысле.
Так-то и в объекто-ориентированных языках вызовы девиртуализироваться могут, но полагаться на оптимизатор ни в ООП, ни в ФП, имхо, не стоит.
Только для девиртуализации компилятору надо доказать, что в данном месте других инстансов быть не может, а это задача сильно более нелокальная и сильно более сложная, чем просто подставить параметр, когда он доступен (что выполняется субъективно ИМХО куда чаще, чем условия для девиртуализации, потому что мало кто играется с экзистенциальными типами или полиморфной рекурсией и при этом ожидает должный перф).
Особенно как автор статьи, заявляющий, что вообще всё мономорфизируется.
То есть - даже мой поход в магазин в субботу можно описать как функциональное преобразование из цифр на банковском счете в набор продуктов в холодильнике… Вопрос - нахрена, а главное - зачем ?! Если объективно процесс ествественным образом описывается как набор шагов, меняющих состояние системы
Даже процесс похода в магазин вы внутри себя описываете декларативно. Вы думаете в терминах того, что надо сделать (выйти из квартиры, вызвать лифт, перейти дорогу, дойти до магазина), а не как это сделать (это будет настолько объёмно, что я даже проверку открытия-закрытия двери писать не буду), и вы притворяетесь, что у ваших действий нет несмоделированных сайд-эффектов: вы не рассматриваете износ петель двери в процессе выхода из дома, выхлопные газы автобуса, смену настроения продавщицы в магазине из-за рисунка на вашей кредитной карточке, и так далее.
Вопрос - нахрена, а главное - зачем ?!
Потому что о чистой функциональщине без неявных сайд-эффектов проще рассуждать и доказывать её свойства.
В чем смысл натягивания совы на глобус и вытягивания цепочки лямбд - которые потом еще хрен отладишь нормально (потому что не видны промежуточные преобразования коллекций) ?
Прелесть в том, что их не нужно отлаживать так часто, как вы думаете :]
Ну и до кучи скажу что архитектура современных ЭВМ нихрена не заточена под ФП - она заточена под императивное программирование с мутабельным состоянием в RAM. Соответственно, ФП всегда будет подвергаться performance penalty по сравнению с императивным кодом.
А почему у меня тогда на хаскеле регулярно получается писать код по производительности на уровне плюсов (иногда — быстрее)?
Потому что нет, конечно, не «всегда будет», это non sequitur. Компилятору ФП никто не мешает компилировать ФП-код во вполне производительный императивный мутабельный код. Более того, начиная с некоторого уровня сложности компиляторов это проще: типизированное ФП (а другое не нужно) выражает в типах больше инвариантов и даёт компилятору больше информации о том, какие оптимизации не изменят семантику программу, и их можно безопасно применить. Просто до этого уровня в императивном (и близком к железу — привет условной джаве) программировании программист делает ту работу, которую может (и должен) делать компилятор.
А вообще забавно то, что я как раз на неделе начал читать сборник публикаций первой конференции History of Programming Languages, и там целый Джон Бакус (который автор Фортрана, куда уж императивнее, и который Backus Normal Form для описания синтаксиса) пишет где-то в окрестности 1980-го года:
My own opinion as to the effect of FORTRAN on later languages and the collective impact of such languages on programming generally is not a popular opinion. […] I now regard all conventional languages (e.g. , the FORTRANs, the ALGOLs, their successors and derivatives) as increasingly complex elaborations of the style of programming dictated by the von Neumann computer. These " von Neumann languages" create enormous, unnecessary intellectual roadblocks in thinking about programs and in creating the higher level combining forms required in a really powerful programming methodology. Von Neumann languages constantly keep our noses pressed in the dirt of address computation and the separate computation of single words, whereas we should be focusing on the form and content of the overall result we are trying to produce. We have come to regard the DO, FOR, WHILE statements and the like as powerful tools, whereas they are in fact weak palliatives that are necessary to make the primitive von Neuman style of programming viable at all.
By splitting programming into a world of expressions on the one hand and a world of statements on the other, von Neumann languages prevent the effective use of higher level combining forms; the lack of the latter makes the definitional capabilities of von Neumann languages so weak that most of their important features cannot be defined-starting with a small, elegant framework-but must be built into the framework of the language at the outset. The gargantuan size of recent von Neumann languages is eloquent proof of their inability to define new constructs: for no one would build in so many complex features if they could be defined and would fit into the existing framework later on.
The world of expressions has some elegant and useful mathematical properties whereas the world of statements is a disorderly one, without useful mathematical properties. Structured programming can be viewed as a modest effort to introduce a small amount of order into the chaotic world of statements. The work of Hoare ( 1 969), Dijkstra ( 1 976), and others to axiomatize the properties of the statement world can be viewed as a valiant and effective effort to be precise about those properties, ungainly as they may be.
This is not the place for me to elaborate any further my views about von Neumann languages. My point is this: while it was perhaps natural and inevitable that languages like FORTRAN and its successors should have developed out of the concept of the von Neumann computer as they did, the fact that such languages have dominated our thinking for twenty years is unfortunate. It is unfortunate because their long-standing familiarity will make it hard for us to understand and adopt new programming styles which one day will offer far greater intellectual and computational power.
Хаскелисты традиционно притворяются, что undefined (и прочих нетотальностей) не существует, и вообще что Hask — настоящая категория.
Олсо, если подходить формально, то
ФП по умолчанию решает эту проблему: значение может быть пустым только явно — с помощью Option<T>
имеет некоторый смысл даже в нетотальных языках при наличии undefined, error и прочих подобных: эти «пустые» значения невозможно наблюдать в чистой части программы в рамках стандартной метатеории [разных вершин] лямбда-куба, без компиляторной магии (ST/IO — компиляторная магия, seq — компиляторная магия, да и она тоже не меняет большую операционную семантику, потому что сходящиеся термы что с seq, что без seq имеют одну и ту же нормальную форму).
Иными словами, ты в чистом коде не можешь написать
isBottom :: Int → Bool
isBottom n = n == ?⊥?
поэтому про наличие пустоты ты не узнаешь.
Аргумент $dSpeak это указатель на структуру Speak a, где лежит функция speak. Ничего не мономорфизировалось, производительность падает так же, как в ООП языках.
После инлайнинга и/или при наличии доступного анфолдинга в использующем модуле оно вполне может специализироваться, если компилятор решит, что это выгодно (я про это целый пост писал пару лет назад!)
И как в расте, при использовании dyn Trait
Для этого в хаскеле тоже надо явно обмазываться экзистенциальными типами, ну либо убить оптимизатор (что можно сделать в любом языке).
Де-факто — да, принцесс там мало. Я был на Мешугге дважды (в Москве где-то в окрестности 2010-го и в Лондоне чуть позже), и гендерный состав там был несравним, например, с Металликой в 2007-м в Лужниках (хотя там, вероятно, половина девушек пришла на HIM, которые были там на разогреве). Но, впрочем, и на совершенно прямолинейных и квадратных 4/4-группах вроде Unearth как-то тоже вяловато.
Раз пошла такая пьянка, то упомянутый мной выше нужный уровень — это как раз какая-нибудь Мешугга стратегически, по глобальной архитектуре написания песен, и что-нибудь вроде первого альбома Structures, или WTR эпохи Invade/Elite, на тактическом, мам-смотри-как-я-могу уровне.
А многое из того, что относят к «классическому» хеви‑металу, меня, например, откровенно зевать заставляет.
Каждый раз, когда на 40-м канале siriusxm включают какой-нибудь там slayer или megadeth, я сразу переключаю.
А что мешает научиться играть сейчас? Отсутствие аудитории?
Понимание, что на нужном уровне я не научусь играть, по крайней мере, с тем количеством времени и регулярности, что мне оставляют другие коммитменты. Следовательно, это бессмысленно.
В 17 не было концепции «нужного уровня», как и не было коммитментов «маши крыльями ботай или сдохнешь». У меня вон план по ботанью расписан на следующие лет шесть, и это уже не изич вроде трёхтомника Верещагина-Шеня по матлогу.
Ну, по вашим же словам из коммента под другим постом, у вас есть как минимум 2 знакомых девушки — возможно, они с удовольствием оценят ваш новый скилл.
Лол, они замужем так-то, у них и так есть кого и за что ценить. Да и это как в той шутке про разных металистов, спасающих принцессу от дракона, и где у прогмитолиста сначала дракон убивает себя от скуки, а потом и принцесса.
Да и вообще, чем меньше людей видит твоё творчество, тем более оно чистое и честное (потому что тогда ты действительно оптимизируешь свои представления о прекрасном, а не принятие другими людьми). И именно поэтому я не хочу влезать во всякие хакатоны, клубы чтения книг (или как это по-русски?), и прочее подобное. И, кстати, что забавно, в 17 лет этих представлений о чистоте тоже не было.
Что мешает ходить сейчас? Я в одиночку и уже не в студенчестве ездила на концерт одной индастриал-метал-группы в Москве в 2019. Потом хотела на другой съездить, но грянул ковид.
Я скорее не про концерты, а про что-то, подразумевающее больше взаимодействия между непосредственными участниками. Условно, сходки относительно стабильного множества людей вживую с целью пообщаться и провести время вместе, всякое такое. Мешает потерянный скилл, отсутствие общих контекстов, и упомянутые выше коммитменты.
Не знаю, вышеописанное — из личного опыта, а опыта онлайн-школ у меня нет.
Но, судя по разным околоковидным вещам, чистый онлайн + отсутствие ИРЛ-взаимодействий заметно вредят. Если вне школы тусовки вживую есть, то, может, и нормально. Но, может, и нет.
Ну т.е. под ширмой борьбы с дискриминацией скрывается просто обычная борьба ценностей, моя свобода самая свободная свобода, а кто против тот враг свободы и ему никаких свобод.
Судя по наблюдаемым данным — да, абсолютно верно.
Я не знаю кто такие МАРы и как они связаны с радужными.
Minor-attracted persons, политкорректное название педофилов.
Я так и не понял по каким критериям вы выбираете с какими дискриминациями вам жить норм, а с какими нет.
Что здесь выбираю я, совершенно неважно.
Ну и если я правильно понял, то смысл борьбы с дискриминациями ровно в одном, чтобы навязать свои ценности и заодно свой набор предпочтительных дискриминаций или в чем то другом?
Я всю жизнь в геймдеве, и, видимо, атмосфера сильно отличается от биздева в этом аспекте — даже в крупных командах с большим количеством менеджмента.
Я потом в разных компаниях работал, включая имеющие достаточно прямолинейную культуру. Но везде помогало (а до определённой поры — помогало бы) понимание, что у людей могут быть несколько другие цели, чем «решить задачу правильно, бонус за красоту», и это нормально. Универ этого понимания не даёт.
То есть, подспудно мы все понимаем, что и в Физтехе цель, тащем — получить диплом, и спихнуть ненавистные какие-нибудь там урматы можно, но это понимание покрыто кучей слоёв из «это неправильно». И, говоря на метауровне, рассуждать о мотивациях и рефлексии в таких терминах там тоже не учат, а это тоже софт-скиллы, которые прокачиваются от столкновений с другими людьми с другими ценностями.
Да вполне релевантна, база есть, дальше только улучшать и обкатывать.
Откуда эта база возьмётся, если до этак 17 лет у вас нет особой свободы в выборе, с кем общаться, где общаться, и так далее, поэтому оптимизируется совсем не та же функция, что во взрослом возрасте? То есть, да, коллег вы тоже не особо выбираете, но на работе будут хотя бы не те же люди, которые в школе лупили отличников, потому что а чё они слишком умные, а учителя-идиоты это не сглаживали, а обостряли.
17-18 — это тот возраст, когда такая свобода реалистично начинает появляться. По крайней мере, опять же, я и в школе не очень социализировался, и в 17+. Но если в школьные годы у меня нет ответа на вопрос «какой есть реалистичный альтернативный сценарий, где я социально успешнее, опытнее и счастливее», то в 17+ он есть (не пошёл бы в вуз, тусил бы больше с людьми из программерских тусовок из интернета, с фуллтайм-работой имел бы больше времени на то, чтобы общаться с друзьями друзей, не все из которых полуаутистичные задроты, научился бы играть на гитаре и играл бы с даже знаю какими людьми, ходил бы на разные мероприятия, етц; не построил бы свою идентичность и личность вокруг академических успехов, в конце концов).
К восемнадцати годам оно обычно уже более-менее на месте; если недодали, то дальше, мне кажется, уже поздно, только развивать начатое.
Я бы сказал, что 17-23 — это критический возраст, когда ещё не совсем поздно, но после которого уже хана. И понятие «себя» кристаллизуется тоже где-то там.
Из умений, которые имхо не входят в понятие "социализация" но входят в понятие "софт-скиллы": умение принимать критику, если ты ее попросил, и выдавать релевантную критику, если ее попросили
ХЗ, считаю это частью социализации. Бро, который вам не говорит, что вы мудак, когда вы ведёте себя соответствующе — не бро.
Впрочем, с другой стороны, если человек выбирает людей со сходными ценностями и паттернами, то особо много поводов воспринимать и выдавать критику и не будет, так что хз. Но это здесь не особо важно.
тайм-менеджмент и планирование, скилл самообразования (да, он действительно не у всех работает).
А, я просто не считаю это софт-скиллами. Впрочем, и это неважно: ваш поинт я понял (как и вы мой, думаю), и это вопрос определений.
Но вот горизонтальные связи это дело создает и укрепляет замечательно, конечно, что очень полезно в том числе в работе — но речь же не про это. Или вы это тоже имели в виду?
И про это тоже. Это же помогает на работе!
Ну и ещё бухаловки и тусы помогают встречать людей из слегка других социальных слоёв, с другими интересами, и так далее, а это полезно для развития упомянутых выше (и вами, и мной) навыков.
Нет, не в порядке. Логика хромает. Я про Гагарина, а вы про грибы.
Сможете описать, в чём именно проблема с логикой?
Ситуации абсолютно изоморфны. Свидетель изоморфизма — замены вроде «старики не хотят и могут учиться новому» на «молодняк не может выкатывать продукт и не контролирует своё эго». А фразы вроде «я пару опровергающих примеров видел, конечно, но это ничего не меняет» можно вообще оставить как есть.
Человека с подобной логикой я бы даже джуном не взял на проект.
Геймдев даже в кое-каких зарубежных конторах — рак с кранчами хуже HFT-трейдинга (в последнем хотя бы платят норм). Есть, конечно, норм места (они всегда есть), но тяжело заранее понять, куда именно ты собеседуешься. Лучше геймдева просто избегать.
Только для программирования нужна точность, а не красота и нарративность. Красота и нарративность хорошо подходят для книжки, почитать на ночь там что-нибудь этакое.
Блин, я даже не знаю, какой вариант ответа на это выбрать:
Большинство людей не может создавать работающие программные системы, это просто медицинский факт. Когда мы пытаемся идти против этого факта, то получаем жрущий полтора гигабайта рамы у меня сейчас gmail, тормозящее дерьмо на электроне, приложения сбера на гигабайты, и регулярно сломанную форму и страницу комментариев на хабре.
Неужели держать в уме всю сеть взаимодействий между разными объектами и их методами когнитивно проще, чем когда побольше ограничений выражено в типах, и три четверти багов устраняется ещё при написании, даже до сохранения файла на диск, рефакторинг простой и понятный, и контрибьютить в очень нетривиальные кодовые базы можно на второй день?
Впрочем, эти варианты не являются взаимно противоречащими, поэтому можно выбрать их оба сразу. Пожалуй, так и поступлю!
Моя голова устаёт, когда надо разбираться в ООП-лапше, потому что меняешь что-то здесь, а разваливается там.
А в случае ФП я могу прийти в новый нетривиальный проект вроде компилятора и продуктивно в него контрибьютить в первый же день. В худшем случае, в случае написанного в ФП-стиле кода на императивном языке, какого-нибудь там HFT-пайплайна на плюсах — в первую неделю.
А онбоардинг в ООП-проект может занимать месяц-другой, даже если его intrinsic-сложность на порядки меньше, и это не компилятор целого языка с тайпчекером, оптимизациями и доказательством корректности учёта газа (привет блокчейн), а, ну, не знаю, абсолютно простая хрень вроде «получи новость от Reuters и ещё десятка источников, сделай из неё bag-of-words-кодировку, посчитай расстояние Хэмминга с центрами имеющихся кластеров, найди ближайший, обнови». Это 500 строк на хаскеле в худшем случае, которые в ООП-стиле превращаются в 50 тыщ макаронов.
Я же явно написал «попытки разной степени успешности выйти из императивно-детализированной концепции в декларативную» (в прошлый раз без жирного, но, может, вы в этот раз заметите?). То есть, в сторону повышения способов выразить, что надо делать, а не как. Потому что когда вы пишете в своём императивном ООП
animal.makeSound(), вы описываете, что надо сделать. Читатель этого кода не знает деталей реализацииmakeSound, процесса вывода байтиков на экране и смены состояния TTY, конкретного животного, да и особенностей работы виртуальных функций вообще и в данном конкретном случае тоже знать не обязан.Но в сторону ФП тоже движение есть, что самое смешное, хотя я об этом не говорил! Оно настолько общепринято, что говорить об ФП в стиле 50-х, в смысле лиспа и «уау функции высшего порядка», в 2026-м не имеет смысла: это есть в подавляющем большинстве языков. И движение туда происходит в самых-самых мейнстримных иимперативных языках, начиная от евнух-версии в виде указателей на функции в C, и заканчивая делегатами в сишарпе, функторами в C++98 и целым STL, построенным на «в функцию-алгоритм передаётся произвольная функция», лямбдами в C++11, етц.
kekw
Или нету никаких изменений, а есть только функция
s = s(x⃗, t).Вы ещё не свыклись с мыслью, что вы просто живёте в четырёхмерном пространстве-времени (реальнее некуда)? А этой мысли уже больше ста лет.
Смысл не в чистоте функций, а в том, что в типе функций указаны её эффекты.
Мастурбация на чистоту — это действительно молоток в руках вчера его освоившего.
Вы там не докажите случайно, что любая импредикативная система неконсистентна, а то Жирар (и даже некоторые программисты) расстроятся — System F придётся выкидывать и папиры по этой теме перепсывать.
Неточность в том, что
Φ(Φ)⇔Φ∈{x∣Φ(x)}— это определение нотации, и вместо значка⇔надо использовать значок ≜ (или ≔, или что-нибудь подобное по вкусу). А с учётом этого высказывание — логическая тавтология, оно не может быть неверным, но и [расселоподобных] проблем влечь тоже не может.Расселоподобные проблемы возникают тогда, когда при определении предиката (или подмножества, что одно и то же) разрешается использовать слишком неограниченный язык. ZF вроде как консистентна не потому, что там, не знаю, не выполняется Px ⇔ x ∈ { y | Py } (выполняется, конечно, это вопрос нотации и δ-эквивалентные вещи), а потому, что язык построения множеств сильно ограничен. System U неконсистентна не потому, что она «абстрактно импредикативна» (System F тоже импредикативна, и ей норм), а потому, что там эта импредикативность слишком мощная.
Нет, почему?
Может :]
Она при этом не может быть эффективно аксиоматизируемой. Совершенно очевидно, что пополнение аксиоматики Пеано множеством всех истинных формул теории арифметики Пеано даёт полную и непротиворечивую систему. Просто не существует алгоритма, который бы перечислил все её аксиомы (включающие счётно бесконечное множество истинных, но невыводимых из аксиоматики Пеано формул).
Но это так, повыпендриваться (надо же чем-то выпендриваться!), потому что по сути это ничего не меняет.
По сути — человеческая аксиоматика не обязана быть ни эффективно аксиоматизируемой, ни даже достаточно богатой для выражения арифметики.
Это пошаговое описание именно в декларативном стиле. Ровно в том же смысле, как и, возвращаясь к программированию, «получить множество авторов статей в хабе “программирование” можно через
nubOrd . map author . filter (λpost → "программирование" `elem` hubs post)». Вы можете переубедить меня, описав процесс надевания куртки в императивном стиле, с мутабельными переменными, циклами, явными условиями, и так далее. Чем меньше абстракций уровня «просовываю руку в рукав», тем ближе к императивщине.Практически все попытки выше ассемблера (включая макроассемблер), все эти функции, ООП, структурное программирование, прочее — это попытки разной степени успешности выйти из императивно-детализированной концепции в декларативную. Эти все вот ООП-шаблоны, билдеры там, фабрики, стратегии — это попытка эмулировать декларативщину в императивной среде.
Сами придумали тезис («ФП/декларативщина — это когда поход в магазин представляется преобразованием цифр в продукты»), сами его оспариваете, сами победили. Как это называется? Это называется strawman argument.
Олсо, это ведь работает во все стороны: сколько людей описывает поход в магазин как ООП? Сколько людей… инстанциирует класс бумажника? обращается к синглтону бумажников? использует абстрактный класс ИбуМажник? Чей метод вызывается при обмене денег на товар — бумажника, денег, товара, продавца, или абстрактного менеджера сделок? Вы когда ребёнку будете объяснять процесс похода в магазин, будете рассказывать про абстрактный менеджер сделок?
Можно ли сделать вывод в вашем мире, что ООП — это академический зашквар?
Я нигде не говорил о красоте доказательства, я говорил о простоте и возможности. Императивный код особо не доказывают, там херак-херак и в продакшен обычно. Это да, это в императивщине и нетипизированной функциональщине делать проще.
Но я как-то всё-таки хотел бы использовать слово «инженер» как похвалу, а не как уничижительный термин.
И это быстрее происходит в типизированной функциональщине.
Товарищ взял не предназначенный для ФП язык и удивляется, что ФП выглядит в нём паршиво. Ну, я не знаю, попробуйте в ООП-стиле на ассемблере писать и потом ругайтесь, что ерунда выходит, клятый ООП.
Оптимизирующие компиляторы вы не приемлите вообще, я так понимаю, или это только применительно к ФП такое неприятие?
Нет, потому что про него я знаю очень отрывочно — мне напели содержимое презентации, не более.
Где обсуждается — не знаю. Но решение как в идрисе (когда ленивость явно помечается как Lazy) выглядит вполне себе дружественным к тайпчекингу и локальным рассуждениям. Ты, по крайней мере, знаешь, что именно у тебя ленивое.
ST— это обобщённыйIO(в прямом смысле,IO ≅ ST RealWorld).seq— так, для полноты. Его расходящийся результат тоже ненаблюдаем в этом же смысле.Только для девиртуализации компилятору надо доказать, что в данном месте других инстансов быть не может, а это задача сильно более нелокальная и сильно более сложная, чем просто подставить параметр, когда он доступен (что выполняется субъективно ИМХО куда чаще, чем условия для девиртуализации, потому что мало кто играется с экзистенциальными типами или полиморфной рекурсией и при этом ожидает должный перф).
Это он зря, конечно.
Последний пост в моём стандалон-блоге.
Даже процесс похода в магазин вы внутри себя описываете декларативно. Вы думаете в терминах того, что надо сделать (выйти из квартиры, вызвать лифт, перейти дорогу, дойти до магазина), а не как это сделать (это будет настолько объёмно, что я даже проверку открытия-закрытия двери писать не буду), и вы притворяетесь, что у ваших действий нет несмоделированных сайд-эффектов: вы не рассматриваете износ петель двери в процессе выхода из дома, выхлопные газы автобуса, смену настроения продавщицы в магазине из-за рисунка на вашей кредитной карточке, и так далее.
Потому что о чистой функциональщине без неявных сайд-эффектов проще рассуждать и доказывать её свойства.
Прелесть в том, что их не нужно отлаживать так часто, как вы думаете :]
А почему у меня тогда на хаскеле регулярно получается писать код по производительности на уровне плюсов (иногда — быстрее)?
Потому что нет, конечно, не «всегда будет», это non sequitur. Компилятору ФП никто не мешает компилировать ФП-код во вполне производительный императивный мутабельный код. Более того, начиная с некоторого уровня сложности компиляторов это проще: типизированное ФП (а другое не нужно) выражает в типах больше инвариантов и даёт компилятору больше информации о том, какие оптимизации не изменят семантику программу, и их можно безопасно применить. Просто до этого уровня в императивном (и близком к железу — привет условной джаве) программировании программист делает ту работу, которую может (и должен) делать компилятор.
А вообще забавно то, что я как раз на неделе начал читать сборник публикаций первой конференции History of Programming Languages, и там целый Джон Бакус (который автор Фортрана, куда уж императивнее, и который Backus Normal Form для описания синтаксиса) пишет где-то в окрестности 1980-го года:
Исключительно из любви к формальности:
Хаскелисты традиционно притворяются, что
undefined(и прочих нетотальностей) не существует, и вообще что Hask — настоящая категория.Олсо, если подходить формально, то
имеет некоторый смысл даже в нетотальных языках при наличии
undefined,errorи прочих подобных: эти «пустые» значения невозможно наблюдать в чистой части программы в рамках стандартной метатеории [разных вершин] лямбда-куба, без компиляторной магии (ST/IO— компиляторная магия,seq— компиляторная магия, да и она тоже не меняет большую операционную семантику, потому что сходящиеся термы что сseq, что безseqимеют одну и ту же нормальную форму).Иными словами, ты в чистом коде не можешь написать
поэтому про наличие пустоты ты не узнаешь.
После инлайнинга и/или при наличии доступного анфолдинга в использующем модуле оно вполне может специализироваться, если компилятор решит, что это выгодно (я про это целый пост писал пару лет назад!)
Для этого в хаскеле тоже надо явно обмазываться экзистенциальными типами, ну либо убить оптимизатор (что можно сделать в любом языке).
Не «зачем», а «почему».
Потому что привычно, и потому что жить иначе тоже надо отдельно учиться.
Де-факто — да, принцесс там мало. Я был на Мешугге дважды (в Москве где-то в окрестности 2010-го и в Лондоне чуть позже), и гендерный состав там был несравним, например, с Металликой в 2007-м в Лужниках (хотя там, вероятно, половина девушек пришла на HIM, которые были там на разогреве). Но, впрочем, и на совершенно прямолинейных и квадратных 4/4-группах вроде Unearth как-то тоже вяловато.
Раз пошла такая пьянка, то упомянутый мной выше нужный уровень — это как раз какая-нибудь Мешугга стратегически, по глобальной архитектуре написания песен, и что-нибудь вроде первого альбома Structures, или WTR эпохи Invade/Elite, на тактическом, мам-смотри-как-я-могу уровне.
Каждый раз, когда на 40-м канале siriusxm включают какой-нибудь там slayer или megadeth, я сразу переключаю.
Понимание, что на нужном уровне я не научусь играть, по крайней мере, с тем количеством времени и регулярности, что мне оставляют другие коммитменты. Следовательно, это бессмысленно.
В 17 не было концепции «нужного уровня», как и не было коммитментов «
маши крыльямиботай или сдохнешь». У меня вон план по ботанью расписан на следующие лет шесть, и это уже не изич вроде трёхтомника Верещагина-Шеня по матлогу.Лол, они замужем так-то, у них и так есть кого и за что ценить. Да и это как в той шутке про разных металистов, спасающих принцессу от дракона, и где у прогмитолиста сначала дракон убивает себя от скуки, а потом и принцесса.
Да и вообще, чем меньше людей видит твоё творчество, тем более оно чистое и честное (потому что тогда ты действительно оптимизируешь свои представления о прекрасном, а не принятие другими людьми). И именно поэтому я не хочу влезать во всякие хакатоны, клубы чтения книг (или как это по-русски?), и прочее подобное. И, кстати, что забавно, в 17 лет этих представлений о чистоте тоже не было.
Я скорее не про концерты, а про что-то, подразумевающее больше взаимодействия между непосредственными участниками. Условно, сходки относительно стабильного множества людей вживую с целью пообщаться и провести время вместе, всякое такое. Мешает потерянный скилл, отсутствие общих контекстов, и упомянутые выше коммитменты.
Не знаю, вышеописанное — из личного опыта, а опыта онлайн-школ у меня нет.
Но, судя по разным околоковидным вещам, чистый онлайн + отсутствие ИРЛ-взаимодействий заметно вредят. Если вне школы тусовки вживую есть, то, может, и нормально. Но, может, и нет.
Можете считать это моей аксиоматикой.
Не вижу причин не существовать.
Почему?
Мои предпочтения — борьба с двойными стандартами.
Судя по наблюдаемым данным — да, абсолютно верно.
Minor-attracted persons, политкорректное название педофилов.
Что здесь выбираю я, совершенно неважно.
Судя по наблюдаемым данным — да, абсолютно верно.
Я потом в разных компаниях работал, включая имеющие достаточно прямолинейную культуру. Но везде помогало (а до определённой поры — помогало бы) понимание, что у людей могут быть несколько другие цели, чем «решить задачу правильно, бонус за красоту», и это нормально. Универ этого понимания не даёт.
То есть, подспудно мы все понимаем, что и в Физтехе цель, тащем — получить диплом, и спихнуть ненавистные какие-нибудь там урматы можно, но это понимание покрыто кучей слоёв из «это неправильно». И, говоря на метауровне, рассуждать о мотивациях и рефлексии в таких терминах там тоже не учат, а это тоже софт-скиллы, которые прокачиваются от столкновений с другими людьми с другими ценностями.
Откуда эта база возьмётся, если до этак 17 лет у вас нет особой свободы в выборе, с кем общаться, где общаться, и так далее, поэтому оптимизируется совсем не та же функция, что во взрослом возрасте? То есть, да, коллег вы тоже не особо выбираете, но на работе будут хотя бы не те же люди, которые в школе лупили отличников, потому что а чё они слишком умные, а учителя-идиоты это не сглаживали, а обостряли.
17-18 — это тот возраст, когда такая свобода реалистично начинает появляться. По крайней мере, опять же, я и в школе не очень социализировался, и в 17+. Но если в школьные годы у меня нет ответа на вопрос «какой есть реалистичный альтернативный сценарий, где я социально успешнее, опытнее и счастливее», то в 17+ он есть (не пошёл бы в вуз, тусил бы больше с людьми из программерских тусовок из интернета, с фуллтайм-работой имел бы больше времени на то, чтобы общаться с друзьями друзей, не все из которых полуаутистичные задроты, научился бы играть на гитаре и играл бы с даже знаю какими людьми, ходил бы на разные мероприятия, етц; не построил бы свою идентичность и личность вокруг академических успехов, в конце концов).
Я бы сказал, что 17-23 — это критический возраст, когда ещё не совсем поздно, но после которого уже хана. И понятие «себя» кристаллизуется тоже где-то там.
ХЗ, считаю это частью социализации. Бро, который вам не говорит, что вы мудак, когда вы ведёте себя соответствующе — не бро.
Впрочем, с другой стороны, если человек выбирает людей со сходными ценностями и паттернами, то особо много поводов воспринимать и выдавать критику и не будет, так что хз. Но это здесь не особо важно.
А, я просто не считаю это софт-скиллами. Впрочем, и это неважно: ваш поинт я понял (как и вы мой, думаю), и это вопрос определений.
И про это тоже. Это же помогает на работе!
Ну и ещё бухаловки и тусы помогают встречать людей из слегка других социальных слоёв, с другими интересами, и так далее, а это полезно для развития упомянутых выше (и вами, и мной) навыков.
Сможете описать, в чём именно проблема с логикой?
Ситуации абсолютно изоморфны. Свидетель изоморфизма — замены вроде «старики не хотят и могут учиться новому» на «молодняк не может выкатывать продукт и не контролирует своё эго». А фразы вроде «я пару опровергающих примеров видел, конечно, но это ничего не меняет» можно вообще оставить как есть.
Даже не знаю, как мне теперь с этим жить.
А потом уехать крышей.
Геймдев даже в кое-каких зарубежных конторах — рак с кранчами хуже HFT-трейдинга (в последнем хотя бы платят норм). Есть, конечно, норм места (они всегда есть), но тяжело заранее понять, куда именно ты собеседуешься. Лучше геймдева просто избегать.