Upload
andrii-kravets
View
45
Download
0
Embed Size (px)
Citation preview
План1. Чего хотят пользователи
2. Как изменились требования к программным
продуктам
3. Почему стоит изменить подход к разработке
4. Как реактивное программирование может
нам помочь
5. Тулы
Изменение инфраструктуры
2000 2014
Размеры кластеров < 100 нод > 1000 нод
Время реакции секунды миллисекунды
Стабильность
работы
95% 100%
Объемы данных GBs TBs/PBs
Как мы привыкли разрабатывать
Spring
Hibernate
JPA
JSF
EJB
Camel
Sys1
Sys2
JMS
JMS
E
S
B
JMS
Фрактал
Фрактал
1. Мы используем подход к разработке не
учитывающий современные реалии
2. Снижение требований к качеству кода в
следствии увеличения вычислительных
мощностей
Почему получается плохо
1. Мы используем подход к разработке не
учитывающий современные реалии
2. Снижение требований к качеству кода в
следствии увеличения вычислительных
мощностей
3. Junior-driven development
4. etc…
Почему получается плохо
Подходы к программированию
1. Процедурное программирование(40е)
2. Объектно-ориентированное
программирование(70е-80е)
Подходы к программированию
1. Процедурное программирование(40е)
2. Объектно-ориентированное
программирование(70е-80е)
3. Функциональное программирование(50е,
80е)
Подходы к программированию
1. Процедурное программирование(40е)
2. Объектно-ориентированное
программирование(70е-80е)
3. Функциональное программирование(50е,
80е)
4. Реактивное функциональное
программирование(90е)
Java and Scala
Java Scala
public final ≈ val
public ≈ var
POJO ≈ case class
Singletone ≈ object
System.out.println() ≈ println()
Основные концепции РП
1. Статические и динамические потоки данных
2. Автоматическое распространение изменений
Что не так со старой
1. На уровне API пропагандируется
использование сайд-эффектов
2. Мы не можем создавать абстракции более
высокого уровня
Что не так со старой
1. На уровне API пропагандируется
использование сайд-эффектов
2. Мы не можем создавать абстракции более
высокого уровня
3. Callback hell
Что не так со старой
1. На уровне API пропагандируется
использование сайд-эффектов
2. Мы не можем создавать абстракции более
высокого уровня
3. Callback hell
4. Необходимость в самостоятельном
управлении ресурсами
Новая событийная система
1. Каждое событие - функция, элемент
высшего уровня
2. Обработчики событий - функции, элементы
высшего уровня
Новая событийная система
1. Каждое событие - функция, элемент
высшего уровня
2. Обработчики событий - функции, элементы
высшего уровня
3. Комбинирование позволяет создавать
абстракции более высокого уровня
1. Алгоритмы
2. Грамотная архитектура приложения
3. Качество кода
4. Высокий профессиональный уровень
команды
Что все еще важно
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
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
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
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 #3
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 #4
val p = Promise[Int]()
val a = Rx{
p.future
}.async(10)
println(a()) // 10
p.success(5)
println(a()) // 5
Scala.Rx #5
“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
Дополнительная информация