Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.
Clojure — это диалект Лиспа, в котором заложена похожая философия кода как данных — гомоиконичность, а также мощная макросистема. Принципы гомоиконичности позволяют использовать крайне небольшой синтаксис языка Clojure, в котором структура программы похожа на его синтаксис — поэтому для того, чтобы понять структуру программы, нужно просто прочитать текстовую разметку программы. Если прибавить к гомоиконичности и маленькому синтаксису реализацию макросов — инструкций, которые сообщают программе, какие именно действия нужно выполнять — получается достаточно мощный язык программирования.
Название языка 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 вы можете посмотреть на официальном сайте языка.
Кроме того, мы используем Clojure в open source проекте Codebattle, если хотите поучаствовать и попробовать изучить Clojure, то пишите нам.
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 16:55:19 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="2EpX6cSgne4q61OMOPRg94kaYxpx_iHZT25CIeTBEvE3m5zeNt4wjpyodxQ0-5CASRNOsHnJ33vyjth1tsb1nw";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им (Код) | Блог Хекслета</title>
<meta name="description" content="Информационный материал в блоге Хекслета: Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им (категория: Код). Опытные наставники, практика на тренажерах, open-source проекты в портфолио. Индивидуальное и групповое онлайн-обучение в школе Хекслет.">
<link rel="canonical" href="https://ru.hexlet.io/blog/posts/clojure">
<meta property="og:title" content="Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им (Код) | Блог Хекслета">
<meta property="og:description" content="Информационный материал в блоге Хекслета: Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им (категория: Код). Опытные наставники, практика на тренажерах, open-source проекты в портфолио. Индивидуальное и групповое онлайн-обучение в школе Хекслет.">
<meta property="og:image" content="https://ru.hexlet.io/vite/assets/blog_post-7eTyeLLt.webp">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="WR6TV1ao0RyDbOyN5yITa0IIGtNYWNGx-CivwRy25zi2z1hgpNZ8fDUvyBXrLeMcggE3eVBvLxNFyDWVTrEAVg" />
<script src="/vite/assets/inertia-INZxX8jp.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-6pOtQ3OW.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="/vite/assets/blog_post-7eTyeLLt.webp"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--ae9eed98663dd1201759d042a5ba7ca790866156/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-bro.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/blog/posts/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T16:55:19.645Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"faIVEgkXGVv89ijW2jc9RfQUmk1q4aH0bm5pX8ZqKeWSc94l-2m0O0q1DE7WOM0yNB2352LWX1bTjvMLlG3Oiw","post":{"model_name":"BlogPost","category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"creator":{"public_name":"Svet Ivanov","id":288263,"is_tutor":false},"tags":[{"id":887,"slug":"java","name":"Java"},{"id":633,"slug":"javascript","name":"JavaScript"},{"id":1119,"slug":"bez-steka","name":"Без стека"}],"id":1033,"title":"Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им","slug":"clojure","state":"published","summary":"Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.","votes_count":21,"created_at":"2020-10-09T17:50:11.285Z","published_at":"2020-10-09T18:08:44.132Z","body":"**Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.**\n\nClojure — это диалект Лиспа, в котором заложена похожая философия кода как данных — гомоиконичность, а также мощная макросистема. Принципы гомоиконичности позволяют использовать крайне небольшой синтаксис языка Clojure, в котором структура программы похожа на его синтаксис — поэтому для того, чтобы понять структуру программы, нужно просто прочитать текстовую разметку программы. Если прибавить к гомоиконичности и маленькому синтаксису реализацию макросов — инструкций, которые сообщают программе, какие именно действия нужно выполнять — получается достаточно мощный язык программирования.\n\n::programs\n\n``` clojure\n(ns clojure.examples.hello\n (:gen-class))\n\n;; Этот код выводит на экран фразу \"Hello World\"\n(defn example []\n (println \"Hello World\"))\n(example)\n```\nНазвание языка Clojure созвучно слову «closure» – «замыкание», которое в абстрактной математике обозначает множества, замкнутые на самих себя. При этом язык Clojure не полностью функциональный — в нем есть и поддержка функций с побочным эффектом, например, функции ввода и вывода. Однако они не имеют своего состояния и служат, как правило, только для взаимодействия алгоритма с внешним миром.\n\n## Содержание\n\n## Дмитрий Сотников, University Health Network\n\n> Мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель\n\n\n\n**Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?**\n\nЯ начал программировать очень много лет назад — мой первый язык был Basic, потом были C++, C. Основные первые работы были на Java, делал backend Application. За всё это время я смотрел разные языки, в том числе даже работал с JS, потому что начал изучать системы фронтенда.\n\nОказалось, что многие языки имеют проблемы с координацией, когда речь начинает идти о многопоточности и мультипроцессинге — не ясно, как они должны работать, чтобы не было постоянных race condition.\n\nТогда меня заинтересовало, какие существуют подходы к решению проблемы многопоточности. Начал смотреть на функциональные языки — первый язык, с которым я работал, был Haskell. Я месяцев шесть его использовал — мне очень понравилось, у него совершенно другой подход к тому, как строить программы, как работает стейт-менеджмент. Но потом я понял, что найти работу хаскелистом достаточно сложно — все-таки это маленький рынок, поэтому я выбрал другой функциональный язык — Scala.\n\nСо Scala тоже возникли сложности — я заметил, что большую часть кода писал как на Java, ведь он сочетает в себе возможности функционального и объектно-ориентированного программирования — на Scala тоже есть объекты, и там можно делать гибридный код. И, даже не осознавая этого, начинаешь делать то, к чему привык. При этом лет 12 назад в Scala все процессы были еще не налажены, поэтому я начал подбирать другой язык программирования — и выбрал Clojure. \n\n::youtube{id=\"0GX4JRAGEzc\"}\n\nМне сразу понравилось, что Clojure — совершенно другой язык по сравнению с уже традиционными языками разработки, которые мы используем и к которым давно привыкли. Clojure довольно интерактивный язык — в нем есть возможность написать функцию и сразу из редактора запустить её и посмотреть, как она работает, проверить её. \n\nНесмотря на отличия, к Clojure нужно привыкнуть — тогда можно понять, что этот язык достаточно простой и маленький. Когда я работал со Scala, приходилось что-то постоянно гуглить, искать на Stack Overflow — смотреть, как можно решить ту или иную задачу, выбирать между разными подходами. В Clojure всё работает намного проще и все подходы к решению задачи в общем похожи друг на друга — все, кто работают с Clojure, делают алгоритмы в более или менее одинаковом стиле. \n\nClojure очень легко читать, если ты уже выучил язык, плюс всегда можно поиграть с кодом, который пишешь — посмотреть, что он делает, поменять его. Это очень помогает изучать язык — например, в Java после написания программы постоянно приходится заниматься дебагом, это снижает мотивацию и может вообще уничтожить желание работать именно с языком. А когда можно постоянно взаимодействовать и коммуницировать с кодом во время написания — как будто бы разговаривать, как это и происходит в Clojure, — становится намного интереснее.\n\n**Какие есть особенности у Clojure? Какие очевидные плюсы и минусы у этого языка?**\n\n***Плюсы Clojure***\n\nСамый большой плюс Clojure в его функциональности и неизменяемости функций. Ты точно знаешь, что функция выполняет, и что нет никаких изменений, которые она за собой тянет. Поэтому когда смотришь код большого проекта, можно просто взять его кусок и точно знать, что он делает и что выполняет. При этом не обязательно знать, что делает окружающий его код. В традиционных же языках созданный код меняет другой код, поэтому всегда нужно понимать, как части программы взаимодействуют друг с другом, за что отвечают те или иные куски кода и как все устроено внутри алгоритмов. Именно поэтому в Java постоянно используют дебагер — ведь всю программу в голове держать невозможно, но нужно всё контролировать и прогнозировать все возможные изменения в коде после того, как разработчик решит поменять какую-нибудь строчку.\n\nВ Clojure можно просто прочитать код и узнать, что он делает и за что отвечает. И в его работе не будет никаких неизвестных изменений, которые он за собой тянет. Особенно это удобно, когда работаешь в большой команде — сам язык позволяет создавать изоляцию между программистами и один участок кода никак не может испортить другой. \n\nЕщё из плюсов — в Clojure можно использовать любые библиотеки из Java и JavaScript. Это огромный плюс языка — сам по себе он достаточно маленький и людей на нем работает не очень много. Поэтому отлично, что можно использовать сторонние системы.\n\nМы работали и с Java, и с Clojure, но пришли к выводу, что одни и те же проекты на Clojure создаются намного быстрее. Нужно меньше кода, чтобы создать программу, он будет быстрее работать, а разработчик только решает проблему через язык программирования. А не как у JS или Java, где приходится много работать именно со структурой языка, а не с решением проблемы.\n\nВ программах, которые сделаны на Clojure, меньше багов. Когда ты приходишь в проект, где работают с Clojure, разбираться с кодом намного проще. В этом Clojure выигрывает у многих языков — особенно в работе с большими системами данных.\n\n***Минусы Clojure***\n\nClojure достаточно сильно отличается от популярных языков разработки, к нему нужно привыкнуть, к его подходу. Ещё Clojure в некоторых местах немного медленнее, чем другие языки. Обычно это не проблема, но если у вас мало ресурсов, то лучше использовать что-то другое.\n\nДругой минус — Clojure компилируется только на JVM или JS. Если эти платформы подходят к вашему проекту, то всё идеально, если нет — придется выбрать другой язык.\n\nClojure — динамический язык. Дело вкуса, но если вам не очень близок такой подход, и вы любите, например, делать статические переменные, то тоже лучше поискать что-то ещё.\n\n**Как устроено коммьюнити вокруг Clojure?**\n\nКоммьюнити в Clojure очень активное — например, у нас в Торонто недавно была большая конференция Clojure/north, которую мы делали, и в ней принимали участие программисты из абсолютно разных частей света — из Финляндии, США, Великобритании и даже Индии. Ну и есть, конечно, российские компании, которые используют Clojure.\n\nПри этом нужно понимать, что Clojure — нишевый язык, поэтому количество людей, которые его используют, никогда не сравнится с JS или Java. Но из языков поменьше, Clojure — один из самых востребованных, особенно из функциональных языков. Поэтому его используют многие компании, [даже корпорации](https://clojure.org/community/success_stories), включая Apple или Amazon.\n\nЭтот язык привлекает очень опытных людей, что влияет и на коммьюнити, и на всю экосистему вокруг языка. JS привлекает неопытных людей, которые в итоге создают не очень качественные библиотеки — они часто ломаются, потому что собирали их программисты без большого количества опыта. На Clojure, к счастью, всё устроено иначе.\n\nДругая важная новость — компанию Congitect создателя Clojure Ричарда Хикки, которая занималась поддержкой и развитием языка, купила большая финансовая корпорация Nubank из Бразилии — она активно использует Clojure. Поэтому теперь язык будет ещё стабильнее и быстрее развиваться.\n\n**Существует ли спрос на программистов, которые используют Clojure? В сочетании с какими языками?**\n\nОбычно ищут разработчиков, которые уже знают JS или Java — все-таки Clojure использует инструменты и системы этих языков. И если человек знает уже платформу, то ему, конечно, будет легче. \n\nНо вообще все зависит от компании — мы периодически берем студентов из университета, которые вообще не писали коммерческого кода. То есть мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель. Clojure просто учить людям, у которых абсолютно нет опыта в программировании и голова пока не забита разными концепциями. \n\nВыучить Clojure просто для людей, которые только начали программировать — с опытом до двух лет, либо уже опытным инженерам, которые программируют много лет. А в среднем — разработчикам, которые программируют от двух до пяти лет — \nобычно труднее всего. Когда разработчики делают всё по одному сценарию, а потом им говорят — можно задачу совсем иным подходом, — обычно человеку бывает сложно перестроиться. И тут дело именно в опыте разработки — он уже есть, но ещё не накопился до той критической массы, когда у программиста меняется подход к изучению нового.\n\n**Какие проекты лучше всего реализовывать на Clojure?**\n\nClojure подходит для фуллстек-разработки, как и JS. Только Clojure будет намного более функциональнее. Да, существует Node.Js, но это достаточно медленный инструмент, который в скорости работы точно уступает Clojure.\n\nClojure лучше всего работает для финансового рынка, дата-аналитики, машинного обучения — сфер, где основной фокус делается на данных, которые нужно быстро обрабатывать.\n\nОднако для веб и фронтенда Clojure тоже отлично работает, даже через собственные библиотеки, построенные на React. Знаю примеры, когда разработчики даже делали игры на Clojure — точнее, на нём делалась логика игры, все остальное, конечно, писалось в Unity.\n\n**Будет ли Clojure востребован в будущем?**\n\nНе думаю, что Clojure будет быстро расти или когда-нибудь заменит Java или JS. Но язык будут точно использовать компании, которые хотят построить большие и сложные системы, которые при этом не должны ломаться.\n\n## Михаил Клишин, VMware\n\n> Clojure — это Porsche мира языков программирования\n\n\n\n**Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?**\n\nДля начала я хотел бы прояснить, что активно использовал Clojure несколько лет — с 2011 по 2015 года. С тех пор лишь поддерживаю с десяток своих open source библиотек в той степени, в которой позволяет время.\n\nClojure для меня даже не был первым Lisp-ом, первым был Emacs Lisp. Изучать Clojure как первый язык имеет смысл, только если ваша работа как-то будет связана с данными. Если вы хотите разрабатывать интерфейсы, конечно, можно начать с ClojureScript, но куда практичнее будет JavaScript или TypeScript.\n\n**Программисту, который работает с другими языками, более распространенными, полезно освоить Clojure для профессионального роста?**\n\nЭто достаточно уникальный язык даже через 10 лет после релиза. За это время произошел маленький Кембрийский взрыв в количестве используемых в индустрии языков. Почти каждую главную особенность Clojure — immutability, code-as-data, подход к полиморфизму и симбиоз с другими языками теперь можно найти где-то ещё. Но мало где их можно найти именно в такой комбинации, и особенно на платформах вроде JVM, Node и .NET.\n\n**Как именно Clojure помогает прокачаться разработчику, за счёт чего это происходит?**\n\nClojure, философия её автора и сообщества открывают глаза на то, что очень маленький набор базовых концепций полностью достаточен для решения огромного количества задач. В мире хватает языков программирования, где кардинально больше концепций, и каждые несколько лет добавляются новые, а старые редко удаляются или пересматриваются. Некоторые языки так набиты фичами и частными случаями, что даже опытные люди и авторы языка по-настоящему понимают и используют лишь какую-то его часть.\n\nПосле знакомства с Clojure вы перестанете думать, что это — единственный возможный вариант, и станете искать более простые решения во всём.\n\n**Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?**\n\n***Плюсы***\n\nImmutability (очень важная вещь для языка, ориентированного на concurrency, на мой взгляд), отличная стандартная библиотека для работы с коллекциями. «Расширяемый» полиморфизм. Метапрограммирование может быть полезно, а может быть и нет.\n\nИменно из-за минималистичности у Clojure несколько портов под разные рантаймы, и они действительно поддерживаются и используются.\n\nЯзык невозможно оценивать без какого-то мнения о его сообществе. Мне Clojure-сообщество нравится относительной зрелостью и отсутствием гонок за модой. Моим самым старым Clojure библиотекам 9 лет и я могу вспомнить лишь один раз, когда мне приходилось тратить время из-за изменений в языке. Backwards compatibility здесь одна из лучших в индустрии, и это опять же следствие компактности языка.\n\n***Минусы***\n\nЭто нишевый и необычно выглядящий язык. Из-за этого некоторые люди и команды даже не рассматривают его. Это сужает количество потенциальных пользователей.\n\nКомпилятор Clojure иногда выдает совершенно неочевидные для новичков ошибки. Иногда это раздражает и опытных пользователей.\n\nЛично на мой взгляд, многие ключевые люди в Clojure core team совершенно не ценят качество документации, а процесс контрибуций много лет требовал отправки бумажной почты (!!!) в Durham, NC. За последние годы в этих вещах произошел сдвиг, но некоторые люди в сообществе выгорели в процессе борьбы за эти изменения и покинули его.\n\n::youtube{id=\"S48PZxLwVSM\"}\n\nКомпиляция в Clojure происходит при запуске приложения, что на JVM делает время старта очень печальным. Это решаемо, но делает Clojure менее конкурентноспособным для ряда задач.\n\n**Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Haskell?**\n\nУ меня за плечами пять-шесть функциональных языка за последние десять лет. Где-то в 2011 году у меня за плечами было года полтора использования Scala, до этого — несколько лет Java, Ruby. Мне хотелось что-то объединяющее Java и Ruby, но экосистема Scala на тот момент была на стадии становления с жуткими growing pains. Так, например, при выходе новой версии в 2011 году надо было ждать рекомпиляции по сути всей экосистемы, потому что изменения в компиляторе были почти всегда обратно-несовместимыми (binary incompatible).\n\nНа все эти адаптации тратилось большое количество времени. Clojure, как я упоминал выше, является полной противоположностью в этом смысле. Поэтому я решил попробовать его и остался очень доволен. Справедливости ради отметим, что тех пор в Scala многое поменялось, но история с обратной совместимостью по-прежнему далека от идеала.\n\nHaskell — это отдельная вселенная, в то время как Clojure живет на платформах, которые очень широко распространены (JVM, Node, .NET). Сообщество и кривая изучения у Haskell совсем другие. Не сомневаюсь, что Haskell способен расширить горизонты не меньше, но Clojure мне кажется более практичным вариантом.\n\n\n> ### Haskell — язык, позволяющий глубже понять программирование. \n> Как он устроен и почему его выбирают разработчики? Подробно [разобрали](https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki), как устроен чистый функциональный язык программирования и отличиях этой парадигмы разработки от других.\n\nПоследние годы я в основном работаю с Erlang и Elixir. Это тоже небольшие функциональные языки с immutable data structures и своим подходом к concurrency. Elixir многое почерпнул у Clojure. Например, первый автор Mix — в прошлом один из ключевых авторов Leiningen. Если бы не отдельный runtime и экосистема, Elixir был бы очень сильным конкурентом Clojure по всем фронтам, и с куда более открытым автором и сообществом.\n\nЕсли бы .NET Core существовал в текущем виде в 2011 году, я бы, наверное, выбрал F#: в нем есть почти все, что я люблю в Clojure, плюс статическая типизация и полезные сообщения об ошибках от компилятора.\n\n**Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Clojure?**\n\nМне Clojure кажется отличным вариантом для работы с данными, (микро)сервисами, где важна concurrency, или проблему хорошо решил бы DSL. Не уверен, что для UI-приложений рассмотрел бы ClojureScript: в этой сфере очень много альтернатив с огромными сообществами.\n\n**Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?**\n\nСразу оговорюсь: я очень плохо представляю себе реалии спроса на навыки и найма инженеров на территории бывшего СССР. Все рассуждения ниже — в контексте мирового рынка.\n\nНа любой нишевый язык спрос не так велик, но иногда предложение даже меньше. На сегодняшний день Clojure в больших компаниях уже не удивителен, но основной спрос скорее со стороны стартапов. Масштабы спроса оценить не берусь, но знаю людей, которые хотели работать в основном с Clojure и довольно быстро к этому пришли. В индустрии определенно есть спрос на людей, открытых новым идеям и владеющих разными языками, и опыт с Clojure определенно будет плюсом с этой точки зрения.\n\n**Будет ли Clojure востребован в будущем?**\n\nЗдесь уместно вставить XKCD про Lisp ;) Люди каждые десятилетия открывают для себя диалект Lisp-а. Этому семейству языков более 50 лет, и Clojure является очень практичным и современным вариантом. Думаю, и язык, и нишевый спрос, останутся. Clojure — это Porsche мира языков программирования в том смысле, что это вряд ли будет вашим единственным рабочим языком. Но в правильной команде и с подходящим use case-ом он может дать отличный результат.\n\n## Николай Рыжиков, Health-Samurai\n\n> Clojure — это венец динамических языков\n\n\n\n**Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?**\n\nЯ уже был полиглотом — Visual Basic, PHP, JS, Ruby, Java, C#, когда познакомился с Clojure. Конечно, Clojure хорош как первый язык, но вместе с ним все-таки придется разобраться и с Java, и с JavaScript.\n\n**Изучение Clojure позволит разработчику выйти на новый уровень, глубже понять программирование?**\n\nПо моему мнению, Clojure — это венец динамических языков. Ричард Хикки создал Clojure с третьего раза в профессионально-сознательном возрасте. Clojure отличается простым концептуальным дизайном и этому стоит поучиться.\n\n**Как именно Clojure помогает прокачаться, за счёт чего это происходит?**\n\nClojure позволяет работать с сутью решаемой проблемы, не отвлекаясь на «ритуалы». REPL и функциональная основа языка взаимодополняют друг друга — вы интерактивно пишете и исполняете простой код, не покидая emacs — и это много стоит!\n\n**Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?**\n\nClojure рассчитан на [профессионалов](https://www.youtube.com/watch?v=MCZ3YgeEUPg), понимающих, что и зачем они делают. Не стоит ожидать, что вас поведут за ручку добрые фреймворки — придется думать своей головой.\n\n**Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Хаскель?**\n\nХаскель слишком долго компилируется :) Хаскель состоит из двух парадигм — функционального программирования и программирования на типах. Причем вторая часть толще, сложнее и бесполезнее, [даже порой вреднее](https://www.youtube.com/watch?v=b-Eq4YV4uwc), для большинства задач.\n\n**Какие инструменты или фреймворки языка вы используете?**\n\nВ Clojure предпочитают библиотеки фреймворкам. Где-то треть библиотек мы себе разработали сами. Интересный феномен — если в Clojure библиотеку уже не коммитили около года, это не значит, что она мертва. Возможно, она просто закончена и больше нечего добавить.\n\n**Какие проекты лучше всего реализовывать на Clojure?**\n\nClojure — прагматичный язык общего назначения, на котором прекрасно пишутся бизнесовые back и front, и даже системные вещи, типа баз данных (datomic).\n\n**Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?**\n\nМы нанимаем на постоянной основе. Речь не идет о программисте на «X» — мы (и другие сознательные конторы) ищем инженеров с «правильным» мышлением, умеющих эффективно, просто и элегантно решать сложные проблемы. А на Clojure это делать приятно и легко.\n\n**Будет ли Clojure востребован в будущем?**\n\nВ раскрутку Clojure, в отличии от многих других «корпоративных» языков, никто не вливал много денег. Это крепкое и пассионарное сообщество профессионалов, которое растет естественным образом. Те, кто пришли к нам несколько лет назад, уже внедрили Clojure в production — и это залог будущего для языка. Я не вижу пока никаких признаков заката, скорее стабильный нехайповый рост — и это хорошо для экосистемы.\n\n::posts\n\n## Анализ рынка Clojure-специалистов\n\nПо сравнению с разработчиками, которые пишут на JS или Python, спрос на Clojure-программистов намного ниже. Несмотря на это, на HH есть вакансии, где требуются именно инженеры, которые смогут писать на этом языке программирования. На HH на сегодняшний день есть 12 вакансий Clojure-разработчиков, а на «Хабр.Карьере» — 2 вакансии, обе от компании Health Samurai.\n\nСредняя зарплата Junior Clojure Developer, которую предлагают компании, составляет от 70 тыс. до 150 тыс. рублей. При этом в Health Samurai отмечают, что первоначальные знания Clojure не являются обязательными.\n\n\n\nВакансии уровня Senior для программиста со знанием Clojure или желанием погрузиться в изучение Лисп-языков, начинаются от 270 тыс. рублей в месяц.\n\n\n\n___________________________\n\nДокументацию к Clojure вы можете [посмотреть](https://clojure.org/guides/weird_characters) на официальном сайте языка. \n\n_Кроме того, мы используем Clojure в open source проекте Codebattle, если хотите поучаствовать и попробовать изучить Clojure, то [пишите нам](https://github.com/hexlet-codebattle/battle_asserts)._","reading_time":12,"url":"https://ru.hexlet.io/blog/posts/clojure","cover_thumb_variant":null,"cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp","cover_main_variant":"/vite/assets/blog_post-7eTyeLLt.webp","related_stacks_count":5},"relatedPosts":[{"model_name":"BlogPost","id":926,"title":"Библиотека React: особенности, перспективы, ситуация на рынке труда","slug":"biblioteka-react-review-article","summary":"В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда работодатели ожидают знания React не только от фронтендеров, но и от бэкенд-разработчиков. Почему эта библиотека настолько популярная, стоит ли изучать её сегодня, каковы её перспективы по мнению опытных программистов? Ответы на эти и другие вопросы читайте в обзорной статье.","created_at":"2020-07-08T15:15:00.191Z","published_at":"2024-02-29T07:46:44.876Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png"},{"model_name":"BlogPost","id":416,"title":"Язык программирования JavaScript: где его используют и почему он популярен","slug":"stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov","summary":"Рассказываем, что это за язык программирования — JavaScript, где его используют, насколько он популярен и с чего начать изучение JavaScript.","created_at":"2019-07-26T08:17:06.287Z","published_at":"2023-10-04T08:41:58.734Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMywicHVyIjoiYmxvYl9pZCJ9fQ==--aa69869c906a992728ba7c26886fa1b715024424/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%8F%D0%B7%D1%8B%D0%BA%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8Fjavascript-01.png"},{"model_name":"BlogPost","id":480,"title":"Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят","slug":"zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript","summary":"Рассказываем, как устроен бэкенд на JavaScript, стоит ли изучать Node.js, когда есть PHP и Python, какое будущее у этой технологии и сколько платят программистам на Node.js.","created_at":"2019-09-27T08:33:36.150Z","published_at":"2023-07-28T13:31:55.753Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MywicHVyIjoiYmxvYl9pZCJ9fQ==--8e5dd13a34bb6d61f1c0db87a25e6e64d0e237fb/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/node%20_new-01.png"}],"category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"mainStackCategory":{"id":12,"name":"Курсы по JavaScript","slug":"javascript","short_name":"JavaScript","order":71,"state":"published","category_slug":"courses_javascript"},"categories":[{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},{"id":3,"name":"Истории успеха","slug":"success","state":"published","created_at":"2016-07-30T12:57:18.308Z"},{"id":14,"name":"Дневник студента","slug":"student-diary","state":"published","created_at":"2019-02-25T13:27:09.471Z"},{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},{"id":12,"name":"Карьера","slug":"career","state":"published","created_at":"2017-07-21T15:42:21.481Z"}],"relatedLandings":[{"stack":{"id":20,"slug":"js-sicp","title":"СИКП на JS","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4050,"duration_in_months":1},"id":28,"slug":"js-sicp","title":"СИКП на JS","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Навык фундаментального программирования","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"js-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"},{"stack":{"id":36,"slug":"java-sicp","title":"СИКП на Java","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4100,"duration_in_months":1},"id":60,"slug":"java-sicp","title":"СИКП на Java","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Java","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"java-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"},{"stack":{"id":37,"slug":"python-sicp","title":"СИКП на Python","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4150,"duration_in_months":1},"id":62,"slug":"python-sicp","title":"СИКП на Python","subtitle":"Навык понимать код на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите Python на глубоком уровне для решения сложных задач","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"python-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"},{"stack":{"id":35,"slug":"ruby-sicp","title":"СИКП на Ruby","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":null,"duration_in_months":1},"id":58,"slug":"ruby-sicp","title":"СИКП на Ruby","subtitle":"Навык понимания программ на фундаментальном уровне, помогающий уверенно проходить собеседования и увеличивать доход","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Ruby ","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"ruby-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"},{"stack":{"id":34,"slug":"algorithms","title":"Алгоритмы и структуры данных","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4000,"duration_in_months":2},"id":56,"slug":"algorithms","title":"Алгоритмы и структуры данных","subtitle":"Навык, который увеличит ваши шансы пройти алгоритмическое интервью в международные компании на 80%","subtitle_for_lists":"Алгоритмы для собеседований","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"algorithms","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--ae9eed98663dd1201759d042a5ba7ca790866156/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-bro.png"}]},"url":"/blog/posts/clojure","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":"Svet Ivanov","name":"Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им","datePublished":"2020-10-09T18:08:44.132Z","headline":"Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.","image":"/vite/assets/blog_post-7eTyeLLt.webp","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":21}]}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/blog","name":"Блог Хекслета"}},{"position":2,"@type":"ListItem","item":{"@id":"/blog/categories/code","name":"Код"}},{"position":3,"@type":"ListItem","item":{"@id":"/blog/posts/clojure","name":"Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog">Блог Хекслета</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog/categories/code">Код</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им</h1></div></div></div><div style="position:absolute;top:calc(18.75rem * var(--mantine-scale))" class=""></div><style data-mantine-styles="inline">.__m__-_R_2iub_{--grid-gutter:var(--mantine-spacing-xl);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_2iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_dmiub_"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;margin-bottom:var(--mantine-spacing-xl)" class="m_6d731127 mantine-Stack-root"><div class=""><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl)" class="m_4081bf90 mantine-Group-root"><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Java"><span class="m_5add502a mantine-Badge-label">Java</span></button><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="JavaScript"><span class="m_5add502a mantine-Badge-label">JavaScript</span></button><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Без стека"><span class="m_5add502a mantine-Badge-label">Без стека</span></button></div><div style="--group-gap:calc(0.625rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-sm);color:var(--mantine-color-gray-text)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-end:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root">9 октября 2020 г.</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-clock "><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 7v5l3 3"></path></svg></div>12 минут</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div>21</div></div><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img style="--image-radius:var(--mantine-radius-md);--image-object-fit:cover;width:100%;height:100%" class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" alt="Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им"/></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6))" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><div style="margin-bottom:var(--mantine-spacing-xl)" class="m_d08caa0 mantine-Typography-root"><p><strong>Clojure — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме. Сам язык с динамической системой типов поощряет функциональное программирование и упрощает поддержку многопоточности, а благодаря своей структуре может запускаться на платформах Java и JavaScript. При этом на Clojure работают уже, как правило, опытные разработчики, которые осознанно выбрали этот язык для решения своих задач. Мы попросили Clojure-разработчиков рассказать о том, как устроен этот язык программирования, какие задачи можно решать с его помощью и отличиях от других языков — функциональных, смешанных или императивных.</strong></p>
<p>Clojure — это диалект Лиспа, в котором заложена похожая философия кода как данных — гомоиконичность, а также мощная макросистема. Принципы гомоиконичности позволяют использовать крайне небольшой синтаксис языка Clojure, в котором структура программы похожа на его синтаксис — поэтому для того, чтобы понять структуру программы, нужно просто прочитать текстовую разметку программы. Если прибавить к гомоиконичности и маленькому синтаксису реализацию макросов — инструкций, которые сообщают программе, какие именно действия нужно выполнять — получается достаточно мощный язык программирования.</p>
<style data-mantine-styles="inline">.__m__-_R_5derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_5derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_5derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на JS</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык фундаментального программирования</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png" alt="СИКП на JS" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Java</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="СИКП на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/python-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Python</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите Python на глубоком уровне для решения сложных задач</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png" alt="СИКП на Python" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/ruby-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Ruby</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Ruby </p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png" alt="СИКП на Ruby" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/algorithms?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Алгоритмы и структуры данных</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Алгоритмы для собеседований</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--ae9eed98663dd1201759d042a5ba7ca790866156/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-bro.png" alt="Алгоритмы и структуры данных" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">(ns clojure.examples.hello
(:gen-class))
;; Этот код выводит на экран фразу "Hello World"
(defn example []
(println "Hello World"))
(example)</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Название языка Clojure созвучно слову «closure» – «замыкание», которое в абстрактной математике обозначает множества, замкнутые на самих себя. При этом язык Clojure не полностью функциональный — в нем есть и поддержка функций с побочным эффектом, например, функции ввода и вывода. Однако они не имеют своего состояния и служат, как правило, только для взаимодействия алгоритма с внешним миром.</p>
<h2 id="heading-2-1">Содержание</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-2">Дмитрий Сотников, University Health Network</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-3">Михаил Клишин, VMware</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-5">Николай Рыжиков, Health-Samurai</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-6">Анализ рынка Clojure-специалистов</a></li>
</ul>
<h2 id="heading-2-2">Дмитрий Сотников, University Health Network</h2>
<blockquote>
<p>Мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель</p>
</blockquote>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/eELfB9T.png" alt="Дмитрий Сотников" loading="lazy"/></p>
<p><strong>Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?</strong></p>
<p>Я начал программировать очень много лет назад — мой первый язык был Basic, потом были C++, C. Основные первые работы были на Java, делал backend Application. За всё это время я смотрел разные языки, в том числе даже работал с JS, потому что начал изучать системы фронтенда.</p>
<p>Оказалось, что многие языки имеют проблемы с координацией, когда речь начинает идти о многопоточности и мультипроцессинге — не ясно, как они должны работать, чтобы не было постоянных race condition.</p>
<p>Тогда меня заинтересовало, какие существуют подходы к решению проблемы многопоточности. Начал смотреть на функциональные языки — первый язык, с которым я работал, был Haskell. Я месяцев шесть его использовал — мне очень понравилось, у него совершенно другой подход к тому, как строить программы, как работает стейт-менеджмент. Но потом я понял, что найти работу хаскелистом достаточно сложно — все-таки это маленький рынок, поэтому я выбрал другой функциональный язык — Scala.</p>
<p>Со Scala тоже возникли сложности — я заметил, что большую часть кода писал как на Java, ведь он сочетает в себе возможности функционального и объектно-ориентированного программирования — на Scala тоже есть объекты, и там можно делать гибридный код. И, даже не осознавая этого, начинаешь делать то, к чему привык. При этом лет 12 назад в Scala все процессы были еще не налажены, поэтому я начал подбирать другой язык программирования — и выбрал Clojure.</p>
<div></div>
<p>Мне сразу понравилось, что Clojure — совершенно другой язык по сравнению с уже традиционными языками разработки, которые мы используем и к которым давно привыкли. Clojure довольно интерактивный язык — в нем есть возможность написать функцию и сразу из редактора запустить её и посмотреть, как она работает, проверить её.</p>
<p>Несмотря на отличия, к Clojure нужно привыкнуть — тогда можно понять, что этот язык достаточно простой и маленький. Когда я работал со Scala, приходилось что-то постоянно гуглить, искать на Stack Overflow — смотреть, как можно решить ту или иную задачу, выбирать между разными подходами. В Clojure всё работает намного проще и все подходы к решению задачи в общем похожи друг на друга — все, кто работают с Clojure, делают алгоритмы в более или менее одинаковом стиле.</p>
<p>Clojure очень легко читать, если ты уже выучил язык, плюс всегда можно поиграть с кодом, который пишешь — посмотреть, что он делает, поменять его. Это очень помогает изучать язык — например, в Java после написания программы постоянно приходится заниматься дебагом, это снижает мотивацию и может вообще уничтожить желание работать именно с языком. А когда можно постоянно взаимодействовать и коммуницировать с кодом во время написания — как будто бы разговаривать, как это и происходит в Clojure, — становится намного интереснее.</p>
<p><strong>Какие есть особенности у Clojure? Какие очевидные плюсы и минусы у этого языка?</strong></p>
<p><em><strong>Плюсы Clojure</strong></em></p>
<p>Самый большой плюс Clojure в его функциональности и неизменяемости функций. Ты точно знаешь, что функция выполняет, и что нет никаких изменений, которые она за собой тянет. Поэтому когда смотришь код большого проекта, можно просто взять его кусок и точно знать, что он делает и что выполняет. При этом не обязательно знать, что делает окружающий его код. В традиционных же языках созданный код меняет другой код, поэтому всегда нужно понимать, как части программы взаимодействуют друг с другом, за что отвечают те или иные куски кода и как все устроено внутри алгоритмов. Именно поэтому в Java постоянно используют дебагер — ведь всю программу в голове держать невозможно, но нужно всё контролировать и прогнозировать все возможные изменения в коде после того, как разработчик решит поменять какую-нибудь строчку.</p>
<p>В Clojure можно просто прочитать код и узнать, что он делает и за что отвечает. И в его работе не будет никаких неизвестных изменений, которые он за собой тянет. Особенно это удобно, когда работаешь в большой команде — сам язык позволяет создавать изоляцию между программистами и один участок кода никак не может испортить другой.</p>
<p>Ещё из плюсов — в Clojure можно использовать любые библиотеки из Java и JavaScript. Это огромный плюс языка — сам по себе он достаточно маленький и людей на нем работает не очень много. Поэтому отлично, что можно использовать сторонние системы.</p>
<p>Мы работали и с Java, и с Clojure, но пришли к выводу, что одни и те же проекты на Clojure создаются намного быстрее. Нужно меньше кода, чтобы создать программу, он будет быстрее работать, а разработчик только решает проблему через язык программирования. А не как у JS или Java, где приходится много работать именно со структурой языка, а не с решением проблемы.</p>
<p>В программах, которые сделаны на Clojure, меньше багов. Когда ты приходишь в проект, где работают с Clojure, разбираться с кодом намного проще. В этом Clojure выигрывает у многих языков — особенно в работе с большими системами данных.</p>
<p><em><strong>Минусы Clojure</strong></em></p>
<p>Clojure достаточно сильно отличается от популярных языков разработки, к нему нужно привыкнуть, к его подходу. Ещё Clojure в некоторых местах немного медленнее, чем другие языки. Обычно это не проблема, но если у вас мало ресурсов, то лучше использовать что-то другое.</p>
<p>Другой минус — Clojure компилируется только на JVM или JS. Если эти платформы подходят к вашему проекту, то всё идеально, если нет — придется выбрать другой язык.</p>
<p>Clojure — динамический язык. Дело вкуса, но если вам не очень близок такой подход, и вы любите, например, делать статические переменные, то тоже лучше поискать что-то ещё.</p>
<p><strong>Как устроено коммьюнити вокруг Clojure?</strong></p>
<p>Коммьюнити в Clojure очень активное — например, у нас в Торонто недавно была большая конференция Clojure/north, которую мы делали, и в ней принимали участие программисты из абсолютно разных частей света — из Финляндии, США, Великобритании и даже Индии. Ну и есть, конечно, российские компании, которые используют Clojure.</p>
<p>При этом нужно понимать, что Clojure — нишевый язык, поэтому количество людей, которые его используют, никогда не сравнится с JS или Java. Но из языков поменьше, Clojure — один из самых востребованных, особенно из функциональных языков. Поэтому его используют многие компании, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://clojure.org/community/success_stories" rel="noopener noreferrer" target="_blank">даже корпорации</a>, включая Apple или Amazon.</p>
<p>Этот язык привлекает очень опытных людей, что влияет и на коммьюнити, и на всю экосистему вокруг языка. JS привлекает неопытных людей, которые в итоге создают не очень качественные библиотеки — они часто ломаются, потому что собирали их программисты без большого количества опыта. На Clojure, к счастью, всё устроено иначе.</p>
<p>Другая важная новость — компанию Congitect создателя Clojure Ричарда Хикки, которая занималась поддержкой и развитием языка, купила большая финансовая корпорация Nubank из Бразилии — она активно использует Clojure. Поэтому теперь язык будет ещё стабильнее и быстрее развиваться.</p>
<p><strong>Существует ли спрос на программистов, которые используют Clojure? В сочетании с какими языками?</strong></p>
<p>Обычно ищут разработчиков, которые уже знают JS или Java — все-таки Clojure использует инструменты и системы этих языков. И если человек знает уже платформу, то ему, конечно, будет легче.</p>
<p>Но вообще все зависит от компании — мы периодически берем студентов из университета, которые вообще не писали коммерческого кода. То есть мы можем взять студента и научить его делать что-то полезное на Clojure за пару недель. Clojure просто учить людям, у которых абсолютно нет опыта в программировании и голова пока не забита разными концепциями.</p>
<p>Выучить Clojure просто для людей, которые только начали программировать — с опытом до двух лет, либо уже опытным инженерам, которые программируют много лет. А в среднем — разработчикам, которые программируют от двух до пяти лет —
обычно труднее всего. Когда разработчики делают всё по одному сценарию, а потом им говорят — можно задачу совсем иным подходом, — обычно человеку бывает сложно перестроиться. И тут дело именно в опыте разработки — он уже есть, но ещё не накопился до той критической массы, когда у программиста меняется подход к изучению нового.</p>
<p><strong>Какие проекты лучше всего реализовывать на Clojure?</strong></p>
<p>Clojure подходит для фуллстек-разработки, как и JS. Только Clojure будет намного более функциональнее. Да, существует Node.Js, но это достаточно медленный инструмент, который в скорости работы точно уступает Clojure.</p>
<p>Clojure лучше всего работает для финансового рынка, дата-аналитики, машинного обучения — сфер, где основной фокус делается на данных, которые нужно быстро обрабатывать.</p>
<p>Однако для веб и фронтенда Clojure тоже отлично работает, даже через собственные библиотеки, построенные на React. Знаю примеры, когда разработчики даже делали игры на Clojure — точнее, на нём делалась логика игры, все остальное, конечно, писалось в Unity.</p>
<p><strong>Будет ли Clojure востребован в будущем?</strong></p>
<p>Не думаю, что Clojure будет быстро расти или когда-нибудь заменит Java или JS. Но язык будут точно использовать компании, которые хотят построить большие и сложные системы, которые при этом не должны ломаться.</p>
<h2 id="heading-2-3">Михаил Клишин, VMware</h2>
<blockquote>
<p>Clojure — это Porsche мира языков программирования</p>
</blockquote>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/bYPCL1U.png" alt="Михаил Клишин" loading="lazy"/></p>
<p><strong>Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?</strong></p>
<p>Для начала я хотел бы прояснить, что активно использовал Clojure несколько лет — с 2011 по 2015 года. С тех пор лишь поддерживаю с десяток своих open source библиотек в той степени, в которой позволяет время.</p>
<p>Clojure для меня даже не был первым Lisp-ом, первым был Emacs Lisp. Изучать Clojure как первый язык имеет смысл, только если ваша работа как-то будет связана с данными. Если вы хотите разрабатывать интерфейсы, конечно, можно начать с ClojureScript, но куда практичнее будет JavaScript или TypeScript.</p>
<p><strong>Программисту, который работает с другими языками, более распространенными, полезно освоить Clojure для профессионального роста?</strong></p>
<p>Это достаточно уникальный язык даже через 10 лет после релиза. За это время произошел маленький Кембрийский взрыв в количестве используемых в индустрии языков. Почти каждую главную особенность Clojure — immutability, code-as-data, подход к полиморфизму и симбиоз с другими языками теперь можно найти где-то ещё. Но мало где их можно найти именно в такой комбинации, и особенно на платформах вроде JVM, Node и .NET.</p>
<p><strong>Как именно Clojure помогает прокачаться разработчику, за счёт чего это происходит?</strong></p>
<p>Clojure, философия её автора и сообщества открывают глаза на то, что очень маленький набор базовых концепций полностью достаточен для решения огромного количества задач. В мире хватает языков программирования, где кардинально больше концепций, и каждые несколько лет добавляются новые, а старые редко удаляются или пересматриваются. Некоторые языки так набиты фичами и частными случаями, что даже опытные люди и авторы языка по-настоящему понимают и используют лишь какую-то его часть.</p>
<p>После знакомства с Clojure вы перестанете думать, что это — единственный возможный вариант, и станете искать более простые решения во всём.</p>
<p><strong>Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?</strong></p>
<p><em><strong>Плюсы</strong></em></p>
<p>Immutability (очень важная вещь для языка, ориентированного на concurrency, на мой взгляд), отличная стандартная библиотека для работы с коллекциями. «Расширяемый» полиморфизм. Метапрограммирование может быть полезно, а может быть и нет.</p>
<p>Именно из-за минималистичности у Clojure несколько портов под разные рантаймы, и они действительно поддерживаются и используются.</p>
<p>Язык невозможно оценивать без какого-то мнения о его сообществе. Мне Clojure-сообщество нравится относительной зрелостью и отсутствием гонок за модой. Моим самым старым Clojure библиотекам 9 лет и я могу вспомнить лишь один раз, когда мне приходилось тратить время из-за изменений в языке. Backwards compatibility здесь одна из лучших в индустрии, и это опять же следствие компактности языка.</p>
<p><em><strong>Минусы</strong></em></p>
<p>Это нишевый и необычно выглядящий язык. Из-за этого некоторые люди и команды даже не рассматривают его. Это сужает количество потенциальных пользователей.</p>
<p>Компилятор Clojure иногда выдает совершенно неочевидные для новичков ошибки. Иногда это раздражает и опытных пользователей.</p>
<p>Лично на мой взгляд, многие ключевые люди в Clojure core team совершенно не ценят качество документации, а процесс контрибуций много лет требовал отправки бумажной почты (!!!) в Durham, NC. За последние годы в этих вещах произошел сдвиг, но некоторые люди в сообществе выгорели в процессе борьбы за эти изменения и покинули его.</p>
<div></div>
<p>Компиляция в Clojure происходит при запуске приложения, что на JVM делает время старта очень печальным. Это решаемо, но делает Clojure менее конкурентноспособным для ряда задач.</p>
<p><strong>Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Haskell?</strong></p>
<p>У меня за плечами пять-шесть функциональных языка за последние десять лет. Где-то в 2011 году у меня за плечами было года полтора использования Scala, до этого — несколько лет Java, Ruby. Мне хотелось что-то объединяющее Java и Ruby, но экосистема Scala на тот момент была на стадии становления с жуткими growing pains. Так, например, при выходе новой версии в 2011 году надо было ждать рекомпиляции по сути всей экосистемы, потому что изменения в компиляторе были почти всегда обратно-несовместимыми (binary incompatible).</p>
<p>На все эти адаптации тратилось большое количество времени. Clojure, как я упоминал выше, является полной противоположностью в этом смысле. Поэтому я решил попробовать его и остался очень доволен. Справедливости ради отметим, что тех пор в Scala многое поменялось, но история с обратной совместимостью по-прежнему далека от идеала.</p>
<p>Haskell — это отдельная вселенная, в то время как Clojure живет на платформах, которые очень широко распространены (JVM, Node, .NET). Сообщество и кривая изучения у Haskell совсем другие. Не сомневаюсь, что Haskell способен расширить горизонты не меньше, но Clojure мне кажется более практичным вариантом.</p>
<blockquote>
<h3 id="heading-3-4">Haskell — язык, позволяющий глубже понять программирование.</h3>
<p>Как он устроен и почему его выбирают разработчики? Подробно <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki" rel="noopener noreferrer" target="_blank">разобрали</a>, как устроен чистый функциональный язык программирования и отличиях этой парадигмы разработки от других.</p>
</blockquote>
<p>Последние годы я в основном работаю с Erlang и Elixir. Это тоже небольшие функциональные языки с immutable data structures и своим подходом к concurrency. Elixir многое почерпнул у Clojure. Например, первый автор Mix — в прошлом один из ключевых авторов Leiningen. Если бы не отдельный runtime и экосистема, Elixir был бы очень сильным конкурентом Clojure по всем фронтам, и с куда более открытым автором и сообществом.</p>
<p>Если бы .NET Core существовал в текущем виде в 2011 году, я бы, наверное, выбрал F#: в нем есть почти все, что я люблю в Clojure, плюс статическая типизация и полезные сообщения об ошибках от компилятора.</p>
<p><strong>Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Clojure?</strong></p>
<p>Мне Clojure кажется отличным вариантом для работы с данными, (микро)сервисами, где важна concurrency, или проблему хорошо решил бы DSL. Не уверен, что для UI-приложений рассмотрел бы ClojureScript: в этой сфере очень много альтернатив с огромными сообществами.</p>
<p><strong>Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?</strong></p>
<p>Сразу оговорюсь: я очень плохо представляю себе реалии спроса на навыки и найма инженеров на территории бывшего СССР. Все рассуждения ниже — в контексте мирового рынка.</p>
<p>На любой нишевый язык спрос не так велик, но иногда предложение даже меньше. На сегодняшний день Clojure в больших компаниях уже не удивителен, но основной спрос скорее со стороны стартапов. Масштабы спроса оценить не берусь, но знаю людей, которые хотели работать в основном с Clojure и довольно быстро к этому пришли. В индустрии определенно есть спрос на людей, открытых новым идеям и владеющих разными языками, и опыт с Clojure определенно будет плюсом с этой точки зрения.</p>
<p><strong>Будет ли Clojure востребован в будущем?</strong></p>
<p>Здесь уместно вставить XKCD про Lisp ;) Люди каждые десятилетия открывают для себя диалект Lisp-а. Этому семейству языков более 50 лет, и Clojure является очень практичным и современным вариантом. Думаю, и язык, и нишевый спрос, останутся. Clojure — это Porsche мира языков программирования в том смысле, что это вряд ли будет вашим единственным рабочим языком. Но в правильной команде и с подходящим use case-ом он может дать отличный результат.</p>
<h2 id="heading-2-5">Николай Рыжиков, Health-Samurai</h2>
<blockquote>
<p>Clojure — это венец динамических языков</p>
</blockquote>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/Ei9fpel.png" alt="Николай Рыжиков" loading="lazy"/></p>
<p><strong>Вы изучали Clojure как первый язык или уже были программистом, когда решили его изучить? Есть ли смысл изучать Clojure в качестве первого языка?</strong></p>
<p>Я уже был полиглотом — Visual Basic, PHP, JS, Ruby, Java, C#, когда познакомился с Clojure. Конечно, Clojure хорош как первый язык, но вместе с ним все-таки придется разобраться и с Java, и с JavaScript.</p>
<p><strong>Изучение Clojure позволит разработчику выйти на новый уровень, глубже понять программирование?</strong></p>
<p>По моему мнению, Clojure — это венец динамических языков. Ричард Хикки создал Clojure с третьего раза в профессионально-сознательном возрасте. Clojure отличается простым концептуальным дизайном и этому стоит поучиться.</p>
<p><strong>Как именно Clojure помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Clojure позволяет работать с сутью решаемой проблемы, не отвлекаясь на «ритуалы». REPL и функциональная основа языка взаимодополняют друг друга — вы интерактивно пишете и исполняете простой код, не покидая emacs — и это много стоит!</p>
<p><strong>Какие есть особенности у Clojure? Какие очевидные плюсы и минусы есть у этого языка?</strong></p>
<p>Clojure рассчитан на <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.youtube.com/watch?v=MCZ3YgeEUPg" rel="noopener noreferrer" target="_blank">профессионалов</a>, понимающих, что и зачем они делают. Не стоит ожидать, что вас поведут за ручку добрые фреймворки — придется думать своей головой.</p>
<p><strong>Почему из всех функциональных языков вы выбрали именно Clojure, а не, например, Хаскель?</strong></p>
<p>Хаскель слишком долго компилируется :) Хаскель состоит из двух парадигм — функционального программирования и программирования на типах. Причем вторая часть толще, сложнее и бесполезнее, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.youtube.com/watch?v=b-Eq4YV4uwc" rel="noopener noreferrer" target="_blank">даже порой вреднее</a>, для большинства задач.</p>
<p><strong>Какие инструменты или фреймворки языка вы используете?</strong></p>
<p>В Clojure предпочитают библиотеки фреймворкам. Где-то треть библиотек мы себе разработали сами. Интересный феномен — если в Clojure библиотеку уже не коммитили около года, это не значит, что она мертва. Возможно, она просто закончена и больше нечего добавить.</p>
<p><strong>Какие проекты лучше всего реализовывать на Clojure?</strong></p>
<p>Clojure — прагматичный язык общего назначения, на котором прекрасно пишутся бизнесовые back и front, и даже системные вещи, типа баз данных (datomic).</p>
<p><strong>Есть ли спрос на программистов со знанием Clojure? В сочетании с какими языками и инструментами чаще всего работодатели ищут Clojure-разработчиков?</strong></p>
<p>Мы нанимаем на постоянной основе. Речь не идет о программисте на «X» — мы (и другие сознательные конторы) ищем инженеров с «правильным» мышлением, умеющих эффективно, просто и элегантно решать сложные проблемы. А на Clojure это делать приятно и легко.</p>
<p><strong>Будет ли Clojure востребован в будущем?</strong></p>
<p>В раскрутку Clojure, в отличии от многих других «корпоративных» языков, никто не вливал много денег. Это крепкое и пассионарное сообщество профессионалов, которое растет естественным образом. Те, кто пришли к нам несколько лет назад, уже внедрили Clojure в production — и это залог будущего для языка. Я не вижу пока никаких признаков заката, скорее стабильный нехайповый рост — и это хорошо для экосистемы.</p>
<style data-mantine-styles="inline">.__m__-_R_6dderddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:80%;}@media(min-width: 36em){.__m__-_R_6dderddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_6dderddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png" loading="lazy" alt="Библиотека React: особенности, перспективы, ситуация на рынке труда"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Библиотека React: особенности, перспективы, ситуация на рынке труда</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда ...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">29 февраля 2024 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMywicHVyIjoiYmxvYl9pZCJ9fQ==--aa69869c906a992728ba7c26886fa1b715024424/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%8F%D0%B7%D1%8B%D0%BA%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8Fjavascript-01.png" loading="lazy" alt="Язык программирования JavaScript: где его используют и почему он популярен"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Язык программирования JavaScript: где его используют и почему он популярен</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Рассказываем, что это за язык программирования — JavaScript, где его используют, насколько он поп...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">4 октября 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MywicHVyIjoiYmxvYl9pZCJ9fQ==--8e5dd13a34bb6d61f1c0db87a25e6e64d0e237fb/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/node%20_new-01.png" loading="lazy" alt="Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Рассказываем, как устроен бэкенд на JavaScript, стоит ли изучать Node.js, когда есть PHP и Python...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">28 июля 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div></div></div></div>
<h2 id="heading-2-6">Анализ рынка Clojure-специалистов</h2>
<p>По сравнению с разработчиками, которые пишут на JS или Python, спрос на Clojure-программистов намного ниже. Несмотря на это, на HH есть вакансии, где требуются именно инженеры, которые смогут писать на этом языке программирования. На HH на сегодняшний день есть 12 вакансий Clojure-разработчиков, а на «Хабр.Карьере» — 2 вакансии, обе от компании Health Samurai.</p>
<p>Средняя зарплата Junior Clojure Developer, которую предлагают компании, составляет от 70 тыс. до 150 тыс. рублей. При этом в Health Samurai отмечают, что первоначальные знания Clojure не являются обязательными.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/VUfcYVE.png" alt="Зарплата" loading="lazy"/></p>
<p>Вакансии уровня Senior для программиста со знанием Clojure или желанием погрузиться в изучение Лисп-языков, начинаются от 270 тыс. рублей в месяц.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/OWjvCTO.png" alt="Зарплата" loading="lazy"/></p>
<hr/>
<p>Документацию к Clojure вы можете <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://clojure.org/guides/weird_characters" rel="noopener noreferrer" target="_blank">посмотреть</a> на официальном сайте языка.</p>
<p><em>Кроме того, мы используем Clojure в open source проекте Codebattle, если хотите поучаствовать и попробовать изучить Clojure, то <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://github.com/hexlet-codebattle/battle_asserts" rel="noopener noreferrer" target="_blank">пишите нам</a>.</em></p></div><div class=""><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg></div><p style="margin-inline-end:var(--mantine-spacing-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Svet Ivanov</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">5 лет назад</p></div><div style="align-items:center" class="m_8bffd616 mantine-Flex-root __m__-_R_5dirddmiub_"><a style="display:inline-flex" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/clojure/votes"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">21</p></div></div></div><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding:var(--mantine-spacing-xl)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Читайте также:</p><ul style="margin-inline-start:var(--mantine-spacing-lg)" class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article">Библиотека React: особенности, перспективы, ситуация на рынке труда</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov">Язык программирования JavaScript: где его используют и почему он популярен</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript">Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят</a></span></div></li></ul></div><div style="margin-block:var(--mantine-spacing-xl)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div></div><div></div></div><style data-mantine-styles="inline">.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_lmiub_ mantine-visible-from-md"><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="margin-bottom:var(--mantine-spacing-md)" class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Категории</p></div><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Мотивация">Мотивация</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Истории успеха">Истории успеха</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Дневник студента">Дневник студента</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Код">Код</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Карьера">Карьера</button></span></div></li></ul></div><div style="justify-content:end;margin-top:0rem;position:sticky;top:calc(5rem * var(--mantine-scale))" class="m_8bffd616 mantine-Flex-root __m__-_R_5dlmiub_"><div tabindex="0" style="cursor:pointer"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses_javascript?promo_name=program_category&promo_position=blog_post&promo_creative=card&promo_type=card"><div style="background-color:var(--mantine-color-default);border:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);padding-inline:var(--mantine-spacing-xl);padding-top:var(--mantine-spacing-xl);padding-bottom:var(--mantine-spacing-xs);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Курсы по JavaScript</p></div><img class="m_9e117634 mantine-Image-root" src="/vite/assets/development-BVihs_d5.png"/><p style="margin-bottom:var(--mantine-spacing-xs);text-align:right" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></a></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-CdBlNCiQ.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>