RailsConf ’16, Kansas City, MO

Wednesday. Day 1. Keynote introduction by Jeremy Daer, nee Kemper, DHH thankfully racing. Heroku presenation on Kafka, Shopify presentations on shipit-engine, request_interceptor and BuildKite, Rafael França on Sprockets, and well attended presentation by Akira Matsuda with ideas for assorted Rails performance hacks. Closing keynote from Nickolas Means with a history of Lockheed’s original skunkworks.

Thursday. Day 2. Ruby Heroes including Avdi Grimm, Charles Nutter, Akira Matsuda and Richard Schneeman. Surprisingly few vendor booths, including Indeed Prime, Hired, Skylight, RubyMine, Stitch Fix and Codacy. Rails 5 presentations on ActionCable, Turbolinks and Sean Griffin on miscellaneous enhancements. Richard Schneeman on maintaining Sprockets and David Copeland of Stitch Fix on emergent software architecture. Lightening talks on Scrivito, RocketJob, Appfolio Farcy, Railscamp, Bundler Gemstash, multi_zip, Brakeman, RubyBookClub, Reinteractive Wallaby and Benjamin Fleischer on JSONAPI.

Friday. Day 3. Aaron Patterson, now at GitHub, workshops on Hashicorp tools and RedPotion and presentations on Percy and Sandi Metz on refactoring. Paul Lamere from Spotify with a wonderful presentation on music data analytics… in Python.

P.S. I never guessed the most interesting presentation on Rails would be by Justin Searls.

From Rails 3.2 to Rails 4.2 If We Really Must

Rails 5 is almost upon us and we’ve spent the last two months, amongst other things, moving our 45,000 lines of Rails e-commerce code from 3.2 to 4.2. For better or worse the move has been less about embracing new features and more about compliance and maintaining security bug fix support. The move has been a rapid succession of stages, from 3.2 to 4.0 in development, 4.1 in production, and finally 4.2 in production. Overall it has been a significant effort and a learning experience.

The biggest challenge we encountered was not fixing our 175 models and 40 controllers, but dealing with our nearly 100 open source gem dependencies. The project started from a proof of concept elegantly scaffolded with ActiveAdmin’s DSL and has accreted functionality and third party interfaces for the past four years. ActiveAdmin remains the leading Rails admin interface, but with the departure of Greg Bell momentum has slowed. Sean Linsley, Timo Schilling and others have put a significant amount of effort into answering questions and applying bug fixes, but the ambitious 1.0 milestone has remained unmet for two years, and gem releases have been infrequent. To update ActiveAdmin first we switched from stable 0.6 gems to the master branch in GitHub, replacing meta-search with ransack, then we worked our way down the master branch to 1.0.0.pre1 in 90 day increments, isolating and working around the issues that impacted us (#2233, #2679, #2771, #3038/#3324, #3145, #3147, #3486, #3591, #3776, #3784). Critical to this effort was our test suite coverage, which remains a disappointing, but so far adequate, 90% (and yes, we upgraded to RSpec 3.x as well).

Apart from gem dependencies the most dramatic issue updating Rails was the breakage of non-strict mode used with our old MySQL database (and thus nearly everything). For Rails 4 we needed to configure ‘strict: false’ to ignore our true mode setting in the database, then with Rails 4.2 this changed again and we needed to explicitly set variable sql_mode to the required value.

So what has Rails 4.x brought us? ActiveRecord foreign keys and enums, but we embraced the foreigner and enumerize gems long ago. Spring, but we so loved Zeus. secrets.yml but we already use environment variables and dotenv. Web Console, but we are happy with Better Errors and Pry. An improved cookie serializer that fouled up our ‘seamless’ rolling production upgrade. Autoloader vexation. Millisecond DateTime rounding errors (or is that due to OS X?). ActionMailer::Preview and ActionMailer#deliver_later, but we have already built out more sophisticated solutions. Strong parameters for sure. New bin/ scripts. Stricter routing with Patch. An end to ActiveRecord’s old dynamic finder API and tweaks to callbacks and ActiveRecord::Relation. Better performance, please, from Aaron’s AdequateRecord. ActiveJob as a wrapper for Resque or Sidekiq. ActiveSupport::Testing::TimeHelpers. Perhaps for us most importantly a step closer to greater concurrency with Puma (and LiveStreaming?), Sidekiq, Celluloid, who knows?

More detailed ActiveAdmin update notes

Year 5 with Rails

In year five with Rails I finally started contributing to high profile open source projects (ActiveAdmin, ActiveMerchant), albeit with mixed success. Understanding complex libraries written by others reacquainted me with debugging in RubyMine. In addition I published the first gems of my own using jeweler, taking my public GitHub contributions over 200 for the year. Working on OSS exposed me to Colloquy IRC and Travis CI. I contributed slightly more to StackOverflow and project related Google Groups.

At my employer our ‘mature’ Rails codebase has grown from 20 to 30KLOC, monitored soberly by Coveralls (87%), CodeClimate (2.8), Codeship CI, Rubocop, Gemnasium and Bliss. I remain committed to SublimeText, now with GitGutter and SublimeGit, and to RSpec, influenced heavily by a RSpec workshop at RailsConf 2014. New gems adopted this year included (tentatively) interactors, oink and thor. Documentation has been mildly improved using YARD.

Ruby Survey 2015

Rarebit (creators of Sass and Haml) recently published the 2015 results of their annual Ruby survey, now in its seventh year.

This year saw a significant shift to Ruby 2.2 (40%) following the shift to 2.1 last year (50%). Only about 15% of rubyists remain with Ruby 2.0 or below. JRuby adoption remains below 5%.

Rails remains the dominant web framework (85%) over Sinatra (10%). RSpec still retains 70% preference while many Test::Unit users have switched to Minitest (15%). 60% of rubyists still prefer JQuery, though there has been a 10% shift to other frameworks in the past year. Interestingly the utilization of Javascript remains around the same: 25% use it heavily, 25% rarely and the rest somewhere in-between. Amongst respondents to this survey Node.js utilization has remained around 20% the last couple of years. On the front end CoffeeScript is used more often than not (55%), Haml remains preferred by 45% and Sass by 80%.

For production the preferred web server remains Unicorn (40%) over Passenger (30%) though Puma adoption has reached 15% in its first year now that Rails 4 has better concurrency support.

If you are a full time Ruby developer I encourage you to participate at http://www.askr.me/ruby

Scaling Complex Rails Applications

After ten years of development Rails is a mature framework, and a recurring theme at conferences is how to build and maintain Rails applications that are increasingly complex. Rails achieved early success as an opinionated framework that emphasizes MVC and convention over configuration, but as developers have tackled ever more ambitious projects there has been divergence as to how to structure them.

What is generally agreed is that business logic should reside in models, away from controllers, views and API implementations. This has led to ‘fat’ models and discussion of strategies to manage them such as this blog post from CodeClimate titled ‘7 Patterns to Refactor Fat ActiveRecord Models‘. An important point often missed when first learning Rails is that app/models is not intended exclusively for classes persisted with ActiveRecord as it may include other domain objects. In addition to domain objects other popular patterns used to structure code include form objects, presenters, decorators and service objects. Presenters and decorators intermediate between controllers and views, whereas service objects intermediate between controllers and models.

Presenters and decorators are probably less controversial in the Rails community and have done much to replace view helpers. Service objects, however, have been disparaged by DHH in favor of concerns, but many developers with a traditional OOP background are unconvinced by his approach. One example project that uses service objects is GitHub itself. More recently Collective Idea have published an ‘interactor’ gem that elaborates this approach.

These strategies all result in more classes, and probably the first step in managing a codebase with many classes is to introduce namespaces. The Rails class loader automatically searches sub-folders matching namespaces so source files can be arranged similarly to the namespace hierarchy. Given most developers nowadays navigate code using global search or ‘jump anywhere’ features in their text editor the neater project directory layout is of limited benefit, but namespacing can reduce name conflicts with libraries or between different areas of an application.

The next step beyond namespacing, suggested by Stephan Hagemann is to divide a project into internal engines or gems, an approach labelled Component Based Rails Architecture. An example project is provided at https://github.com/shageman/the_next_big_thing Each component has its own test suite so the scope of regression testing of any feature change is more limited. If a component proves reusable it can be split out from the original project altogether.

Beyond a component based architecture the final step to scaling a complex application is to break it apart into separate services interacting with an internal API, an approach referred to as Service Oriented Architecture (SOA). I will defer comment on the benefits and challenges of such an approach to a later post.

See also

Rails Development Resources

Wyncode recently blogged a “top 10” list of Rails development resources, what would be on my list?

Getting started on OS X with MRI Ruby you typically need to install Xcode command line tools, homebrew and rvm (with JewelryBox) or rbenv.  MRI Ruby (aka. CRuby, aka. yarv) is the de facto reference implementation written in C, though JRuby has gained a following in larger enterprises.  Microsoft at one time supported development of Iron Ruby for .NET but it has failed to gain much following.

Emerging in part as a reaction against the complexity of Java EE, the Rails community has tended to favor lightweight text editors such as TextMate, and now Sublime Text, over more heavyweight IDEs such as Eclipse and Netbeans, though JetBrain’s Rubymine has had some success.  Vim continues to be popular with rubyists, with projects like Hermes.

If you don’t want to setup and maintain a local development environment you can now simply rent an online environment from Cloud9 or Nitrous.io.  Other essential online tools include shared code repositories like GitHub and Bitbucket and bug tracking/project management tools such as Pivotal Tracker, Assembla or CodeBaseHQ.

One of the strengths of Rails is it’s excellent community maintained documentation, both guides and apidocs.  Another great API resource is devdocs.io.

For online learning Code School and Rails for Zombies is a popular beginner resource, and Confreaks is great for catching up with conference presentations.  Ryan Bates stopped publishing RailsCasts a year ago but Avdi Grimm has stepped in with Ruby Tapas.

Finally, one of the most important ingredients of any programming ecosystem are the libraries: Ruby Toolbox is a great place for learning about available gems from Haml to Inherited Resource, from Nokogiri to Grape and ActiveAdmin.

I hope I’ve piqued your interest to look at any one of these.

Year four with Rails

Another year with Rails already.  The e-commerce project I’m leading has grown to 20kLOC with 1,400 tests maintained by an international team coordinated using Assembla.  The biggest addition to our toolbox has been Airbrake and its seemingly unrelenting production bug reports.  The other biggest challenge has been refactoring increasingly sophisticated factories to support the ever growing test suite.  Our infrastructure has changed significantly also in the face of continuing growth, but that’s another story.

A third year with Rails

This last year Ruby 2.0 has been released (Feb) and Rails 4.0 (Jun). I’ve embraced Sublime Text and git flow branching. Spork has been supplanted by Zeus. I’ve dabbled with OpenStruct, metaprogramming and AcitiveSupport::Concerns. New gems I’ve been learning include Enumerize, InheritedResources, Formtastic, Resque and Mechanize. I published a minor extension to the authorize-net gem and got hands on with CoffeeScript.

A second year with Rails

My second year with Rails has been increasingly team oriented, using online collaboration tools like GitHub, PivotalTracker, Atlassian BitBucket, CodeBaseHQ and Assembla.  Even though I was productive with Windows for a year on a one person project I’ve now joined my colleagues in using OS X with RVM.  My use of TDD has continued with adoption of Cucumber, RSpec, FactoryGirl and Spork, and for better or worse I am now using MySQL more than PostgreSQL.

The past year has seen the release of Ruby 1.9.3 (October) and Rails 3.1 (August) and 3.2 (January).  Ruby 1.8.7 has been scheduled for no further support after June 2013.

Testing ssl_requirement with pound

ssl_requirement is a Rails gem by DHH to declaratively redirect requests to SSL.  It is useful, for example, to ensure all access to a checkout page is secure.  SSL encryption, however, is usually handled by a webserver such as Nginx or Apache, and these are not typically used in Rails test mode.  It appears most developers simply disable SSL redirects during testing, but this allows certain defects such as correct handling of flash messages to go undetected.  To test SSL redirects I’ve started using a lightweight, secure reverse proxy called pound. The pound configuration file can be kept to a bare minimum to forward requests from port 8443 to 3000 and encrypt the response:

ListenHTTPS
  Address 127.0.0.1
  Port    8443
  Cert    "pound.pem"
  AddHeader "X_FORWARDED_PROTO: https"
  Service
    BackEnd
      Address 127.0.0.1
      Port    3000
    End
  End
End

To run pound:

pound -vf ./pound.conf

Posts navigation

1 2 3 4 5 6
Scroll to top