Slide 1

Slide 1 text

Зачем вам нужна Clojure Никита Прокопов tonsky.livejournal.com echo

Slide 2

Slide 2 text

# Кто мы? AboutEcho.com Риалтаймовый веб: комментарии, потоки, запросы... Калифорния/Ульяновск/Новосибирск echo

Slide 3

Slide 3 text

# Кто мы?

Slide 4

Slide 4 text

# Кто мы? Erlang, OCaml, C: ~15 программистов 45 000 rps в пике 450 серверов

Slide 5

Slide 5 text

# Кто мы? Javascript: 8 программистов 500 кб кода 300 кб тестов ~200M запросов на CDN в день

Slide 6

Slide 6 text

# Кто мы? Clojure: 1..5 программистов 9 месяцев продакшн уже ч/з 3 месяца Clojure никто не знал

Slide 7

Slide 7 text

# Как случилась Clojure? Новый проект, нет кода для переиспользования Twitter Storm Двухнедельный proof of concept Erlang vs Clojure

Slide 8

Slide 8 text

# Почему Clojure? Явные сильные стороны: Скорость разработки Производительность Concurrency Высокая культура разработки

Slide 9

Slide 9 text

# Что такое Clojure? JVM-based язык Общего назначения Современный LISP Функциональный Прагматичный

Slide 10

Slide 10 text

# Скобочки? Фу? fun(x, y) obj.method() if (x < y) { foo(); } else { bar(); } Map 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 ,.;

Slide 11

Slide 11 text

# Сильные стороны Clojure ## Concurrency Иммутабельные персистентные структуры данных Явная модель изменений, высокоуровневые примитивы, транзакционная память Проще, предсказуемее, компонуемее

Slide 12

Slide 12 text

# Сильные стороны Clojure ## Обработка данных Дата-центричная философия Удобная стандартная библиотека ФП — композиция кусков Extensible Data Notation

Slide 13

Slide 13 text

# Сильные стороны Clojure ## Язык общего назначения Небольшой, выразительный Компактный синтаксис Динамический полиморфизм, без ООП Компонуемые абстракции, открытость, расширяемость Кодогенерация (порой)

Slide 14

Slide 14 text

# Сильные стороны 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

Slide 15

Slide 15 text

# Сильные стороны Clojure (defn blank? [s] (every? #(Character/isWhitespace %) s)) [](){} ×8

Slide 16

Slide 16 text

# Анатомия Clojure (defn blank? [s] (every? #(Character/isWhitespace %) s)) стандартная библиотека функциональное программирование java interop компактный синтаксис макрос! вопросик в идентификаторе!

Slide 17

Slide 17 text

# Анатомия Clojure (defn blank? [s] (every? #(Character/isWhitespace %) s)) списки вектор код как данные

Slide 18

Slide 18 text

# Clojure как Java Уважает платформу Прямой interop в Java Генерация .class => дергаем Clojure из Java-проекта Lein работает прямо с Maven-репозиториями

Slide 19

Slide 19 text

# Clojure как Java Писать Java на Clojure проще, чем на самой Java Разгоняется до скорости Java

Slide 20

Slide 20 text

# Clojure как Python Динамическая компиляция Быстрое прототипирование Быстрее, чем в Питоне (REPL) Компактнее и лаконичнее, чем в Питоне (ФП) Потенциал для оптимизации

Slide 21

Slide 21 text

# Clojure как Bash* Удобный перочинный нож Особенно если запущен REPL Особенно хорошо — разбор, анализ и трансформация данных * Обобщенный

Slide 22

Slide 22 text

# Clojure как JavaScript ## ClojureScript Clojure в браузере

Slide 23

Slide 23 text

# ClojureScript ## Зачем? Писать web и не сойти с ума Трудно масштабировать JS проект: нужна хорошая архитектура нужна жесткая дисциплина нужна согласованность по тулзам Проблема не в синтаксисе

Slide 24

Slide 24 text

# JavaScript Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

Slide 25

Slide 25 text

# JavaScript Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

Slide 26

Slide 26 text

# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции Меньше кнопок нажимать

Slide 27

Slide 27 text

# ClojureScript Правильная семантическая модель: модулей данных вычислений состояния

Slide 28

Slide 28 text

# ClojureScript Стандартные решения стандартных проблем реализаций import: 0 ООП-фреймворков: 0 альтерн. синтаксисов: 0 альтерн. коллекций: 0 monad tutorials: 0

Slide 29

Slide 29 text

Google Closure-совместим Сжимает Генерирует кроссбраузерный код Оптимизирует лучше человека* Ужасная отладка** * Потенциально ** Уже почти нет # ClojureScript ## Компиляция

Slide 30

Slide 30 text

Не надо ждать стандартов 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

Slide 31

Slide 31 text

# ClojureScript ## Довесок Иммутабельность Персистентные структуры данных ФП Макросы Строгая типизация Протоколы ...в браузере! уже сегодня!

Slide 32

Slide 32 text

1,5 года Достаточно быстр и легок Стабильное API Production-ready # ClojureScript

Slide 33

Slide 33 text

