116
Functional and Reactive programming using Facebook's React and Appian's SAIL January 17th, 2017 Carlos Aguayo Director, Software Development

Functional and Reactive programming using Facebook's React ...6.148.scripts.mit.edu/2017/pages/lectures/WEBday5_appianreact.pdf · Functional and Reactive programming using Facebook's

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Functional and Reactive programming using Facebook's React and Appian's SAIL

January 17th, 2017

Carlos Aguayo Director, Software Development

◎ Appian○ 12 years○ Director, Software Development○ Front End Developer○ SAIL patent

◎ Georgia Tech○ Masters student○ Computer Science○ Machine Learning specialization

◎ linkedin.com/in/carlosaguayo◎ @carlosaguayo81

Hello!I am Carlos Aguayo

What is

● Think about how complex building a web application can be.

● Think about how complex building a web application can be.○ Then make it robust

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful○ iPhone, iPad, Android

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful○ iPhone, iPad, Android○ It needs to be easy to code

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful○ iPhone, iPad, Android○ It needs to be easy to code○ We need to be able to change it quickly

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful○ iPhone, iPad, Android○ It needs to be easy to code○ We need to be able to change it quickly○ It can't be expensive

● Think about how complex building a web application can be.○ Then make it robust ○ And scalable ○ And fast○ Multiple servers○ It needs to be secure○ It needs to be usable○ It needs to be beautiful○ iPhone, iPad, Android○ It needs to be easy to code○ We need to be able to change it quickly○ It can't be expensive○ And we want it now!

At this lecture, you will:

1. Learn about programming paradigms for building modern UIs1.1. Reactive Programming1.2. Functional Programming

2. See an example of how to apply these techniques

React is a declarative, efficient, and flexible JavaScript library for building user interfaces.

https://facebook.github.io/react/

<HelloWorld />

<div> <h1>Hello World!</h1></div>

https://facebook.github.io/react/

<HelloWorld name="MIT"/>

<div> <h1>Hello {this.props.name}!</h1></div>

https://facebook.github.io/react/

<HelloWorld name="MIT"/>

<div> <h1>Hello {this.props.name}!</h1></div>

https://facebook.github.io/react/

<HelloWorld name="MIT"/>

<div> <h1>Hello {this.props.name}!</h1></div>

https://facebook.github.io/react/

<HelloWorld name="MIT"/>

<div> <h1>Hello {this.props.name}!</h1></div>

https://facebook.github.io/react/

Hello MIT !

State- name: MIT

https://facebook.github.io/react/

Hello MIT !

Change Name: __MIT__

State- name: MIT

https://facebook.github.io/react/

Hello MIT !

Change Name: __Carlos__

State- name: MIT

https://facebook.github.io/react/

Hello MIT !

Change Name: __Carlos__

State- name: Carlos

https://facebook.github.io/react/

Hello Carlos !

Change Name: __Carlos__

State- name: Carlos

https://facebook.github.io/react/

First component: a Square

Needs to:

https://facebook.github.io/react/tutorial/tutorial.html

First component: a Square

First component: a Square

Needs to:1. Be able to display an 'X' or an 'O'

https://facebook.github.io/react/tutorial/tutorial.html

First component: a Square

First component: a Square

Needs to:1. Be able to display an 'X' or an 'O'2. Report whenever it gets clicked

https://facebook.github.io/react/tutorial/tutorial.html

First component: a Square

https://facebook.github.io/react/tutorial/tutorial.html

First component: a SquareFirst component: a Square

Needs to:1. Be able to display an 'X' or an 'O'2. Report whenever it gets clicked

https://facebook.github.io/react/tutorial/tutorial.html

First component: a SquareFirst component: a Square

Needs to:1. Be able to display an 'X' or an 'O'2. Report whenever it gets clicked

Second component: a Board

Needs to:1. Render 9 Squares

https://facebook.github.io/react/tutorial/tutorial.html

Second component: a Board

Needs to:1. Render 9 Squares2. Each square with a given value

https://facebook.github.io/react/tutorial/tutorial.html

https://facebook.github.io/react/tutorial/tutorial.html

Second component: a Board

Needs to:1. Render 9 Squares2. Each square with a given value3. Report whenever one of them gets clicked with its

position

https://facebook.github.io/react/tutorial/tutorial.html

Second component: a Board

Needs to:1. Render 9 Squares2. Each square with a given value3. Report whenever one of them gets clicked with its

position

https://facebook.github.io/react/tutorial/tutorial.html

Second component: a Board

Needs to:1. Render 9 Squares2. Each square with a given value3. Report whenever one of them gets clicked with its

position

https://facebook.github.io/react/tutorial/tutorial.html

Second component: a Board

Needs to:1. Render 9 Squares2. Each square with a given value3. Report whenever one of them gets clicked with its

position

Third component: a Game!

Needs to:1. Render a Board

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves

https://facebook.github.io/react/tutorial/tutorial.html

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves 5. Tell if someone has won

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves 5. Tell if someone has won

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves 5. Tell if someone has won

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves 5. Tell if someone has won

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

https://facebook.github.io/react/tutorial/tutorial.html

Third component: a Game!

Needs to:1. Render a Board2. Keep track of step number3. Keep track of who is next4. Keep track of moves 5. Tell if someone has won

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

