SlideShare une entreprise Scribd logo
1  sur  61
Télécharger pour lire hors ligne
Дизайн больших приложений в ФП
Александр Гранин
graninas@gmail.com
О себе
2
● Продолжающий хаскеллист, исследователь
● LambdaNsk - ФП-сообщество Новосибирска
● Статьи на Хабре о Haskell, о дизайне в ФП
● Haskell pet-projects
● Работаю в Kaspersky Lab (C++, C#)
О чем будем говорить
● Проектирование в ФП
● Элементы функционального дизайна
● Кому он в ФП нужен, этот ваш дизайн?
3
4
Проектирование в ФП
5
6
UML
7
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
8
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
9
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
10
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
MONADS
STATE State monad
IO IO monad
LIST List monad
ID Identity monad
RWS Read-Write-State monad
Laziness
Immutability
Combinators
Abstraction
D.S.L.
High Order
Functions
11
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
MONADS
STATE State monad
IO IO monad
LIST List monad
ID Identity monad
RWS Read-Write-State monad
Laziness
Immutability
Combinators
Abstraction
D.S.L.
High Order
Functions
Что такое “хороший дизайн”?
12
Задача дизайна - уменьшить сложность
13
Дизайн в ФП?
14
SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Inversion of
Control
15
Архитектура,
интерфейсы
Типы данных,
модули
Код
Функциональные
требования
Нефункциональные
требования
Модель предметной
области
Сценарии
использования
Сбор и анализ
требований
Реализация
требований
16
ООП + UML
= ОК
17
ФП + UML
18
ФП: сбор и анализ требований
Mind Maps Use Cases (UML)
19
ФП: проектирование архитектуры
Карта
необходимости
Ассоциативная
карта
элементов
Карта
архитектуры
подсистем
20
Карта необходимости
● Крупные блоки
● Базовые требования
● Без связей
● Без структуры
21
AI
22
AI
Path
Finding
Game
Storage
Analysis
23
AI
Path
Finding
Game
Storage
Heuristics
Analysis
Game
Logic
A*
24
AI
Path
Finding
Game
Storage
Heuristics
Prediction
Analysis
Game
Logic
A* Debug
View
25
Path
Finding
Game
Storage
Heuristics
Prediction
Analysis
Game
Logic
A*
L
SS
C
SS
SS
GL
GL
GL
GL
GL
GL
GL=Game Logic Layer
V=View Layer
L=Library
C=Concept
Debug
View V
AI
C
GL
26
Карта элементов (ассоциативная)
● Все возможности
● Ассоциативные связи
● “Поток сознания” (!)
● Без структуры (!!)
● Легенда
Библиотеки, слои,
подсистемы, концепты,
данные, объекты, типы
27
Path
Finding
Game
Storage
Heuristics
Prediction
Analysis
Game
Logic
A*
L
SS
C
SS
SS
GL
GL
GL
GL
GL
GL
GL=Game Logic Layer
V=View Layer
L=Library
C=Concept
Debug
View V
AI
C
GL
28
Path
Finding
Game
Storage
Heuristics
Prediction
Analysis
Game
Logic
SS
C
SS
SS
A*
L
GL
GL
GL
GL
GL
GL
GL=Game Logic Layer
V=View Layer
L=Library
C=Concept
Debug
View V
AI
29
Game
Storage
Heuristics
PredictionAnalysis
Game
Logic
A*
Path
Finding Debug
View???
AI
30
Карта архитектуры подсистем
31
Карта архитектуры подсистем
● Упорядоченность
● Слои: IO / Pure / Business Logic
● Концепция + реализация
● Четкие ациклические связи
● Границы слоев
● Границы подсистем
● DSL, eDSL, интерпретаторы
● Функциональные идиомы
Game State
Storage
Monad.STM
Концепция
Реализация
Business
Logic Layer
Application
Layer
View Layer
32
Элементы функционального дизайна
33
View Layer
Subsystem
Business
Logic Layer
Subsystem
1. Контроль эффектов, связь подсистем
● FRP / Event Bus, Reactive Scenarios
Event Bus
FRP Library
Application
Layer
Subsystem
Interaction Logic
(FRP Scenarios)
34
1. Контроль эффектов, связь подсистем
● FRP / Event Bus, Reactive Scenarios
● Command eDSL (ADT), Command Interpreters
● Monad.Free, Free eDSL, Free Scenarios, Free Interpreters
2. Границы слоев / подсистем
35
Command
Interpreter
eDSL
Logic behind
Event Bus
FRP Library
Command
Interpreter
eDSL
Logic behind
Event
Mapper
Event
Mapper
36
● Command eDSL (ADT), Command Interpreters
● Monad.Free, Free eDSL, Scenarios, Interpreters
2. Границы слоев / подсистем
37
● Command eDSL (ADT), Command Interpreters
● Monad.Free, Free eDSL, Scenarios, Interpreters
2. Границы слоев / подсистем
38
3. Модель данных
● Монолитная модель - объекты описываются типами 1:1
● Комбинаторная - объекты комбинируются из частей (свойств)
Object 4 Object 5 Object 6
Object 2 Object 3
Object 1
Object 1
Object 2
Object 3
Object 4
Property 1
Property 3
Property 4
Property 2
Property 5
39
3. Модель данных
● Монолитная модель - объекты описываются типами 1:1
● Комбинаторная - объекты комбинируются из частей (свойств)
40
3. Модель данных
● Монолитная модель - объекты описываются типами 1:1
● Комбинаторная - объекты комбинируются из частей (свойств)
41
● Линзы
4. Трансформация модели данных
Lens 2 Lens 3Lens 1
42
● Линзы
4. Трансформация модели данных
● Наивный IoC - функции высших порядков
● Monad.State Dependency Injection
5. Inversion of Control, внедрение зависимостей
43
● Наивный IoC - функции высших порядков
● Monad.State Dependency Injection
5. Inversion of Control, внедрение зависимостей
44
● Наивный IoC - функции высших порядков
● Monad.State Dependency Injection
5. Inversion of Control, внедрение зависимостей
45
46
Кому он в ФП нужен, этот ваш дизайн?
47
Кому он нужен, этот ваш ФП-дизайн?
enterprise
48
Разработчики
языков,
библиотек
49
Разработчики
языков,
библиотек
Программисты -
академики
50
Разработчики
языков,
библиотек
Программисты -
академики
Программисты -
практики
51
Разработчики
языков,
библиотек
Программисты -
академики
Пуристы, борцы за чистоту рядов,
недоброжелатели
Программисты -
практики
52
Разработчики
языков,
библиотек
Программисты -
академики
Программисты -
практики
Манагеры
Большой
бизнес
Пуристы, борцы за чистоту рядов,
недоброжелатели
Оставшиеся вопросы
53
● Типы данных
● Обработка ошибок
● Работа с внешними API
● Важные структуры данных
● UI
● Базы данных
● Потоковый дизайн
● ...
Полезные источники
54
Scott Wlaschin
● How to design and code a complete program
● Functional Programming Patterns
● Railway Oriented Programming
Александр Гранин
● Дизайн и архитектура в ФП
Спасибо за внимание!
Александр Гранин
graninas@gmail.com
Вопросы?
● Command eDSL (ADT), Command Interpreters
● Monad.Free, Free eDSL, Scenarios, Interpreters
1. Границы слоев / подсистем
56
Command
Interpreter
Application
IO
eDSL
Logic behind
Logic behind
+ Низкая связанность (Low Coupling)
+ Чистота, декларация побочных эффектов
+ Смена подсистемы == смена интерпретатора
+ Разное поведение == разные сценарии
+ Функциональное тестирование подсистем
+ Мокирование == замена интерпретатора
- Дизайн и поддержка eDSL на ADT
2. Взаимодействие подсистем, контроль эффектов
57
● FRP / Event Bus, Reactive Scenarios
+ Низкая связанность (Low Coupling)
+ Независимость подсистем
+ Контроль побочных эффектов
+ Разное взаимодействие == разные сценарии
+ Сценарии: Arrows / Monads / Applicatives
- Зоопарк и сложность FRP-библиотек (Haskell)
- Много возможных моделей Event Flow
- Трудно тестировать FRP-сценарии
58
● Монолитная - объекты описываются типами 1:1
+ Algebraic Data Types
+ Проста в понимании, реализации
+ Pattern Matching
+ Подходит для маленькой предметной области
- Сложность растет экспоненциально с ростом функциональности
- Монолитный код
- Зависимость кода от внутренностей модели
- Трудно адаптировать под изменяющиеся требования
3. Монолитная модель данных
4. Комбинаторная модель данных
59
● Комбинаторная - объекты комбинируются из частей (свойств)
+ Богатые возможности комбинаторного подхода
+ Проще адаптировать под изменяющиеся требования
+ Легко адресовать функциональность к частям модели
+ Сложность растет линейно с ростом функциональности
+ Подходит для большой и сложной предметной области
- Более сложный код обвязки (создание / изменение объектов и т.д.)
- Трудно выделить правильные комбинатоы / свойства
5. Трансформация модели данных
60
● Линзы
+ Работа со структурами любой сложности
+ Богатые возможности по трансформации и запросам к данным
+ Компактный код
- Сложность библиотек для линз (Haskell)
- Вопросы производительности
● Наивный IoC - функции высших порядков
● Monad.State Dependency Injection
6. Inversion of Control, внедрение зависимостей
61
+ Код “сверху-вниз”, от общих функций к частным
+ IoC - привычный способ мышления
+ Подходит для небольших частей / программ
- State & Dependency Injection - Not a FP Way
- “Лобовые” решения типичных задач
- Нет места функциональным идиомам

Contenu connexe

Tendances

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.Igor Shkulipa
 

Tendances (20)

Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
PascalABC.NET 2015-2016
PascalABC.NET 2015-2016PascalABC.NET 2015-2016
PascalABC.NET 2015-2016
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
Python
PythonPython
Python
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 

Similaire à Дизайн больших приложений в ФП

Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages_ymn
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPAlexander Lisachenko
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
Aspect-Oriented Programming in PHP
Aspect-Oriented Programming in PHPAspect-Oriented Programming in PHP
Aspect-Oriented Programming in PHPAlexander Lisachenko
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Слоистая архитектура
Слоистая архитектураСлоистая архитектура
Слоистая архитектураyiiconf
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...Iosif Itkin
 
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...Alexey Neznanov
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseAlexander Granin
 
Развертывание алгоритмов на ПЛИС
Развертывание алгоритмов на ПЛИСРазвертывание алгоритмов на ПЛИС
Развертывание алгоритмов на ПЛИСMATLAB
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 

Similaire à Дизайн больших приложений в ФП (20)

Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Aspect-Oriented Programming in PHP
Aspect-Oriented Programming in PHPAspect-Oriented Programming in PHP
Aspect-Oriented Programming in PHP
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
Netpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHPNetpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHP
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Слоистая архитектура
Слоистая архитектураСлоистая архитектура
Слоистая архитектура
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
 
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...
Неотрефлексированный сдвиг парадигмы: от поколений языков программирования вы...
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом Enterprise
 
Развертывание алгоритмов на ПЛИС
Развертывание алгоритмов на ПЛИСРазвертывание алгоритмов на ПЛИС
Развертывание алгоритмов на ПЛИС
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 

Plus de Alexander Granin

Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stmAlexander Granin
 
Hierarchical free monads and software design in fp
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fpAlexander Granin
 
Final tagless vs free monad
Final tagless vs free monadFinal tagless vs free monad
Final tagless vs free monadAlexander Granin
 
The present and the future of functional programming in c++
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++Alexander Granin
 
О разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentAlexander Granin
 
Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Alexander Granin
 
Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Alexander Granin
 
Закон Деметры / Demetra's law
Закон Деметры / Demetra's lawЗакон Деметры / Demetra's law
Закон Деметры / Demetra's lawAlexander Granin
 
Design of big applications in FP
Design of big applications in FPDesign of big applications in FP
Design of big applications in FPAlexander Granin
 
GitHub - зеркало разработчика
GitHub - зеркало разработчикаGitHub - зеркало разработчика
GitHub - зеркало разработчикаAlexander Granin
 
The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++Alexander Granin
 
Functional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskFunctional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskAlexander Granin
 
Transition graph using free monads and existentials
Transition graph using free monads and existentialsTransition graph using free monads and existentials
Transition graph using free monads and existentialsAlexander Granin
 
Software transactional memory. pure functional approach
Software transactional memory. pure functional approachSoftware transactional memory. pure functional approach
Software transactional memory. pure functional approachAlexander Granin
 
Вы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPВы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPAlexander Granin
 
Functional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsFunctional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsAlexander Granin
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Alexander Granin
 
Линзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиЛинзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиAlexander Granin
 
Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Alexander Granin
 

Plus de Alexander Granin (20)

Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stm
 
Hierarchical free monads and software design in fp
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fp
 
Final tagless vs free monad
Final tagless vs free monadFinal tagless vs free monad
Final tagless vs free monad
 
Monadic parsers in C++
Monadic parsers in C++Monadic parsers in C++
Monadic parsers in C++
 
The present and the future of functional programming in c++
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++
 
О разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop development
 
Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...
 
Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...
 
Закон Деметры / Demetra's law
Закон Деметры / Demetra's lawЗакон Деметры / Demetra's law
Закон Деметры / Demetra's law
 
Design of big applications in FP
Design of big applications in FPDesign of big applications in FP
Design of big applications in FP
 
GitHub - зеркало разработчика
GitHub - зеркало разработчикаGitHub - зеркало разработчика
GitHub - зеркало разработчика
 
The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++
 
Functional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskFunctional programming in C++ LambdaNsk
Functional programming in C++ LambdaNsk
 
Transition graph using free monads and existentials
Transition graph using free monads and existentialsTransition graph using free monads and existentials
Transition graph using free monads and existentials
 
Software transactional memory. pure functional approach
Software transactional memory. pure functional approachSoftware transactional memory. pure functional approach
Software transactional memory. pure functional approach
 
Вы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPВы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FP
 
Functional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsFunctional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonads
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
 
Линзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиЛинзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция данными
 
Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)
 

Дизайн больших приложений в ФП