Перейти к содержимому

Clojure что на нем пишут

  • автор:

Clojure: расскажите чутка про язык?

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

Что за такой язык Clojure, какие в нём особенности, на какой язык больше всего похож его синтаксис/логика, и легко ли на него перейти с Java?

�� Подобається Сподобалось 0

До обраного В обраному 0

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

12 коментарів

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Dmytriy Kovalenko Principal SE в MEGOGO 27.09.2021 11:42

Один из альтернативных языков на JVM, из тех что сейчас в ходу — наименее популярный.
Любят его за то что:
— это лисп — гомоиконность, макросы, вот это вот все
— создатель Rich Hickey толкает здравые идеи и развивает язык, выступает за простоту в реализации и вообще пытается всячески влиять на мир программирования проповедуя собственные идеи
— можно использовать либы и тулы JVM экосистемы, производительность поэтому тоже неплохая
— есть REPL который позволяет быстро прототипировать и проверять гипотезы
— есть вариант писать full-stack с помощью ClojureScript
Не любят за то что:
— это лисп 🙂 писать-читать код нужно иначе, изнутри-наружу, синтаксис отсутствует, программисты пишут AST руками
— Динамическая типизация имеет свои недостатки, читать-поддерживать код сложнее, особо в команде из более чем пару человек
— слабая популярность играет злую шутку с наймом, кложуристов мало и не особо прибавляется потому что опять же не самый популярный язык/стек

С Java сложно перейти тем кто кроме джавы ничего не видел. Легче будет перейти тем кто интересуется ФП, пробовал альтернативные языки или может сталкивался с лиспами.
Для себя я так и не придумал применения для этого языка кроме обучения другой парадигме. Для команд который пишут на Java переход не имеет смысла. Каких-то киллер-продуктов типа спарка для скалы, в мире clojure я также не вижу. Единственный вариант когда в этом есть смысл — когда команда уже пишет на clojure, либо есть один ментор-кложурист, а все остальные очень хотят попробовать что-то необычное 🙂
Если интересует ФП при этом хочется применять его в работе — советую посмотреть на Scala, это единственный мейнстрим язык с серьезной его поддержкой.

Что за такой язык Clojure, какие в нём особенности, на какой язык больше всего похож его синтаксис/логика

Особенности:
— один из диалектов лиспа
— заточен под функциональное программирование
— есть реализация не только под JVM, но и под .NET (ClojureCLR), и диалект-компилятор под джаваскрипт (ClojureScript)
— Испытал влияние: Lisp, ML, Haskell, Erlang, Prolog, Scheme, Java, Ruby © википедия
Более подробно можно на той же википедии почитать. 🙂

легко ли на него перейти с Java?

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

Эта удивительная Clojure: что на ней разрабатывают, чем она отличается от других языков и подходит ли для входа в программирование

Эта статья была написана для одного издания, но по ряду причин ее не опубликовали. Размещаю здесь, чтобы материал не пропал. В подготовке статьи участвовали:

  • Павел Пеганов и Иван Гришаев, программисты;
  • Маша Даровская, редактор.

Мы расспросили разработчиков на Clojure из сообщества clojure_ru. Выясняли, как применяют язык, что на нём пишут, легко ли на нём программировать.

Что программируют на Clojure

Павел: сфера применения Clojure в техническом плане — в основном веб и серверные приложения. На успешно работающий Clojure-код можно посмотреть, например, в продуктах Metabase и Penpot, их исходный код открыт.

Но постепенно язык проникает и в другие области. ClojureScript работает в браузерах и других средах для JavaScript, с помощью проекта Esprit его уже запускают на микроконтроллерах, а сейчас развивают ClojureDart, чтобы захватывать мир Flutter. Конечно, не все эксперименты в итоге «взлетят», но такое разнообразие работающих проектов показывает, что применимость языка ограничена скорее настроениями разработчиков, чем самим языком.

Если говорить о предметных областях, то в вакансиях и проектах с Clojure, о которых слышу я, эмпирически кажется, что финтеха больше, чем прочих. Даже компания, поддерживающая Clojure, Cognitect, принадлежит банку Nubank. Но кроме финтеха областей тоже хватает.

Иван: сфера применения Clojure широка, она решает те же задачи, что Java, Python и другие языки. На ней пишут сетевые сервисы, бэкенд веб- и мобильных приложений. Clojure подходит для обработки данных из разных источников — баз данных, очередей, HTTP API — и часто служит их оркестратором.

Существует ClojureScript — компилятор кода на Clojure в JavaScript. С его помощью создают браузерный фронтенд и мобильные приложения на базе React Native.

Код на Clojure можно скомпилировать при помощи GraalVM и native image, получив бинарный файл. С этим подходом пишут утилиты командной строки, интерпретаторы, AWS Lambda и многое другое.

Чем Clojure отличается от других языков семейства Lisp и почему эти языки несовместимы

Павел: с другими диалектами Lisp я за всю карьеру (с 2014 года) ни разу на практике не столкнулся. Видел пару образцов кода на Scheme, и те в книге Structure and Interpretation of Computer Programs, а не на работе. Слышал также о Racket, но только в академическом контексте.

Вообще от разных языков странно ожидать совместимости на основе только некоторого сходства в синтаксисе. Иногда такое действительно можно наблюдать, но разве что когда сходство — это следствие родства, когда один язык прямо вырастает из другого, и несовместимости достаточно быстро возникают и в таких случаях. К примеру, некоторые программы на C можно собрать и как C++, но только совсем простые. Аналогичная ситуация между Ruby и Crystal.

Clojure же относительно самобытен. Обилие скобок бросается в глаза, конечно, но это лишь одна из составляющих языка. И в отличие от многих собратьев по семейству, он активно пользуется разными видами скобок, не только круглыми.

Иван: Lisp — это семейство языков, объединённых схожим синтаксисом, а Clojure — наиболее современный их представитель. Для обывателя все Лиспы одинаковы, но на самом деле разница велика: каждый диалект силён в своих областях.

От классических диалектов вроде Common Lisp или Scheme Clojure отличается более современными идеями. Язык поощряет неизменяемость данных, асинхронные и ленивые вычисления.

Clojure предлагает мощные коллекции и функции для работы с ними. Они доступны по умолчанию без сторонних библиотек. По сравнению с Common Lisp улучшены макросы. Разработка на Clojure ведётся через REPL, как это принято в классических диалектах.

Синтаксис Clojure отличается от других Lisp-языков. В нём меньше круглых скобок, а некоторые формы задают квадратными и фигурными. Шутки про множество скобок уже не так актуальны для Clojure, как это было со старыми диалектами.

