SlideShare a Scribd company logo
1 of 61
Download to read offline
Tame accidental complexity
       Introduction to NoSQL with MongoMapper




Giordano Scalzo
I’m not here to talk about performance
I’m not here to talk about scalability
but I’m here to talk about simplicity
Rails has been a first step
Anatomy of a Rails Application
Anatomy of a Rails Application




view
Anatomy of a Rails Application




view       controller
Anatomy of a Rails Application




view       controller      model
Different languages
html+css




   view        controller       model
Different languages
html+css        oop




   view        controller       model
Different languages
html+css        oop               sql




   view        controller       model
Impedance mismatch
html+css        oop               sql




   view         controller      model
Origin of Sql

SQL
From Wikipedia, the free encyclopedia




SQL (...), is a database computer language
designed for managing data in relational
database management systems (RDBMS)
Origin of Sql

SQL
From Wikipedia, the free encyclopedia




SQL (...), is a database computer language
designed for managing data in relational
database management systems (RDBMS)
We need persistent objects!
We need persistent objects!




class User
  def initialize(username, password)
    @username = username
    @password = password
  end
end
We need persistent objects!




   {
       username: "giordano",
       password: "123"
   }
ActiveRecord tries its best
We need something different
Persistence
Persistence




class User
  include MongoMapper::Document
end
Persistence


class User
  include MongoMapper::Document
end

user = User.create({
   :username => "giordano",
   :password => "123"
})
user.save
Persistence


class User
  include MongoMapper::Document
end

user = User.create({
   :username => "giordano",
   :password => "123"
})
user.save

puts User.all.last.to_mongo
Persistence




{
    "_id"=>BSON::ObjectId('4d643a274d8ff683dd000001'),
    "username"=>"giordano",
    "password"=>"123"
}
Types
Types




class User
  include MongoMapper::Document
  key :username, String
  key :password , String
end
Built-in Types




Array, Binary, Boolean, Date,
Float, Hash, Integer, Nil,
ObjectId, Set, String, Time
Custom Types



class DowncasedString
  def self.to_mongo(value)
    value.nil? ? nil : value.to_s.downcase
  end
  def self.from_mongo(value)
    value.nil? ? nil : value.to_s.downcase
  end
end
Custom Types




class User
  include MongoMapper::Document
  key :username, String
  key :password , String
  key :email, DowncasedString
end
Custom Types



user = User.new
user.username = "giordano"
user.password = "123"
user.email = "Giordano.Scalzo@CleanCode.it"

user.save

puts User.all.last.to_mongo
Custom Types




{
 "_id"=>BSON::ObjectId('4d6442d94d8ff684d3000001'),
 "username"=>"giordano", "password"=>"123",
 "email"=>"giordano.scalzo@cleancode.it"
}
Embedded Documents
Embedded Documents



class Task
  include MongoMapper::EmbeddedDocument
  key :description, String
  key :pomodori, Integer
  key :is_done, Boolean
end
Embedded Documents



class User
  include MongoMapper::Document
  key :username, String
  key :password , String
  key :email, DowncasedString
  many :tasks
end
Embedded Documents

user.tasks << Task.new({
   description: 'refactor server',
   pomodori: 8,
   is_done: false
})

user.tasks << Task.new({
   description: 'timer sound',
   pomodori: 2,
   is_done: false
})
Embedded Documents
{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000001'),
  "username"=>"giordano", "password"=>"123",
  "email"=>"giordano.scalzo@cleancode.it",
  "tasks"=>[{
    "_id"=>BSON::ObjectId('4d6575e84d8ff692e6000002'),
    "description"=>"refactor server",
    "pomodori"=>8, "is_done"=>false
   }, {
    "_id"=>BSON::ObjectId('4d6575e84d8ff692e6000003'),
    "description"=>"timer sound",
    "pomodori"=>2, "is_done"=>false
   }]
}
Embedded Documents
{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000001'),
  "username"=>"giordano", "password"=>"123",
  "email"=>"giordano.scalzo@cleancode.it",
  "tasks"=>[{
    "_id"=>BSON::ObjectId('4d6575e84d8ff692e6000002'),
    "description"=>"refactor server",
    "pomodori"=>8, "is_done"=>false
   }, {
    "_id"=>BSON::ObjectId('4d6575e84d8ff692e6000003'),
    "description"=>"timer sound",
    "pomodori"=>2, "is_done"=>false
   }]
}
Documents




class Task
  include MongoMapper::Document
  key :description, String
  key :pomodori, Integer
  key :is_done, Boolean
