SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO GVMachines Inc.
Трансдюсеры,
CSP-каналы,неизменяемые
структуры данных в JavaScript
Обомне
‣ 11+ летопытавебразработки,5летJavaScript,
6летPython
‣ Работалв oDesk,Helios,42cc.
‣ Со-организаторконференцийPyConUkraine,
KyivJS
‣ 3годаработаютехническимдиректоромв
ZAKAZ.UA
Нехочувас расстраивать,но у
менявсехорошо
‣ Transducers
‣ Asynchronousworkflows
‣ Immutabledatastructures
ТРАНСДЮСЕРЫ –
НОВАЯ
КОНЦЕПЦИЯ ПО
РАБОТЕ С
ДАННЫМИ
Rich Hickey
6 августа 2014
пост о трансдюсерах в
Clojure
Transducers – composable algorithmic transformations
ТРАНСДЮСЕРЫПОШЛИ
ХОРОШО
Концепциятакхорошопошла,что
сейчасестьреализациидля Python,
Ruby,Erlang, C++итакдалее
Ithinkthislibrarywasoriginallydesigned
tofixajavascriptproblem,notaPython
problem.
alcalde, reddit
Гдепригодится
трансдюсеры
‣ Любойкодссерьезным анализомили
преобразованиемпоследовательностей
‣ Обработка потоковданных
‣ Параллельныевычисления(Fork-Joinmodel)
Ростсложностилюбойпрограммы
ограничентемпределом,докоторого
можносохранятьконтрольнадней:…
MartinWard,«Language Oriented Programming»
Мой взгляд
‣ Современемкомпонентовв системе
становится больше,временинаподдержку
этихкомпонентовуходитбольше
‣ Поэтомучитабельностькода ипростотаего
отладкиярассматриваюкакинвестицию,
возможностьтратитьменьшевремени на
поддержку (сейчасиливбудущем)
‣ Ибольшевременитратитьна новыефичи
REDUCE
Array.prototype.reduce(reducer[,initial])
whatever,input ->whatever
reduceболеефундаментальнаяфункция,
чемmapилиfilter.
Спомощьюreduceихлегкореализовать
TransformReducer
функция,которая принимаетредюсер,
преобразуетего ивозвращает новыйредюсер
(whatever,input ->whatever)->(whatever,input->
whatever)
iterable
map(f1)
map(f2)
filter(f3)
reducer
sequence
Трансдюсер
Verysimpleexample
Fizzbuzz
Выносимзапределы
обработки
‣ функцию-трансформерилипредикат
‣ функцию-накопительрезультатаобработки
Простейшийтрансдюсерготов!
КОМПОЗИЦИЯ
1. Последовательное
прохождение
2. Буферизацияобработки
3. Произвольноепрерывание
1. Буферизация/стриминг
2. Независимость от типа
данныхихранилища
3. Композицияхранилищ
НАКОПЛЕНИЕ
Важныефичи
‣ Значениепоумолчаниювзависимостиоттипа
накопителя
‣ Прерываниередукции(earlytermination),будет
‣ Очисткапослеработы(cleanupstate),
реализоватьпротокол
Protocol
РАЗДЕЛЕНИЕ
ОТВЕТСТВЕННОСТИ
FTW!
MAP, FILTER, REDUCE – 
ЭТО ПРОСТО КРУТО
А ТРАНСДЮСЕРЫ –
ЭТО ОФИГЕННО.
ASYNCHRONOUSWORKFLOWS
‣ Promises
‣ Events emittersandhandlers
‣ ES6generators
Стандартныйнабор
‣ Promises– нужноявнопомечатьстатус.done()
‣ Events emittersandhandlers – неочень
реюзабельны,многоboilerplateкода
‣ ES6generators– слишкомнизкийуровень
Слишкомнизкийуровень.
CSP(Communicatingsequential
processes)– этоформализованныйпуть
описаниявзаимодействияв
асинхронныхсредах.
Существуетдве основные
модели
‣ Actors model
‣ CSPChannels
Promises
CSPChannels
Actors
Где вамехать?
НЕИЗМЕНЯЕМЫЕСТРУКТУРЫ
ДАННЫХ
Immutable.js
‣ явное изменениясостояния– всегданужно
использовать присваивание
‣ Эффективность:hashmaptries,vectortries,
минимализируеткопированиеданных
‣ Линейная
Recordtype
With transducers
React.js
React.js +FLUX
Performance
http://jsperf.com/plain-js-vs-immutable-vs-mori/2
ВЦЕЛОМ
ПОЧЕМУВАЖНО?
чистыефункции
purefunctions
нетпобочныхэффектов
noside-effects
эффективнаяорганизациявзаимодействия
thoughtfulconcurrencymanagement
Спасибо!
@maxmaxmaxmax
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript

Weitere ähnliche Inhalte

Was ist angesagt?

101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Ontico
 
Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?
Vsevolod Dyomkin
 

