everything is composable (victor martins)

109
Everything is composable

Upload: concrete

Post on 15-Mar-2018

96 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Everything is Composable (Victor Martins)

Everything is composable

Page 2: Everything is Composable (Victor Martins)

Hello!I am Victor Igor

You can find me at @victorvoid

Page 3: Everything is Composable (Victor Martins)

1.Programming paradigms

A “new” perspective on modeling the flow of your software.

Page 4: Everything is Composable (Victor Martins)

“Na prática, cada paradigma vem com a sua própria maneira de pensar, e há problemas para os quais é a melhor abordagem.

Page 5: Everything is Composable (Victor Martins)

Programming paradigms

◍ Functional programming◍ Object-oriented programming◍ Logic programming◍ Symbolic programming

Page 6: Everything is Composable (Victor Martins)

Composability The essence of software development is composition.

Page 7: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

Page 8: Everything is Composable (Victor Martins)

Composability

const doin_Thangs = str => _.chain(str) .words() .groupBy(s => s.length) .orderBy(x => x.length) .take(2) .flatten() .value()

Page 9: Everything is Composable (Victor Martins)

Composability

const reactiveUpInHere = el => fromEvent(el, 'keyup') .map(e => e.target.value) .filter(text => text.length > 2) .throttle(500) .distinctUntilChanged()

Page 10: Everything is Composable (Victor Martins)

Composability

(->> (range 1000000000000000000) (filter even?) (map inc) (take 5) (partition 2 1)) ;;=> ((1 3) (3 5) (5 7) (7 9))

Page 11: Everything is Composable (Victor Martins)

Composability

player.unitWithinRange(2).where(UnitIs.Enemy).where(UnitIs.Tank).DoDamage(5)

Page 12: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

Page 13: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

‘Victor and Igor’

Page 14: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

‘victor and igor’

Page 15: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

[‘victor’,‘and’,‘igor’]

Page 16: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

[‘victor’,‘and’,‘igor’]

Page 17: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

[‘igor’,‘and’,‘victor’]

Page 18: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

[‘igor’,‘victor’]

Page 19: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

‘igorvictor’

Page 20: Everything is Composable (Victor Martins)

Composability

const doThing = str => { const lower = str.toLowerCase() const words = lower.split(' ') words.reverse() for(let i in words) { words[i] = words[i].trim() } let keepers = [] for(let i in words) { if(words[i].length > 3) { keepers.push(words[i]) } } return keepers.join('')}

Page 21: Everything is Composable (Victor Martins)

Composability

const doThing = str => { const lower = str.toLowerCase() const words = lower.split(' ') words.reverse() for(let i in words) { words[i] = words[i].trim() } let keepers = [] for(let i in words) { if(words[i].length > 3) { keepers.push(words[i]) } } return keepers.join('')}

Page 22: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

Page 23: Everything is Composable (Victor Martins)

Composability

Page 24: Everything is Composable (Victor Martins)

Composability

“O maior contribuinte de complexidade em muitos sistemas é o tratamento do estado e

o peso que isso acrescenta ao tentar analisar um sistema.”

Ben Moseley & Peter MarksOut of the Pit 2006

Page 25: Everything is Composable (Victor Martins)

Control flow

Composability

Page 26: Everything is Composable (Victor Martins)

Composability

Code volume

Page 27: Everything is Composable (Victor Martins)

Composability

Page 28: Everything is Composable (Victor Martins)

Composability

Page 29: Everything is Composable (Victor Martins)

Composability

Page 30: Everything is Composable (Victor Martins)

Composability

const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')

Page 31: Everything is Composable (Victor Martins)
Page 32: Everything is Composable (Victor Martins)
Page 33: Everything is Composable (Victor Martins)

Programming !== Math

Programming !== Math

Page 34: Everything is Composable (Victor Martins)

Programming !== Math

try { return f(x)} catch(e) { console.error(e)}

Page 35: Everything is Composable (Victor Martins)

Programming !== Math

if { return f()} else(e) { return y}

Page 36: Everything is Composable (Victor Martins)

Programming !== Math

let stuff = [1, 2, 3]stuff = [1, 2]

Page 37: Everything is Composable (Victor Martins)

Programming !== Math

let stuff.splice(0, 2) stuff.pop()

Page 38: Everything is Composable (Victor Martins)

Programming !== Math

for(let thing in things) { if(thing.amount > 100) keepers.push(thing.name)}

for (i = 0; i < cars.length; i++) { text += cars[i] + "<br>";}

while (i < 10) { text += "The number is " + i; i++;}

Page 39: Everything is Composable (Victor Martins)

Assignment

CallbacksLoops

Side EffectsBranching

Errors

Page 40: Everything is Composable (Victor Martins)

Programming !== Math

Programming !== Math

Page 41: Everything is Composable (Victor Martins)

Programming != Math

Programming !== Math

Page 42: Everything is Composable (Victor Martins)