end
Documents

p User.all.last.to_mongo


{
 "_id"=>BSON::ObjectId('4d657e924d8ff6949c000001'),
 "username"=>"giordano", "password"=>"123",
 "email"=>"giordano.scalzo@cleancode.it"
}
Documents

p User.all.last.tasks
[#<Task _id:
    BSON::ObjectId('4d65822b4d8ff69542000002'),
    description: "refactor server",
    pomodori: 8, is_done: false,
    user_id: BSON::ObjectId('4d65822b4d8ff69542000001')
  >,
  #<Task _id:
    BSON::ObjectId('4d65822b4d8ff69542000003'),
    description: "timer sound",
    pomodori: 2, is_done: false,
    user_id: BSON::ObjectId('4d65822b4d8ff69542000001')
  >
]
Validations & Callbacks
Validations & Callbacks



class User
  include MongoMapper::Document
  key :username, String,
  validates_presence_of :username
  key :password, String
  validates_presence_of :password
end
Validations & Callbacks




class User
  include MongoMapper::Document
  key :username, String, :required => true
  key :password, String, :required => true
end
Validations & Callbacks



validates_presence_of
validates_length_of
validates_format_of
validates_numericality_of
validates_acceptance_of
validates_confirmation_of
validates_inclusion_of
validates_exclusion_of
Validations & Callbacks


before_save                   after_save
before_create                 after_create
before_update                 after_update
before_validation             after_validation
before_validation_on_create   after_validation_on_create
before_validation_on_update   after_validation_on_update
before_destroy                after_destroy
validate_on_create            validate_on_update
validate
Validations & Callbacks




forked in current gem 0.8.6
using Rails3 ActiveModel in
Rails3 branch just merged
What about querying?
What about querying?




query = User.where(:last_name.exists => true,
                   :created_at.gte => from_date,
                   :created_at.lt => Time.now)
       Plucky: ActiveRecord-like language
            .skip(0).limit(5)

query.all
What about querying?




query = User.where(:last_name.exists => true,
                   :created_at.gte => from_date,
                   :created_at.lt => Time.now)
       Plucky: ActiveRecord-like language
            .skip(0).limit(5)
#<Plucky::Query created_at: {
  "$gte"=>"1",
  "$lt"=>2011-02-24 10:54:36 UTC},
  last_name: {"$exists"=>true}, limit: 5, skip: 0>
What about querying?




query = User.where(:last_name.exists => true)
            .where(:created_at.gte => from_date)
            .where(:created_at.lt => Time.now)
       Plucky: ActiveRecord-like language
            .skip(0).limit(5)
#<Plucky::Query created_at: {
  "$gte"=>"1",
  "$lt"=>2011-02-24 10:54:36 UTC},
  last_name: {"$exists"=>true}, limit: 5, skip: 0>
What about plugins?
What about plugins?
Accessible              Modifiers
Associations            Pagination
Caching                 Persistence
Callbacks               Protected
Clone                   Querying
Dirty                   Rails
Document                Safe
Dynamic Querying        Single
EmbeddedDocument        Collection
Equality                Inheritance
IdentityMap             Scopes
Indexes                 Serialization
Inspect                 Timestamps
Keys                    Userstamps
Logger                  Validations
Itʼs just a beginning
http://mongomapper.com/documentation/
http://mongoid.org/
giordano.scalzo@cleancode.it
@giordanoscalzo
www.slideshare.net/giordano
github.com/gscalzo

More Related Content

What's hot

ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMJonathan Wage
 
Modularized Persistence - B Zsoldos
Modularized Persistence - B ZsoldosModularized Persistence - B Zsoldos
Modularized Persistence - B Zsoldosmfrancis
 
Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)nyccamp
 
iOS State Preservation and Restoration
iOS State Preservation and RestorationiOS State Preservation and Restoration
iOS State Preservation and RestorationRobert Brown
 
Improving RDF Search Performance with Lucene and SIREN
Improving RDF Search Performance with Lucene and SIRENImproving RDF Search Performance with Lucene and SIREN
Improving RDF Search Performance with Lucene and SIRENMike Hugo
 
Semantic code transformations in MetaJS
Semantic code transformations in MetaJSSemantic code transformations in MetaJS
Semantic code transformations in MetaJSDmytro Dogadailo
 
The Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemThe Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemHarold Giménez
 
Spray Json and MongoDB Queries: Insights and Simple Tricks.
Spray Json and MongoDB Queries: Insights and Simple Tricks.Spray Json and MongoDB Queries: Insights and Simple Tricks.
Spray Json and MongoDB Queries: Insights and Simple Tricks.Andrii Lashchenko
 