# Clojure сообщество, ## или зачем интересоваться Clojure Clojure сделает из вас более лучшего инженера Много хорошего кода Правильные ценности Правильная философия

Slide 34

Slide 34 text

# Clojure сообщество, ## или зачем интересоваться Clojure Площадка для экспериментов Крайне полезные лекции! Мало сил — приходится искать хорошие решения

Slide 35

Slide 35 text

# Clojure сообщество ## Доклады Rich Hickey про CS Hammock-driven development Are we there yet? Simple made easy TBD (так вот называется, о дизайне систем)

Slide 36

Slide 36 text

Clojure Concurrency RH Unveils ClojureScript RH on Datomic # Clojure сообщество ## Доклады Rich Hickey про Clojure

Slide 37

Slide 37 text

# Clojure в жизни

Slide 38

Slide 38 text

Опрошено 5 разработчиков 1..5 мес. работы на Clojure До этого никто Clojure не знал # Clojure в Echo

Slide 39

Slide 39 text

— несложно, дело привычки — читать сложнее Erlang-а — Python (2,3) Java, Erlang (4) Clojure(6,7) — примерно Ruby (без Rails) — очень зависит от автора # Clojure в Echo ## Насколько сложно читать?

Slide 40

Slide 40 text

— очень легко — легче, чем в ООП языках — меньше кода, только суть — упирается в понимание кода — Проблем с отладкой нет (отладочная печать она и в Африке отладочная печать) # Clojure в Echo ## Насколько сложно писать?

Slide 41

Slide 41 text

— неделя — от недели и больше — недели две — с учетом, что есть опыт в ФП # Clojure в Echo ## Когда начинает получаться?

Slide 42

Slide 42 text

— concurrency примитивы — двухсторонний interop — meta параметры — идеология # Clojure в Echo ## Наиболее сложные области

Slide 43

Slide 43 text

— гибкость, лаконичность — особенно чувствуется при переключении на другой язык — скорость написания кода («опа—опа и готово») — java—библиотеки — удобна для файлов конфигурации # Clojure в Echo ## Полезно

Slide 44

Slide 44 text

— скобки (1 чел.) — привязанность к Java (2 чел.) — непрозрачность кода из—за макросов (2 чел.) — медленный старт, тяжеловесность платформы (2 чел.) # Clojure в Echo ## Что раздражает?

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

# Clojure в Echo ## Twitter Storm Начиналось всё хорошо

Slide 47

Slide 47 text

# Clojure в Echo ## Twitter Storm Фреймворк, не библиотека Всё делает сам Нужно интегрировать с ним тулзы Нужно специальное тестирование

Slide 48

Slide 48 text

# Clojure в Echo ## Twitter Storm Не переконфигурируется на лету Баги в реализации (leaks, deploy) Фиксирует версии библиотек (zookeeper, clojure, логгинг, вебстек?) Заменили на plain old functions + систему управления кластером (скоро)

Slide 49

Slide 49 text

# Clojure в Echo ## Midje: unit-testing Начиналось всё хорошо

Slide 50

Slide 50 text

# Clojure в Echo ## Midje: unit-testing Простые тесты писать проще* (is (= (:peer res) :p1)) (fact res => (contains {:peer :p1})) * Ну не сложнее точно

Slide 51

Slide 51 text

# Clojure в Echo ## Midje: unit-testing Простые тесты писать проще* (is (= (:peer res) :p1)) (fact res => (contains {:peer :p1})) * Ну не сложнее точно

Slide 52

Slide 52 text

# Clojure в Echo ## Midje: unit-testing (fact res => (contains {:peer :p1})) Поведение неконсистентно Обычная clojure не подходит Свои checkers писать нереально Адское макропрограммирование Нет junit.xml вывода и даже автор не представляет, как его добавить

Slide 53

Slide 53 text

# Clojure в Echo ## Midje clojure.test: unit-testing (is (= (:peer res) :p1)) Прямой, тупой, бесхитростный Расширяется во все стороны Чистая дистилированная clojure Нет mocking, только bindings :(

Slide 54

Slide 54 text

# Clojure в Echo ## Положительный опыт clojure.data.* clojure.tools.* http.async.client riemann clj-redis clj-oauth amotoen nippy ring compojure clojurescript enfocus jayq shoreleave

Slide 55

Slide 55 text

# Success stories ## Riemann

Slide 56

Slide 56 text

# Success stories ## Datomic — БД нового типа

Slide 57

Slide 57 text

# Success stories ## Prismatic — crawling, ML

Slide 58

Slide 58 text

# Success stories ## Prismatic — crawling, ML

Slide 59

Slide 59 text

# Преимущества Clojure Обработка данных Concurrency Быстрая разработка Доступ к JVM

Slide 60

Slide 60 text

# Когда использовать? Параллельная обработка общего state Обработка больших массивов данных (анализ, обучение) Большие приложения в браузере

Slide 61

Slide 61 text

— clojure.org — clojuredocs.org — tonsky.livejournal.com — The Joy of Clojure — Clojure Programming — Programming Clojure # Полезные ресурсы

Slide 62

Slide 62 text

Спасибо за внимание! tonsky.livejournal.com [email protected] Новосибирск, март 2013