f.g

Programming !== Math

Page 43: Everything is Composable (Victor Martins)

f.g = x => f(g(x))

Programming !== Math

Page 44: Everything is Composable (Victor Martins)

str.toUpperCase().trim()

Programming !== Math

trim(toUpperCase(str))

Page 45: Everything is Composable (Victor Martins)

Category theory

Page 46: Everything is Composable (Victor Martins)

Category Theory

What’s category theory?

Page 47: Everything is Composable (Victor Martins)

What’s category theory?

Category Theory

Categories represent abstraction of other mathematical concepts.

Page 48: Everything is Composable (Victor Martins)

A mudança de paradigma provocada pela teoria da relatividade de Einstein trouxe a constatação de que não há uma perspectiva única para ver o mundo.

Page 49: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Page 50: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Page 51: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain

dom(f) f

Page 52: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain/codomain

dom(f) f

cod(f)

Page 53: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain/codomain

dom(f)

g

cod(f)

Page 54: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain/codomain

f

Composition

h

Page 55: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain/codomain

f

Composition

hh . f

Page 56: Everything is Composable (Victor Martins)

Category

Category Theory

objects

Arrows or morphisms

Domain/codomainCompositionIdentity

Page 57: Everything is Composable (Victor Martins)

World Wide Web

Category Theory

Page 58: Everything is Composable (Victor Martins)

World Wide Web

Category Theory

objects = webpages

Arrows = hyperlinks

Page 59: Everything is Composable (Victor Martins)

World Wide Web

Category Theory

objects = webpages

Arrows = hyperlinks

Composition = Links don’t composeIdentity

Page 60: Everything is Composable (Victor Martins)

World Wide Web

Category Theory

objects = nodes

Arrows = edges

Composition = Edges don’t composeIdentity

Graphs

Page 61: Everything is Composable (Victor Martins)

Category Theory

objects = sets (or types)

Arrows = functions

Composition = function compositionIdentity = identity function

Programming

Page 62: Everything is Composable (Victor Martins)

Functors

Category Theory

Page 63: Everything is Composable (Victor Martins)

Category Theory

Functors map between categories

Functors

Page 64: Everything is Composable (Victor Martins)

Category Theory

A BCategory Category

FunctorF

Page 65: Everything is Composable (Victor Martins)

Category Theory

Composition Law

F(g ∘ f) = F(g) ∘ F(f)Identity Law

F(idA) = idF(A)

Functors laws

Page 66: Everything is Composable (Victor Martins)

Category Theory

“Hey, I know what can be mapped over. An array can be mapped over — you can map a function over an array!”

Page 67: Everything is Composable (Victor Martins)

Category Theory

Identity

const f = [1,2,3]f.map(x => x) //[1,2,3]

Page 68: Everything is Composable (Victor Martins)

Category Theory

Composition

[1,2,3].map(x => f(g(x)))

= [1,2,3].map(g).map(f)

Page 69: Everything is Composable (Victor Martins)

Composability

const nextCharForNumberString = str => { const trimmed = str.trim() const number = parseInt(trimmed) const nextNumber = number + 1 return String.fromCharCode(nextNumber)}

nextCharForNumberString(' 70 ') //'G'

Page 70: Everything is Composable (Victor Martins)

Composability

const nextCharForNumberString = str => return [str.trim()]

.map(trimmed => new Number(trimmed)) .map(number => number + 1) .map(n => String.fromCharCode(n))

nextCharForNumberString(' 70') //['G']

Page 71: Everything is Composable (Victor Martins)

Category Theory

Build your own Functor

Page 72: Everything is Composable (Victor Martins)

Composability

const Box = x => ({ map: f => Box(f(x))})

Page 73: Everything is Composable (Victor Martins)

const Box = x => ({ map: f => Box(f(x))})

const nextCharForNumberString = str => return Box(str.trim())

.map(trimmed => new Number(trimmed)) .map(number => number + 1) .map(n => String.fromCharCode(n))

nextCharForNumberString(' 70') //Box('G')

Page 74: Everything is Composable (Victor Martins)

const Box = x => ({ map: f => Box(f(x)), fold: f => f(x)})const nextCharForNumberString = str => return Box(str.trim())

.map(trimmed => new Number(trimmed)) .map(number => number + 1) .fold(n => String.fromCharCode(n))

nextCharForNumberString(' 70') //'G'

Page 75: Everything is Composable (Victor Martins)

Assignment

CallbacksLoops

Side EffectsBranching

Errors

Page 76: Everything is Composable (Victor Martins)

Loops

Page 77: Everything is Composable (Victor Martins)

filtermap

reduce

Page 78: Everything is Composable (Victor Martins)

Assignment

CallbacksLoops

Side EffectsBranching

Errors

Page 79: Everything is Composable (Victor Martins)

CallbacksSide effects

Page 80: Everything is Composable (Victor Martins)

