filosofia ruby e rails (ufop e inforuso 2010)
DESCRIPTION
Filosofia do Ruby/Rails e valores da comunidade.TRANSCRIPT
FILOSOFIA RUBY E RAILS
@danielvlopes
ENG. DE SOFTWARE CENTRADA EM MÉTODOS ÁGEIS
http://bit.ly/unapos
SLIDESHARE.NET/DANIELVLOPES
FILOSOFIA RUBY E RAILS
• Código
• Cultura
• Criatividade
POR QUE ME INTERESSA?
... um aclamado instrutor aplicando um curso descobriu que um de seus pupilos era um venture capitalist.
Quando questionado sobre o motivo de estar em uma turma de “Ruby on Rails” ... , ele respondeu simplesmente:
Mark Gardner http://bit.ly/railsecosystem
todas as start-ups que me procuram estão usando, eu quero descobrir qual é o “grande lance”.
Matz Ruby World Keynote http://bit.ly/bH4hA2
Investidores estão pressionando startups para usarem Ruby. "É mais rápido, então se você pode encurtar a entrega em um
mês, porque não usar Ruby?"
Matz Ruby World Keynote http://bit.ly/bH4hA2
Investidores estão pressionando startups para usarem Ruby. "É mais rápido, então se você pode encurtar a entrega em um
mês, porque não usar Ruby?"
Mais de 60% dos VCs usam Ruby para criar seus sistemas
POR QUE STARTUPS?
VOCÊ DEVE SE COMPORTAR COMO
UMA STARTUP
Yukihiro Matsumoto(criador do Ruby)
“Se você terminar seu trabalho rápido e de forma divertida, isso
não é bom?”
Matz http://www.artima.com/intv/ruby3.html
“Tornar as coisas simples fáceis e as coisas complexas possíveis”
• 100% orientada a objetos
• Linguagem dinâmica
• Esperados 4 milhões até 2013
• FREE e Open Source
• As vezes chamada de “scripting” language
Eu inventei o termo “Orientação a Objetos” e posso dizer que não era C++ que eu tinha em mente.
Dave Thomas
2001Dave Thomas
2004
“Eu sempre soube que Smalltalk substituiria Java. Só não sabia que isso se chamaria Ruby.”
Kent Beck, Criador do "Extreme Programming" e "TDD"
FICAMOS EMPOLGADOS !!!
Vídeo Java VS Rails
JRubyCharles Nutter
JRubyCharles Nutter
MacRubyL. Sansonetti
JRubyCharles Nutter
JQuery/RailsYehuda Katz
MacRubyL. Sansonetti
Ruby 1.8.7
Ruby 1.8.7
Ruby 1.9.2
JRuby 1.5.X
JRuby 1.5.X
Rubinius 1.1
JRuby 1.5.X
Rubinius 1.1
Mac Ruby 0.6
JRuby 1.5.X
Rubinius 1.1
Mac Ruby 0.6
Iron Ruby 1.0
RUBY NA WEB
RUBY ON RAILS
JASON FRIED
DAVID HANSSON
DHH
DHH
2004
Vídeo 37Signals
código gerando código
código gerando código
convention over configuration
código gerando código
convention over configuration
don’t repeat your self
código gerando código
convention over configuration
don’t repeat your self
desenvolvimento ágil
EXTREME PROGRAMMING
recursos restful
recursos restful
Unicode, TimeZone, i18n
recursos restful
Unicode, TimeZone, i18n
Segurança (XSS, XSRF, Injection)
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
class Post < ActiveRecord::Base # ASSOCIATIONS has_and_belongs_to_many :categories belongs_to :author has_many :comments, :dependent => :destroy
# VALIDATIONS validates_presence_of :title, :body, :author, :slug, :published_at validates_uniqueness_of :slug validates_inclusion_of :draft, :in => [true, false] validates_associated :author
# SCOPES (custom queries) default_scope :order => 'published_at DESC' scope :published, lambda { where(:draft => false) }
# CALLBACKS before_validation :generate_slug
protected def generate_slug self.slug = title unless slug.present? self.slug = slug.parameterize endend
model
<%= form_for [ post, comment ], :remote => true do |f| %> <%= error_messages_for comment %> <div class="field"> <%= f.label :author %><br /> <%= f.text_field :author %> </div>
<div class="field"> <%= f.label :url %><br /> <%= f.text_field :url %> </div>
<div class="field"> <%= f.label :body %><br /> <%= f.text_area :body, :rows => 10, :cols => 90 %> </div>
<%= render "submit_or_cancel" %><% end %>
views
class Admin::PostCategoriesController < ApplicationController def index @categories = PostCategory.all respond_with @categories end
def show @category = PostCategory.find(params[:id]) respond_with @category end
def new @category = PostCategory.new respond_with @category end
def edit @category = PostCategory.find(params[:id]) end
def create @category = PostCategory.new(params[:post_category]) flash[:notice] = 'Category was successfully created.' if @category.save respond_with @category end
def update end
def destroy endend
controller
CLEAN CODE
190
40VS
Eles servem mais de 23 milhões de visitantes/mês.
Eles servem mais de 23 milhões de visitantes/mês.
A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java
Eles servem mais de 23 milhões de visitantes/mês.
A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java
mais importante, facilitou a dificuldade que tinham em manutenção.
A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java
mais importante, facilitou a dificuldade que tinham em manutenção.
Eles finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.
mais importante, facilitou a dificuldade que tinham em manutenção.
Eles finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.
Uma vez completo e otimizado, o site deles agora é mais rápido que antes
http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails
ECOSSISTEMA
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
source 'http://rubygems.org'
gem 'rails', '3.0.0.rc'gem 'devise', '1.1.1'gem 'paperclip', '2.3.3'gem 'menu_builder', '0.3.3'gem 'RedCloth', '4.2.3'gem 'will_paginate', '3.0.pre2'gem 'reverse_captcha', '0.0.1'gem 'capistrano', '2.5.19'gem 'mysql', '2.8.1'
group :development do gem 'sqlite3-ruby', :require => 'sqlite3' gem "rspec", ">=2.0.0.beta.11" gem "rspec-rails", ">=2.0.0.beta.11" gem "ruby-debug"end
group :test do gem 'capybara' gem 'database_cleaner' gem 'steak', '>= 0.4.0.beta.1' gem 'factory_girl_rails'end
Gemfile
COMO ACHAR ?
DEPLOY
deploy.rbset :application, "producer"set :ip_address , "208.88.125.20"
# GIT SETTINGSset :scm, :gitset :repository, "[email protected]:danielvlopes/producer.git"set :branch, "master"set :deploy_via, :remote_cache
# SSH SETTINGSset :user , "rails"set :deploy_to, "/home/rails/#{application}"set :shared_directory, "#{deploy_to}/shared"set :use_sudo, falseset :group_writable, falsedefault_run_options[:pty] = true
# ROLESrole :app, ip_addressrole :web, ip_addressrole :db, ip_address, :primary => true
# HOOKSafter 'deploy:setup', 'db:setup'
after 'deploy:update_code' do db.symlink assets.symlinkend
TESTES
RSpec Steak
Cucumber Test::Unit
Minitest Bacon Should
Factory Girl Fabrication
Machinist Mocha RR
Feature: Authenticate In order to see my previous links As a user I want to be able to create an account
Scenario: Creating a new account Given I am not authenticated When I go to register And I fill in the following: | Email | [email protected] | | Password | 123456 | | Password confirmation | 123456 | And I press "Sign up" Then I should see "You have signed up successfully"
Cucumber
http://github.com/danielvlopes/buggy/blob/master/features/authenticate.feature
feature "Catalog", %q{ In order to display a catalog in devices As registered publisher I want to manage a catalog.} do
background do ensure_not_logged_in @owner = Factory :app, :name => "1Password" end
scenario "Create catalog for 1Password", :js => true do visit new_catalog_page_for(@owner)
select "shelf/metal", :from => "Theme" fill_in "Title", :with => "Appextras"
drag_to_catalog available_app click "Create Catalog"
should_have_notice "Catalog was successfully created." end
Steak
describe Guest do before do @room = Room.new("Room 35", Type::Master.new) @hosting = Hosting.new(@room, 5) @guest = Guest.new("Daniel Lopes", @hosting) end
it "should have a name" do assert_equal "Daniel Lopes", @guest.name end
describe "when print the invoice" do it "should have the guest name" do assert_match /Daniel Lopes/, @guest.invoice end
it "should have the room name" do assert_match /Room 35/, @guest.invoice end
it "should have the total amount" do assert_match /Valor total: 1000/, @guest.invoice end
it "should have the discount points earned with that hosting" do assert_match /Você ganhou 6 ponto\(s\)/, @guest.invoice end endend
Minispec
COMUNIDADE
guides.rubyonrails.org
peepcode.com
railscasts.com
akitaonrails.com
egenial.com.br/cursos
github.com
MITOS
Ruby é Lento
http://programmingzen.com/?s=benchmark
slideshare.net
Home 331 ms
Total 5.45 ms
http://railsmg.org/meetings/1
Rails NÃO ESCALA
Friendster foi escrito em Java e mudaram para PHP.
MySpace foi escrito em ColdFusion e mudaram ASP.NET.
Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a linguagem é o problema, mas eu acho que isso raramente é a realidade.
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das eleições em quase tempo
real em um de seus sites mais acessados de todos os tempos.”
http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1
RAILS é a SALVAÇÃO
VAMOS SER AGILE
Recapitulando
entregue rápido
entregue rápidoentregue sempre
entregue rápidoentregue sempre
com qualidade
SEJA SEMPRE PROFISSIONAL
Vídeo Uncle Bob
Aprender Ruby e Railsvão te tornar um
profissional melhor
CURSOS
egenial.com.br/cursorails
egenial.com.br/imersaorubyonrails
CONTATOS
blog.areacriacoes.com.br
twitter @danielvlopes