MVP
a hackathoner’s best friend
Who am I?

• Ruben Tan
• Lead Developer in 40 Square Software
• Node.JS disciple
• Still a Goblin Camp addict
What is MVP

• Minimum Viable Product
• The smallest feature set to be released
• YAGNI,YAGNI,YAGNI
What Software Engineers Want
What Actually Got Built
What Usually Happens
MVP
MVP

• Evolution vs Divine Design
 • Usually, your framework™ won’t solve
    anybody’s problem
 • Imagined features are not features
 • Be economic and result oriented
MVP Example
01   var express = require(‘express’);
02
03   var server = express.createServer();
04
05   server.configure(function() {
06
07         // Use a simple view engine
08         server.register(‘html’, require(‘ejs’));
09         server.set(‘views’, __dirname + ‘/view’);
10         server.set(‘view engine’, ‘html’);
11
12         // Serve only static files for now
13         server.use(express.static(__dirname + ‘/public’);
14
15   });
16
17   server.get(‘/’, function(req, res) {
18       res.render(‘index.html’);
19   });
20
21   server.listen(1337);
MVP Evolve
01   var express = require(‘express’);
02
03   var server = express.createServer();
04   var db = {}; // add a DB here
05
06   server.configure(function() {
07
08         // Use a simple view engine
09         server.register(‘html’, require(‘ejs’));
10         server.set(‘views’, __dirname + ‘/view’);
11         server.set(‘view engine’, ‘html’);
12
13         // Add session support
14         server.use(express.cookieParser());
15         server.use(express.session({ secret : ‘Nodehack’ });
16
17         // Serve only static files for now
18         server.use(express.static(__dirname + ‘/public’);
19
20   });
21
22   server.get(‘/’, function(req, res) {
23       res.render(‘index.html’);
24   });
25
26   server.listen(1337);
01
               MVP Refactor
     var express = require(‘express’);
02
03   var server = express.createServer();
04   var db = {
05       config : { secret : ‘NodeHack’ }
06   };
07
08   server.configure(function() {
09
10         // Use a simple view engine
11         server.register(‘html’, require(‘ejs’));
12         server.set(‘views’, __dirname + ‘/view’);
13         server.set(‘view engine’, ‘html’);
14
15         // Add session support
16         server.use(express.cookieParser());
17         server.use(express.session({ secret : db.config.secret });
18
19         // Serve only static files for now
20         server.use(express.static(__dirname + ‘/public’);
21
22   });
23
24   server.get(‘/’, function(req, res) {
25       res.render(‘index.html’);
26   });
27
28   server.listen(1337);
MVP Future

• Move DB into it’s own module
• Add a connector using the Adapter Pattern
• Move session storage into DB/Cache
• etc etc etc
MVP Principles

• Prototype First, Refactor Later
• Use TDD/BDD to simplify refactoring
• Forward engineer only when necessary
• YAGNI,YAGNI,YAGNI
process.exit();

NodeHack #2 - MVP

  • 1.
  • 2.
    Who am I? •Ruben Tan • Lead Developer in 40 Square Software • Node.JS disciple • Still a Goblin Camp addict
  • 3.
    What is MVP •Minimum Viable Product • The smallest feature set to be released • YAGNI,YAGNI,YAGNI
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    MVP • Evolution vsDivine Design • Usually, your framework™ won’t solve anybody’s problem • Imagined features are not features • Be economic and result oriented
  • 9.
    MVP Example 01 var express = require(‘express’); 02 03 var server = express.createServer(); 04 05 server.configure(function() { 06 07 // Use a simple view engine 08 server.register(‘html’, require(‘ejs’)); 09 server.set(‘views’, __dirname + ‘/view’); 10 server.set(‘view engine’, ‘html’); 11 12 // Serve only static files for now 13 server.use(express.static(__dirname + ‘/public’); 14 15 }); 16 17 server.get(‘/’, function(req, res) { 18 res.render(‘index.html’); 19 }); 20 21 server.listen(1337);
  • 10.
    MVP Evolve 01 var express = require(‘express’); 02 03 var server = express.createServer(); 04 var db = {}; // add a DB here 05 06 server.configure(function() { 07 08 // Use a simple view engine 09 server.register(‘html’, require(‘ejs’)); 10 server.set(‘views’, __dirname + ‘/view’); 11 server.set(‘view engine’, ‘html’); 12 13 // Add session support 14 server.use(express.cookieParser()); 15 server.use(express.session({ secret : ‘Nodehack’ }); 16 17 // Serve only static files for now 18 server.use(express.static(__dirname + ‘/public’); 19 20 }); 21 22 server.get(‘/’, function(req, res) { 23 res.render(‘index.html’); 24 }); 25 26 server.listen(1337);
  • 11.
    01 MVP Refactor var express = require(‘express’); 02 03 var server = express.createServer(); 04 var db = { 05 config : { secret : ‘NodeHack’ } 06 }; 07 08 server.configure(function() { 09 10 // Use a simple view engine 11 server.register(‘html’, require(‘ejs’)); 12 server.set(‘views’, __dirname + ‘/view’); 13 server.set(‘view engine’, ‘html’); 14 15 // Add session support 16 server.use(express.cookieParser()); 17 server.use(express.session({ secret : db.config.secret }); 18 19 // Serve only static files for now 20 server.use(express.static(__dirname + ‘/public’); 21 22 }); 23 24 server.get(‘/’, function(req, res) { 25 res.render(‘index.html’); 26 }); 27 28 server.listen(1337);
  • 12.
    MVP Future • MoveDB into it’s own module • Add a connector using the Adapter Pattern • Move session storage into DB/Cache • etc etc etc
  • 13.
    MVP Principles • PrototypeFirst, Refactor Later • Use TDD/BDD to simplify refactoring • Forward engineer only when necessary • YAGNI,YAGNI,YAGNI
  • 14.

Editor's Notes