[2019] Spring JPA의 사실과 오해
[2019] Spring JPA의 사실과 오해[2019] Spring JPA의 사실과 오해
[2019] Spring JPA의 사실과 오해NHN FORWARD
 
How to survive in a BASE world
How to survive in a BASE worldHow to survive in a BASE world
How to survive in a BASE worldUwe Friedrichsen
 
The Ring programming language version 1.8 book - Part 49 of 202
The Ring programming language version 1.8 book - Part 49 of 202The Ring programming language version 1.8 book - Part 49 of 202
The Ring programming language version 1.8 book - Part 49 of 202Mahmoud Samir Fayed
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]Devon Bernard
 
Automatically Spotting Cross-language Relations
Automatically Spotting Cross-language RelationsAutomatically Spotting Cross-language Relations
Automatically Spotting Cross-language RelationsFederico Tomassetti
 
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web TestingBDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web TestingJohn Ferguson Smart Limited
 

What's hot (20)

ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODM
 
Modularized Persistence - B Zsoldos
Modularized Persistence - B ZsoldosModularized Persistence - B Zsoldos
Modularized Persistence - B Zsoldos
 
Using Dojo
Using DojoUsing Dojo
Using Dojo
 
Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)
 
iOS State Preservation and Restoration
iOS State Preservation and RestorationiOS State Preservation and Restoration
iOS State Preservation and Restoration
 
Django cryptography
Django cryptographyDjango cryptography
Django cryptography
 
Headless Js Testing
Headless Js TestingHeadless Js Testing
Headless Js Testing
 
Improving RDF Search Performance with Lucene and SIREN
Improving RDF Search Performance with Lucene and SIRENImproving RDF Search Performance with Lucene and SIREN
Improving RDF Search Performance with Lucene and SIREN
 
Functions
FunctionsFunctions
Functions
 
Semantic code transformations in MetaJS
Semantic code transformations in MetaJSSemantic code transformations in MetaJS
Semantic code transformations in MetaJS
 
The Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystemThe Ruby/mongoDB ecosystem
The Ruby/mongoDB ecosystem
 
Spray Json and MongoDB Queries: Insights and Simple Tricks.
Spray Json and MongoDB Queries: Insights and Simple Tricks.Spray Json and MongoDB Queries: Insights and Simple Tricks.
Spray Json and MongoDB Queries: Insights and Simple Tricks.
 
SQLAlchemy Seminar
SQLAlchemy SeminarSQLAlchemy Seminar
SQLAlchemy Seminar
 
[2019] Spring JPA의 사실과 오해
[2019] Spring JPA의 사실과 오해[2019] Spring JPA의 사실과 오해
[2019] Spring JPA의 사실과 오해
 
How to survive in a BASE world
How to survive in a BASE worldHow to survive in a BASE world
How to survive in a BASE world
 
The Ring programming language version 1.8 book - Part 49 of 202
The Ring programming language version 1.8 book - Part 49 of 202The Ring programming language version 1.8 book - Part 49 of 202
The Ring programming language version 1.8 book - Part 49 of 202
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]
 
Automatically Spotting Cross-language Relations
Automatically Spotting Cross-language RelationsAutomatically Spotting Cross-language Relations
Automatically Spotting Cross-language Relations
 
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web TestingBDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 

Viewers also liked

Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good codeGiordano Scalzo
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartGabriele Lana
 
JavaScript Survival Guide
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival GuideGiordano Scalzo
 
JavaScript Coding Guidelines
JavaScript Coding GuidelinesJavaScript Coding Guidelines
JavaScript Coding GuidelinesOleksii Prohonnyi
 

Viewers also liked (6)

Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
 
Tdd iPhone For Dummies
Tdd iPhone For DummiesTdd iPhone For Dummies
Tdd iPhone For Dummies
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
 
JavaScript Survival Guide
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival Guide
 
JavaScript Coding Guidelines
JavaScript Coding GuidelinesJavaScript Coding Guidelines
JavaScript Coding Guidelines
 

Similar to Tame Accidental Complexity with Ruby and MongoMapper

Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Rabble .
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101Will Button
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsSolution4Future
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureiMasters
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 
Angular JS2 Training Session #1
Angular JS2 Training Session #1Angular JS2 Training Session #1
Angular JS2 Training Session #1Paras Mendiratta
 
