Como não escrever o projeto lixo do futuro A Ferramenta Ideal uma questão de perspectiva Ricardo Valeriano @sr_valeriano github.com/ricardovaleriano ruby, java, javascript, ios Guilherme Silveira @guilhermecaelum github.com/caelum ruby, java, scala, machine learning em educação http://caelum.com.br/online Não é especificamente sobre Ruby ¬¬ Não tem código ¬¬ Mentira, tem mas pouquinho =) Java é D+ Java List<Categoria> categorias = new ArrayList<Categoria>(); for(Produto p : produtos) categorias.add(p.getCategoria()); for(int i=0;i<categorias.size();i++) { Categoria c = categorias.get(i); if(categorias.lastIndexOf(c)!=i) { categorias.remove(c); i--; } } double total = 0; for(Produto p : produtos) { total += p.getValor(); } , e t n e s! i m a l a m e r de é Ruby é D+ Ruby unicas = [] for produto in produtos unless(unicas.include? produto.categoria) unicas << produto.categoria end end Ruby unicas = produtos.map{|p| p.categoria}.uniq total = produtos.inject(0){|tot, p| tot + p.valor} Ruby unicas = produtos.map(&:categoria).uniq total = produtos.inject(0){|tot, p| tot + p.valor} GORDO Y U NO USE THA API? Domine sua api (sugestão para o bom programador) Ruby unicos = produtos.map(&:categoria).uniq total = produtos.map(&:valor).inject(:+) Domine sua api (sugestão para o bom programador) Java List<Categoria> categorias = new ArrayList<Categoria>(); for(Produto p : produtos) categorias.add(p.getCategoria()); for(int i=0;i<categorias.size();i++) { Categoria c = categorias.get(i); if(categorias.lastIndexOf(c)!=i) { categorias.remove(c); i--; } } double total = 0; for(Produto p : produtos) { total += p.getValor(); } a t l m a e f g a na m a u c p sa e d Java Set categorias = new HashSet(); for(Produto p : produtos) cat.add(p.categoria()); double total = 0; for(Produto p : produtos) total += p.valor(); Ruby unicos = produtos.map(&:categoria).uniq , e total = produtos.map(&:valor).inject(:+) t n e s! i m a l a m e e r d Ruby é D+ é Scala produtos.map(_.categoria).unique produtos.map(_.valor).sum E ! á H m m e t s i a Scala class Compra() { lazy val produtos = Produtos.all } BONUS ROUND: public lazy! class Compra(produtos:List[Produto]) { } class Compra(val produtos:List[Produto]) { } BONUS ROUND: IMUTAVEL! class Compra(var produtos:List[Produto]) { } BONUS ROUND: public vars! Scala rocks #fato Obrigado The End. Ricardo Valeriano @sr_valeriano github.com/ricardovaleriano ruby, java, javascript, ios Guilherme Silveira @guilhermecaelum github.com/caelum ruby, java, scala, machine learning O que buscamos em uma linguagem? Poder o que posso fazer? Expressividade como posso fazer? O que expressa mais, de maneira mais breve? PORTUGUÊS (PT-BR) fato real: ontem... Usei o cartão de crédito da minha mãe pois estava as b a sem dinheiro. íl + 0 2 s INGLÊS (EN-US) OS GRINGOS DEVEM ESTAR MORRENDO ESCUTANDO ESSE INGLES DO VALERIANO I’ve used my mom’s credit s card ‘cause I had no a b a money. íl + 7 1 s MANÊS? Súmemo jão. Mó perreio! Utilizei do cartão da senhora minha mãe, certo? Prá adquirir uns bens, na humildade mêmo, tá ligado? COREANO A PRIMEIRA VISTA, QUAL VOCÊ PREFERE? 돈 없어서 엄마 카드 < < < 썼다. L A s a M b R a O F síl > > > 12 Expressividade 엄카 썼다. s a o b d í a l ru í s 4 em s e Coreano menos palavras mais expressividade mais poder LET’S ALL LEARN KOREAN NOOOOOW! 안녕~ 집에 갈래? ‘A medida que diminuem as palavras, aumenta a ambiguidade’ José Valim @ GuruSP Então... o que queremos afinal? MAIS poder MAIS expressividade MAIS concisão ‘you can accomplish more in smaller yet readable code’ Matz (on Ruby) Não é só escrever menos Talvez o código mais simples, seja melhor. ‘Simplicity Ain't Easy’ Stuart Halloway Ruby class Complaint def has_category? @product.category end end Ruby class Complaint def has_category? @product && @product.category end end Ruby class Complaint def has_category? @product.andand.category end end Ruby class Complaint def has_category? !!(@product && @product.category) end end Ruby class Complaint def has_category? [email protected] end end andand? @product.andand.category Zoado né? ‘i don’t need more random boolean conditional constructs because thats not what is ! o improvingrour i e code aquality’ d o! s d l evan phoenix r a e V E F Ruby produtos.map(&:categoria).uniq produto.andand.categoria produto.map(&:categoria) não é um random boolean conditional é o básico de uma mônada de funcional products.map(_.category) (0 ou +) product.map(_.category) (0 ou 1) Quem ganha? Ninguém. os dois estão certos! um no imperativo, outro no funcional. Contexto Poder, Expressividade, Concisão são contextuais ‘humans require more sophisticated tools to program’ Matz Quem acha a sua linguagem perfeita? As ferramentas mudam com o tempo, elas evoluem. Linguagens e escolhas possuem desvantagens. #fato (re) Conheça bem as desvantagens. (sugestão para o bom programador) (re) Conheça bem as desvantagens. (sugestão para o bom programador) Para evitar abusar delas. (sugestão para o bom programador) MySQL Neo4J as queue as crud storage resumindo O mais importante em um projeto é escrever código bonito. O mais importante em um projeto é escrever código bom. ? + código? O que não queremos? def _read_attribute(attr_name) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' value = @attributes[attr_name] unless value.nil? if column = column_for_attribute(attr_name) if unserializable_attribute?(attr_name, column) unserialize_attribute(attr_name) else column.type_cast(value) end else value end end end fonte pequena? def _read_attribute(attr_name) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' value = @attributes[attr_name] unless value.nil? if column = column_for_attribute(attr_name) if unserializable_attribute?(attr_name, column) unserialize_attribute(attr_name) else column.type_cast(value) end else value end end end agora sim? fonte 16 for_att ribute( attr_na agora sim? fonte mil mas eese... mas se... mas e se... mas e se... mas e mas ese... se... def _read_attribute(attr_name) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' value = @attributes[attr_name] unless value.nil? if column = column_for_attribute(attr_name) if unserializable_attribute?(attr_name, column) unserialize_attribute(attr_name) else column.type_cast(value) end else value end end end 23... Conciso? Ruby? C++? Java? Scala? Muito if?Basic? C#? JavaScript? A nova linguagem do mês? Nova Linguagem novo uso idiomático novo mindset LET’S USE SCALA FOR ALL THE THINGS! Para evitar abusar das desvantagens. (sugestão para o bom programador) scala para crud Nova Linguagem novo uso idiomático novo mindset mesmos erros ‘o teu “overuse” é muito bom prá você mas a desgraça dos outros’ Jay Fields Quem está há mais de 2 anos no mesmo projeto? ‘pfvr néam? amanhã você vai sair do projeto!’ Random Scumbag Seja o principal crítico de suas escolhas (sugestão para o bom programador) É IRADO, É DEZ ‘Quando quebra o projeto em vários, fica mais fácil de ver que para uma parte do projeto uma linguagem é mais interessante’ Alberto (oderski) Souza require "sinatra" require "json" interestie Sequel.connect ENV["DATABASE_URL"] require "interest" get "/" do interest = Interest.new params[:interest] interest.save ? ok_response params : error_response params end def ok_response(params) respond_with params end def error_response(params) respond_with(params, { errors:["unable to set up interest"] }) end def respond_with(params, json_data = {ok:"ok"}) "#{params["callback"]}(#{json_data.to_json})" end Projetos pequenos múltiplos projetos Não escolha sempre a sua linguagem preferida. (sugestão para o bom programador) Quando não usar o Rails? Quem melhor que o José Valim para dizer? Caelum Online (online.caelum.com.br) Baseado nisso mysql alumni.caelum.com.br RoR alunos java + vraptor solr ondetrabalhar.com ruby + projetos postgresql promo RoR redis analisador 1 sinatra sinatra + sequel sinatra + sequel exercícios RoR postgresql mountable engine RoR aws tickets RoR java scala + vraptor interestie postgresql postgresql gnarus java java + RoR redis sugest mysql pagamentos casa do código scala + play java + octave mysql mysql + 1 projeto métricas mysql postgresql postgresql analisador 2 + 6 projetos java + 1 ‘página’ RoR postgresql js Baseado nisso mysql alumni.caelum.com.br RoR alunos java + vraptor solr ondetrabalhar.com ruby + projetos postgresql promo RoR redis analisador 1 sinatra sinatra + sequel sinatra + sequel exercícios RoR postgresql mountable engine RoR aws tickets RoR java scala + vraptor interestie postgresql postgresql gnarus java java + RoR redis sugest mysql pagamentos casa do código scala + play java + octave mysql mysql + 1 projeto métricas mysql postgresql postgresql analisador 2 + 6 projetos java + 1 ‘página’ RoR postgresql js Baseado nisso mysql alumni.caelum.com.br RoR alunos java + vraptor solr ondetrabalhar.com ruby + projetos postgresql promo RoR redis analisador 1 sinatra sinatra + sequel sinatra + sequel exercícios RoR postgresql mountable engine RoR aws tickets RoR java java + vraptor interestie postgresql postgresql gnarus java java + RoR redis sugest mysql pagamentos casa do código scala + play java + octave mysql mysql + 1 projeto métricas mysql postgresql postgresql analisador 2 + 6 projetos java + 1 ‘página’ RoR postgresql js Reparou? mysql alumni.caelum.com.br RoR alunos java + vraptor solr ondetrabalhar.com ruby + projetos postgresql promo RoR redis analisador 1 sinatra sinatra + sequel sinatra + sequel exercícios RoR postgresql mountable engine RoR aws tickets RoR java java + vraptor interestie postgresql postgresql gnarus java java + RoR redis sugest mysql pagamentos casa do código scala + play java + octave mysql mysql + 1 projeto métricas mysql postgresql postgresql analisador 2 + 6 projetos java + 1 ‘página’ RoR postgresql js RESUMINDO (de verdade) Domine sua linguagem (sugestão para o bom programador) Domine sua linguagem api/framework a ponto de criticar os pontos negativos (sugestão para o bom programador) Domine outras linguagens... TANTO quanto. (sugestão para o bom programador) Todas as linguagens são marotas * Contexto Pessoa Momento * salvo brain f#ck Domine suas escolhas para não ser dominado por elas. (sugestão para o bom programador) Domine suas escolhas para não ser dominado por elas. (sugestão para o bom programador) Obrigado! @guilhermecaelum @sr_valeriano www.rubyonrailsonline.com.br