APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING...

64
APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS - Connecting Single Page Applications to the Backend without Mess and Mayhem - HackITZ, November 2016 Dr. Thomas Schank Version 1.0.0

Transcript of APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING...

Page 1: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

APPLYINGFUNCTIONALREACTIVEPROGRAMMINGTOWRITEDYNAMICSERVER

BASEDWEB-APPLICATIONS-

ConnectingSinglePageApplicationstotheBackendwithoutMessandMayhem

-

HackITZ,November2016

Dr.ThomasSchankVersion1.0.0

Page 2: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Motivation1-Cider-CIperiodicallypullpage(!)andreplace

Page 3: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Knownaspjaxpjax=pushState+ajax

"pushState"⇒pulling

pjaxworksbygrabbinghtmlfromyourserverviaajaxandreplacingthecontentofacontaineron

yourpagewiththeajax'dhtml

Page 4: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

pjaxpro/conssimple,verylittleJavaScript

extendsserversiderendering

notsuitableforcomplexfrontend

frequentpullingcausesloadandtraffic

timelags

Page 5: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Goals1

maintainstateontheserver,

andpushitfromtheretothebrowserondemand

Page 6: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Motivation2-OO/MVCStyleinPivotal

⇒Reactwonthelpyouifyoumessupmanagingstate

Page 7: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DataBindingsandConnectingComponents

Page 8: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DataBindingsandConnectingComponents

Page 9: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DataBindingsandConnectingComponents

Page 10: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DataBindingsandConnectingComponents

Page 11: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Goal2

ensureconsistencyofstateeverywherebackend,frontend,components,…

Page 12: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Motivation3-Segregation

Page 13: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Thereisanunnaturalandunnecessarydividebetweenback-andfrontend.ThegapinMadekv3isnowbiggerasithaseverbeenbefore.

Page 14: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Thereisanunnaturalandunnecessarydividebetweenback-andfrontend.ThegapinMadekv3isnowbiggerasithaseverbeenbefore.

RailsandotherMVCFrameworks:conventionoverconfiguration

breaksdownwhenthingsgetcomplex

Page 15: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Thereisanunnaturalandunnecessarydividebetweenback-andfrontend.ThegapinMadekv3isnowbiggerasithaseverbeenbefore.

RailsandotherMVCFrameworks:conventionoverconfiguration

breaksdownwhenthingsgetcomplex

"Backend":LotsofRails+ARhackstowritecomplexSQLqueries.

Middle-Layer:lotsofcode(presentersetc.)ifyouwantrealseparation(asinMVC)

Page 16: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Frontend:(C)JSXsomeReactgoodness

XML/HTMLhardtoread

Templates

React = require('react')ReactDOM = require('react-dom')RailsForm = require('../lib/forms/rails-form.cjsx')

module.exports = React.createClass displayName: 'HeaderButton'

_onClick: (event) -> event.preventDefault() if @props.onAction @props.onAction(@props.asyncAction) return false

render: ({authToken, href, method, icon, title, name} = @props) -> method = 'post' if not method icon = 'icon-' + icon onClick = if @props.onAction and @props.asyncAction then @_onClick else null <RailsForm className='button_to' name='' method={method} action={href} authToken={authToken}> <button className="button" type="submit" title={title} onClick={onClick}> <i className={icon}></i> </button> {@props.children} </RailsForm>

Page 17: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Frontend:(C)JSX

TheDOM"isatree"!Encodeitessuchandyougetfullcode-andcomposability.

someReactgoodness

XML/HTMLhardtoread

Templates

React = require('react')ReactDOM = require('react-dom')RailsForm = require('../lib/forms/rails-form.cjsx')

module.exports = React.createClass displayName: 'HeaderButton'

_onClick: (event) -> event.preventDefault() if @props.onAction @props.onAction(@props.asyncAction) return false

render: ({authToken, href, method, icon, title, name} = @props) -> method = 'post' if not method icon = 'icon-' + icon onClick = if @props.onAction and @props.asyncAction then @_onClick else null <RailsForm className='button_to' name='' method={method} action={href} authToken={authToken}> <button className="button" type="submit" title={title} onClick={onClick}> <i className={icon}></i> </button> {@props.children} </RailsForm>

Page 18: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Goal3

uniformityclosethegapbetweenbackendandfrontend

Page 19: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

CoreProblem-Remedy-Roadmap

Page 20: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

TheCoreProblemmanagingstateovertimeandindifferentplaces

Page 21: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

ComingUpcompletelydifferentapproach

effective

veryefficient

impossibletocreatebugslikeseen

awesomedeveloperexperience

Page 22: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Roadmap1. basics

2. singlepageapplications

3. SPA+backend

4. consequencestodevelopers&architecture

Page 23: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

OnefurtherGoalInterestYOUforthestuff.

Catchattachedtoaparticulartechnology:

Clojure+ClojureScript

Page 24: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

FunctionalReactiveProgramming