Functional Reactive Programming - RxSwift
Functional Reactive Programming - RxSwiftFunctional Reactive Programming - RxSwift
Functional Reactive Programming - RxSwiftRodrigo Leite
 
The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31Mahmoud Samir Fayed
 
10 Rules for Safer Code [Odoo Experience 2016]
10 Rules for Safer Code [Odoo Experience 2016]10 Rules for Safer Code [Odoo Experience 2016]
10 Rules for Safer Code [Odoo Experience 2016]Olivier Dony
 
10 Rules for Safer Code
10 Rules for Safer Code10 Rules for Safer Code
10 Rules for Safer CodeQuang Ngoc
 
Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)MongoSF
 
Mongoid in the real world
Mongoid in the real worldMongoid in the real world
Mongoid in the real worldKevin Faustino
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBMongoDB
 
Scalable web application architecture
Scalable web application architectureScalable web application architecture
Scalable web application architecturepostrational
 

Similar to Tame Accidental Complexity with Ruby and MongoMapper (20)

SOLID Ruby, SOLID Rails
SOLID Ruby, SOLID RailsSOLID Ruby, SOLID Rails
SOLID Ruby, SOLID Rails
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101
 
Quality code by design
Quality code by designQuality code by design
Quality code by design
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutions
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean Architecture
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Angular JS2 Training Session #1
Angular JS2 Training Session #1Angular JS2 Training Session #1
Angular JS2 Training Session #1
 
Functional Reactive Programming - RxSwift
Functional Reactive Programming - RxSwiftFunctional Reactive Programming - RxSwift
Functional Reactive Programming - RxSwift
 
The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31
 
10 Rules for Safer Code [Odoo Experience 2016]
10 Rules for Safer Code [Odoo Experience 2016]10 Rules for Safer Code [Odoo Experience 2016]
10 Rules for Safer Code [Odoo Experience 2016]
 
10 Rules for Safer Code
10 Rules for Safer Code10 Rules for Safer Code
10 Rules for Safer Code
 
Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)
 
Mongoid in the real world
Mongoid in the real worldMongoid in the real world
Mongoid in the real world
 
前端概述
前端概述前端概述
前端概述
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
Scalable web application architecture
Scalable web application architectureScalable web application architecture
Scalable web application architecture
 
Jquery fundamentals
Jquery fundamentalsJquery fundamentals
Jquery fundamentals
 

More from Giordano Scalzo

The Joy Of Server Side Swift Development
The Joy Of Server Side Swift DevelopmentThe Joy Of Server Side Swift Development
The Joy Of Server Side Swift DevelopmentGiordano Scalzo
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftGiordano Scalzo
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to SwiftGiordano Scalzo
 
Better Software Developers
Better Software DevelopersBetter Software Developers
Better Software DevelopersGiordano Scalzo
 
Agile Iphone Development
Agile Iphone DevelopmentAgile Iphone Development
Agile Iphone DevelopmentGiordano Scalzo
 
XpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayXpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayGiordano Scalzo
 
Bdd: Tdd and beyond the infinite
Bdd: Tdd and beyond the infiniteBdd: Tdd and beyond the infinite
Bdd: Tdd and beyond the infiniteGiordano Scalzo
 
10 minutes of me: Giordano Scalzo's Visual Resume
10 minutes of me: Giordano Scalzo's Visual Resume10 minutes of me: Giordano Scalzo's Visual Resume
10 minutes of me: Giordano Scalzo's Visual ResumeGiordano Scalzo
 

More from Giordano Scalzo (10)

The Joy Of Server Side Swift Development
The Joy Of Server Side Swift DevelopmentThe Joy Of Server Side Swift Development
The Joy Of Server Side Swift Development
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to Swift
 
Code kata
Code kataCode kata
Code kata
 
Better Software Developers
Better Software DevelopersBetter Software Developers
Better Software Developers
 
Agile Iphone Development
Agile Iphone DevelopmentAgile Iphone Development
Agile Iphone Development
 
XpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayXpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp way
 
Bdd: Tdd and beyond the infinite
Bdd: Tdd and beyond the infiniteBdd: Tdd and beyond the infinite
Bdd: Tdd and beyond the infinite
 
10 minutes of me: Giordano Scalzo's Visual Resume
10 minutes of me: Giordano Scalzo's Visual Resume10 minutes of me: Giordano Scalzo's Visual Resume
10 minutes of me: Giordano Scalzo's Visual Resume
 
Scrum in an hour
Scrum in an hourScrum in an hour
Scrum in an hour
 

Tame Accidental Complexity with Ruby and MongoMapper