Represent each state as a list of 'X' and 'O'

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

Represent each state as a list of 'X' and 'O'

'X', 'O', null,'O', 'X', null,null, null, 'X'

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

Every time the user clicks, we are adding an entry into our history.

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

history = [ [null, null, null, null, null, null, null, null, null]]

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

history = [ [null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, 'X']]

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

history = [ [null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, 'X'], [null, null, null, 'O', null, null, null, null, 'X']]

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

history = [ [null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, 'X'], [null, null, null, 'O', null, null, null, null, 'X'], [null, null, null, 'O', 'X', null, null, null, 'X']]

https://facebook.github.io/react/tutorial/tutorial.html

State- What step am I in? (stepNumber)- Who's next? (xIsNext)- Move history (history)

https://facebook.github.io/react/tutorial/tutorial.html

Let's play Tic-Tac-Toe!

React.JS is just a view layer.

Everything else is just details and better control over components:1. How to mount and

dismount2. JavaScript ES63. etc.

https://facebook.github.io/react/tutorial/tutorial.html

React:

● Handles plumbing for you

○ Does all the data binding

● It's fast and extremely efficient!

● It knows exactly what to render and how to render.

● Simple is beautiful!

1. Start With A Mock

https://facebook.github.io/react/tutorial/tutorial.html

1. Start With A Mock

2. Break The UI Into A Component Hierarchy

https://facebook.github.io/react/tutorial/tutorial.html

1. Start With A Mock

2. Break The UI Into A Component Hierarchy

3. Build A Static Version

https://facebook.github.io/react/docs/thinking-in-react.html

1. Start With A Mock

2. Break The UI Into A Component Hierarchy

3. Build A Static Version

4. Identify the state

https://facebook.github.io/react/docs/thinking-in-react.htmlhttps://facebook.github.io/react/docs/thinking-in-react.html

1. Start With A Mock

2. Break The UI Into A Component Hierarchy

3. Build A Static Version

4. Identify the state

5. Identify where it should live

https://facebook.github.io/react/docs/thinking-in-react.html

1. Start With A Mock

2. Break The UI Into A Component Hierarchy

3. Build A Static Version

4. Identify the state

5. Identify where it should live

6. Win!

var a = 1;var b = 2;

var c = a + b;

// c equals to 3

b = 3;

// is c quals now to 4?

var a = 1;var b = 2;

var c = a + b;

// c equals to 3

b = 3;

// is c quals now to 4?

Imperative Programming

Hello MIT !

Change Name: __MIT__

State- name: MIT

Hello MIT !

Change Name: __MIT__

State- name: MIT

Reactive programming is a programming paradigm oriented around data flows and the propagation of change.

This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.

Programming with asynchronous data streams

Programming with asynchronous data streams

You don't really control when and where for data flows.

Programming with asynchronous data streams

You don't really control when and where for data flows.

Appian SAIL: Functional Reactive Programming

load(

first: "John",

last: "Smith",

with(

display: lower(concat(first, ".", last)),

{

a!textField(label: "First", value: first, saveInto: first),

a!textField(label: "Last", value: last, saveInto: last),

a!textField(label: "Display", value: display, readOnly: true)

}

)

)

Appian SAIL: Functional Reactive Programming

first: "John",

last: "Smith",

display: "john.smith"

first: "John",

last: "Doe",

display: "john.smith"

first: "John",

last: "Doe",

display: "john.doe"

Appian SAIL: Functional Reactive Programming

Original Context

first: "John"last: "Smith"username: "john.smith"

Evaluate Expression for Context & UI

Appian SAIL: Functional Reactive Programming

Original Context

Evaluate Expression for Context & UI

Client Renders UI

first: "John"last: "Smith"username: "john.smith"

Appian SAIL: Functional Reactive Programming

Original Context

Evaluate Expression for Context & UI

Client Renders UI

User Interacts with UI

first: "John"last: "Smith"username: "john.smith"

Appian SAIL: Functional Reactive Programming

Original Context

Evaluate Expression for Context & UI

Client Renders UI

User Interacts with UI

Update Context

first: "John"last: "Smith"username: "john.smith"

last: "Doe"

Appian SAIL: Functional Reactive Programming

Original Context

Evaluate Expression for Context & UI

Client Renders UI

User Interacts with UI

Update Context

first: "John"last: "Smith"username: "john.smith"

last: "Doe"

Appian SAIL: Functional Reactive Programming

Original Context

Evaluate Expression for Context & UI

Client Renders UI

User Interacts with UI

Update Context

first: "John"last: "Smith"username: "john.smith"

last: "Doe"

Functional Programming

Functional Programming

One typically thinks of functions as mathematical operations.

Functional Programming

add(a, b) = f(a, b) { a + b; }

add(1, 2) = 3add(2, 3) = 5

One typically thinks of functions as mathematical operations.

Functional Programming

How about a function to define a User Interface?

Functional Programming

How about a function to define a User Interface?

a!textField(label: "First", value: first, saveInto: first)

Functional Programming

a!textField(label: "First", value: first, saveInto: first)

How about a function to define a User Interface?

Functional Programming

<HelloWorld name="MIT"/>

<div> <h1>Hello {this.props.name}!</h1></div>

https://facebook.github.io/react/

How about a function to define a User Interface?