Page 25: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Elliott,Conal;Hudak,Paul(1997),"FunctionalReactiveAnimation"

Thecombinationoffunctionalprogramming,andreactiveprogramming.

Page 26: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Elliott,Conal;Hudak,Paul(1997),"FunctionalReactiveAnimation"

What?

Thecombinationoffunctionalprogramming,andreactiveprogramming.

Thebasicideabehindreactiveprogrammingisthattherearecertaindatatypesthatrepresentavalue"overtime".Computationsthatinvolvethesechanging-over-timevalueswillthemselveshave

valuesthatchangeovertime.

Page 27: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

SpreadsheetProgramming

Page 28: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

StoringStatewithAtoms

Page 29: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

increaseanddecreaseexample: (def ^:dynamic db {:a 0 :b 0})

(doseq [_ (range 0 1000)] (def db {:a (inc (:a db)) :b (dec (:b db))}))

; (= db {:a 1000 :b -1000})

1234567

Page 30: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

increaseanddecreaseexample:

withthreads

ooooops

(def ^:dynamic db {:a 0 :b 0})

(doseq [_ (range 0 1000)] (def db {:a (inc (:a db)) :b (dec (:b db))}))

; (= db {:a 1000 :b -1000})

1234567

(def ^:dynamic db {:a 0 :b 0})

(doseq [_ (range 0 1000)] (future (def db {:a (inc (:a db)) :b (dec (:b db))})))

; .e.g. (= db {:a 598, :b -666})

12345678

Page 31: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

increaseanddecreaseexample:

withthreads

ooooopsTheabsenceofthreadsdoesnotsolvethestateproblem,itmakesitevenharder.

(def ^:dynamic db {:a 0 :b 0})

(doseq [_ (range 0 1000)] (def db {:a (inc (:a db)) :b (dec (:b db))}))

; (= db {:a 1000 :b -1000})

1234567

(def ^:dynamic db {:a 0 :b 0})

(doseq [_ (range 0 1000)] (future (def db {:a (inc (:a db)) :b (dec (:b db))})))

; .e.g. (= db {:a 598, :b -666})

12345678

Page 32: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

TheAtom (def db (atom {:a 0 :b 0})) (doseq [_ (range 0 1000)] (future (swap! db (fn [current] {:a (inc (:a current)) :b (dec (:b current))}))))

; (= @db {:a 1000, :b -1000})

123456789

10

Atomsprovideawaytomanageshared,synchronous,independentstate.TheintendeduseofatomistoholdoneofClojure’simmutabledata

structures.

Page 33: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

TheAtomcont.

Interestingnolockingtransactions,MVCC

Extremelyuseful

supportvalidators⇒schema

watchable

Page 34: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

ReactiveProgramming-Atoms-Reagent

Page 35: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

AtomsandReactiveProgrammingimagine:atom≅cellofaspreadsheet

(def a1 (atom 5)) (def a2 (atom 7)) (def a3 (reaction (+ @a1 @a2)))

123

Page 36: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

AtomsandReactiveProgrammingimagine:atom≅cellofaspreadsheet

a3isanatomvalueofa1ora2change⇒a3willgetupdated[^lazy][^reaction]evaluationcanbeeagerorlazy,dependingontheenvironmentandlibrary

(def a1 (atom 5)) (def a2 (atom 7)) (def a3 (reaction (+ @a1 @a2)))

123

Page 37: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

-

"MinimalisticReactforClojureScript"see

"ManagingstateinReagent"

Reagent

Page 38: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

SinglePageApplications

Weconsiderawebappwithoutdataexchangetoorfromtheserverfornow.

Single-PageApplications(SPAs)areWebappsthatloadasingleHTMLpageanddynamicallyupdatethatpageastheuserinteractswiththeapp...withoutconstantpagereloads.(ASP.NET)

Page 39: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

re-frameisapatternforwritingSPAsinClojureScript,usingReagent.

re-frame

"It'sMVC,Jim,butnotasweknowit".(re-frame)

Page 40: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

re-frameisapatternforwritingSPAsinClojureScript,usingReagent.

Honestly,itisnotMVC!

Youwillfindthepatternsusedinre-frameinothertalks,libraries,frameworks.Itisallovertheplace.

Youshouldreadthere-framedocumentation.Itiswittyinallofitsmeanings.

re-frame

"It'sMVC,Jim,butnotasweknowit".(re-frame)

Page 41: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

re-framekeyfeaturesOneandonlyonedatabase!

DataflowsfromthedatabasetotheDOM.

Eventscausethedatabasetochange.

EventsnevermanipulatetheDOMdirectly.

noshortcuts!

Page 42: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

OneDatabase?Technically,youcanhavemultipledatabases.

Theirsignalgraphmustformanacyclicdirectedgraph.

Makesureyoudon'tshortcut.TheDomisalways"thesink".

Donotcomplicatethingsunnecessarily⇒justuseonedatabase!