Главное отличие Clojure от других Лиспов в том, что Clojure работает на платформе JVM. При компиляции получается jar-файл, который позже запускается силами Java. Это отпугивает разработчиков на Common Lisp, которые привыкли к машинному коду. JVM позволяет повторно использовать код на Java, который писали и отлаживали десятилетиями. Этому Clojure обязана своей популярностью: сразу после выхода на ней можно было писать промышленный код, не дожидаясь библиотек.

Можно ли начать программировать с Clojure

Павел: можно ли освоить Clojure как первый язык? Определённо. Язык довольно прост по своей структуре, встроенных механик в нём немного, удивительно многие механизмы можно реализовать посредством функций и макросов у себя в коде, не вмешиваясь в устройство самого языка. А REPL можно поначалу воспринимать как своего рода «чат» с языком или как калькулятор, способный на обработку не только чисел. Не нужно разбираться со структурой проекта, процессом сборки, способом запуска, обязательной точкой входа (необходимостью всё заворачивать в классы и методы, например) — всё это для самого первого языка лишнее.

Логично начинать знакомство с сайта языка: clojure.org. Там прекрасные руководства, пусть кому-то они и могут показаться суховатыми. Есть и книги, причём некоторые даже в свободном доступе. Мне здорово помогла Clojure Cookbook, объясняющая язык на примерах — от примитивных и абстрактных до прикладных. Её исходники доступны на GitHub.

Мой совет: не браться изучать редактор Emacs одновременно с Clojure, что часто рекомендуют другие. Так можно делать, конечно, просто Emacs — это целый мир, и не каждому хватит упорства осваивать сразу две настолько широких темы параллельно. Для начинающего я бы посоветовал в качестве редактора VSCode с расширением Calva, его интерфейс гораздо больше похож на то, с чем можно столкнуться в повседневной околокомпьютерной деятельности.

Для тех же, кто погружается после других языков, для ознакомления может быть полезна краткая шпаргалка по Clojure с сайта Learn X in Y Minutes (есть и на русском языке).

Иван: я бы не рекомендовал Clojure в качестве первого языка. Она опирается на JVM, и это усложнит путь начинающему разработчику. Scheme или Racket станут отличным выбором — неслучайно курс SICP и одноимённая книга используют Scheme.

Начните с официального сайта Clojure: его разделы описывают философию языка, устройство и первые шаги.

На русском языке доступны книги «Программирование на Clojure» и «Clojure на производстве», причём последняя — не перевод. Из английских подойдут The Joy of Clojure и Clojure for Brave and True. Вступите в группу clojure_ru в «Телеграме», чтобы обращаться за советами.

Полезные библиотеки

Павел: Clojure подключается к уже существующим экосистемам. Классическая реализация для JVM позволяет использовать почти всё, что можно использовать из Java. Такое же отношение между ClojureScript и JavaScript, ClojureDart и Dart и т.д. Так что в переписывании существующих библиотек из других экосистем Clojure не сильно нуждается, разве что в обёртках для библиотек с платформы, а их уже написано немало.

Но есть интересные образцы и в самой Clojure. Мне, например, было интересно попробовать re-frame (для браузерных приложений), Instaparse (даёшь строку с грамматикой — получаешь функцию-парсер) и DataScript (иммутабельная БД с языком запросов).

Иван: в Clojure есть все необходимые библиотеки для баз данных, кэширования, очередей сообщений. Поддерживаются известные форматы и протоколы, средства веб-разработки. Проблемы отсутствующих библиотек нет как таковой.

Можно сказать, Clojure умеет всё, что умеет Java из-за повторного использования кода. При этом абстракции, построенные на Clojure, оказываются изящными и ёмкими.

У Clojure свой репозиторий библиотек, который называется Clojars. Поддерживается Maven — центральный репозиторий Java. Зависимости могут находиться в репозитории Git, что позволяет указывать версии с точностью до тега или коммита. Этим пользуются в больших фирмах, где много внутренних библиотек.

Популярность языка

Иван: Clojure менее популярна, чем Java или Python, но ее доля растёт. На западе Clojure используется всё чаще, и эта тенденция плавно доходит до нас. Пока что в России мало компаний, которые ищут разработчиков на Clojure: это Health Samurai, Сбербанк, Ростелеком. На мировом рынке вакансий больше на порядок, но из-за последних событий тяжело устроиться, если находишься в России.

Типичная вакансия на Clojure — это сетевой сервис или бэкенд веб- или мобильного приложения. Код сводится к обработке данных из разных источников — БД, Redis, Kafka. Реже встречается фронтенд с различными обертками над React.

Зарплата удалённого разработчика в западных фирмах варьируется от 5 до 12 тысяч долларов в месяц. Среди российских вакансий самая высокая ЗП обозначена «до 330 тысяч рублей». Я не собеседовался туда и не могу подтвердить, правда это или для привлечения внимания.

Работу в России ищут в телеграм-канале clojure_ru в топике вакансий. Удалённые вакансии размещают в слаке Clojurians в канале #remote-jobs , а также на сайтах clojurejobboard.com и remoteok.com по тегу clojure.

Как в сообществе относятся к новичкам

Павел: Clojure редко изучают как первый язык. Наверное, поэтому в части сообщества, что я видел, много сформировавшихся и опытных специалистов с холодными головами, привыкших к странным вопросам от людей, пришедших из других экосистем. Те дискуссии, что я видел, были конструктивными, познавательными и в целом приятными. Инциденты случаются, но редко, чаще даже с особо абразивными участниками получается наладить диалог, хоть выглядит этот диалог порой забавно. В целом, как и почти везде — на уважительное отношение можно ожидать взаимности.

Иван: пожалуй, у Clojure самое доброе и отзывчивое сообщество, что мне приходилось видеть. Возможно, потому, что к Clojure приходят в более старшем возрасте, нежели к PHP, Javascript или Python. Люди общаются в позитивном ключе — задавайте вопросы, и вам помогут.

Тулинг языка и поддержка в IDE

Павел: это язык, за который без инструментов лучше не браться. Тот, кто впервые видит Clojure, чаще всего пугается обилия скобочек. Но, наверное, никто из тех, кто плотно занимается Clojure, вручную их не расставляет. Для этого есть как минимум Paredit и Parinfer. С ними можно фокусироваться на структуре кода, а не на тексте, из которого он состоит. Из поддержки именно в IDE я слышал только о Cursive для сред Intellij от JetBrains, чаще же используют просто текстовые редакторы вроде Emacs, Vim и VSCode. Есть и Language Server, интегрировать который в новые редакторы для облегчения работы с Clojure не должно быть большой проблемой.

