SlideShare a Scribd company logo
1 of 106
Download to read offline
build and maintain large Ruby
applications
Enrico Teotti - @agenteo - http://teotti.com
starting shortly
build and maintain large Ruby
applications
Enrico Teotti - @agenteo - http://teotti.com
http://www.slideshare.net/agenteo
http://pivotal.io/careers
crowbar.rb spec.description = ”Builds and maintains large Ruby apps”
–Any Java developer always ;-)
“Ruby is a toy language.”
automated
testing
team
diligence
local Ruby
gems
http://teotti.com/cognitive-overload-in-software-development/
Ruby files in a project are like ingredients in a recipe
yeasthoney
salt
milk flourwaterlard
sugar
arugula
squacqueroneprosciutto
piadina
yeasthoney
salt
milk flourwaterlard
sugar
arugula
squacqueroneprosciutto
3 months later
piadina
the curse of
knowledge
yeasthoney
salt
milk flourwaterlard
sugar
arugula
squacqueroneprosciutto
6 months later
– The law of continuing change (1974) Lehman, M
“Any software system used in the real-world must change or
become less and less useful in that environment.”
– The law of increasing complexity (1974) Lehman, M
“As a program evolves, it becomes more complex, and extra
resources are needed to preserve and simplify its structure.”
biscuits
mozzarella
sunflower oil
carrots
eggs
tomato puree
basil
mascarpone
coffee
cacao
yeasthoney
salt
milk flourwaterlard
sugar
arugula
squacqueroneprosciutto
oregano
sunflower oil
carrots
gs
tomato puree
basil
mascarpone
coffee
cacao
yeasthoney
salt
milk flourwaterlard
sugar
arugula
squacqueroneprosciutto
oregano
piadina
pizza margherita
tiramisu
carrot cake
white ingredients
green ingredients
red ingredients
yellowish ingredients
orange ingredients
dark ingredients
white ingredients
green ingredients
classes grouped
by design pattern
ls -l app/
controllers
helpers
models
presenters
services
serializers
strategies
utils
views
http://teotti.com/application-directories-named-as-architectural-patterns-antipattern/
piadina
pizza margherita
tiramisu
carrot cake
namespaces
# lib/blog/after_publish.rb
module Blog
class AfterPublish
private
def subscribe_blogger_to_promotion
Promotions::Submission.new
end
end
end
# lib/promotions/new_member.rb
module Promotions
class Submission
private
def fetch_member(id)
# lib/membership/finder.rb
Membership::Finder.new(id)
end
end
end
promotionsblog membership
namespaces
context context
promotions
name
finder
blog membership
main Ruby application
1 year
lib
http://teotti.com/building-and-maintaing-large-ruby-on-rails-applications-for-3-years/
DB
team of 5
promotions
room
decorator
name
finder
blog membershiprecipes
main Ruby application
comments
3 years
lib
DB
team of 5
that’s the Ruby way
ma noooooooooo
piadina worktop
tiramisu worktop
shared worktop
carrot cake worktop
pizza worktop
local Ruby gems
A
main Ruby application
piadina gem
Apiadina gem
pizza gem
C
shared
ingredients
gem
B
main Ruby application
Apiadina gem
pizza gem
C
shared
ingredients
gem
B
main Ruby application
spec.add_dependency "shared_ingredients"
# local_gems/pizza/pizza.gemspec
Apiadina gem
pizza gem
C
shared
ingredients
gem
main Ruby application
spec.add_dependency "shared_ingredients"
# local_gems/piadina/piadina.gemspec
B
piadina gem
pizza gem
C
shared
ingredients
gem
B
main Ruby application
desserts gem
D
A
piadina gem
pizza gem
C
shared
ingredients
gem
B
main Ruby application
desserts gem
D
A
E
calzone gem
pizza dough gem
F
piadina gem
pizza gem
C
shared
ingredients
gem
B
main Ruby application
desserts gem
D
A
E
calzone gem
pizza dough gem
F
Conway’s Law
“organizations which design systems … are constrained to produce designs which
are copies of the communication structures of these organizations"
piadina gem
pizza gem
shared
ingredients
gem
main Ruby application
desserts gem
D
A
calzone gem
pizza dough gem
F
B
E
C
http://teotti.com/create-dependency-structures-with-local-ruby-gems/
code & examples
A
C
D
B
E
your health plan
drug information
claims platform
product
information
membership
gem
gem
gem
gem
gem
dependency
main Ruby application
Sinatra / Rails / Hanami
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
!"" run.rb
#"" spec
ruby script that
triggers entry point
gem’s behaviour
require 'health_plan'
subscriber_id = 'ASE123456789'
aggregated_drug_information = HealthPlan::Aggregator.new(subscriber_id)
puts aggregated_drug_information.details
main Ruby application
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
!"" run.rb
#"" spec
path 'local_gems' do
gem 'health_plan'
end
source 'https://rubygems.org'
group :test do
gem 'rspec'
end
bundler’s Gemfile uses
a path directive to find
local gems
main Ruby application
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
!"" run.rb
#"" spec
bundler’s Gemfile uses
a path directive to find
local gems
path 'local_gems' do
gem 'health_plan'
end
source 'https://rubygems.org'
group :test do
gem 'rspec'
end
main Ruby application
http://teotti.com/gemfiles-hierarchy-in-ruby-on-rails-component-based-architecture/
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
!"" run.rb
#"" spec
directory where your local gems are
$ cd local_gems
$ bundle gem health_plan
create health_plan/Gemfile
create health_plan/Rakefile
create health_plan/LICENSE.txt
create health_plan/README.md
create health_plan/.gitignore
create health_plan/health_plan.gemspec
create health_plan/lib/health_plan.rb
create health_plan/lib/health_plan/version.rb
Initializing git repo in /Users/me/code/lab/gem-dependency-structure/local_gems/health_plan
$ rm -Rf health_plan/.git*
bundle gem can create gems
main Ruby application
# local_gems/health_plan/health_plan.gemspec
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'health_plan/version'
Gem::Specification.new do |spec|
spec.name = "health_plan"
spec.version = HealthPlan::VERSION
spec.authors = ["Enrico Teotti"]
spec.email = ["enrico.teotti@gmail.com"]
spec.summary = %q{Write a short summary. Required.}
spec.description = %q{Write a longer description. Optional.}
spec.homepage = ""
spec.license = "MIT"
spec.files = `git ls-files -z`.split("x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   #"" health_plan
!"" run.rb
#"" spec
spec.add_development_dependency "rspec", "3.4.0"
end
your health plan
# local_gems/health_plan/health_plan.gemspec
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'health_plan/version'
Gem::Specification.new do |spec|
spec.name = "health_plan"
spec.version = HealthPlan::VERSION
spec.authors = ["Enrico Teotti"]
spec.email = ["enrico.teotti@gmail.com"]
spec.summary = %q{Write a short summary. Required.}
spec.description = %q{Write a longer description. Optional.}
spec.homepage = ""
spec.license = "MIT"
spec.files = `git ls-files -z`.split("x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   #"" health_plan
!"" run.rb
#"" spec
spec.add_development_dependency "rspec", "3.4.0"
end
your health plan
# local_gems/health_plan/spec/health_plan/aggregator_spec.rb
require 'spec_helper'
describe HealthPlan::Aggregator do
describe "#details" do
it "should not throw exceptions" do
aggregator = HealthPlan::Aggregator.new(12345)
expect(aggregator.details).to eq({ name: 'The full package plan'})
end
end
end
your health plan
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   #"" health_plan
!"" run.rb
#"" spec
# local_gems/health_plan/lib/health_plan/aggregator.rb
module HealthPlan
class Aggregator
def initialize(id)
@subscriber_id = id
end
def details
{ name: 'The full package plan'}
end
end
end
# local_gems/health_plan/lib/health_plan.rb
require "health_plan/version"
require "health_plan/aggregator"
module HealthPlan
end
gem entry point
your health plan
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   #"" health_plan
!"" run.rb
#"" spec
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
your health plan
drug information
main Ruby application
$ cd local_gems
$ bundle gem drug_information
create drug_information/Gemfile
create drug_information/Rakefile
create drug_information/LICENSE.txt
create drug_information/README.md
create drug_information/.gitignore
create drug_information/drug_information.gemspec
create drug_information/lib/drug_information.rb
create drug_information/lib/drug_information/version.rb
drug information
# local_gems/health_plan/spec/health_plan/aggregator_spec.rb
require 'spec_helper'
describe HealthPlan::Aggregator do
describe "#details" do
let(:fetched_drugs) { 'something' }
before do
fetcher_double = double('DrugInformation::Fetcher', details: fetched_drugs)
allow(DrugInformation::Fetcher).to receive(:new).and_return(fetcher_double)
end
it "should not throw exceptions" do
aggregator = HealthPlan::Aggregator.new(12345)
expect(aggregator.details).to eq({ name: 'The full package plan’,
drugs: fetched_drugs })
end
end
end
your health plan
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
your health plan
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'health_plan/version'
Gem::Specification.new do |spec|
spec.name = "health_plan"
spec.version = HealthPlan::VERSION
spec.authors = ["Enrico Teotti"]
spec.email = ["enrico.teotti@gmail.com"]
spec.summary = %q{Write a short summary. Required.}
spec.description = %q{Write a longer description. Optional.}
spec.homepage = ""
spec.license = "MIT"
spec.files = `git ls-files -z`.split("x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec", "3.4.0"
spec.add_dependency "drug_information"
end
# local_gems/health_plan/health_plan.gemspec
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
your health plan
# local_gems/health_plan/Gemfile
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
path '..'
source 'https://rubygems.org'
‘..’ represents the parent directory
gemspec
your health plan
# local_gems/health_plan/Gemfile
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
path '..'
source 'https://rubygems.org'
look for dependencies within the gem specification file
gemspec
# local_gems/health_plan/lib/health_plan/aggregator.rb
module HealthPlan
class Aggregator
def initialize(id)
@subscriber_id = id
end
def details
fetched_drug_info = DrugInformation::Fetcher.new(@subscriber_id)
{ name: 'The full package plan', drugs: fetched_drug_info.details }
end
end
end
# local_gems/health_plan/lib/health_plan.rb
require "health_plan/version"
require "health_plan/aggregator"
require "drug_information"
module HealthPlan
end
gem entry point
your health plan
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
require dependent gem
http://teotti.com/create-dependency-structures-with-local-ruby-gems/
$ bundle viz
!"" Gemfile
!"" Gemfile.lock
!"" local_gems
$   !"" drug_information
$   #"" health_plan
!"" run.rb
#"" spec
main Ruby application
https://github.com/shageman/cobradeps
automated
testing
A
C
D
B
E
main Ruby application
unit tested
unit tested
unit testedunit tested
unit tested
acceptance tests
A
C
main Ruby application
B
loaded in memory, deamon or webserver
unit tested
unit tested
not unit tested
http://teotti.com/create-dependency-structures-with-local-ruby-gems#gotcha-flaky-bugs-caused-by-missing-requirement-statements
team
diligence
A
C
D
B
E
main Ruby application
your health plan
API
drug information
claims platform
product
information
persistence DB
A
C
D
B
E
main Ruby application
F
H
I L
modular monolith!
membership
payment API
payment
platform
bank
transaction
credit card
transaction
your health plan
API
drug information
claims platform
product
information
persistence DDB
A
C
D
B
E
main Ruby application
F
H
I L
payment
platform
A
C
D
B
E
main Ruby application
F
H
I L
your health plan
API
DDB
A
C
D
B
E
main Ruby application
F
H
I L
membership
payment API
DDB
A
C
D
B
E
main Ruby application
F
H
I LDDB
A
C
D
B
E
main Ruby application
F
H
I LDDB
A
C
D
B
E
main Ruby application
F
H
I LDDB
A
C
D
B
E
main Ruby application
F
H
I L
I find your use of
Gems disturbing
Do I really look like
a guy with a plan?
*nods then
deletes your
Gem*
DDB
Director of security
Director of happiness
Director of project Death Star
team
diligence
http://blog.codinghorror.com/the-last-responsible-moment/
team
diligence
http://teotti.com/rails-service-oriented-architecture-alternative-with-components/
to be continued…
premature use of SOA in a small team
A
C
D
B
E
main Ruby application
F
H
I L
membership
payment API
payment
platform
bank
transaction
credit card
transaction
your health plan
API
drug information
claims platform
product
information
persistence DDB
main Ruby application
your health
plan API
drug
information
claims
platform
product
information
persistence
membership
payment
API
payment
platform
bank
transaction
credit card
transaction
DB
deploy parts of a monolith
http://teotti.com/deploy-parts-of-a-ruby-on-rails-application/
monolithic Ruby application
DB
editorial admin
persistence
site search
componentized Ruby application
public content
shared ui
DB
editorial admin
persistence
site search
componentized Ruby application
public content ui
shared ui
DB
Persistence::ContentPieceRepository.create(params)
editorial admin
persistence
site search
componentized Ruby application
public content
shared ui
DB
editorial admin
persistence
site search
componentized Ruby application
public content
shared ui
DB
editorial admin ui
persistence
site search
componentized Ruby application
public content
shared ui
DB
Persistence::ContentPieceRepository.find_by_slug('/article-slug')
deploy@adminServer $ RUNNING_MODE=admin puma
editorial admin
persistence
site search
Rails application
public content
shared ui
DB
deploy@publicServer $ RUNNING_MODE=public puma
editorial admin
persistence
site search
componentized Ruby application
public content
shared ui
DB
editorial admin
persistence
site search
componentized Ruby application
public content
shared ui
DB
legacy migration
editorial admin ui
persistence
site search
componentized Ruby application
public content ui
shared ui
DB
legacy
migration
AWS
SQS
massage and
transform content
legacy system
pull legacy
content
automated
testing
team
diligence
local Ruby
gems
automated
testing
team
diligence
local Ruby
gems
team
in a
fixed
mindset
gems require a bit of experience,

gems require you to work a bit hard,
this person doesn’t write maintainable code yet,

that person doesn’t understand ruby gems yet
gems require talented developers

gems are only for smart developers,
this person always write unmaintainable code,

that person will never understand ruby gems
https://www.youtube.com/watch?v=W47rcJowx7k
http://www.amazon.com/Mindset-The-New-Psychology-Success/dp/0345472322
automated
testing
team
diligence
local Ruby
gems
automated
testing
team
diligence
local Ruby
gems
automated
testing
team
diligence
local Ruby
gems
@agenteo
Enrico Teotti
http://teotti.com
www.slideshare.net/agenteo
More Links
https://leanpub.com/cbra
http://teotti.com/component-based-rails-architecture-primer/
http://teotti.com/reengineer-legacy-rails-applications/

More Related Content

What's hot

Routing 1, Season 1
Routing 1, Season 1Routing 1, Season 1
Routing 1, Season 1RORLAB
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Racksickill
 
Gradle: The Build system you have been waiting for
Gradle: The Build system you have been waiting forGradle: The Build system you have been waiting for
Gradle: The Build system you have been waiting forCorneil du Plessis
 
Pourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentPourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentNicolas Ledez
 
Be a microservices hero
Be a microservices heroBe a microservices hero
Be a microservices heroOpenRestyCon
 
Introduction à Ruby
Introduction à RubyIntroduction à Ruby
Introduction à RubyMicrosoft
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsJay Harris
 
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...Junho Choi
 
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012Daum DNA
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with RackRuby MVC from scratch with Rack
Ruby MVC from scratch with RackDonSchado
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101Samantha Geitz
 
APRICOT 2015 - NetConf for Peering Automation
APRICOT 2015 - NetConf for Peering AutomationAPRICOT 2015 - NetConf for Peering Automation
APRICOT 2015 - NetConf for Peering AutomationTom Paseka
 
Git the Docs: A fun, hands-on introduction to version control
Git the Docs: A fun, hands-on introduction to version controlGit the Docs: A fun, hands-on introduction to version control
Git the Docs: A fun, hands-on introduction to version controlBecky Todd
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of DjangoJacob Kaplan-Moss
 
Reusable bootstrap resources zend con 2010
Reusable bootstrap resources   zend con 2010Reusable bootstrap resources   zend con 2010
Reusable bootstrap resources zend con 2010Hector Virgen
 
What is systemd? Why use it? how does it work? - devoxx france 2017
What is systemd? Why use it? how does it work? - devoxx france 2017What is systemd? Why use it? how does it work? - devoxx france 2017
What is systemd? Why use it? how does it work? - devoxx france 2017Quentin Adam
 
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...Amazon Web Services
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and PythonPiXeL16
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 

What's hot (20)

Rails 4.0
Rails 4.0Rails 4.0
Rails 4.0
 
Routing 1, Season 1
Routing 1, Season 1Routing 1, Season 1
Routing 1, Season 1
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Gradle: The Build system you have been waiting for
Gradle: The Build system you have been waiting forGradle: The Build system you have been waiting for
Gradle: The Build system you have been waiting for
 
Pourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentPourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirent
 
Be a microservices hero
Be a microservices heroBe a microservices hero
Be a microservices hero
 
Introduction à Ruby
Introduction à RubyIntroduction à Ruby
Introduction à Ruby
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.js
 
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...
글로벌 CDN서비스와 웹 성능 향상 방법론 (Global CDN and Web Performance Optimization) - DevOn...
 
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012
글로벌 CDN서비스와 웹 성능 향상 방법론 | Devon 2012
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with RackRuby MVC from scratch with Rack
Ruby MVC from scratch with Rack
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101
 
APRICOT 2015 - NetConf for Peering Automation
APRICOT 2015 - NetConf for Peering AutomationAPRICOT 2015 - NetConf for Peering Automation
APRICOT 2015 - NetConf for Peering Automation
 
Git the Docs: A fun, hands-on introduction to version control
Git the Docs: A fun, hands-on introduction to version controlGit the Docs: A fun, hands-on introduction to version control
Git the Docs: A fun, hands-on introduction to version control
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
 
Reusable bootstrap resources zend con 2010
Reusable bootstrap resources   zend con 2010Reusable bootstrap resources   zend con 2010
Reusable bootstrap resources zend con 2010
 
What is systemd? Why use it? how does it work? - devoxx france 2017
What is systemd? Why use it? how does it work? - devoxx france 2017What is systemd? Why use it? how does it work? - devoxx france 2017
What is systemd? Why use it? how does it work? - devoxx france 2017
 
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...
(BDT402) Performance Profiling in Production: Analyzing Web Requests at Scale...
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Socket applications
Socket applicationsSocket applications
Socket applications
 

Similar to Build and maintain large ruby applications Ruby Conf Australia 2016

Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023Enrico Teotti
 
Consegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com RubyConsegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com RubyFabio Akita
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesAlfresco Software
 
Tdc 2013 - Ecossistema Ruby
Tdc 2013 - Ecossistema RubyTdc 2013 - Ecossistema Ruby
Tdc 2013 - Ecossistema RubyFabio Akita
 
11 page-directive
11 page-directive11 page-directive
11 page-directivesnopteck
 
Puppet at Bazaarvoice
Puppet at BazaarvoicePuppet at Bazaarvoice
Puppet at BazaarvoicePuppet
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An IntroductionThorsten Kamann
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!cloudbring
 
Puppet atbazaarvoice
Puppet atbazaarvoicePuppet atbazaarvoice
Puppet atbazaarvoiceDave Barcelo
 
TYPO3 Flow 2.0 (International PHP Conference 2013)
TYPO3 Flow 2.0 (International PHP Conference 2013)TYPO3 Flow 2.0 (International PHP Conference 2013)
TYPO3 Flow 2.0 (International PHP Conference 2013)Robert Lemke
 
JSUG - Maven by Michael Greifeneder
JSUG - Maven by Michael GreifenederJSUG - Maven by Michael Greifeneder
JSUG - Maven by Michael GreifenederChristoph Pickl
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppSmartLogic
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Joao Lucas Santana
 

Similar to Build and maintain large ruby applications Ruby Conf Australia 2016 (20)

Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023
 
Consegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com RubyConsegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com Ruby
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
 
Tdc 2013 - Ecossistema Ruby
Tdc 2013 - Ecossistema RubyTdc 2013 - Ecossistema Ruby
Tdc 2013 - Ecossistema Ruby
 
11 page-directive
11 page-directive11 page-directive
11 page-directive
 
Puppet at Bazaarvoice
Puppet at BazaarvoicePuppet at Bazaarvoice
Puppet at Bazaarvoice
 
Sinatra
SinatraSinatra
Sinatra
 
Sprockets
SprocketsSprockets
Sprockets
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Os Haase
Os HaaseOs Haase
Os Haase
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Puppet atbazaarvoice
Puppet atbazaarvoicePuppet atbazaarvoice
Puppet atbazaarvoice
 
TYPO3 Flow 2.0 (International PHP Conference 2013)
TYPO3 Flow 2.0 (International PHP Conference 2013)TYPO3 Flow 2.0 (International PHP Conference 2013)
TYPO3 Flow 2.0 (International PHP Conference 2013)
 
JSUG - Maven by Michael Greifeneder
JSUG - Maven by Michael GreifenederJSUG - Maven by Michael Greifeneder
JSUG - Maven by Michael Greifeneder
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
 
BPMS1
BPMS1BPMS1
BPMS1
 

More from Enrico Teotti

Facilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdfFacilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdfEnrico Teotti
 
Facilitating online agile retrospectives
Facilitating online agile retrospectivesFacilitating online agile retrospectives
Facilitating online agile retrospectivesEnrico Teotti
 
Measure success in agile retrospectives
Measure success in agile retrospectivesMeasure success in agile retrospectives
Measure success in agile retrospectivesEnrico Teotti
 
3 things about public speaking
3 things about public speaking3 things about public speaking
3 things about public speakingEnrico Teotti
 
Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1Enrico Teotti
 
feature flagging with rails engines v0.2
feature flagging with rails engines v0.2 feature flagging with rails engines v0.2
feature flagging with rails engines v0.2 Enrico Teotti
 
Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architectureEnrico Teotti
 
Feature flagging with rails engines
Feature flagging with rails enginesFeature flagging with rails engines
Feature flagging with rails enginesEnrico Teotti
 
Rails engines in large apps
Rails engines in large appsRails engines in large apps
Rails engines in large appsEnrico Teotti
 

More from Enrico Teotti (11)

Facilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdfFacilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdf
 
Facilitating online agile retrospectives
Facilitating online agile retrospectivesFacilitating online agile retrospectives
Facilitating online agile retrospectives
 
Measure success in agile retrospectives
Measure success in agile retrospectivesMeasure success in agile retrospectives
Measure success in agile retrospectives
 
Structured retros
Structured retrosStructured retros
Structured retros
 
3 things about public speaking
3 things about public speaking3 things about public speaking
3 things about public speaking
 
Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1
 
Mindset
MindsetMindset
Mindset
 
feature flagging with rails engines v0.2
feature flagging with rails engines v0.2 feature flagging with rails engines v0.2
feature flagging with rails engines v0.2
 
Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architecture
 
Feature flagging with rails engines
Feature flagging with rails enginesFeature flagging with rails engines
Feature flagging with rails engines
 
Rails engines in large apps
Rails engines in large appsRails engines in large apps
Rails engines in large apps
 

Recently uploaded

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 

Recently uploaded (20)

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 

Build and maintain large ruby applications Ruby Conf Australia 2016