Promise(5).then(five => five + 2)//Promise(7)

Promise(5).then(five => Promise(five + 2))//Promise(7)

Promise(5).map(five => five + 2))//Promise(7)

Page 81: Everything is Composable (Victor Martins)

const doThing = () => fs.readFile('file.json', 'utf-8', (err, data) => { if(err) throw err const newdata = data.replace(/8/g, '6') fs.writeFile('file2.json', newdata, (err, _) => { if(err) throw err console.log('success!') } }

Page 82: Everything is Composable (Victor Martins)

const readFile = futurize(fs.readFile)const writeFile = futurize(fs.writefile)

const doThing = () => readFile('file.json') .map(data => data.replace('/8/g', '6') .chain(replaced => writeFile('file2.json', replaced))

Page 83: Everything is Composable (Victor Martins)

const readFile = futurize(fs.readFile)const writeFile = futurize(fs.writefile)

const doThing = () => readFile('file.json') .map(data => data.replace('/8/g', '6') .chain(replaced => writeFile('file2.json', replaced))

doThing().fork(e => console.log(e), r => console.log('success'))

Page 84: Everything is Composable (Victor Martins)

const lib = username => getTweets(username) .map(tweets => truncateTo130(tweets)) .chain(tweets => writeFile('tweets.json', tweets))

lib('@victorvoid').chain(f => saveToS3(f)).fork(e => console.error(e), r => console.log(r))

Page 85: Everything is Composable (Victor Martins)

Assignment

CallbacksLoops

Side EffectsBranching

Errors

Page 86: Everything is Composable (Victor Martins)

ErrorsBranching

Page 87: Everything is Composable (Victor Martins)

Either

data Either a b = Left a | Right b

Page 88: Everything is Composable (Victor Martins)

Left('no loaded').fold(() => 'uow, error!', s => s.toUpperCase())//'uow, error!'

Right('loaded').fold(() => 'uow, error!', s => s.toUpperCase())//'LOADED'

Page 89: Everything is Composable (Victor Martins)

LeftOrRight('no loaded') .fold(() => 'uow, error!', s => s.toUpperCase())

Page 90: Everything is Composable (Victor Martins)

Right(2) .map(x => x + 4) .map(x => x / 2) .fold(() => 'uow, error!', r => r + 1)//4

Page 91: Everything is Composable (Victor Martins)

Left('ignored') .map(x => x + 4) .map(x => x / 2) .fold(() => 'uow, error!', r => r + 1)//'uow, error!'

Page 92: Everything is Composable (Victor Martins)

const getConfig = () => { try { return fs.readFileSync('config.json') } catch (e) { return null }}const getPort = () => { const str = getConfig() if(str) { const parsed = JSON.parse(str)

return parsed.port } else (e) { return 3000 }}

Page 93: Everything is Composable (Victor Martins)

const getConfig = () => Either.try(fs.readFileSync)('config.json')

const getPort = () => getConfig() .map(JSON.parse) .fold(e => 3000, c => c.port)

Page 94: Everything is Composable (Victor Martins)

const getThing = user => { const address = user.address if(address){ const zip = address.match(/(\d{5})$/i) if(zip){ const city = cityByZip(zip) if(city){ return city } else { return 'cant find city' } } } return 'cant find city'}

Page 95: Everything is Composable (Victor Martins)

const getThing = user => fromNullable(user.address) .chain(a => fromNullable(a.match(/(\d{5})$/i))) .chain(zip => fromNullable(cityByZip(zip))) .fold(() => 'cant find city', city => city)

Page 96: Everything is Composable (Victor Martins)

Assignment

CallbacksLoops

Side EffectsBranching

Errors

Page 97: Everything is Composable (Victor Martins)
Page 98: Everything is Composable (Victor Martins)

React example

Component :: a -> JSX

Page 99: Everything is Composable (Victor Martins)

a JSX bf g

Page 100: Everything is Composable (Victor Martins)

a JSX bf g

Page 101: Everything is Composable (Victor Martins)

a JSXfb

g

Page 102: Everything is Composable (Victor Martins)

const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f(x)))})

Page 103: Everything is Composable (Victor Martins)

const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f))})

const heading = str => <h1>You are viewing {str}</h1>

const Title = Comp(heading).contramap(s => s.pageName)

Page 104: Everything is Composable (Victor Martins)

const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f))})

const heading = str => <h1>You are viewing {str}</h1>

const Title = Comp(heading).contramap(s => s.pageName)

Title.fold({ pageName: 'Home', currUser: {id: '123', name: 'Victor'}})//<h1>You are viewing Home</h1>

Page 105: Everything is Composable (Victor Martins)

Learn a new language

Page 106: Everything is Composable (Victor Martins)

Fantasy Land Specification

Page 107: Everything is Composable (Victor Martins)
Page 109: Everything is Composable (Victor Martins)

Thanks!Any questions?

You can find me at @victorvoid & victorvoid.me