Со сборкой дела обстоят чуть сложнее, но тоже хорошо. Нет какого-то одного инструмента, который используется везде, но и огромного ассортимента, из которого не понятно что выбирать, тоже нет. Сейчас на сайте clojure.org советуют Clojure CLI, который вполне неплох. А если касаться других реализаций Clojure вроде ClojureScript, то, скорее всего, там будет что-то своё, это придётся осваивать отдельно — единства инструментов в разных реализациях нет.

Иван: Clojure предлагает все средства для комфортной работы. Прежде всего это утилита Leiningen для управления проектами. При помощи неё код запускают с разными профилями, собирают uberjar, прогоняют тесты, загружают библиотеки в репозиторий Clojars. Lein расширяется плагинами, которых великое множество под разные задачи.

Кроме Leiningen, доступны утилиты Clojure CLI и Boot со схожими возможностями. Clojure CLI более гибко работает с classpath, что порой необходимо в сложных проектах.

Для Clojure создан и поддерживается LSP-сервер и плагины к популярным редакторам. LSP используют многие разработчики, его популярность растёт. Однако лучшей IDE для Clojure считается Emacs с модулем Cider.

Важно понимать, что разработка на Clojure протекает не так, как в других языках. В них программист полагается на статический анализатор кода. В Clojure всё решает REPL-driven-development, когда код запускают в REPL по мере написания. В этом плане связка Emacs+Cider предлагают наиболее продвинутые средства.

Поскольку Emacs — это вещь в себе, будет трудно изучать его вместе с Clojure. В идеале с ним знакомятся отдельно. Я перешёл на Emacs ещё до Clojure. Возможно, на первых порах подойдут IntelliJ IDEA или VS Code — они тоже поддерживают Clojure за счёт сторонних модулей.

Набирает популярность проект babashka — интерпретатор Clojure, написанный на Clojure и скомпилированный GraalVM. С его помощью запускают скрипты, написанные на Clojure, без компиляции. Babashka полезен в облачном сервисе AWS Lambda и в системном программировании.

Проблема статической типизации в Clojure

Павел: статическая типизация — это, пожалуй, тема самых бурных и длинных дебатов в чатах по Clojure.

Основная проблема со статической типизацией — негибкость. Либо статически типизирован весь код, либо код просто не собирается и не запускается, либо систему типов на определённых участках приходится отключать, лишаясь её преимуществ. Необходимость постоянно с этим бороться здорово замедляет разработку: очень непросто вписать предметную область, особенно недоосвоенную, в формальные ограничения системы типов.

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

Для желающих есть библиотека Typed Clojure, ранее core.typed. Но я не припомню, чтобы она была сколько-нибудь популярна. Популярны схемы (schemas). Когда-то на слуху была библиотека Schema, позднее появились Clojure.spec и Malli. Они позволяют зафиксировать структуру значений в ключевых местах, где ожидаются проблемы. Но где это делать и как — дело ваше.

Хотя на «краях» языка, где идёт взаимодействие с хост-платформой, указывать типы местами всё-таки приходится. На классическом Clojure для JVM при вызове класса на Java может потребоваться type hint, чтобы ускорить код или вызвать правильный метод из разных перегрузок. А в ClojureScript они могут использоваться в экстернах для сжатия скомпилированного кода на JavaScript с помощью Google Closure Compiler. Но таких случаев немного, и их можно запереть в библиотеках-обёртках, чтобы в повседневной жизни с ними не сталкиваться.

Иван: Clojure — не чисто функциональный язык как Haskell. Разработчики говорят о нём: tends to be functional — тяготеет к функциональному стилю, но не полностью. Надёжность кода на Clojure обусловлена тем, что код на нём запускают в REPL по мере написания. Из-за этого сразу видно, работает код или нет. В других языках код проверяет статический анализатор. Он покажет типовые ошибки, но их отсутствие не гарантирует безошибочную работу. Clojure, напротив, отталкивается от запуска кода, что даёт решающее преимущество.

В Clojure были попытки создать статическую типизацию. Проект называется Clojure Typed; с его помощью в код добавляют аннотации с типами, а затем он проверяется на корректность. Судьба проекта неоднозначна: некоторые компании им пользовались, но с развитием кодовой базы типизация скорее мешает, чем приносит пользу.

В Clojure приняты другие, более простые способы следить за типами. Прежде всего это тесты: юнит-, интеграционные, smoke- и другие. Есть набор линтеров — утилит для статического анализа кода. Встроенный пакет clojure.spec позволяет описать структуру данных, в том числе аргументов функции и её результата. Всё вместе это устраняет проблемы динамической типизации, оставляя только её положительные стороны.

За восемь лет работы с Clojure я помню лишь несколько случаев, когда на проде возникала ошибка типов. Чаще всего причина была в слабой проверке входных данных, что исправлялось тестами.

Динамическая типизация в лучшей степени ложится на окружающий мир. Хоть и возможно описать типами 90% данных, останутся те 10%, для которых это сделать тяжело, при этом сложность типов растёт нелинейно. Добавьте сюда частые изменения бизнес-требований. Как бы странно это ни звучало, именно динамическая типизация оказывается удобней на долгом этапе разработки.

Язык для удовольствия

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

Я сходу припоминаю два крупных эпизода, заставивших меня испытать это ощущение.

Первый — с Component. Он меня отправил в целое путешествие на тему подмены кода у уже работающего приложения новой версией (что при разработке хочется делать постоянно) без каких-либо скрытых сложных механизмов, лишний раз закрепил тему вреда глобальных переменных, продемонстрировал интересный сорт внедрения зависимостей (dependency injection) и подтолкнул ознакомиться с другими подходами к этой же задаче на этом же языке: Mount и Integrant.

Второй — с re-frame. Инструменты по созданию браузерных приложений, что я видел до того момента, то и дело вводили для генерации разметки собственные языки с собственными правилами и операторами, вместо того чтобы подключить к процессу всю мощь JavaScript. Это отбивало у меня охоту лезть во фронтенд без острой необходимости, которой так и не возникло. Re-frame же всё делал в ClojureScript, в том числе разметку, и этим убедил меня как минимум попробовать. И это очень быстро вылилось в работающий браузерный чат на WebRTC.

И с тех пор я раз за разом возвращаюсь, надеясь, что случится ещё один эпизод.

Иван: очевидно, что на языке, на котором приятно программировать, вы сделаете больше. Clojure дарит удовольствие тем, что ёмко выражает ваши мысли. На текущий момент я не знаю языка, который переводит мои намерения в код с той же лёгкостью. Много лет назад я писал на Python и был такого же мнение о нём, но Clojure в этом плане ушла дальше.

