SlideShare a Scribd company logo
1 of 82
Пришло время быть 
реактивными, или нет? 
Андрей Кравец 
@andykravets 
http://andrewkravets.com
Ссылка на презентацию
План 
1. Чего хотят пользователи 
2. Как изменились требования к программным 
продуктам 
3. Почему стоит изменить подход к разработке 
4. Как реактивное программирование может 
нам помочь 
5. Тулы
Чего хотят пользователи?
Чего хотят пользователи? 
1. Скорость
Чего хотят пользователи? 
1. Скорость 
2. Надежность
Чего хотят пользователи? 
1. Скорость 
2. Надежность 
3. Безопасность
Чего хотят пользователи? 
1. Скорость 
2. Надежность 
3. Безопасность 
4. Удобство
Чего хотят пользователи? 
1. Скорость 
2. Надежность 
3. Безопасность 
4. Удобство 
5. ??? 
6. PROFIT!!!
Почему стало сложнее 
удовлетворить пользователя
Пользователей стало больше
Изменение инфраструктуры 
2000 2014 
Размеры кластеров < 100 нод > 1000 нод 
Время реакции секунды миллисекунды 
Стабильность 
работы 
95% 100% 
Объемы данных GBs TBs/PBs
Как мы привыкли разрабатывать
Как мы привыкли разрабатывать 
Spring 
Hibernate 
JPA 
JSF 
EJB 
Camel
Как мы привыкли разрабатывать 
Spring 
Hibernate 
JPA 
JSF 
EJB 
Camel 
Sys1 
Sys2 
JMS 
JMS
Как мы привыкли разрабатывать 
Spring 
Hibernate 
JPA 
JSF 
EJB 
Camel 
Sys1 
Sys2 
JMS 
JMS 
E 
S 
B 
JMS
Как мы привыкли разрабатывать 
Spring 
Hibernate 
JPA 
JSF 
EJB 
Camel 
Sys1 
Sys2 
JMS 
JMS 
E 
S 
B 
JMS 
Фрактал 
Фрактал
Что не так с нашей системой 
Spring 
Hibernate 
JPA 
JSF 
EJB 
Camel 
Sys1 
Sys2 
JMS 
JMS 
E 
S 
B 
JMS Медленно
Почему получается плохо
Почему получается плохо 
1. Мы используем подход к разработке не 
учитывающий современные реалии
Почему получается плохо 
1. Мы используем подход к разработке не 
учитывающий современные реалии 
2. Снижение требований к качеству кода в 
следствии увеличения вычислительных 
мощностей
Почему получается плохо 
1. Мы используем подход к разработке не 
учитывающий современные реалии 
2. Снижение требований к качеству кода в 
следствии увеличения вычислительных 
мощностей 
3. Junior-driven development 
4. etc…
Подходы к программированию
Подходы к программированию 
1. Процедурное программирование(40е)
Подходы к программированию 
1. Процедурное программирование(40е) 
2. Объектно-ориентированное 
программирование(70е-80е)
Подходы к программированию 
1. Процедурное программирование(40е) 
2. Объектно-ориентированное 
программирование(70е-80е) 
3. Функциональное программирование(50е, 
80е)
Подходы к программированию 
1. Процедурное программирование(40е) 
2. Объектно-ориентированное 
программирование(70е-80е) 
3. Функциональное программирование(50е, 
80е) 
4. Реактивное функциональное 
программирование(90е)
Java => Scala
Java and Scala 
Java Scala 
public final ≈ val 
public ≈ var 
POJO ≈ case class 
Singletone ≈ object 
System.out.println() ≈ println()
Как выглядит императивный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3
Как выглядит императивный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3 
a=2 
println(c)
Как выглядит императивный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3 
a=2 
println(c) //3
Как починить? 
var a = 1 
var b =2 
var c=a+b 
println(c) //3 
a=2 
println(c) //3
На вкус как боль...
Что такое реактивное 
программирование(РП)
Основные концепции РП 
1. Статические и динамические потоки данных
Основные концепции РП 
1. Статические и динамические потоки данных 
2. Автоматическое распространение изменений
Как выглядит рекативный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3
Как выглядит рекативный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3 
a=2
Как выглядит рекативный флоу 
var a = 1 
var b =2 
var c=a+b 
println(c) //3 
a=2 
println(c) //4
Что такое функциональное 
реактивное 
программирование(ФРП)
Что насчет флоу? 
F1() => F2() => F3(F4()) => …. => Fn()
Свойства реактивных приложений
Событийная-ориентированность
Что не так со старой
Что не так со старой 
1. На уровне API пропагандируется 
использование сайд-эффектов
Что не так со старой 
1. На уровне API пропагандируется 
использование сайд-эффектов 
2. Мы не можем создавать абстракции более 
высокого уровня
Что не так со старой 
1. На уровне API пропагандируется 
использование сайд-эффектов 
2. Мы не можем создавать абстракции более 
высокого уровня 
3. Callback hell
Что не так со старой 
1. На уровне API пропагандируется 
использование сайд-эффектов 
2. Мы не можем создавать абстракции более 
высокого уровня 
3. Callback hell 
4. Необходимость в самостоятельном 
управлении ресурсами
Как ФРП позволяет решить эти 
проблеммы
Новая событийная система 
1. Каждое событие - функция, элемент 
высшего уровня
Новая событийная система 
1. Каждое событие - функция, элемент 
высшего уровня 
2. Обработчики событий - функции, элементы 
высшего уровня
Новая событийная система 
1. Каждое событие - функция, элемент 
высшего уровня 
2. Обработчики событий - функции, элементы 
высшего уровня 
3. Комбинирование позволяет создавать 
абстракции более высокого уровня
Масштабируемость
Масштабируемость 
1. Вертикальная
Масштабируемость 
1. Вертикальная
Масштабируемость 
1. Вертикальная 
2. Горизонтальная
Отказоустойчивость
Отзывчивость
Почему эти принципы не 
серебряная пуля
Что все еще важно 
1. Алгоритмы
Что все еще важно 
1. Алгоритмы 
2. Грамотная архитектура приложения
Что все еще важно 
1. Алгоритмы 
2. Грамотная архитектура приложения 
3. Качество кода
Что все еще важно 
1. Алгоритмы 
2. Грамотная архитектура приложения 
3. Качество кода 
4. Высокий профессиональный уровень 
команды
Scala.Rx
Scala.Rx #1 
val a = Var(1) // 1 
val b = Var(2) // 2 
val c = Rx{ a() + b() } // 3 
val d = Rx{ c() * 5 } // 15 
val e = Rx{ c() + 4 } // 7 
val f = Rx{ d() + e() + 4 } // 26 
println(f()) // 26
Scala.Rx #1
Scala.Rx #1 
val a = Var(1) // 1 
val b = Var(2) // 2 
val c = Rx{ a() + b() } // 3 
val d = Rx{ c() * 5 } // 15 
val e = Rx{ c() + 4 } // 7 
val f = Rx{ d() + e() + 4 } // 26 
println(f()) // 26 
a() = 3 
println(f()) // 38
Scala.Rx #1
Scala.Rx #2 
val a = Var(1) 
var count = 0 
val o = Obs(a){ 
count = a() + 1 
} 
println(count) // 2
Scala.Rx #2
Scala.Rx #2 
val a = Var(1) 
var count = 0 
val o = Obs(a){ 
count = a() + 1 
} 
println(count) // 2 
a() = 4 
println(count) // 5
Scala.Rx #2
Scala.Rx #3 
val a = Var(1) 
var count = 0 
val o = a.foreach{ x => 
count = x + 1 
} 
println(count) // 2 
a() = 4 
println(count) // 5
Scala.Rx #4 
val a = Var(1) 
val b = Rx{ 2 * a() } 
var target = 0 
val o = Obs(b){ target = b() } 
println(target) // 2 
a() = 2 
println(target) // 4 
o.kill() 
a() = 3 
println(target) // 4
Scala.Rx #5 
val p = Promise[Int]() 
val a = Rx{ 
p.future 
}.async(10) 
println(a()) // 10
Scala.Rx #5 
val p = Promise[Int]() 
val a = Rx{ 
p.future 
}.async(10) 
println(a()) // 10 
p.success(5) 
println(a()) // 5
Scala.Rx 
и 
производительность
“I havent done much perf measurements at all =/ 
there is a unit test which would give you numbers.” 
Haoyi Li
Что дальше?
Дополнительная информация 
1. RxJava 
2. The Reactive Manifesto 
3. Deprecating the Observer Pattern 
4. Typesafe Activator 
5. Elm 
6. RxJS/Flapjax/Bacon.js/Kefir.js 
7. Tao Presentations
Questions?

