SlideShare a Scribd company logo
1 of 62
Download to read offline
Зачем вам нужна
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

More Related Content

What's hot

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромKirill Kovalchuk
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016Alex Chistyakov
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»WrikeTechClub
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Эффективные email коммуникации
Эффективные email коммуникацииЭффективные email коммуникации
Эффективные email коммуникацииDenis Tsvettsih
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке Evgeny Borisov
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Rubyguest5f907e
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Pythonautomated-testing.info
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Fwdays
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...ScrumTrek
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Ontico
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Pavel Chertorogov
 

What's hot (20)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодером
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Эффективные email коммуникации
Эффективные email коммуникацииЭффективные email коммуникации
Эффективные email коммуникации
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Ruby
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)
 

Viewers also liked

Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptMax Klymyshyn
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'еHappyDev
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповOntico
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptFDConf
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахDennis Schetinin
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)Ontico
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»DevDay
 
JavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.asyncJavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.asyncFalko Riemenschneider
 
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in ClojureFlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in Clojuredenyslebediev
 
"Content Security Policy" — Алексей Андросов, MoscowJS 18
"Content Security Policy" — Алексей Андросов, MoscowJS 18"Content Security Policy" — Алексей Андросов, MoscowJS 18
"Content Security Policy" — Алексей Андросов, MoscowJS 18MoscowJS
 
Monte carlo simulation
Monte carlo simulationMonte carlo simulation
Monte carlo simulationAnurag Jaiswal
 

Viewers also liked (11)

Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
JavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.asyncJavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.async
 
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in ClojureFlatGUI: Reactive GUI Toolkit Implemented in Clojure
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
 
"Content Security Policy" — Алексей Андросов, MoscowJS 18
"Content Security Policy" — Алексей Андросов, MoscowJS 18"Content Security Policy" — Алексей Андросов, MoscowJS 18
"Content Security Policy" — Алексей Андросов, MoscowJS 18
 
Monte carlo simulation
Monte carlo simulationMonte carlo simulation
Monte carlo simulation
 

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

Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7Alexander Levantovsky
 
Хорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеХорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеNikolay Sivko
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"Tanya Denisyuk
 
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGДмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGDataArt
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Ontico
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpGoSharp
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyDmytro Zharii
 
как инженерные практики помогают экономить бизнесу
как инженерные практики помогают экономить бизнесукак инженерные практики помогают экономить бизнесу
как инженерные практики помогают экономить бизнесуAndrey Rebrov
 
Erlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoErlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoLev Walkin
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
 
InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems
 

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

Joker2014
Joker2014Joker2014
Joker2014
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
 
Хорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеХорошо поддерживаемое приложение
Хорошо поддерживаемое приложение
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
 
Sivko
SivkoSivko
Sivko
 
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGДмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
 
как инженерные практики помогают экономить бизнесу
как инженерные практики помогают экономить бизнесукак инженерные практики помогают экономить бизнесу
как инженерные практики помогают экономить бизнесу
 
Erlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoErlang and OCaml Experience at Echo
Erlang and OCaml Experience at Echo
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
 
InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015
 

More from CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

More from CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

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

  • 1. Зачем вам нужна Clojure Никита Прокопов tonsky.livejournal.com echo
  • 2. # Кто мы? AboutEcho.com Риалтаймовый веб: комментарии, потоки, запросы... Калифорния/Ульяновск/Новосибирск echo
  • 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 (defn blank? [s] (every? #(Character/isWhitespace %) s)) стандартная библиотека функциональное программирование java interop компактный синтаксис макрос! вопросик в идентификаторе!
  • 17. # Анатомия Clojure (defn blank? [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 проект: нужна хорошая архитектура нужна жесткая дисциплина нужна согласованность по тулзам Проблема не в синтаксисе
  • 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 Unveils ClojureScript 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
  • 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 # Полезные ресурсы