В виде вступления, я бы хотел вернуться немного в своё детство: в возрасте примерно 14 лет я читал фэнтезийный цикл книг Роберта Сальваторе про тёмного эльфа Дриззта (Дззирта), сюжет проходил в мире известном как “Забытые королевства”, кова с целью наживы”. Это натолкнуло меня тогда на некую идею, которую я смог выразить уже значительно позже, познакомившись с гипотезой Сепира-Уорфа и парадоксом Блоба.торый населён большим количеством различных народов, это и эльфы, и великаны, и гоблины и многие другие. И у каждого из этих народов есть свой язык, на котором они говорят. Мне хорошо запомнилось, что например, в языке гоблинов нет слов для выражения любви или дружбы, а наиболее близким к ним по смыслу являлось бы что-то вроде “сотрудничест
В чём суть гипотезы Сепира-Уорфа?
Гипотеза существует в двух версиях, на сколько я понимаю - строгую версию гипотезы сейчас по-серьёзному не рассматривается, по этому остановимся на её "мягкой" вариации. Она говорит, что язык на котором общаются люди влияет на их мышления, т.е. лингвистические паттерны дают определённые способы мышления о тех или иных уже не языковых категориях, например, то как мы представляем себе время или пространство. Всё это послужило почвой для ряда психолингвистический исследований во второй половине 20го века и породило целую плеяду искусственных языков, по типу Ложбана или Логлана (http://miresperanto.com/konkurentoj/lojhban.htm).
О чём Парадокс Блоба?
Парадокс Блоба был предложен Полом Грэмом в своей культовой статье: "Lisp: побеждая посредственность" (https://nestor.minsk.by/sr/2003/07/30710.html). Если кратко его сформулировать, то парадокс говорит о том, что если мы расположим все языки программирования на “лестнице абстракции” от самых низких по уровню абстракции до самых высоких и куда-то в середину поместим язык Блоб, то программист, пишущий на этом языке будет довольно хорошо понимать языки расположенные ниже, однако ему будет казаться, что писать на них очень неудобно, ведь в них нету привычных для Блоба абстракций и их приходится выражать не самым удобным образом, но даже если и можно их выразить, то это выглядит довольно громоздко. С другой стороны, программист языка Блоб будет смотреть на языки расположенные по уровню абстракции выше и думать, зачем было придумывать такие синтаксические конструкции, он не будет до конца понимать для чего это всё нужно, так как будет мыслить в рамках своего языка и не сможет подняться по уровню абстракции выше (без определённых усилий конечно).
К чему я веду?
В примере выше гоблины, условно, пишут на каком-нибудь низкоуровневом языке, например на ассемблере и когда они хотят в рамках данного языка выразить какие-то более сложные абстракции они сталкиваются с тем, что им приходится придумывать довольно большие программы, чтобы объяснить что-то, что скажем, на языке людей (C++) заняло бы пару фраз. С другой стороны, пусть существует язык эльфов (например Haskell) в котором есть какие-то ещё более абстрактные вещи, которые не ясны большинству людей (вроде эндофункторов, монад и ко-произведений), хотя и понятны отдельным волшебникам вроде Гранина (https://www.youtube.com/watch?v=BEmwnPGfcTU) или Бартоша (https://www.youtube.com/watch?v=I8LbkfSSR58&list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_), которые могут это выразить на том же C++, но выходит снова очень громоздко и не красиво, но они так делают потому, что знают ещё более абстрактный язык чем язык эльфов, например язык ангелов (теорию категорий). В математике, теория категорий является, возможно, одной из самых абстрактных областей, обобщающей различные структуры и понятия из других математических областей, например сюръективность и инъективность из теории множеств на эндо- и моно- морфизмы, которые существуют и в других категориях, например в которых объекты будут не обязательно множествами.
На какие мысли это меня наталкивает?
Во-первых, язык на котором вы пишете код очень сильно определяет то, как вы в принципе можете мыслить о какой-то задаче и какие решения вы найдёте. Я прекрасно помню свой переход от мышления в "процедурной" парадигме к "объектно-ориентированной" и как изменились мои подходы к решению задач после этого. Изначально я мыслил последовательно и был очень привязан к аппаратным абстракциям, по типу устройств ввода-вывода, хранению памяти и т.п. А переходя на объектный уровень смог лучше выражать в коде абстракции своей предметной области.
В этом смысле, первый язык программирования (ЯП) делает определённый импринт в сознании, заставляя вас мыслить в том или ином ключе и хорошо если сам ЯП не обладает внутренней противоречивостью (как например языковое ядро того же Паскаля) -т.к. это приводит к накоплению когнитивных ошибок. И если вы начинаете писать с языка, который даёт слишком много свободы выражения каких-то идей, вам потом довольно трудно будет заставлять себя думать о каких-то возможностях, которые не выражаются в вашем языке (работа с памятью например).
Во-вторых, для гибкости мышления полезно изучать разные языки программирования, идея в общем-то стара как мир: "если хотите лучше понять другую культуру - учите её язык", но суть даже не в том, что надо изучить как можно больше языков, а скорее в том, что полезно разобраться с работой разных парадигм. Это даёт нашему мышлению больше способов выразить одни и те же идеи, найти более элегантные или если хотите - эффективные способы их решения. Как пример, приведу сложение массива: практически на любом современном ЯП завязанном на работу с CPU, эта задача имеет линейную сложность O(n), так как вам нужно проитеррироваться последовательно по всем элементам этого массива. Но если вы используете CUDA, то сложность этого действа сокращается до O(ln(n)), так как вы можете сразу складывать попарно все элементы за один такт работы GPU (в реальности, на современных процессорах появилось векторное сложение, так что это в определённых границах правдиво и про CPU). Такие подходы принципиально меняют отношение к тем или иным задачам, вы как бы получаете ещё одно измерение, через которое можно смотреть на проблему. В связи с этим, мне кажется полезным быть знакомым с процедурной, объектно ориентированной, функциональной парадигмой, попробовать пописать код на языках со строгой типизацией и динамической, на языках с низкоуровневыми и высокоуровневыми абстракциями. На мой вкус, в современных реалиях такой наборчик мог бы выглядеть вот так:
- Python - даёт понимание скриптов, удобен, когда вы проверяете какие-то концепции (пишете spikes), даёт понимание работы динамической, но при этом строгой типизации.
- C (именно С, не С++ т.к. чистый С в плане освоения на много проще С++) - учит работать на уровне операционной системы, знакомит с низкоуровневыми абстракциями и процедурным стилем программирования.
- Java,C#,Go - языки, которые учат мыслить в объектно ориентированной парадигме.
- Haskell – я выбрал именно его, так как он не даёт возможности писать ни в какой другой парадигме кроме функциональной и на мой взгляд лучше всего подходит для этого.
- CUDA - строго говоря не язык, а SDK, на её месте мог бы быть любой язык, позволяющий проводить матричные операции единовременно, т.е. это прокачка головы в сторону навыка распараллеливания задач.
- Lisp – чтобы познакомиться с парадигмой макропрограммирования.
В третьих, даже если вы не планируете миграцию с языка на язык, то после погружения в новый язык программирования ваша разработка на старом языке не будет прежней, вы выучите определённые когнитивные ходы для мышления о тех или иных задачах. И будете, даже машинально их переносить на свой ЯП, что позволит вам всегда иметь несколько решений одной проблемы и выбирать лучшее.
В заключительной части хочется добавить, что античные философы занимались поиском этимона, они так называли слово, которое выражает суть какого-то объекта или идеи, "истинное слово" если будет угодно. И чем какое-то слово более ёмко выражает суть идеи или абстракции, тем нам проще с ней работать и её понимать. Кажется, что и в мире программирования, когда язык, на котором мы пишем даёт нам возможность более удачно выражать те или иные идеи тем нам самим же удобнее и проще.
Учите языки программирования, разбирайтесь в парадигмах, курите философию.
Подписывайтесь на мой telegram-канал https://t.me/Nikita_Trixter