More Related Content

Similar to Андрей Кравец Тема: "Пришло время быть реактивным, или..?"

2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят
2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят
2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едятHappyDev-lite
 
«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...MDDay_4
 
Денис Бесков. Как обеспечивать полноту требований
Денис Бесков. Как обеспечивать полноту требованийДенис Бесков. Как обеспечивать полноту требований
Денис Бесков. Как обеспечивать полноту требованийDenis Beskov
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)Ontico
 
Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)Alexander Babich
 
Введение в performance management
Введение в performance managementВведение в performance management
Введение в performance managementSQALab
 
Светлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной командеСветлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной командеSQALab
 
Процесс тестирования в распределенной команде
Процесс тестирования в распределенной командеПроцесс тестирования в распределенной команде
Процесс тестирования в распределенной командеSvetlana Fedyanina
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Andrey Listochkin
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
Методы обхода Web Application Firewall
Методы обхода Web Application FirewallМетоды обхода Web Application Firewall
Методы обхода Web Application FirewallDmitry Evteev
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25MoscowJS
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic appsDenis Izmaylov
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesAliaksandr Ikhelis
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовSQALab
 

Similar to Андрей Кравец Тема: "Пришло время быть реактивным, или..?" (20)

2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят
2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят
2017-03-26 02 Егор Непомнящих. Что такое web front end, и с чем его едят
 
