large
Architecting
node.js
applications
Monday, October 22, 12
Slide 2
Slide 2 text
@sergimansilla
Monday, October 22, 12
Slide 3
Slide 3 text
Program
☐ Cloud9 IDE?
☐ Growing pains
☐ Introducing Architect
☐ Lessons learned
Monday, October 22, 12
Slide 4
Slide 4 text
Normal developers
Monday, October 22, 12
Slide 5
Slide 5 text
JavaScript Developer
Monday, October 22, 12
Slide 6
Slide 6 text
Cloud9 IDE - http://c9.io
Monday, October 22, 12
Slide 7
Slide 7 text
debugging
Real
Monday, October 22, 12
Slide 8
Slide 8 text
(Smart!)
Code completion
Monday, October 22, 12
Slide 9
Slide 9 text
analysis
Static
Monday, October 22, 12
Slide 10
Slide 10 text
Free
Linux
VM
Monday, October 22, 12
Slide 11
Slide 11 text
Bring your own machine
Monday, October 22, 12
Slide 12
Slide 12 text
Real terminal
Monday, October 22, 12
Slide 13
Slide 13 text
Collaboration
Monday, October 22, 12
Slide 14
Slide 14 text
See each other type
Debug together
Productivity++
Monday, October 22, 12
Slide 15
Slide 15 text
Create
Share Test
Deploy Run/Debug
Monday, October 22, 12
Slide 16
Slide 16 text
Program
☑ Cloud9 IDE?
☐ Growing pains
☐ Introducing Architect
☐ Lessons learned
Monday, October 22, 12
Slide 17
Slide 17 text
10,000s
of JavaScript
LOC
Monday, October 22, 12
Slide 18
Slide 18 text
dynamic,
typed
weakly
language
Monday, October 22, 12
Slide 19
Slide 19 text
one
thread
single
Monday, October 22, 12
Slide 20
Slide 20 text
Remote VM
Cloud9 datacenter
IDE server Remote VM
Remote VM
Openshift
Monday, October 22, 12
Slide 21
Slide 21 text
Pure madness
Monday, October 22, 12
Slide 22
Slide 22 text
Modularization
Monday, October 22, 12
Slide 23
Slide 23 text
Black
box
coding
Monday, October 22, 12
Slide 24
Slide 24 text
Monday, October 22, 12
Slide 25
Slide 25 text
Java/.NET
Node.js
import(s)
require
Monday, October 22, 12
Slide 26
Slide 26 text
abstracting
away
Great for
require
Monday, October 22, 12
Slide 27
Slide 27 text
application
modularity
Not Great for
require
Monday, October 22, 12
Slide 28
Slide 28 text
duplicated modules
maps to folder names
Relies on FS
require
Hard to configure module
Monday, October 22, 12
Slide 29
Slide 29 text
Dependency error handling
coding time compile time run time
KA-BOOM!
- Server crash
- Unhappy customers
- Developer gets fired
Monday, October 22, 12
Slide 30
Slide 30 text
How to fix it?
Static dependency list
Named services
Easy configuration
Resolve at startup
No FS required
Pass an object
Monday, October 22, 12
Slide 31
Slide 31 text
Program
☑ Cloud9 IDE?
☑ Growing pains
☐ Introducing Architect
☐ Lessons learned
Monday, October 22, 12
Slide 32
Slide 32 text
Architect
github.com/c9/architect
Monday, October 22, 12
Slide 33
Slide 33 text
Architect
Everything is a plugin
Plugins can consume plugins
An application is just a set of plugins
Monday, October 22, 12
Slide 34
Slide 34 text
Dependency model
require
Architect
runtime
compile time
Monday, October 22, 12
Slide 35
Slide 35 text
Dependency error handling
Architect
coding time compile time run time
- Happy customers
- Developer keeps job
- Fails before release
Monday, October 22, 12
Slide 36
Slide 36 text
Monday, October 22, 12
Slide 37
Slide 37 text
Declare entity ‘presenter’ with behavior
Use ‘presenter’ to do a presentation
Monday, October 22, 12
Slide 38
Slide 38 text
Presenter Presentation
Dependency model
Monday, October 22, 12
Slide 39
Slide 39 text
Express our model
package.json
Builds dependency tree
executing code
without
Monday, October 22, 12
Slide 40
Slide 40 text
Monday, October 22, 12
Slide 41
Slide 41 text
What’s next?
Extract the code
Wrap in Architect plugin code
Make two plugins
Monday, October 22, 12
Slide 42
Slide 42 text
Function
signature
Call when done
Monday, October 22, 12
Slide 43
Slide 43 text
Architect plugin code
Module.exports
Options - we’ll get to that
Imports - everything you ‘consume’
Register - invoke when done
Monday, October 22, 12
Slide 44
Slide 44 text
Monday, October 22, 12
Slide 45
Slide 45 text
Monday, October 22, 12
Slide 46
Slide 46 text
Easy to test
Mock dependencies
Monday, October 22, 12
Slide 47
Slide 47 text
Assert ‘dance’ is called 11 times
Monday, October 22, 12
Slide 48
Slide 48 text
No black magic
Specify dependency model
Feed architect a config file
Call ‘createApp’
Monday, October 22, 12
Slide 49
Slide 49 text
Monday, October 22, 12
Slide 50
Slide 50 text
Monday, October 22, 12
Slide 51
Slide 51 text
Configuration
Per-plugin options
No global options object
Specify in config file
Monday, October 22, 12
Slide 52
Slide 52 text
Monday, October 22, 12
Slide 53
Slide 53 text
Monday, October 22, 12
Slide 54
Slide 54 text
Options
Automatically passed in at startup
Options are also dependencies
Fail if options aren’t present
Monday, October 22, 12
Slide 55
Slide 55 text
Monday, October 22, 12
Slide 56
Slide 56 text
Monday, October 22, 12
Slide 57
Slide 57 text
Architect makes you think of your app as
chunks of functionality
rather than sets of classes
Monday, October 22, 12
Slide 58
Slide 58 text
Think ‘chunks of functionality’
Implicit type constraints
Keep implementation private
Swap features instead of interfaces
Monday, October 22, 12
Slide 59
Slide 59 text
How does Cloud9 use it?
Open source version
Local version (OS + sync)
Hosted version
Normal
FTP
SSH
Monday, October 22, 12
Slide 60
Slide 60 text
Monday, October 22, 12
Slide 61
Slide 61 text
Swap feature per
implementation
On Open source: talk local filesystem
On FTP: talk FTP library
On SSH: talk via a SSH bridge
Monday, October 22, 12
Slide 62
Slide 62 text
Here is something your
DI framework can’t do
Monday, October 22, 12
Slide 63
Slide 63 text
IDE instance
(FTP)
IDE instance
(SSH)
IDE instance
(Normal)
IDE instance
(Normal)
Single node.js process
Other code
(dashboard etc.)
Monday, October 22, 12
Slide 64
Slide 64 text
Monday, October 22, 12
Slide 65
Slide 65 text
Architect can do
Multiple instances of same plugin
Run independently
But in the same process
Monday, October 22, 12
Slide 66
Slide 66 text
Monday, October 22, 12
Slide 67
Slide 67 text
Monday, October 22, 12
Slide 68
Slide 68 text
HERE’S SOMETHING COOL
Monday, October 22, 12
Slide 69
Slide 69 text
Centralized eventbus
Loose coupling between plugins
No hard dependencies!
Can also do inter-context communication
Monday, October 22, 12
Slide 70
Slide 70 text
Event
bus
Plugin
Other plugin
Emit event
React on event
Monday, October 22, 12
Slide 71
Slide 71 text
Monday, October 22, 12
Slide 72
Slide 72 text
Monday, October 22, 12
Slide 73
Slide 73 text
And now scale up
Need something inter-server
Swap it with i.e. Redis PubSub
Plugins will never notice
Modular awesomeness!
Monday, October 22, 12
Slide 74
Slide 74 text
Program
☑ Cloud9 IDE?
☑ Growing pains
☑ Introducing Architect
☐ Lessons learned
Monday, October 22, 12
Slide 75
Slide 75 text
Modularize in feature blocks
Don’t over engineer
Don’t create too small blocks
They aren’t interfaces!
Monday, October 22, 12
Slide 76
Slide 76 text
Use dependency injection
Architect (JavaScript)
StructureMap (.NET)
Spring (Java)
Monday, October 22, 12
Slide 77
Slide 77 text
Avoid context switching
Less code!
Less errors!
Less boilerplate!
Monday, October 22, 12
Slide 78
Slide 78 text
Loose coupling
Use an event bus
Smaller dependency graph
Monday, October 22, 12
Slide 79
Slide 79 text
github.com/c9/architect
Monday, October 22, 12
Slide 80
Slide 80 text
Happy coding!
Monday, October 22, 12
Slide 81
Slide 81 text
Sergi Mansilla
@sergimansilla
github.com/sergi
http://c9.io
Monday, October 22, 12