Преимущества Clojure это:

  • неизменямость данных, из-за чего уходит целый пласт ошибок;
  • REPL-driven development, когда код запускают из редактора по мере написания. Из-за этого раньше видны ошибки и дальнейший путь разработки;
  • макросы, с которыми легко писать выразительный код, избегать повторов и многое другое.

Ни в одном языке нет этих трёх компонентов, развитых в той же мере, что и в Clojure.

Про популярность языка

Павел: было бы неплохо, чтобы язык стал популярнее. Но популяризация может произойти по-разному, и не все возможные сценарии этого мне нравятся. Иногда возникают обсуждения, что Clojure нужен какой-то доминирующий фреймворк или инструмент, который привлечёт огромную толпу людей. Что от этого бывает, я своими глазами видел в Ruby on Rails. Фреймворк захватил экосистему самого языка настолько, что разработчиков на Rails, вероятно, больше, чем разработчиков на Ruby, как бы парадоксально это ни звучало. И вредные привычки из фреймворка растекаются далеко за его пределы.

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

Но это, так уж вышло, несколько поднимает порог входа из-за того, что выбирать первые инструменты приходится вслепую, а это неприятно. Разработчик испытывает страх неизвестности, не хочется потом переписывать весь проект из-за неверного выбора на ранних этапах. Но, к счастью, обычно это и не требуется, т. к. нет чего-то, что пронизывает весь проект настолько, чтобы замена одного узла потребовала полного переписывания. И жертвовать этой чертой ради популярности мне видится вредным.

Иван: Популярность Clojure растёт, но это происходит медленно. На западе ее не считают экзотикой. Clojure применяют в крупных банках, например Raiffeisen Bank International и NuBank.

На официальном сайте Clojure есть раздел Companies, где перечислены компании, когда-либо замеченные в найме Clojure-разработчиков. Возможно, читателей удивит длина списка, а также участие в нём Facebook, Apple, Netflix, Atlassian и других крупных компаний. Мне довелось переписываться с разработчиком из Apple. По его словам, Clojure используют для сбора данных и статистики.

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

Низкая производительность: правда или миф

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

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

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

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

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

Появились алгоритмы неизменяемых структур, где копирование данных сведено к минимуму. И хотя они медленней изменяемых аналогов, разница не столь велика, а преимуществ гораздо больше.

Многие промышленные языки в той или иной степени функциональны: это Scala, Kotlin, Rust. Опыт показывает, что неизменяемость и монадические типы (Try, Maybe) удобны в разработке. Эти абстракции не бесплатны, но они окупаются.

Сегодня уже нет чёткого разделения языков по принципу императивный — функциональный. Удачные решения из ФП заимствуют, потому что они оправдывают себя на практике.

Как мы упоминали, Clojure — гибридный язык. Код на нём варьируется от императивного до функционального стиля. Разработчик вправе выбирать, какой крайности придерживаться. Медленные участки кода легко переписать на манер Java. Например, заменить неизменяемый словарь Clojure на HashMap, неизменяемый вектор — на массив и так далее.

Существует исследование, где сравнивают скорость Java и Clojure: A performance comparison of Clojure and Java. Вывод гласит, что Clojure медленней Java в среднем от 2 до 5 раз, что совпадает с моими личными наблюдениями. Однако в силу своей гибкости Clojure предлагает много способов ускорить неоптимальный код.

Вместе с тем код на Clojure оказывается если не на порядок, то примерно в 5-7 раз короче аналогичного кода на Java. Меньший объем кода упрощает его поддержку, облегчает внедрение новых требований.

Если важен быстрый старт, например, в окружении AWS Lambda, проект компилируют с помощью GraalVM и native-image. Получается бинарный файл, запуск которого занимает микросекунды. Так работает несколько моих проектов: телеграм-бот, обработчик HTML-форм и другие.

Важность иммутабельности и ленивости языка

Павел: ленивости в Clojure, надо сказать, не так уж много. Есть ленивые преобразования коллекций, ленивые последовательности. Это встречается более-менее везде, где существуют итераторы. У Clojure преобразования в стандартной библиотеке ленивые по умолчанию, что встречается уже не так часто.

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

А вот с иммутабельностью интереснее. Я бы даже сказал, что это одна из самых полезных особенностей языка! Есть общие доводы в пользу иммутабельности — то, что вносимые в объекты изменения видны явно, т. к. изменённую версию надо откуда-то явно получить и передать дальше. Это снижает риск «случайной зависимости», когда разработчик, вызывая функцию на каком-то значении, не рассчитывает, что она его изменит и, возможно, поломает остаток алгоритма.

Но есть у иммутабельности и синергия с разработкой через REPL. Поскольку большинство конструкций вместо изменения уже сформированных объектов формируют новые, код очень часто можно выполнять по кусочкам и повторно. Благодаря этому можно делать в кусочках небольшие изменения и немедленно проверять, какой они вызывают эффект, не перезапуская всей программы. Это позволяет идти к решению постепенно, небольшими шагами, вовремя поворачивая, когда что-то идёт не по плану. А ещё это сильно упрощает юнит-тесты.

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

Гораздо важнее иммутабельность данных. Она исключает ошибки, связанные со случайными изменениями данных: словарей, списков, полей объекта. Метод .setSomething(x) , вставленный или удалённый где-то посередине, способен разрушить проект. В Clojure это невозможно в принципе: каждая функция принимает результат вычислений другой функции. Даже если какая-то функция дополнит словарь новыми полями, прежний экземпляр останется нетронутым.

В Clojure есть свои изменяемые типы, но они ведут себя как обёртки над неизменяемыми. Они применяются точечно и выделяются на общем фоне. Изменяемый объект, добавленный без причины, вызовет замечания коллег.

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