Was ist angesagt? (18)

Why we did not choose Hadoop
Why we did not choose HadoopWhy we did not choose Hadoop
Why we did not choose Hadoop
 
Onliner development workflow
Onliner development workflowOnliner development workflow
Onliner development workflow
 
Around the Gulp — Андрей Яманов — MoscowJS 13
Around the Gulp — Андрей Яманов — MoscowJS 13Around the Gulp — Андрей Яманов — MoscowJS 13
Around the Gulp — Андрей Яманов — MoscowJS 13
 
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
 
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
 
Benchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSDBenchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSD
 
Мониторинг, когда не тестируешь
Мониторинг, когда не тестируешьМониторинг, когда не тестируешь
Мониторинг, когда не тестируешь
 
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
Дмитрий Носов, Rambler&Co, H2O на Spark: как мы пили газировку и чуть не захл...
Дмитрий Носов, Rambler&Co, H2O на Spark: как мы пили газировку и чуть не захл...Дмитрий Носов, Rambler&Co, H2O на Spark: как мы пили газировку и чуть не захл...
Дмитрий Носов, Rambler&Co, H2O на Spark: как мы пили газировку и чуть не захл...
 
Экосистема Common Lisp
Экосистема Common LispЭкосистема Common Lisp
Экосистема Common Lisp
 
Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?
 
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
 

Andere mochten auch

CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
Ontico
 

Andere mochten auch (11)

Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
 
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
 

Ähnlich wie Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript

JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
GeeksLab Odessa
 
Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169
Media Gorod
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИСЭволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
2ГИС Технологии
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
it-people
 
Tech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTOTech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTO
lyncis
 

Ähnlich wie Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript (20)

JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
JS Lab`16. Максим Климишин: "Smarter React.js: UI faster, UX better"
 
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
 
Инновации и JavaScript
Инновации и JavaScriptИнновации и JavaScript
Инновации и JavaScript
 
Workflow одной OPS-команды
Workflow одной OPS-командыWorkflow одной OPS-команды
Workflow одной OPS-команды
 
SECON'2016. Кузнецов Вячеслав, Workflow одной Ops-команды
SECON'2016. Кузнецов Вячеслав, Workflow одной Ops-командыSECON'2016. Кузнецов Вячеслав, Workflow одной Ops-команды
SECON'2016. Кузнецов Вячеслав, Workflow одной Ops-команды
 
Технологии больших веб проектов завтра и послезавтра
Технологии больших веб проектов завтра и послезавтраТехнологии больших веб проектов завтра и послезавтра
Технологии больших веб проектов завтра и послезавтра
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
От заката до рассвета | Максим Безуглый | Zlit Tech
От заката до рассвета | Максим Безуглый | Zlit TechОт заката до рассвета | Максим Безуглый | Zlit Tech
От заката до рассвета | Максим Безуглый | Zlit Tech
 
Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
 
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИСЭволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
 
5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python
 
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous DeliveryJenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
 
New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)
 
DevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System AdministratorDevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System Administrator
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
Capistrano Framework
Capistrano FrameworkCapistrano Framework
Capistrano Framework
 
Tech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTOTech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTO
 
Tech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTOTech Success: Web/2.0 startup HOWTO
Tech Success: Web/2.0 startup HOWTO
 
MySQL InnoDB Cluster
MySQL InnoDB ClusterMySQL InnoDB Cluster
MySQL InnoDB Cluster
 

Mehr von Max Klymyshyn

Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
Max Klymyshyn
 
PyCon 2012 - Data Driven Design
PyCon 2012 -  Data Driven DesignPyCon 2012 -  Data Driven Design
PyCon 2012 - Data Driven Design
Max Klymyshyn
 

Mehr von Max Klymyshyn (20)

Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypePapers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDT
 
OdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitOdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profit
 
PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation
 
Communicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptCommunicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScript
 
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonPiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
 
Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)
 
KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)
 
Изоформные приложения на React.js
Изоформные приложения на React.jsИзоформные приложения на React.js
Изоформные приложения на React.js
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)
 
Robust web apps with React.js
Robust web apps with React.jsRobust web apps with React.js
Robust web apps with React.js
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
Odessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonOdessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and Python
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013
 
Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
 
AgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneAgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get Done
 
PyCon 2012 - Data Driven Design
PyCon 2012 -  Data Driven DesignPyCon 2012 -  Data Driven Design
PyCon 2012 - Data Driven Design
 
LvivPy - Flask in details
LvivPy - Flask in detailsLvivPy - Flask in details
LvivPy - Flask in details
 
Kyivpy#8 - Quality Driven Development with Python
Kyivpy#8   - Quality Driven Development with PythonKyivpy#8   - Quality Driven Development with Python
Kyivpy#8 - Quality Driven Development with Python
 
Testing with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous DeploymentTesting with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous Deployment
 

Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript