{"id":2977,"date":"2020-01-27T03:11:51","date_gmt":"2020-01-27T06:11:51","guid":{"rendered":"https:\/\/www.itexto.com.br\/devkico\/?p=2977"},"modified":"2020-01-27T03:11:57","modified_gmt":"2020-01-27T06:11:57","slug":"meu-retorno-ao-ruby-on-rails","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2977","title":{"rendered":"Meu retorno ao Ruby on Rails"},"content":{"rendered":"\n<p>Este ano a itexto decidiu investir em Ruby on Rails, o que me fez iniciar uma imers\u00e3o pessoal de aprendizado na tecnologia e cujas primeiras (segundas?) impress\u00f5es conto para voc\u00eas neste post.<\/p>\n\n\n\n<p>Aviso: esta \u00e9 a vis\u00e3o de algu\u00e9m que trabalha com Java h\u00e1 muito tempo e que \u00e9 iniciante em Ruby on Rails. Por favor entendam e me corrijam caso diga bobagens aqui, ok? Voc\u00ea estar\u00e1 ajudando no meu aprendizado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minha hist\u00f3ria pessoal com Ruby on Rails e Grails (o antigo Groovy on Rails)<\/h2>\n\n\n\n<p>Minha hist\u00f3ria com Ruby on Rails (RoR) completa em 2020 15 anos. Come\u00e7ou quando vi o v\u00eddeo abaixo em 2005, quando o David Heinemeier Hansson (DHH) nos mostrou como escrever um blog em 15 minutos com RoR. Se voc\u00ea leu <a href=\"https:\/\/www.casadocodigo.com.br\/products\/livro-grails\" class=\"rank-math-link\">meu livro sobre Grails<\/a> deve ter visto minha men\u00e7\u00e3o ao framework e parte desta hist\u00f3ria no cap\u00edtulo 4: &#8220;Precisamos falar sobre Grails&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"ast-oembed-container \" style=\"height: 100%;\"><iframe loading=\"lazy\" title=\"Ruby on Rails demo\" width=\"500\" height=\"375\" src=\"https:\/\/www.youtube.com\/embed\/Gzj723LkRJY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p>Apesar de ter mudado radicalmente o modo como via o desenvolvimento web na \u00e9poca (n\u00e3o s\u00f3 a minha vis\u00e3o, mas a do mundo, dado que a esmagadora maioria dos frameworks que vieram depois s\u00e3o <strong>profundamente<\/strong> influenciados pelo RoR (Grails se chamava Groovy on Rails &#8211; c\u00f3pia bruta &#8211; <a href=\"https:\/\/web.archive.org\/web\/20071107124501\/http:\/\/www.nabble.com\/Groovy-on-Rails-is-no-more-(kind-of)-t1369271.html\" class=\"rank-math-link\">link para e-mail com amea\u00e7a de processinho vindo do DHH<\/a>)), n\u00e3o embarquei neste trem naquela \u00e9poca pelas seguintes raz\u00f5es:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Na empresa em que trabalhava j\u00e1 tinha sido um parto convencer o pessoal a usar Java (a linguagem adotada era VB6).<\/li><li>Apesar de incr\u00edvel o framework mostrava na \u00e9poca alguns limites no que dizia respeito ao desempenho e estabilidade (talvez por minha pr\u00f3pria falta de experi\u00eancia com ele na \u00e9poca).<\/li><\/ul>\n\n\n\n<p>Na mesma \u00e9poca surgia um framework chamado &#8220;Groovy on Rails&#8221; (Grails) que me oferecia a produtividade do RoR somado \u00e0 possibilidade de poder aproveitar todo meu c\u00f3digo legado Java e, ainda por cima, ser baseado em um stack que j\u00e1 havia sido fortemente testado pelo mercado (Spring e Hibernate essencialmente). Grails me ganhou ali e foi um dos maiores acertos da minha carreira sem d\u00favidas.<\/p>\n\n\n\n<p>Mas Grails apesar da popularidade na \u00e9poca nunca se tornou um framework mainstream. E por todos estes anos observava a popularidade do Rails e me perguntava por que Grails tamb\u00e9m n\u00e3o havia obtido tanta popularidade. <\/p>\n\n\n\n<p>Grails ainda \u00e9 um dos meus frameworks favoritos (empata com Spring). Tenho diversos cases em que atuei e conheci nos quais pude ver qu\u00e3o bem escala, \u00e9 f\u00e1cil de manter a base de c\u00f3digo ao longo dos anos (ANOS!) mantendo o framework atualizado e, ainda mais importante: \u00e9 uma plataforma que continua muito viva e ativa, basta ver que sempre saem grandes releases do framework (como o 4.0, lan\u00e7ado no final do ano passado). <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que Rails agora?<\/h2>\n\n\n\n<p>Ent\u00e3o por que resolvemos investir <strong>tamb\u00e9m<\/strong> em Ruby on Rails <strong>agora?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Rails passou pelo teste do tempo, tal como Grails. <\/li><li>Rails tem a popularidade que falta ao Grails (h\u00e1 clientes que levam a popularidade do stack de desenvolvimento como um fator determinante (discordo da postura, mas entendo)).<\/li><li>Usamos internamente muitas ferramentas feitas em Ruby on Rails que gostar\u00edamos de entender a fundo e, quem sabe, at\u00e9 mesmo contribuir para seu desenvolvimento (Gitlab, Discourse, Redmine&#8230;).<\/li><li>\u00c9 importante do ponto de vista estrat\u00e9gico abra\u00e7ar plataformas que v\u00e3o al\u00e9m da JVM (e aqui entram sub-raz\u00f5es):<ul><li>Pra termos uma vis\u00e3o melhor a respeito do pr\u00f3prio Java.<\/li><li>Aumentar nosso horizonte de atua\u00e7\u00e3o enquanto consultoria.<\/li><li>Pra que possamos ter cada vez mais uma vis\u00e3o menos enviesada do que \u00e9 desenvolver software.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>E o mesmo tipo de projeto no qual atuamos com Grails, podemos atuar no Rails: aplica\u00e7\u00f5es web baseadas em um banco de dados relacional que podem ser tanto full stack (fornecendo a base para o desenvolvimento tanto da API quanto do front-end) quanto apenas a API, o que o torna compat\u00edvel com os tempos atuais, nos quais o desenvolvimento do back-end desacoplado do front-end se tornou quase que a norma. Mas mais do que isto: projetos para os quais precisemos de alt\u00edssima produtividade: a mesma ou ao menos bem pr\u00f3xima daquela que temos com Grails.<\/p>\n\n\n\n<p>N\u00e3o estamos abandonando o Grails (muito pelo contr\u00e1rio!), mas \u00e9 interessante podermos dar mais esta op\u00e7\u00e3o para nossos clientes e, de quebra, ainda ampliarmos enormemente nossos horizontes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Meu processo de aprendizado (ou reaprendizado)<\/h2>\n\n\n\n<p>Para algu\u00e9m que est\u00e1 a tanto tempo no Java (1996) e Groovy (2007\/8) como eu pegar para aprender Ruby on Rails pode ser um processo bastante complicado. Sendo assim fiz o que recomendo a nossos alunos de Grails. <strong>Come\u00e7ar pela linguagem<\/strong>.<\/p>\n\n\n\n<p>Comecei pelo aprendizado do Ruby: do mais b\u00e1sico ao mais avan\u00e7ado, o que se mostrou um desafio e tanto. Apesar da comunidade Ruby on Rails ser extremamente ativa, o mesmo n\u00e3o posso dizer a respeito da disponibilidade de bom material sobre a linguagem Ruby. Foi bastante dif\u00edcil selecionar este material.<\/p>\n\n\n\n<p>Comecei por dois livros que li na \u00e9poca em que tive meu primeiro contato com Rails em 2005\/2006. Os livros do F\u00e1bio Akita (Repensando a Web com Rails) e do Eust\u00e1quio Rangel (Ruby: conhecendo a linguagem). N\u00e3o vou mentir, por serrem livros bem antigos apenas dei uma repassada r\u00e1pida de olho neles. Mas os menciono aqui por que na \u00e9poca, apesar de n\u00e3o terem sido meu caminho, exerceram forte influ\u00eancia sobre mim: especialmente o primeiro, do F\u00e1bio Akita.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/livro_akita.jpg\" alt=\"\" class=\"wp-image-2979\" width=\"188\" height=\"250\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/livro_akita.jpg 376w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/livro_akita-226x300.jpg 226w\" sizes=\"(max-width: 188px) 100vw, 188px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/livro_taq.png\" alt=\"\" class=\"wp-image-2980\" width=\"197\" height=\"289\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/livro_taq.png 263w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/livro_taq-205x300.png 205w\" sizes=\"(max-width: 197px) 100vw, 197px\" \/><\/figure><\/div>\n\n\n\n<p>Encontrar material novo sobre Ruby se mostrou uma tarefa muito \u00e1rdua. Isto por que no <a href=\"https:\/\/ruby-lang.org\" class=\"rank-math-link\">site oficial<\/a> os <a href=\"https:\/\/www.ruby-lang.org\/pt\/documentation\/\" class=\"rank-math-link\">links<\/a> que existem apontam muitas vezes para vers\u00f5es muito antigas ou  material muito raso como, por exemplo, o site <a href=\"https:\/\/ruby.github.io\/TryRuby\/\" class=\"rank-math-link\">&#8220;Try Ruby&#8221;<\/a>, que promete em 15 minutos te dar uma vis\u00e3o geral da linguagem. Ele at\u00e9 consegue, mas n\u00e3o era o que buscava.<\/p>\n\n\n\n<p>Na pr\u00e1tica acabei ficando com uma dobradinha entre tr\u00eas sites:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/rubylearning.com\/\" class=\"rank-math-link\">Ruby Learning<\/a> &#8211; que s\u00e3o essencialmente notas sobre a linguagem, mas que me ajudaram bastante a pegar o vocabul\u00e1rio a respeito da linguagem.<\/li><li><a href=\"https:\/\/www.techotopia.com\/index.php\/Ruby_Essentials\" class=\"rank-math-link\">Ruby Essentials<\/a> &#8211; vai um pouco al\u00e9m das notas do Ruby Learning: essencialmente o mesmo conte\u00fado.<\/li><li><a href=\"http:\/\/ruby-doc.com\/docs\/ProgrammingRuby\/\" class=\"rank-math-link\">Programming Ruby<\/a> &#8211; do mesmo pessoald o Pragmatic Programmer. Infelizmente trata da vers\u00e3o 1.6 da linguagem ainda.<\/li><\/ul>\n\n\n\n<p>Segui o estilo de leitura mais chato que voc\u00eas podem imaginar: linear, do in\u00edcio ao fim, experimentando todos os exemplos que podia no meu computador e fazendo meus pr\u00f3prios experimentos. Saber Groovy (que \u00e9 inspirado tamb\u00e9m em Ruby) me ajudou bastante a entender a linguagem.<\/p>\n\n\n\n<p>Se com Ruby tive dificuldade em encontrar material, o mesmo n\u00e3o posso falar sobre Ruby on Rails, que peguei logo na sequ\u00eancia. E me sinto muito aliviado por ter come\u00e7ado pela linguagem, por que foi gra\u00e7as a este esfor\u00e7o que consegui ficar minimamente produtivo com o framework.<\/p>\n\n\n\n<p>(Volto \u00e0 \u00eanfase na linguagem. Se voc\u00ea n\u00e3o entender a sintaxe do Ruby, Rails vai parecer m\u00e1gica e isto al\u00e9m de perigoso \u00e9 p\u00e9ssimo pra sua compreens\u00e3o)<\/p>\n\n\n\n<p>O <a href=\"https:\/\/rubyonrails.org\/\" class=\"rank-math-link\">site oficial do framework<\/a> cont\u00e9m os <a href=\"https:\/\/guides.rubyonrails.org\/\" class=\"rank-math-link\">guias essenciais<\/a> que s\u00e3o o material que tenho seguido em meus estudos. S\u00e3o guias muito bons! At\u00e9 bem pouco tempo atr\u00e1s achava a documenta\u00e7\u00e3o do Grails a melhor que conhecia: agora prefiro a do Ruby on Rails.<\/p>\n\n\n\n<p>Comecei pelo <a href=\"https:\/\/guides.rubyonrails.org\/getting_started.html\" class=\"rank-math-link\">guia introdut\u00f3rio no qual criamos um motor de blogs<\/a>. Foi uma boa escolha por que voc\u00ea consegue pegar o in\u00edcio sobre como \u00e9 o fluxo de trabalho do framework.<\/p>\n\n\n\n<p>Feito isto fui seguindo os guias um a um. Estou usando a \u00faltima vers\u00e3o do Rails (6.0.2.1), e alguns dos guias ainda n\u00e3o est\u00e3o 100% completos. Tenho conseguido me virar bem, mas meu foco n\u00e3o est\u00e1 sendo a constru\u00e7\u00e3o full stack do framework, mas sim a implementa\u00e7\u00e3o de APIs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minhas segundas impress\u00f5es<\/h2>\n\n\n\n<p>\u00c9 muito dif\u00edcil pra mim ver as tecnologias relacionadas ao Rails e n\u00e3o fazer compara\u00e7\u00f5es com o que temos no mundo Java (e agora .net). Sendo assim tenha em mente que minhas opini\u00f5es ainda s\u00e3o bastante enviesadas (e limitadas pela minha pouca experi\u00eancia).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Active Record<\/h3>\n\n\n\n<p>\u00c9 o framework de persist\u00eancia objeto-relacional do Rails. A primeira vez que vi em 2005\/6 (especialmente os finders din\u00e2micos) achei que era m\u00e1gica. Hoje, tantos anos depois, n\u00e3o me impressiona tanto. Na realidade, comparado ao GORM do Grails, acho que fica pra tr\u00e1s, especialmente quando penso na busca por criterias e no pr\u00f3prio HQL\/JPQL.<\/p>\n\n\n\n<p>Apesar de ainda o ver um pouco atr\u00e1s (talvez por minha pouca experi\u00eancia com ele), h\u00e1 aspectos que me agradam. Percebi que a busca por SQL \u00e9 quase uma necessidade com ele. Eu tenho algo interessante que \u00e9 o fato de ter uma solu\u00e7\u00e3o de ORM mas, ao mesmo tempo, tenho acesso ao SQL.<\/p>\n\n\n\n<p>N\u00e3o \u00e9 t\u00e3o completo quanto o Hibernate. Ao lidar com MySQL, por exemplo, tive alguma dificuldade ao tratar campos do tipo bit na base legada que usei para testes (a do \/dev\/All &#8211; mais sobre isto a frente). Tamb\u00e9m tive dificuldade em fazer algo simples como a busca com operador like usando apenas o Active Record e sem precisar escrever SQL.<\/p>\n\n\n\n<p>\u00c9 muito interessante a abordagem do framework com o banco de dados, especialmente legado. Dado a natureza da linguagem Ruby, o mapeamento das nossas classes de modelo com o banco de dados nascem quase que por m\u00e1gica. Cada campo presente nas tabelas vira imediatamente um atributo de inst\u00e2ncia de nossas classes, sem a necessidade de mapeamentos.<\/p>\n\n\n\n<p>(\u00c9 importante que voc\u00ea saiba que Active Record \u00e9 o nome de um <a href=\"https:\/\/www.martinfowler.com\/eaaCatalog\/activeRecord.html\" class=\"rank-math-link\">padr\u00e3o de projeto<\/a>, antes que o nome de um framework de persist\u00eancia. Esta compreens\u00e3o lhe ajudar\u00e1 DEMAIS a entender o framework.)<\/p>\n\n\n\n<p>Mas note: s\u00e3o minhas segundas\/primeiras impress\u00f5es. Ainda n\u00e3o tenho muita experi\u00eancia com o framework e tenho certeza de que estou comendo mosca neste ponto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action Controller<\/h3>\n\n\n\n<p>\u00c9 como escrevemos nossos controladores com Rails. N\u00e3o h\u00e1 como n\u00e3o comparar com o Grails. O que posso dizer a respeito&#8230; Grails \u00e9 uma c\u00f3pia XEROX do Rails aqui. \u00c9 realmente MUITO parecido, talvez por isto eu tenha pego t\u00e3o r\u00e1pido o jeito da coisa.<\/p>\n\n\n\n<p>Fiquei produtivo muito r\u00e1pido com o Action Controller. Bastou ler o guia <a href=\"https:\/\/guides.rubyonrails.org\/v5.2\/action_controller_overview.html\" class=\"rank-math-link\">Action Controller Overview<\/a> e, na sequ\u00eancia, o <a href=\"https:\/\/guides.rubyonrails.org\/v5.2\/routing.html\" class=\"rank-math-link\">Rails Routing from Outside In<\/a>, ambos presentes no site oficial do framework.<\/p>\n\n\n\n<p>Interessante que o framework j\u00e1 nasce com tudo o que precisamos para poder aplicar o BDD\/TDD de cara na escrita dos controladores. Isto me possibilitou fazer diversos experimentos e j\u00e1 come\u00e7ar a usar o framework com o p\u00e9 direito, isto \u00e9, j\u00e1 tendo tudo baseado em testes.<\/p>\n\n\n\n<p>Resumindo: se voc\u00ea sabe Grails, j\u00e1 sabe 80% do que precisa no Rails.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dificuldades com o ambiente de desenvolvimento<\/h3>\n\n\n\n<p>Nem tudo s\u00e3o flores. H\u00e1 pedras no caminho, especialmente se voc\u00ea est\u00e1 acostumado com Java. No mundo Java tudo \u00e9 Java: \u00e9 muito raro voc\u00ea precisar de c\u00f3digo nativo pra fazer qualquer coisa. O mesmo n\u00e3o se d\u00e1 com Ruby on Rails.<\/p>\n\n\n\n<p>Pra ter acesso \u00e0 base de dados MySQL, por exemplo, achei em um primeiro momento que bastava instalar a gem mysql2. Quebrei muito a cabe\u00e7a at\u00e9 notar que faltavam algumas bibliotecas nativas pra que esta funcionasse (native client for MySQL). Este \u00e9 um ponto interessante a ser levado em considera\u00e7\u00e3o.<\/p>\n\n\n\n<p>Comecei a aprender <a href=\"https:\/\/capistranorb.com\/\" class=\"rank-math-link\">Capistrano<\/a> tamb\u00e9m, que no meu primeiro contato era uma ferramenta bastante popular para o deployment de aplica\u00e7\u00f5es Ruby on Rails. \u00c9 muito interessante: mas estou vendo tantas alternativas de deployment que ainda me deixam um pouco confuso. Mas estou aprendendo!<\/p>\n\n\n\n<p>Tal como no caso do Java que temos o SDKMan, no caso do Ruby temos o RVM. \u00c9 interessante, mas n\u00e3o \u00e9 t\u00e3o f\u00e1cil de usar quanto o SDKMan. Ainda apanho um pouco com ele.<\/p>\n\n\n\n<p>Estas tem sido minhas dificuldades iniciais, mas pouco a pouco estou aprendendo com elas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Surpresas com o desempenho &#8211; o uso oculto do \/dev\/All<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"302\" height=\"167\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/carro_vermelho.jpeg\" alt=\"\" class=\"wp-image-2981\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/carro_vermelho.jpeg 302w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/carro_vermelho-300x166.jpeg 300w\" sizes=\"(max-width: 302px) 100vw, 302px\" \/><\/figure><\/div>\n\n\n\n<p>O <a href=\"https:\/\/devall.com.br\" class=\"rank-math-link\">\/dev\/All<\/a> tem uma fun\u00e7\u00e3o adicional na <a href=\"https:\/\/www.itexto.com.br\" class=\"rank-math-link\">itexto<\/a>. Al\u00e9m de ser um dos nossos projetos favoritos \u00e9 tamb\u00e9m o sandbox que usamos para testar novas tecnologias. Pouca gente sabe (agora todo mundo sabe), mas a API do \/dev\/All \u00e9 aberta.<\/p>\n\n\n\n<p>Temos documentados no formato <a href=\"https:\/\/swagger.io\" class=\"rank-math-link\">Swagger<\/a> todos os comportamentos esperados por esta API. Isto nos possibilita testar as mais variadas tecnologias. J\u00e1 houve implementa\u00e7\u00f5es desta API em Grails, Spring (\u00e9 a atual), Node.js, PHP, .net e, agora: Ruby on Rails.<\/p>\n\n\n\n<p>Isto nos possibilita fazer compara\u00e7\u00f5es de desempenho, escalabilidade e estabilidade com um caso real, o que evita muita especula\u00e7\u00e3o. E o resultado que tivemos com Ruby on Rails no que diz respeito ao desempenho foi <strong>muito satisfat\u00f3rio<\/strong>. <\/p>\n\n\n\n<p>Levando em considera\u00e7\u00e3o que a base usada hoje em produ\u00e7\u00e3o, escrita em Spring tem pelo menos um ano de otimiza\u00e7\u00f5es, e a que escrevi em Ruby on Rails, com pouqu\u00edssima experi\u00eancia, consistiu em uma prova de conceito, eu diria que os resultados, <strong>apesar de inferiores, foram excelentes<\/strong>.<\/p>\n\n\n\n<p>Para realizar nossos testes uso um programa chamado <a href=\"https:\/\/www.joedog.org\/siege-home\/\" class=\"rank-math-link\">Siege<\/a>, que me permite simular acesso concorrente a uma API. Meu c\u00f3digo RoR n\u00e3o \u00e9 t\u00e3o ruim assim: ele j\u00e1 faz a busca por eager fetching, evitando consultas do tipo N+1, mas n\u00e3o \u00e9 l\u00e1 a coisa mais otimizada do mundo. Quer ver o resultado com 255 clientes concorrentes durante 10 segundos nos dois ambientes? Segue o print:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"667\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/siege_devall.png\" alt=\"\" class=\"wp-image-2982\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/siege_devall.png 558w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/siege_devall-251x300.png 251w\" sizes=\"(max-width: 558px) 100vw, 558px\" \/><figcaption>A parte de cima \u00e9 o resultado com Spring, a de baixo com Ruby on Rails usando 4 workers no ambiente production<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ruby on Rails n\u00e3o ficou muito atr\u00e1s (20% menos transa\u00e7\u00f5es na m\u00e9dia). Tudo bem que n\u00e3o \u00e9 o melhor benchmark do mundo mas pelo menos \u00e9 um caso real contra uma base de dados legada. J\u00e1 d\u00e1 uma ideia ou pelo menos um norte!<\/p>\n\n\n\n<p>Por muito tempo algo que me fazia ficar alguns p\u00e9s atr\u00e1s com Rails era o mito de que se tratava de um framework lento. Bem: &#8220;myth busted&#8221;. N\u00e3o \u00e9 o melhor desempenho do mundo (Node.js me causou uma primeira impress\u00e3o bem melhor), mas tamb\u00e9m n\u00e3o \u00e9 um problema.<\/p>\n\n\n\n<p>Al\u00e9m disto, s\u00f3 se pode falar que algo \u00e9 lento se tivermos um requisito de desempenho bem definido.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumindo<\/h2>\n\n\n\n<p>Tem sido meses de <strong>muito aprendizado<\/strong>. Faz tempo que n\u00e3o aprendo tantas coisas e sinto tanto prazer no processo. Aquele papo de que Ruby \u00e9 uma linguagem focada na felicidade do programador \u00e9 real, e como!<\/p>\n\n\n\n<p>Gosto muito do lado pragm\u00e1tico do RoR (e do Grails). Voc\u00ea n\u00e3o fica preso a burocracias (tal como n\u00e3o raro ficamos no Java): \u00e9 tudo muito direto, muito pr\u00e1tico e ao mesmo tempo sem ser tosco. O aspecto l\u00fadico da linguagem vaza pro framework.<\/p>\n\n\n\n<p>E como \u00e9 um framework baseado em conven\u00e7\u00f5es muito bem pensadas (como Grails), dar manuten\u00e7\u00e3o neste tipo de sistema fica muito mais barato. Ter comprovado tamb\u00e9m o fato de que n\u00e3o temos um problema real de desempenho com Rails me fez sentir muito mais seguro para adot\u00e1-lo em projetos futuros.<\/p>\n\n\n\n<p>J\u00e1 iniciamos um projeto interno em Ruby on Rails: sei que vamos aprender muito neste processo. Conforme vou aprendendo, conto pra voc\u00eas neste blog, ok? At\u00e9 l\u00e1!<\/p>\n\n\n\n<p>PS: se falei alguma bobagem aqui, por favor, leve em considera\u00e7\u00e3o minha pouca experi\u00eancia e tamb\u00e9m me conte. Isto ir\u00e1 nos ajudar a, futuramente, dominarmos estas tecnologias. Valeu!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Meu retorno ao Ruby on Rails ap\u00f3s 15 anos do primeiro contato. Como tem sido meu processo de reaprendizado, o que tenho gostado, n\u00e3o gostado e minhas principais dificuldades. <\/p>\n","protected":false},"author":1,"featured_media":342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Meu retorno ao Ruby on Rails - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2977\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Meu retorno ao Ruby on Rails - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Meu retorno ao Ruby on Rails ap\u00f3s 15 anos do primeiro contato. Como tem sido meu processo de reaprendizado, o que tenho gostado, n\u00e3o gostado e minhas principais dificuldades.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2977\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-27T06:11:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-01-27T06:11:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"411\" \/>\n\t<meta property=\"og:image:height\" content=\"304\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2977\",\"name\":\"Meu retorno ao Ruby on Rails - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg\",\"datePublished\":\"2020-01-27T06:11:51+00:00\",\"dateModified\":\"2020-01-27T06:11:57+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2977\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg\",\"width\":411,\"height\":304},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2977#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Meu retorno ao Ruby on Rails\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Meu retorno ao Ruby on Rails - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2977","og_locale":"pt_BR","og_type":"article","og_title":"Meu retorno ao Ruby on Rails - \/dev\/Kico","og_description":"Meu retorno ao Ruby on Rails ap\u00f3s 15 anos do primeiro contato. Como tem sido meu processo de reaprendizado, o que tenho gostado, n\u00e3o gostado e minhas principais dificuldades.","og_url":"https:\/\/devkico.itexto.com.br\/?p=2977","og_site_name":"\/dev\/Kico","article_published_time":"2020-01-27T06:11:51+00:00","article_modified_time":"2020-01-27T06:11:57+00:00","og_image":[{"width":411,"height":304,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg","type":"image\/jpeg"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2977","url":"https:\/\/devkico.itexto.com.br\/?p=2977","name":"Meu retorno ao Ruby on Rails - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg","datePublished":"2020-01-27T06:11:51+00:00","dateModified":"2020-01-27T06:11:57+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2977#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2977"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2977#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg","width":411,"height":304},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2977#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Meu retorno ao Ruby on Rails"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/bruce_on_rails.jpg","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2977"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2977"}],"version-history":[{"count":3,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2977\/revisions"}],"predecessor-version":[{"id":2984,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2977\/revisions\/2984"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/342"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}