Page 43: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

OneDatabase?Technically,youcanhavemultipledatabases.

Theirsignalgraphmustformanacyclicdirectedgraph.

Makesureyoudon'tshortcut.TheDomisalways"thesink".

Donotcomplicatethingsunnecessarily⇒justuseonedatabase!Theserulesarelessoutofatechnicalnecessity.Theyhelpustoavoidunnecessarycomplexityandfocusonthefeatures.

Page 44: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DefineaSchemaandValidate! (ns cider-ci.repository.fetch-and-update.db-schema (:require [schema.core :as schema])) (def schema {:last_fetched_at (schema/maybe org.joda.time.DateTime) :last_error (schema/maybe String) :last_error_at (schema/maybe org.joda.time.DateTime) :updated_at org.joda.time.DateTime :state (schema/enum "error" "fetching" "initializing" "ok" "waiting")

:pending? Boolean })

123456789

10

Page 45: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

DefineaSchemaandValidate!

e.g.useitlikethis

worksuniformlyinClojureandClojureScript.

(ns cider-ci.repository.fetch-and-update.db-schema (:require [schema.core :as schema])) (def schema {:last_fetched_at (schema/maybe org.joda.time.DateTime) :last_error (schema/maybe String) :last_error_at (schema/maybe org.joda.time.DateTime) :updated_at org.joda.time.DateTime :state (schema/enum "error" "fetching" "initializing" "ok" "waiting")

:pending? Boolean })

123456789

10

(def fetch-and-update-db (atom {:last_fetched_at nil :last_error nil :last_error_at nil :updated_at (time/now) :pending? true :state "initializing" } :validator #(schema/validate schema %)))

12345678

plumatic/schema

Page 46: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

SPAsinteractingwiththeServerAtleastapartoftheroutesareSPAs.

Updatedstateontheserverneedstobereflectedontheclient.

⇒extendingthere-frameconcept

Page 47: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications
Page 48: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications
Page 49: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Butthisisnot"webscale"

No,butonhowmanycoresdoesyourapplicationrunrightnow?

Page 50: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications
Page 51: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

PushforthechannelServer→ClientprobablyWebSocketspushdiffs!

Wepushthestateinthespiritofreactiveprogramming.

nothingelse,noRPCstyle,nothing!

⇒WebSocketsvia seemtoworkratherwellptaoussanis/sente

Page 52: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications
Page 53: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

RESTfortheChannelClient→ServerWecanusethesameroutesfortheAPIandthefrontend!

willsaveyouatonofwork

enablesacertainkindofarchitecture

Page 54: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

WedoNotSyncTwo(n-)waysyncingdataisveryhard/expensivetoimplement.Sowe

justdonotdoit.

Page 55: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Benefits-DeveloperExperience-Architecture

Page 56: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

♻UniformProgrammingClojure+ClojureScript

Ourprimarygoalistoimplementfeatures;nottowriteHTML,React,SQL,ActiveRecord,…

Traditionalframeworksfosterseparationbytechnologyandoverheadincommunication.

samecodeontheserverandclient(almost)

itworks,actuallyitisawesome!

e.g.durationparserandvalidatorinCider-CI

Page 57: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

UniformStructuresItisalljustdata-treesmostly.

DOM ,

SQL

Lisp'shomoiconicityreallyflieshere!

weavejester/hiccup reagent

kk/honeysql

Page 58: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

ClojureScriptProgrammingExperience

sourcemaps

interactiveprogrammingwith

Demo?

ItisreallybetterthanwritingpureJavaScript!

bhauman/lein-figwheel

Page 59: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

ArchitectureMostapplicationhaveascrumdriven(i.e.nonatall)architecture.

Onthenextlevelthearchitecturesaremostlytechnologydriven.

Weshouldincludethefeaturesanddemandsinourarchitectures.

Page 60: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

FeatureDrivenArchitecture

Cider-CIArchitectureRefactoring

⇒cheaperandeasierchangesandrefactorings

Page 61: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

FinalWords

Page 62: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Whyshouldyoucare?JavaScripthastomanygotchasasageneralplatformontheserver.

Ruby(onRails),PHP,Python,…,willneverruninthebrowserforreal.Theyhavealsotoomanyweaknessesontheserver.

Page 63: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

Whyshouldyoucare?JavaScripthastomanygotchasasageneralplatformontheserver.

Ruby(onRails),PHP,Python,…,willneverruninthebrowserforreal.Theyhavealsotoomanyweaknessesontheserver.

Imho,wehavetomoveandthefuturewillbeeither:

TheenterprisestackAngular2/3+servertechnologyX,orthedistinguishablealternativeClojure+ClojureScript.

Whatdoyouchoose?

Page 64: APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE … · APPLYING FUNCTIONAL REACTIVE PROGRAMMING TO WRITE DYNAMIC SERVER BASED WEB-APPLICATIONS-Connecting Single Page Applications

THEENDThankyou!