Hundreds of thousands
of lines of JavaScript
Saturday, November 10, 12
Slide 10
Slide 10 text
dynamic,
weakly-typed
language
Saturday, November 10, 12
Slide 11
Slide 11 text
one single thread
Saturday, November 10, 12
Slide 12
Slide 12 text
Remote
VM
Cloud9 datacenter
IDE server
Remote
VM
Remote
VM
Openshift
Saturday, November 10, 12
Slide 13
Slide 13 text
Saturday, November 10, 12
Slide 14
Slide 14 text
Saturday, November 10, 12
Slide 15
Slide 15 text
Modularization
Saturday, November 10, 12
Slide 16
Slide 16 text
Black box coding
Saturday, November 10, 12
Slide 17
Slide 17 text
Saturday, November 10, 12
Slide 18
Slide 18 text
Good at
abstracting away
require
Saturday, November 10, 12
Slide 19
Slide 19 text
Not that good at
app-level abstraction
require
Saturday, November 10, 12
Slide 20
Slide 20 text
duplicated modules
maps to folder names
Relies on FS
require
hard to configure module
Saturday, November 10, 12
Slide 21
Slide 21 text
Dependency error handling
coding time compile time run time
KA-BOOM!
- Server crash
- Unhappy customers
- Developer gets fired
Saturday, November 10, 12
Slide 22
Slide 22 text
How to fix it?
Static dependency list
Named services
Easy configuration
Resolve at startup
No FS required
Pass an object
Saturday, November 10, 12
Slide 23
Slide 23 text
Architect
github.com/c9/architect
Saturday, November 10, 12
Slide 24
Slide 24 text
Everything is a plugin
Plugins can consume plugins
An application is just a set of
plugins
Architect
Saturday, November 10, 12
Slide 25
Slide 25 text
Dependency model
require
Architect
runtime
compile time
Saturday, November 10, 12
Slide 26
Slide 26 text
Dependency error handling
Architect
coding time compile time run time
- Happy customers
- Developer keeps job
- Fails before release
Saturday, November 10, 12
Slide 27
Slide 27 text
github.com/sergi/nodejsconfit2012
Saturday, November 10, 12
Slide 28
Slide 28 text
Saturday, November 10, 12
Slide 29
Slide 29 text
Declare entity ‘cook’ with behavior
Use ‘cook’ to do some cooking
Saturday, November 10, 12
Slide 30
Slide 30 text
Cook
Cooking
action
Dependency model
Saturday, November 10, 12
Slide 31
Slide 31 text
package.json
Builds dependency tree
executing code
without
Saturday, November 10, 12
Slide 32
Slide 32 text
{
{
cook/package.json
do-‐cooking/package.json
Saturday, November 10, 12
Slide 33
Slide 33 text
Next
Extract the code
Wrap in Architect plugin code
Make two plugins
Saturday, November 10, 12
Slide 34
Slide 34 text
Function
signature
Call when
done
Saturday, November 10, 12
Slide 35
Slide 35 text
Architect plugin code
Module.exports
Options - we’ll talk about it later
Imports - everything you ‘consume’
Register - call when done
Saturday, November 10, 12
Slide 36
Slide 36 text
Saturday, November 10, 12
Slide 37
Slide 37 text
Saturday, November 10, 12
Slide 38
Slide 38 text
Easy to test
Mock dependencies
Saturday, November 10, 12
Slide 39
Slide 39 text
‘cook’ should be called 8 times
Saturday, November 10, 12
Slide 40
Slide 40 text
No black magic
Specify dependency model
Feed architect a config file
Call ‘createApp’
Saturday, November 10, 12
Slide 41
Slide 41 text
Saturday, November 10, 12
Slide 42
Slide 42 text
Saturday, November 10, 12
Slide 43
Slide 43 text
Configuration
Per-plugin options
No global options object
Specify in config file
Saturday, November 10, 12
Slide 44
Slide 44 text
Saturday, November 10, 12
Slide 45
Slide 45 text
Saturday, November 10, 12
Slide 46
Slide 46 text
Options
Passed in at startup
Options can be dependencies
Fail if options aren’t present
Saturday, November 10, 12
Slide 47
Slide 47 text
Saturday, November 10, 12
Slide 48
Slide 48 text
Saturday, November 10, 12
Slide 49
Slide 49 text
Your app as
chunks of functionality
rather than sets of classes
Saturday, November 10, 12
Slide 50
Slide 50 text
chunks of functionality
Implicit type constraints
Keep implementation private
Swap features instead of interfaces
Saturday, November 10, 12
Slide 51
Slide 51 text
How does Cloud9 use it?
Open source version
Local version (OS + sync)
Hosted version
Normal
FTP
SSH
Saturday, November 10, 12
Slide 52
Slide 52 text
Saturday, November 10, 12
Slide 53
Slide 53 text
Swap feature per
implementation
On OSS: talk local filesystem
On FTP: talk FTP library
On SSH: talk via a SSH bridge
Saturday, November 10, 12
Slide 54
Slide 54 text
Architect is a DI
framework
Saturday, November 10, 12
Slide 55
Slide 55 text
But a quite
special one
Saturday, November 10, 12
Slide 56
Slide 56 text
IDE instance
(FTP)
IDE instance
(SSH)
IDE instance
(Normal)
IDE instance
(Normal)
Single node.js process
Other code
(dashboard etc.)
Saturday, November 10, 12
Slide 57
Slide 57 text
Architect can do
Multiple instances of same plugin
Run independently
But in the same process
Saturday, November 10, 12
Slide 58
Slide 58 text
Centralized event bus
Loose coupling between plugins
No hard dependencies!
Can also do inter-context communication
Saturday, November 10, 12
Slide 59
Slide 59 text
Event
bus
Plugin
Other plugin
Emit event
React on event
Saturday, November 10, 12
Slide 60
Slide 60 text
Saturday, November 10, 12
Slide 61
Slide 61 text
Saturday, November 10, 12
Slide 62
Slide 62 text
And now scale
Swap it with i.e. Redis PubSub
Plugins will never notice
Modular awesomeness!
Saturday, November 10, 12
Slide 63
Slide 63 text
Modularize in feature blocks
Don’t over engineer
Don’t create too small blocks
They aren’t interfaces!
Saturday, November 10, 12
Slide 64
Slide 64 text
Avoid context switching
Less code!
Less errors!
Less boilerplate!
Saturday, November 10, 12
Slide 65
Slide 65 text
Loose coupling
Use (don’t abuse) an event bus
Smaller dependency graph
Saturday, November 10, 12
Slide 66
Slide 66 text
github.com/c9/architect
Saturday, November 10, 12
Slide 67
Slide 67 text
Happy coding!
Saturday, November 10, 12
Slide 68
Slide 68 text
@sergimansilla
github.com/sergi
http://c9.io
Saturday, November 10, 12