Ссылки и ресурсы

  • Документация
    • Официальный сайт и его разделы:
      • Rationale
      • Getting Started
      • «Программирование на Clojure»
      • «Clojure на производстве»
      • Clojure for Brave and True
      • The Joy of Clojure
      • Веб-ресурсы
        • Planet Clojure — агрегатор блогов на тему Clojure
        • Ask Clojure — сайт вопросов и ответов
        • Видео
          • Канал ClojureTV на Ютубе
          • Simple Made Easy by Rich Hickey (2011)
          • A History of Clojure by Rich Hickey with Q&A
          • Inside Clojure — Rich Hickey and Brian Beckman
          • Чат @clojure_ru в Телеграме
          • Группа Clojurians в Slack

          Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter

          Комментариев пока нет

          • Ivan Grishaev’s blog
          • ivan@grishaev.me

          6 языков программирования нового поколения, на которые стоит обратить внимание

          Представляем вам список из 6 достаточно перспективных языков программирования, на которые стоит обратить внимание. Список собрал KV.BY.

          Clojure

          Язык Clojure построен на JVM. Это позволяет ему быть совместимым с Java-кодом и со средой выполнения Java (Java runtime environment). Clojure является компилируемым в Java и это далеко не все – есть также другая версия, ClojureScript, которая компилируется в JavaScript.

          Выражения в Clojure читаются справа-налево, а не слева-направо, поэтому, чтобы сложить 2 и 3, вам придется написать (+2 3) и использовать рекурсию вместо циклов. Clojure относится к Lisp-семейству языков программирования, поэтому код и сами данные в нем воспринимаются как линейный список. Также в данном языке используется большое количество макросов.

          Какие есть плюсы?

          Скажем, вы хотите «поиграть» с функциональным программированием (ФП), но нет желания проходить весь путь до конца. ФП позволяет максимально использовать возможности современных многоядерных процессоров при работе с параллельными вычислениями, но низкоуровневые языки, как Haskell, слишком сложны для некоторых.

          Clojure – это язык программирования общего назначения, как и Java, с которым он совместим. Однако в отличие от Java, синтаксис языка программирования Clojure считается достаточно простым, последовательным и лаконичным. Кроме того, вы сможете взаимодействовать с запущенной программой и видеть результат выполнения отдельных функций сразу вместо того, чтобы после внесения каждого изменения перекомпилировать ее и запускать заново.

          Какие есть минусы?

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

          Какие компании используют?

          Walmart и Puppet.

          Go

          Нет, ну вы только посмотрите на этого милашку! Разве можно удержаться от улыбки при взгляде на этого необычного суслика, который является символом языка Golang? Go был разработан компанией Google, чтобы удовлетворить требования современного мира, определяемые многоядерными процессорами, сетевыми системами, вычислительными кластерами и веб-приложениями.

          Go, оснащенный такими необходимыми функциями, как параллелизм и встроенный сборщик мусора, создавался для быстрой разработки. Также в архитектуру Go было заложено более простое управление зависимостями и возможность масштабировать приложения с большей легкостью.

          Какие есть плюсы?

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

          Go-приложения без особых проблем поддерживают многопоточность, позволяя создавать веб-приложения, которые будут использоваться большим количество людей одновременно. Так как этот язык разработан непосредственно самой компанией Google, он пользуется огромной поддержкой и может похвастаться активно развивающимся сообществом.

          Кроме того, на языке Gо можно работать с Windows, Linux, Mac и даже с такими небольшими устройствами, как Raspberry Pi.

          Какие есть минусы?

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

          Какие компании используют?

          Dropbox, Google, SoundCloud, CloudFlare, Docker и Cloud Foundry.

          Rust

          Rust был разработан компанией Mozilla как альтернатива C++, кроме того, он пользуется активной поддержкой от Samsung. Главной целью создателей Rust было сохранить такие возможности языка программирования C++, как управление памятью и производительность. Однако также стояла задача избавиться от таких багов, как «висячие» указатели на несуществующие объекты, переполнение буфера и некоторые другие. Избавление от всех этих недостатков позволило сделать поддержку кода намного более простой, особенно в отношении долгосрочных проектов.

          Децентрализованная сетевая компания Maidsafe потратила 6 месяцев, избавляясь от целой кодовой базы на 500 000 строк C++-кода. С помощью языка Rust его удалось не только поместить в компактные 30 000 строк, но и повысить его стабильность.

          Какие есть плюсы?

          Этот язык подойдет вам, если вы являетесь системным разработчиком, который работает над долгосрочным проектом по разработке низкоуровневого программного обеспечения и хочет писать на чем-то более безопасном и современном, нежели C / C++.

          Как для нового языка, Rust может похвастаться не только отличной поддержкой, но и растущим количеством разработчиков и библиотек.

          Какие есть минусы?

          Изучение Rust вряд ли можно назвать простым, так как Rust комбинирует низкоуровневые возможности языка C с возможностями таких высокоуровневых функциональных языков программирования, как Scala. Компилятор ставит безопасность превыше всего, поэтому не позволит коду нарушать многие правила языка. Это отлично, если у вас есть в планах долгосрочные проекты, но работа с Rust может быть сложной для новичков.

          Какие компании используют?

          Dropbox, Mozilla, Chef, Maidsafe.

          Julia

          До сих пор не нашли в этой подборке язык для себя? Тогда позвольте предоставить вам Julia. Этот язык создавался, чтобы позволить аналитикам данных и математикам с помощью одного языка делать все то, что они раньше делали с использованием нескольких языков.

          К примеру, можно использовать Matlab для линейной алгебры, R для работы со статистическими данными, C для быстрого запуска и выполнения функций и язык программирования общего назначения, например, Python, чтобы соединить все это воедино.

          Главной целью Julia стало объединить в одно легкость использования и продуктивность от Python с математическими возможностями Matlab и производительностью C. Julia поддерживает параллельные и распределенные вычисления, а также Lisp-подобные макросы.

          Какие есть плюсы?

          Julia станет отличным выбором, если вы являетесь аналитиком данных и вам приходится работать с большими базами данных. Синтаксис этого языка очень похож на Python, так что если вы знакомы с Python, то у вас не возникнет сложностей с изучением Julia. Есть и дополнительные функции, тем более что при необходимости вы всегда можете воспользоваться библиотеками от Fortran и C. Кроме того, есть встроенный диспетчер пакетов для установки дополнительных функций и внешних библиотек.

          Какие есть минусы?

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

          Кроме того, Staffjoy – одна из первых компаний, которая начала активно использовать данный язык программирования – заявила, что прекратила работу на Julia в связи с недостаточной поддержкой данного языка.

          Hack

          PHP является одним из наиболее широко используемых языков программирования, но даже его самые ярые фанаты вряд ли смогут с максимальной уверенностью заявить, что PHP идеален и не требует никакой доработки. Hack является PHP-совместимым языком программирования для HHVM, который добавляет функциональность стандартному PHP (хоть PHP 7 старается тоже не отставать).

          Какие есть плюсы?

          Если вы работаете с PHP, то переход на Hack позволит вам значительно ускорить разработку и сделает ваш код более надежным и масштабируемым. Большая часть Facebook написана на PHP, поэтому они заинтересованы в его развитии и укреплении.

          Какие есть минусы?

          Если вас устраивает новая версия PHP, то нет особого смысла переходить на Hack. Кроме того, в отличие от PHP, Hack не может быть встроен в HTML-код, поэтому многие простые проекты будет сложнее реализовать с помощью этого нового языка.

          Какие компании используют?

          Wikipedia, Facebook, Box.

          TypeScript

          Цель создания TypeScript очень схожа с историей возникновения Hack. Только вместо того, чтобы улучшать PHP, компания Microsoft решила добавить функциональность языку JavaScript. TypeScript, как и многие другие проекты Microsoft, запущенные в последнее время, является бесплатным и может похвастаться открытым кодом.

          В то время как Hack является отдельным от PHP языком, TypeScript все же представляет собой полностью совместимое подмножество JavaScript.

          TypeScript-код компилируется в JavaScript. Он добавляет к JavaScript внешние библиотеки, модули и классы, поддерживает статическую типизацию и может использоваться для разработки клиент-серверного приложения.

          Какие есть плюсы?

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

          Какие есть минусы?

          Будучи надстройкой, TypeScript не ставит своей целью исправить какие-то недочеты JavaScript или облегчить написание кода на этом языке. По этой причине можно предпочесть CoffeeScript, главной целью создания которого было облегчить переход к работе с JavaScript тем, кто раньше писал на Python или Ruby.

          Какие компании используют?

          Bet365, Kaggle, группа компаний eBay.

          Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им

          Как устроен функциональный диалект Лиспа Clojure и почему использующие его пр. главное изображение

          Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.

          • Дмитрий Сотников, University Health Network: Мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель
          • Михаил Клишин, VMware: Clojure — это Porsche мира языков программирования
          • Николай Рыжиков, Health-Samurai: Clojure — это венец динамических языков
          • Анализ рынка Clojure-специалистов

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

          (ns clojure.examples.hello (:gen-class)) ;; Этот код выводит на экран фразу "Hello World" (defn example [] (println "Hello World")) (example) 

          Название языка Clojure созвучно слову «closure» – «замыкание», которое в абстрактной математике обозначает множества, замкнутые на самих себя. При этом язык Clojure не полностью функциональный — в нем есть и поддержка функций с побочным эффектом, например, функции ввода и вывода. Однако они не имеют своего состояния и служат, как правило, только для взаимодействия алгоритма с внешним миром.

          Дмитрий Сотников, University Health Network: Мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель

          Дмитрий Сотников

          Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?

          Я начал программировать очень много лет назад — мой первый язык был Basic, потом были C++, C. Основные первые работы были на Java, делал backend Application. За всё это время я смотрел разные языки, в том числе даже работал с JS, потому что начал изучать системы фронтенда.

          Оказалось, что многие языки имеют проблемы с координацией, когда речь начинает идти о многопоточности и мультипроцессинге — не ясно, как они должны работать, чтобы не было постоянных race condition.

          Тогда меня заинтересовало, какие существуют подходы к решению проблемы многопоточности. Начал смотреть на функциональные языки — первый язык, с которым я работал, был Haskell. Я месяцев шесть его использовал — мне очень понравилось, у него совершенно другой подход к тому, как строить программы, как работает стейт-менеджмент. Но потом я понял, что найти работу хаскелистом достаточно сложно — все-таки это маленький рынок, поэтому я выбрал другой функциональный язык — Scala.

          Со Scala тоже возникли сложности — я заметил, что большую часть кода писал как на Java, ведь он сочетает в себе возможности функционального и объектно-ориентированного программирования — на Scala тоже есть объекты, и там можно делать гибридный код. И, даже не осознавая этого, начинаешь делать то, к чему привык. При этом лет 12 назад в Scala все процессы были еще не налажены, поэтому я начал подбирать другой язык программирования — и выбрал Clojure.

          Мне сразу понравилось, что Clojure — совершенно другой язык по сравнению с уже традиционными языками разработки, которые мы используем и к которым давно привыкли. Clojure довольно интерактивный язык — в нем есть возможность написать функцию и сразу из редактора запустить её и посмотреть, как она работает, проверить её.

          Несмотря на отличия, к Clojure нужно привыкнуть — тогда можно понять, что этот язык достаточно простой и маленький. Когда я работал со Scala, приходилось что-то постоянно гуглить, искать на Stack Overflow — смотреть, как можно решить ту или иную задачу, выбирать между разными подходами. В Clojure всё работает намного проще и все подходы к решению задачи в общем похожи друг на друга — все, кто работают с Clojure, делают алгоритмы в более или менее одинаковом стиле.

          Clojure очень легко читать, если ты уже выучил язык, плюс всегда можно поиграть с кодом, который пишешь — посмотреть, что он делает, поменять его. Это очень помогает изучать язык — например, в Java после написания программы постоянно приходится заниматься дебагом, это снижает мотивацию и может вообще уничтожить желание работать именно с языком. А когда можно постоянно взаимодействовать и коммуницировать с кодом во время написания — как будто бы разговаривать, как это и происходит в Clojure, — становится намного интереснее.

          Какие есть особенности у Clojure? Какие очевидные плюсы и минусы у этого языка?

          Плюсы Clojure

          Самый большой плюс Clojure в его функциональности и неизменяемости функций. Ты точно знаешь, что функция выполняет, и что нет никаких изменений, которые она за собой тянет. Поэтому когда смотришь код большого проекта, можно просто взять его кусок и точно знать, что он делает и что выполняет. При этом не обязательно знать, что делает окружающий его код. В традиционных же языках созданный код меняет другой код, поэтому всегда нужно понимать, как части программы взаимодействуют друг с другом, за что отвечают те или иные куски кода и как все устроено внутри алгоритмов. Именно поэтому в Java постоянно используют дебагер — ведь всю программу в голове держать невозможно, но нужно всё контролировать и прогнозировать все возможные изменения в коде после того, как разработчик решит поменять какую-нибудь строчку.

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

          Ещё из плюсов — в Clojure можно использовать любые библиотеки из Java и JavaScript. Это огромный плюс языка — сам по себе он достаточно маленький и людей на нем работает не очень много. Поэтому отлично, что можно использовать сторонние системы.

          Мы работали и с Java, и с Clojure, но пришли к выводу, что одни и те же проекты на Clojure создаются намного быстрее. Нужно меньше кода, чтобы создать программу, он будет быстрее работать, а разработчик только решает проблему через язык программирования. А не как у JS или Java, где приходится много работать именно со структурой языка, а не с решением проблемы.

          В программах, которые сделаны на Clojure, меньше багов. Когда ты приходишь в проект, где работают с Clojure, разбираться с кодом намного проще. В этом Clojure выигрывает у многих языков — особенно в работе с большими системами данных.

          Минусы Clojure

          Clojure достаточно сильно отличается от популярных языков разработки, к нему нужно привыкнуть, к его подходу. Ещё Clojure в некоторых местах немного медленнее, чем другие языки. Обычно это не проблема, но если у вас мало ресурсов, то лучше использовать что-то другое.

          Другой минус — Clojure компилируется только на JVM или JS. Если эти платформы подходят к вашему проекту, то всё идеально, если нет — придется выбрать другой язык.

          Clojure — динамический язык. Дело вкуса, но если вам не очень близок такой подход, и вы любите, например, делать статические переменные, то тоже лучше поискать что-то ещё.

          Как устроено коммьюнити вокруг Clojure?

          Коммьюнити в Clojure очень активное — например, у нас в Торонто недавно была большая конференция Clojure/north, которую мы делали, и в ней принимали участие программисты из абсолютно разных частей света — из Финляндии, США, Великобритании и даже Индии. Ну и есть, конечно, российские компании, которые используют Clojure.

          При этом нужно понимать, что Clojure — нишевый язык, поэтому количество людей, которые его используют, никогда не сравнится с JS или Java. Но из языков поменьше, Clojure — один из самых востребованных, особенно из функциональных языков. Поэтому его используют многие компании, даже корпорации , включая Apple или Amazon.

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

          Другая важная новость — компанию Congitect создателя Clojure Ричарда Хикки, которая занималась поддержкой и развитием языка, купила большая финансовая корпорация Nubank из Бразилии — она активно использует Clojure. Поэтому теперь язык будет ещё стабильнее и быстрее развиваться.

          Существует ли спрос на программистов, которые используют Clojure? В сочетании с какими языками?

          Обычно ищут разработчиков, которые уже знают JS или Java — все-таки Clojure использует инструменты и системы этих языков. И если человек знает уже платформу, то ему, конечно, будет легче.

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

          Выучить Clojure просто для людей, которые только начали программировать — с опытом до двух лет, либо уже опытным инженерам, которые программируют много лет. А в среднем — разработчикам, которые программируют от двух до пяти лет — обычно труднее всего. Когда разработчики делают всё по одному сценарию, а потом им говорят — можно задачу совсем иным подходом, — обычно человеку бывает сложно перестроиться. И тут дело именно в опыте разработки — он уже есть, но ещё не накопился до той критической массы, когда у программиста меняется подход к изучению нового.

          Какие проекты лучше всего реализовывать на Clojure?

          Clojure подходит для фуллстек-разработки, как и JS. Только Clojure будет намного более функциональнее. Да, существует Node.Js, но это достаточно медленный инструмент, который в скорости работы точно уступает Clojure.

          Clojure лучше всего работает для финансового рынка, дата-аналитики, машинного обучения — сфер, где основной фокус делается на данных, которые нужно быстро обрабатывать.

          Однако для веб и фронтенда Clojure тоже отлично работает, даже через собственные библиотеки, построенные на React. Знаю примеры, когда разработчики даже делали игры на Clojure — точнее, на нём делалась логика игры, все остальное, конечно, писалось в Unity.

          Будет ли Clojure востребован в будущем?

          Не думаю, что Clojure будет быстро расти или когда-нибудь заменит Java или JS. Но язык будут точно использовать компании, которые хотят построить большие и сложные системы, которые при этом не должны ломаться.

          Михаил Клишин, VMware: Clojure — это Porsche мира языков программирования

          Михаил Клишин

          Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?

          Для начала я хотел бы прояснить, что активно использовал Clojure несколько лет — с 2011 по 2015 года. С тех пор лишь поддерживаю с десяток своих open source библиотек в той степени, в которой позволяет время.

          Clojure для меня даже не был первым Lisp-ом, первым был Emacs Lisp. Изучать Clojure как первый язык имеет смысл, только если ваша работа как-то будет связана с данными. Если вы хотите разрабатывать интерфейсы, конечно, можно начать с ClojureScript, но куда практичнее будет JavaScript или TypeScript.

          Программисту, который работает с другими языками, более распространенными, полезно освоить Clojure для профессионального роста?

          Это достаточно уникальный язык даже через 10 лет после релиза. За это время произошел маленький Кембрийский взрыв в количестве используемых в индустрии языков. Почти каждую главную особенность Clojure — immutability, code-as-data, подход к полиморфизму и симбиоз с другими языками теперь можно найти где-то ещё. Но мало где их можно найти именно в такой комбинации, и особенно на платформах вроде JVM, Node и .NET.

          Как именно Clojure помогает прокачаться разработчику, за счёт чего это происходит?

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

          После знакомства с Clojure вы перестанете думать, что это — единственный возможный вариант, и станете искать более простые решения во всём.

          Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?

          Плюсы

          Immutability (очень важная вещь для языка, ориентированного на concurrency, на мой взгляд), отличная стандартная библиотека для работы с коллекциями. «Расширяемый» полиморфизм. Метапрограммирование может быть полезно, а может быть и нет.

          Именно из-за минималистичности у Clojure несколько портов под разные рантаймы, и они действительно поддерживаются и используются.

          Язык невозможно оценивать без какого-то мнения о его сообществе. Мне Clojure-сообщество нравится относительной зрелостью и отсутствием гонок за модой. Моим самым старым Clojure библиотекам 9 лет и я могу вспомнить лишь один раз, когда мне приходилось тратить время из-за изменений в языке. Backwards compatibility здесь одна из лучших в индустрии, и это опять же следствие компактности языка.

          Минусы

          Это нишевый и необычно выглядящий язык. Из-за этого некоторые люди и команды даже не рассматривают его. Это сужает количество потенциальных пользователей.

          Компилятор Clojure иногда выдает совершенно неочевидные для новичков ошибки. Иногда это раздражает и опытных пользователей.

          Лично на мой взгляд, многие ключевые люди в Clojure core team совершенно не ценят качество документации, а процесс контрибуций много лет требовал отправки бумажной почты (. ) в Durham, NC. За последние годы в этих вещах произошел сдвиг, но некоторые люди в сообществе выгорели в процессе борьбы за эти изменения и покинули его.

          Компиляция в Clojure происходит при запуске приложения, что на JVM делает время старта очень печальным. Это решаемо, но делает Clojure менее конкурентноспособным для ряда задач.

          Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Haskell?

          У меня за плечами пять-шесть функциональных языка за последние десять лет. Где-то в 2011 году у меня за плечами было года полтора использования Scala, до этого — несколько лет Java, Ruby. Мне хотелось что-то объединяющее Java и Ruby, но экосистема Scala на тот момент была на стадии становления с жуткими growing pains. Так, например, при выходе новой версии в 2011 году надо было ждать рекомпиляции по сути всей экосистемы, потому что изменения в компиляторе были почти всегда обратно-несовместимыми (binary incompatible).

          На все эти адаптации тратилось большое количество времени. Clojure, как я упоминал выше, является полной противоположностью в этом смысле. Поэтому я решил попробовать его и остался очень доволен. Справедливости ради отметим, что тех пор в Scala многое поменялось, но история с обратной совместимостью по-прежнему далека от идеала.

          Haskell — это отдельная вселенная, в то время как Clojure живет на платформах, которые очень широко распространены (JVM, Node, .NET). Сообщество и кривая изучения у Haskell совсем другие. Не сомневаюсь, что Haskell способен расширить горизонты не меньше, но Clojure мне кажется более практичным вариантом.

          Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики? Подробно разобрали, как устроен чистый функциональный язык программирования и отличиях этой парадигмы разработки от других.

          Последние годы я в основном работаю с Erlang и Elixir. Это тоже небольшие функциональные языки с immutable data structures и своим подходом к concurrency. Elixir многое почерпнул у Clojure. Например, первый автор Mix — в прошлом один из ключевых авторов Leiningen. Если бы не отдельный runtime и экосистема, Elixir был бы очень сильным конкурентом Clojure по всем фронтам, и с куда более открытым автором и сообществом.

          Если бы .NET Core существовал в текущем виде в 2011 году, я бы, наверное, выбрал F#: в нем есть почти все, что я люблю в Clojure, плюс статическая типизация и полезные сообщения об ошибках от компилятора.

          Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Clojure?

          Мне Clojure кажется отличным вариантом для работы с данными, (микро)сервисами, где важна concurrency, или проблему хорошо решил бы DSL. Не уверен, что для UI-приложений рассмотрел бы ClojureScript: в этой сфере очень много альтернатив с огромными сообществами.

          Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?

          Сразу оговорюсь: я очень плохо представляю себе реалии спроса на навыки и найма инженеров на территории бывшего СССР. Все рассуждения ниже — в контексте мирового рынка.

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

          Будет ли Clojure востребован в будущем?

          Здесь уместно вставить XKCD про Lisp 😉 Люди каждые десятилетия открывают для себя диалект Lisp-а. Этому семейству языков более 50 лет, и Clojure является очень практичным и современным вариантом. Думаю, и язык, и нишевый спрос, останутся. Clojure — это Porsche мира языков программирования в том смысле, что это вряд ли будет вашим единственным рабочим языком. Но в правильной команде и с подходящим use case-ом он может дать отличный результат.

          Николай Рыжиков, Health-Samurai: Clojure — это венец динамических языков

          Николай Рыжиков

          Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?

          Я уже был полиглотом — Visual Basic, PHP, JS, Ruby, Java, C#, когда познакомился с Clojure. Конечно, Clojure хорош как первый язык, но вместе с ним все-таки придется разобраться и с Java, и с JavaScript.

          Изучение Clojure позволит разработчику выйти на новый уровень, глубже понять программирование?

          По моему мнению, Clojure — это венец динамических языков. Ричард Хикки создал Clojure с третьего раза в профессионально-сознательном возрасте. Clojure отличается простым концептуальным дизайном и этому стоит поучиться.

          Как именно Clojure помогает прокачаться, за счёт чего это происходит?

          Clojure позволяет работать с сутью решаемой проблемы, не отвлекаясь на «ритуалы». REPL и функциональная основа языка взаимодополняют друг друга — вы интерактивно пишете и исполняете простой код, не покидая emacs — и это много стоит!

          Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?

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

          Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Хаскель?

          Хаскель слишком долго компилируется 🙂 Хаскель состоит из двух парадигм — функционального программирования и программирования на типах. Причем вторая часть толще, сложнее и бесполезнее, даже порой вреднее , для большинства задач.

          Какие инструменты или фреймворки языка вы используете?

          В Clojure предпочитают библиотеки фреймворкам. Где-то треть библиотек мы себе разработали сами. Интересный феномен — если в Clojure библиотеку уже не коммитили около года, это не значит, что она мертва. Возможно, она просто закончена и больше нечего добавить.

          Какие проекты лучше всего реализовывать на Clojure?

          Clojure — прагматичный язык общего назначения, на котором прекрасно пишутся бизнесовые back и front, и даже системные вещи, типа баз данных (datomic).

          Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?

          Мы нанимаем на постоянной основе. Речь не идет о программисте на «X» — мы (и другие сознательные конторы) ищем инженеров с «правильным» мышлением, умеющих эффективно, просто и элегантно решать сложные проблемы. А на Clojure это делать приятно и легко.

          Будет ли Clojure востребован в будущем?

          В раскрутку Clojure, в отличии от многих других «корпоративных» языков, никто не вливал много денег. Это крепкое и пассионарное сообщество профессионалов, которое растет естественным образом. Те, кто пришли к нам несколько лет назад, уже внедрили Clojure в production — и это залог будущего для языка. Я не вижу пока никаких признаков заката, скорее стабильный нехайповый рост — и это хорошо для экосистемы.

          Анализ рынка Clojure-специалистов

          По сравнению с разработчиками, которые пишут на JS или Python, спрос на Clojure-программистов намного ниже. Несмотря на это, на HH есть вакансии, где требуются именно инженеры, которые смогут писать на этом языке программирования. На HH на сегодняшний день есть 12 вакансий Clojure-разработчиков, а на «Хабр.Карьере» — 2 вакансии, обе от компании Health Samurai.

          Средняя зарплата Junior Clojure Developer, которую предлагают компании, составляет от 70 тыс. до 150 тыс. рублей. При этом в Health Samurai отмечают, что первоначальные знания Clojure не являются обязательными.

          Зарплата

          Вакансии уровня Senior для программиста со знанием Clojure или желанием погрузиться в изучение Лисп-языков, начинаются от 270 тыс. рублей в месяц.

          Зарплата

          На Хекслете сейчас нет курсов изучения Clojure, однако есть отдельный курс по функциональному программированию для JavaScript, вебинар на эту тему от разработчика Никиты Соболева или программиста Александра Гранина, бесплатный курс по языку Racket и небольшой курс по функциональному языку программирования Erlang.

          Документацию к Clojure вы можете посмотреть на официальном сайте языка.

          Кроме того, мы используем Clojure в open source проекте Codebattle, если хотите поучаствовать и попробовать изучить Clojure, то пишите нам .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *