Зачем вам нужна
Clojure
Никита Прокопов
tonsky.livejournal.com
echo
# Кто мы?
AboutEcho.com
Риалтаймовый веб:
комментарии, потоки, запросы...
Калифорния/Ульяновск/Новосибирск
echo
# Кто мы?
# Кто мы?
Erlang, OCaml, C:
~15 программистов
45 000 rps в пике
450 серверов
# Кто мы?
Javascript:
8 программистов
500 кб кода
300 кб тестов
~200M запросов на CDN в день
# Кто мы?
Clojure:
1..5 программистов
9 месяцев
продакшн уже ч/з 3 месяца
Clojure никто не знал
# Как случилась Clojure?
Новый проект, нет кода для
переиспользования
Twitter Storm
Двухнедельный proof of concept
Erlang vs Clojure
# Почему Clojure?
Явные сильные стороны:
Скорость разработки
Производительность
Concurrency
Высокая культура разработки
# Что такое Clojure?
JVM-based язык
Общего назначения
Современный LISP
Функциональный
Прагматичный
# Скобочки? Фу?
fun(x, y)
obj.method()
if (x < y) {
foo();
} else {
bar();
}
Map<String, Integer>
m = new HashMap<>() {{
put(“x”, 1);
put(“y”, 2);
}}
(fun x y)
(.method obj)
(if (< x y)
(foo)
(bar))
(let [m {:x 1
:y 2}])
Java ()
Java ,.;
Clojure ()
Clojure ,.;
# Сильные стороны Clojure
## Concurrency
Иммутабельные персистентные
структуры данных
Явная модель изменений,
высокоуровневые примитивы,
транзакционная память
Проще, предсказуемее, компонуемее
# Сильные стороны Clojure
## Обработка данных
Дата-центричная философия
Удобная стандартная библиотека
ФП — композиция кусков
Extensible Data Notation
# Сильные стороны Clojure
## Язык общего назначения
Небольшой, выразительный
Компактный синтаксис
Динамический полиморфизм, без ООП
Компонуемые абстракции,
открытость, расширяемость
Кодогенерация (порой)
# Сильные стороны Clojure
public class StringUtils {
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
} [](){} ×28
# Сильные стороны Clojure
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
[](){} ×8
# Анатомия Clojure
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
стандартная
библиотека
функциональное
программирование
java interop
компактный
синтаксис
макрос! вопросик в
идентификаторе!
# Анатомия Clojure
(defn blank? [s]
(every? #(Character/isWhitespace %) s))
списки
вектор
код
как данные
# Clojure как Java
Уважает платформу
Прямой interop в Java
Генерация .class =>
дергаем Clojure из Java-проекта
Lein работает прямо
с Maven-репозиториями
# Clojure как Java
Писать Java на Clojure проще, чем
на самой Java
Разгоняется до скорости Java
# Clojure как Python
Динамическая компиляция
Быстрое прототипирование
Быстрее, чем в Питоне (REPL)
Компактнее и лаконичнее,
чем в Питоне (ФП)
Потенциал для оптимизации
# Clojure как Bash*
Удобный перочинный нож
Особенно если запущен REPL
Особенно хорошо — разбор,
анализ и трансформация данных
* Обобщенный
# Clojure как JavaScript
## ClojureScript
Clojure в браузере
# ClojureScript
## Зачем?
Писать web и не сойти с ума
Трудно масштабировать JS проект:
нужна хорошая архитектура
нужна жесткая дисциплина
нужна согласованность по тулзам
Проблема не в синтаксисе
# JavaScript
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
# JavaScript
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Меньше кнопок нажимать
# ClojureScript
Правильная семантическая модель:
модулей
данных
вычислений
состояния
# ClojureScript
Стандартные решения стандартных проблем
реализаций import: 0
ООП-фреймворков: 0
альтерн. синтаксисов: 0
альтерн. коллекций: 0
monad tutorials: 0
Google Closure-совместим
Сжимает
Генерирует кроссбраузерный код
Оптимизирует лучше человека*
Ужасная отладка**
* Потенциально
** Уже почти нет
# ClojureScript
## Компиляция
Не надо ждать стандартов 2 года
Не надо ждать смерти IE 7..10 лет
Не надо ждать библиотек 0..∞
Уже сегодня, уже сейчас
# ClojureScript
## Компиляция
Destucturing
Compact function syntax
Vararg parameters
Modules/imports
Lexical scope
Real data structures
Array comprehensions
Maps with non-string keys
For-of
Multiline strings
# ClojureScript
## Довесок
Иммутабельность
Персистентные структуры данных
ФП
Макросы
Строгая типизация
Протоколы
...в браузере! уже сегодня!
1,5 года
Достаточно быстр и легок
Стабильное API
Production-ready
# ClojureScript
# Clojure сообщество,
## или зачем интересоваться Clojure
Clojure сделает из вас более
лучшего инженера
Много хорошего кода
Правильные ценности
Правильная философия
# Clojure сообщество,
## или зачем интересоваться Clojure
Площадка для экспериментов
Крайне полезные лекции!
Мало сил — приходится искать
хорошие решения
# Clojure сообщество
## Доклады Rich Hickey про CS
Hammock-driven development
Are we there yet?
Simple made easy
TBD (так вот называется,
о дизайне систем)
Clojure Concurrency
RH Unveils ClojureScript
RH on Datomic
# Clojure сообщество
## Доклады Rich Hickey про Clojure
# Clojure в жизни
Опрошено 5 разработчиков
1..5 мес. работы на Clojure
До этого никто Clojure не знал
# Clojure в Echo
— несложно, дело привычки
— читать сложнее Erlang-а
— Python (2,3)
Java, Erlang (4)
Clojure(6,7)
— примерно Ruby (без Rails)
— очень зависит от автора
# Clojure в Echo
## Насколько сложно читать?
— очень легко
— легче, чем в ООП языках
— меньше кода, только суть
— упирается в понимание кода
— Проблем с отладкой нет
(отладочная печать она и в Африке
отладочная печать)
# Clojure в Echo
## Насколько сложно писать?
— неделя
— от недели и больше
— недели две
— с учетом, что есть опыт в ФП
# Clojure в Echo
## Когда начинает получаться?
— concurrency примитивы
— двухсторонний interop
— meta параметры
— идеология
# Clojure в Echo
## Наиболее сложные области
— гибкость, лаконичность
— особенно чувствуется при
переключении на другой язык
— скорость написания кода
(«опа—опа и готово»)
— java—библиотеки
— удобна для файлов конфигурации
# Clojure в Echo
## Полезно
— скобки (1 чел.)
— привязанность к Java (2 чел.)
— непрозрачность кода из—за
макросов (2 чел.)
— медленный старт, тяжеловесность
платформы (2 чел.)
# Clojure в Echo
## Что раздражает?
— Большая неограниченная свобода.
Можно писать как угодно, в любом
стиле. Зеркало разработчика.
— Идеальна для соло проектов и
плоха для командной разработки.
— Писать на Clojure очень легко,
поэтому мы так много пишем и
переписываем то, что пишем.
# Clojure в Echo
## Общее впечатление
# Clojure в Echo
## Twitter Storm
Начиналось всё хорошо
# Clojure в Echo
## Twitter Storm
Фреймворк, не библиотека
Всё делает сам
Нужно интегрировать с ним тулзы
Нужно специальное тестирование
# Clojure в Echo
## Twitter Storm
Не переконфигурируется на лету
Баги в реализации (leaks, deploy)
Фиксирует версии библиотек
(zookeeper, clojure, логгинг, вебстек?)
Заменили на plain old functions
+ систему управления кластером
(скоро)
# Clojure в Echo
## Midje: unit-testing
Начиналось всё хорошо
# Clojure в Echo
## Midje: unit-testing
Простые тесты писать проще*
(is (= (:peer res) :p1))
(fact
res => (contains {:peer :p1}))
* Ну не сложнее точно
# Clojure в Echo
## Midje: unit-testing
Простые тесты писать проще*
(is (= (:peer res) :p1))
(fact
res => (contains {:peer :p1}))
* Ну не сложнее точно
# Clojure в Echo
## Midje: unit-testing
(fact
res => (contains {:peer :p1}))
Поведение неконсистентно
Обычная clojure не подходит
Свои checkers писать нереально
Адское макропрограммирование
Нет junit.xml вывода
и даже автор не представляет, как его добавить
# Clojure в Echo
## Midje clojure.test: unit-testing
(is (= (:peer res) :p1))
Прямой, тупой, бесхитростный
Расширяется во все стороны
Чистая дистилированная clojure
Нет mocking, только bindings :(
# Clojure в Echo
## Положительный опыт
clojure.data.*
clojure.tools.*
http.async.client
riemann
clj-redis
clj-oauth
amotoen
nippy
ring
compojure
clojurescript
enfocus
jayq
shoreleave
# Success stories
## Riemann
# Success stories
## Datomic — БД нового типа
# Success stories
## Prismatic — crawling, ML
# Success stories
## Prismatic — crawling, ML
# Преимущества Clojure
Обработка данных
Concurrency
Быстрая разработка
Доступ к JVM
# Когда использовать?
Параллельная обработка общего state
Обработка больших массивов данных
(анализ, обучение)
Большие приложения в браузере
— clojure.org
— clojuredocs.org
— tonsky.livejournal.com
— The Joy of Clojure
— Clojure Programming
— Programming Clojure
# Полезные ресурсы
Спасибо за внимание!
tonsky.livejournal.com
jobs@aboutecho.com
Новосибирск, март 2013

CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?

  • 1.
    Зачем вам нужна Clojure НикитаПрокопов tonsky.livejournal.com echo
  • 2.
    # Кто мы? AboutEcho.com Риалтаймовыйвеб: комментарии, потоки, запросы... Калифорния/Ульяновск/Новосибирск echo
  • 3.
  • 4.
    # Кто мы? Erlang,OCaml, C: ~15 программистов 45 000 rps в пике 450 серверов
  • 5.
    # Кто мы? Javascript: 8программистов 500 кб кода 300 кб тестов ~200M запросов на CDN в день
  • 6.
    # Кто мы? Clojure: 1..5программистов 9 месяцев продакшн уже ч/з 3 месяца Clojure никто не знал
  • 7.
    # Как случиласьClojure? Новый проект, нет кода для переиспользования Twitter Storm Двухнедельный proof of concept Erlang vs Clojure
  • 8.
    # Почему Clojure? Явныесильные стороны: Скорость разработки Производительность Concurrency Высокая культура разработки
  • 9.
    # Что такоеClojure? JVM-based язык Общего назначения Современный LISP Функциональный Прагматичный
  • 10.
    # Скобочки? Фу? fun(x,y) obj.method() if (x < y) { foo(); } else { bar(); } Map<String, Integer> m = new HashMap<>() {{ put(“x”, 1); put(“y”, 2); }} (fun x y) (.method obj) (if (< x y) (foo) (bar)) (let [m {:x 1 :y 2}]) Java () Java ,.; Clojure () Clojure ,.;
  • 11.
    # Сильные стороныClojure ## Concurrency Иммутабельные персистентные структуры данных Явная модель изменений, высокоуровневые примитивы, транзакционная память Проще, предсказуемее, компонуемее
  • 12.
    # Сильные стороныClojure ## Обработка данных Дата-центричная философия Удобная стандартная библиотека ФП — композиция кусков Extensible Data Notation
  • 13.
    # Сильные стороныClojure ## Язык общего назначения Небольшой, выразительный Компактный синтаксис Динамический полиморфизм, без ООП Компонуемые абстракции, открытость, расширяемость Кодогенерация (порой)
  • 14.
    # Сильные стороныClojure public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } } [](){} ×28
  • 15.
    # Сильные стороныClojure (defn blank? [s] (every? #(Character/isWhitespace %) s)) [](){} ×8
  • 16.
    # Анатомия Clojure (defnblank? [s] (every? #(Character/isWhitespace %) s)) стандартная библиотека функциональное программирование java interop компактный синтаксис макрос! вопросик в идентификаторе!
  • 17.
    # Анатомия Clojure (defnblank? [s] (every? #(Character/isWhitespace %) s)) списки вектор код как данные
  • 18.
    # Clojure какJava Уважает платформу Прямой interop в Java Генерация .class => дергаем Clojure из Java-проекта Lein работает прямо с Maven-репозиториями
  • 19.
    # Clojure какJava Писать Java на Clojure проще, чем на самой Java Разгоняется до скорости Java
  • 20.
    # Clojure какPython Динамическая компиляция Быстрое прототипирование Быстрее, чем в Питоне (REPL) Компактнее и лаконичнее, чем в Питоне (ФП) Потенциал для оптимизации
  • 21.
    # Clojure какBash* Удобный перочинный нож Особенно если запущен REPL Особенно хорошо — разбор, анализ и трансформация данных * Обобщенный
  • 22.
    # Clojure какJavaScript ## ClojureScript Clojure в браузере
  • 23.
    # ClojureScript ## Зачем? Писатьweb и не сойти с ума Трудно масштабировать JS проект: нужна хорошая архитектура нужна жесткая дисциплина нужна согласованность по тулзам Проблема не в синтаксисе
  • 24.
  • 25.
  • 26.
  • 27.
    # ClojureScript Правильная семантическаямодель: модулей данных вычислений состояния
  • 28.
    # ClojureScript Стандартные решениястандартных проблем реализаций import: 0 ООП-фреймворков: 0 альтерн. синтаксисов: 0 альтерн. коллекций: 0 monad tutorials: 0
  • 29.
    Google Closure-совместим Сжимает Генерирует кроссбраузерныйкод Оптимизирует лучше человека* Ужасная отладка** * Потенциально ** Уже почти нет # ClojureScript ## Компиляция
  • 30.
    Не надо ждатьстандартов 2 года Не надо ждать смерти IE 7..10 лет Не надо ждать библиотек 0..∞ Уже сегодня, уже сейчас # ClojureScript ## Компиляция Destucturing Compact function syntax Vararg parameters Modules/imports Lexical scope Real data structures Array comprehensions Maps with non-string keys For-of Multiline strings
  • 31.
    # ClojureScript ## Довесок Иммутабельность Персистентныеструктуры данных ФП Макросы Строгая типизация Протоколы ...в браузере! уже сегодня!
  • 32.
    1,5 года Достаточно быстри легок Стабильное API Production-ready # ClojureScript
  • 33.
    # Clojure сообщество, ##или зачем интересоваться Clojure Clojure сделает из вас более лучшего инженера Много хорошего кода Правильные ценности Правильная философия
  • 34.
    # Clojure сообщество, ##или зачем интересоваться Clojure Площадка для экспериментов Крайне полезные лекции! Мало сил — приходится искать хорошие решения
  • 35.
    # Clojure сообщество ##Доклады Rich Hickey про CS Hammock-driven development Are we there yet? Simple made easy TBD (так вот называется, о дизайне систем)
  • 36.
    Clojure Concurrency RH UnveilsClojureScript RH on Datomic # Clojure сообщество ## Доклады Rich Hickey про Clojure
  • 37.
    # Clojure вжизни
  • 38.
    Опрошено 5 разработчиков 1..5мес. работы на Clojure До этого никто Clojure не знал # Clojure в Echo
  • 39.
    — несложно, делопривычки — читать сложнее Erlang-а — Python (2,3) Java, Erlang (4) Clojure(6,7) — примерно Ruby (без Rails) — очень зависит от автора # Clojure в Echo ## Насколько сложно читать?
  • 40.
    — очень легко —легче, чем в ООП языках — меньше кода, только суть — упирается в понимание кода — Проблем с отладкой нет (отладочная печать она и в Африке отладочная печать) # Clojure в Echo ## Насколько сложно писать?
  • 41.
    — неделя — отнедели и больше — недели две — с учетом, что есть опыт в ФП # Clojure в Echo ## Когда начинает получаться?
  • 42.
    — concurrency примитивы —двухсторонний interop — meta параметры — идеология # Clojure в Echo ## Наиболее сложные области
  • 43.
    — гибкость, лаконичность —особенно чувствуется при переключении на другой язык — скорость написания кода («опа—опа и готово») — java—библиотеки — удобна для файлов конфигурации # Clojure в Echo ## Полезно
  • 44.
    — скобки (1чел.) — привязанность к Java (2 чел.) — непрозрачность кода из—за макросов (2 чел.) — медленный старт, тяжеловесность платформы (2 чел.) # Clojure в Echo ## Что раздражает?
  • 45.
    — Большая неограниченнаясвобода. Можно писать как угодно, в любом стиле. Зеркало разработчика. — Идеальна для соло проектов и плоха для командной разработки. — Писать на Clojure очень легко, поэтому мы так много пишем и переписываем то, что пишем. # Clojure в Echo ## Общее впечатление
  • 46.
    # Clojure вEcho ## Twitter Storm Начиналось всё хорошо
  • 47.
    # Clojure вEcho ## Twitter Storm Фреймворк, не библиотека Всё делает сам Нужно интегрировать с ним тулзы Нужно специальное тестирование
  • 48.
    # Clojure вEcho ## Twitter Storm Не переконфигурируется на лету Баги в реализации (leaks, deploy) Фиксирует версии библиотек (zookeeper, clojure, логгинг, вебстек?) Заменили на plain old functions + систему управления кластером (скоро)
  • 49.
    # Clojure вEcho ## Midje: unit-testing Начиналось всё хорошо
  • 50.
    # Clojure вEcho ## Midje: unit-testing Простые тесты писать проще* (is (= (:peer res) :p1)) (fact res => (contains {:peer :p1})) * Ну не сложнее точно
  • 51.
    # Clojure вEcho ## Midje: unit-testing Простые тесты писать проще* (is (= (:peer res) :p1)) (fact res => (contains {:peer :p1})) * Ну не сложнее точно
  • 52.
    # Clojure вEcho ## Midje: unit-testing (fact res => (contains {:peer :p1})) Поведение неконсистентно Обычная clojure не подходит Свои checkers писать нереально Адское макропрограммирование Нет junit.xml вывода и даже автор не представляет, как его добавить
  • 53.
    # Clojure вEcho ## Midje clojure.test: unit-testing (is (= (:peer res) :p1)) Прямой, тупой, бесхитростный Расширяется во все стороны Чистая дистилированная clojure Нет mocking, только bindings :(
  • 54.
    # Clojure вEcho ## Положительный опыт clojure.data.* clojure.tools.* http.async.client riemann clj-redis clj-oauth amotoen nippy ring compojure clojurescript enfocus jayq shoreleave
  • 55.
  • 56.
    # Success stories ##Datomic — БД нового типа
  • 57.
    # Success stories ##Prismatic — crawling, ML
  • 58.
    # Success stories ##Prismatic — crawling, ML
  • 59.
    # Преимущества Clojure Обработкаданных Concurrency Быстрая разработка Доступ к JVM
  • 60.
    # Когда использовать? Параллельнаяобработка общего state Обработка больших массивов данных (анализ, обучение) Большие приложения в браузере
  • 61.
    — clojure.org — clojuredocs.org —tonsky.livejournal.com — The Joy of Clojure — Clojure Programming — Programming Clojure # Полезные ресурсы
  • 62.