«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...
 
Денис Бесков. Как обеспечивать полноту требований
Денис Бесков. Как обеспечивать полноту требованийДенис Бесков. Как обеспечивать полноту требований
Денис Бесков. Как обеспечивать полноту требований
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)
Масштабируемые кроссплатформенные веб-приложения / Илья Пухальский (Epam)
 
Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)
 
Введение в performance management
Введение в performance managementВведение в performance management
Введение в performance management
 
Светлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной командеСветлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной команде
 
Процесс тестирования в распределенной команде
Процесс тестирования в распределенной командеПроцесс тестирования в распределенной команде
Процесс тестирования в распределенной команде
 
Scrum Wars
Scrum WarsScrum Wars
Scrum Wars
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
Obzor 2013 presentation
Obzor 2013 presentationObzor 2013 presentation
Obzor 2013 presentation
 
Swp12 natalia zhelnova
Swp12 natalia zhelnovaSwp12 natalia zhelnova
Swp12 natalia zhelnova
 
Методы обхода Web Application Firewall
Методы обхода Web Application FirewallМетоды обхода Web Application Firewall
Методы обхода Web Application Firewall
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic apps
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
 

More from Ciklum Minsk

Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Ciklum Minsk
 
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...Ciklum Minsk
 
Николай Папирный Тема: "Java memory model для простых смертных"
Николай Папирный Тема: "Java memory model для простых смертных"Николай Папирный Тема: "Java memory model для простых смертных"
Николай Папирный Тема: "Java memory model для простых смертных"Ciklum Minsk
 
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"Александр Захаров Тема: "Domain Driven Design: проектирование по модели"
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"Ciklum Minsk
 
Александр Захаров "Использование EntityGraph в JPA 2.1"
Александр Захаров "Использование EntityGraph в JPA 2.1"Александр Захаров "Использование EntityGraph в JPA 2.1"
Александр Захаров "Использование EntityGraph в JPA 2.1"Ciklum Minsk
 
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"Ciklum Minsk
 

More from Ciklum Minsk (6)

Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
 
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...
Евгений Дрозд, Василий Сливка Тема: "Как тестировщику сделать счастливым Java...
 
Николай Папирный Тема: "Java memory model для простых смертных"
Николай Папирный Тема: "Java memory model для простых смертных"Николай Папирный Тема: "Java memory model для простых смертных"
Николай Папирный Тема: "Java memory model для простых смертных"
 
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"Александр Захаров Тема: "Domain Driven Design: проектирование по модели"
Александр Захаров Тема: "Domain Driven Design: проектирование по модели"
 
Александр Захаров "Использование EntityGraph в JPA 2.1"
Александр Захаров "Использование EntityGraph в JPA 2.1"Александр Захаров "Использование EntityGraph в JPA 2.1"
Александр Захаров "Использование EntityGraph в JPA 2.1"
 
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"
Антон Гордийчук Тема: "AngularJS — продвинутый HTML для web-приложений"
 

Андрей Кравец Тема: "Пришло время быть реактивным, или..?"

Editor's Notes

  1. Снижение требований к быстродействию кода, а не качеству. Быстрый код редко бывает читабельным.
  2. я переименовал бы этот слайд в “что не так с нынешней событийной ориентированностью”
  3. Все эти три пункта для меня совершенно не очевидны. Мне бы хотелось видеть примеры и более развернутое объяснение, что не так.
  4. Все эти три пункта для меня совершенно не очевидны. Мне бы хотелось видеть примеры и более развернутое объяснение, что не так.