Category: software development
Year Ten With Rails
PayPal Subscription Management Ruby SDK
PayPal’s APIs are… a work in progress. First came Direct Payments, aka. PayPal Payments, aka. payments v1 accompanied by a REST SDK that provides API client code in various languages. After the Braintree acquisition came PayPal Checkout with a new payments API (v2) and completely new Checkout SDK. The Direct Payments API has continued to evolve, however, (despite being “in the process of being deprecated”) with a new Product Catalog and Subscriptions implementation replacing the original Billing Agreement. Unfortunately as of writing these API changes were not being reflected in the REST SDK, though there is now a separate subscriptions developer reference home page that explains how to customize the JS SDK and documents the server side API (for the most part, but Plan Create and Subscription Create are missing(!), for that see the REST API reference). PayPal’s documentation catalog links to the REST SDK for subscriptions management despite the implementation being absent.
For better or worse Braintree has taken a very different approach with the Checkout SDK compared to the REST SDK: there is no longer any effort to provide mapping of the schema to data objects with marshalling or unmarshalling. The open source gem code is machine generated using a tool and the underlying schema representation is not obviously available, making collaboration on any improvements problematic if not impossible.
To be fair the REST SDK is dated and has it’s own issues: no client side validation or defaults, unintuitive connection management and limited control of logging, but at least these things can be fixed. Unfortunately it appears unlikely.
For further discussion see PayPal-Ruby-SDK#378
Nine Years A Rubyist
This last year has seen continuing maturation of Ruby on Rails with Ruby 2.6 and Rails 6.0. Ruby 2.6 included an initial release of JIT compilation for YARV, and Rails 6.0 adopts Webpacker as the default JavaScript asset manager instead of Sprockets. Ruby, however, continues increasingly overshadowed by JavaScript and Python, and Rails is challenged by the popularity of microservices and Node. Neither Matz’s mruby 2.0 nor Crystal have gained widespread attention, but at least AWS Lambda Ruby support and FaastRuby are now available.
At a practical level, for our mature in-house codebase a switch to microservices is not necessary or cost effective. This year, however, has seen Stephan Hagemann’s ‘Component Based Rails Applications’ ebook published (endorsed) as a softback by Addison Wesley and a very similar approach embraced by Shopify. Our own internal codebase remains ~60% gemified from 2017 in a simple layered architecture while we have focused on consistently packaging business logic using interactors (service objects) for both foreground and background processes.
New gems (to us) used this year included roxml, and replacing the unmaintained god process monitor with eye. On the open source side I stepped back from contributing to ActiveAdmin and published instead a couple of API clients for AmEx and PayPal.
Eight Years A Rubyist
Year 8 with Rails for me has been an unglamorous affair of maintenance upgrades (Ruby 2.3, Rails 5.x), refactors and bug fixes.
It has been discouraging to see StackOverflow characterize Ruby as shrinking and unpopular and compare Ruby on Rails with ASP.net. Nate Berkopec’s findings that vanilla Rails apps are perfectly capable of 1,000 requests/minute is cold comfort in the face of shrinking developer mindshare: this decline has real consequences in terms of open source contributions and Ruby gem maintenance.
On the other hand Ruby remains #4 on Github and developers are still very much in demand. JavaScript continues ascendant but Derek Prior of Thoughtbot has mentioned cooling enthusiasm for Elixir, and Go too has slid in popularity, at least according to TIOBE. Crystal 1.0 remains delayed. An experimental JIT has now shipped for YARV foreshadowing further performance improvements in Ruby 2.6.
On the Rails front end Basecamp continued their contrarian tradition by offering Stimulus.js as a more limited and pragmatic alternative to React’s dominant framework. The Majestic Monolith remains relevant for smaller businesses and early stage startups despite ambitious engineers everywhere (myself included) wanting to use the same tech stack as the largest, most successful companies from Apple, Salesforce and Netflix to… Twitter. At Railsconf GitHub, now owned my Microsoft, recommitted to easier scalability enhancements for Rails 6.
On the infrastructure side the Docker ecosystem has continued to mature with the embrace of Kubenetes at Dockercon EU in Oct ’17. It has also been good to see a more enlightened approach to open source by AWS with EKS and ApacheMQ.
At my employer we continue to support a somewhat modular monolith with a 50 kloc monorepo, 40 ActiveAdmin resources, 60 background jobs, 70 direct and 240 total gem dependencies. We have fully caught up with Rails 5.2 and edged forward with Ruby 2.3 for Bootsnap support and React-Apollo 1.x. Procedural code has continued to migrate to standardized Interactors. New gems used included Bootsnap, Combustion, Dalli (memcached) and AWS SDK v3 SQS, S3, SES & SNS.
What has Rails 5.x brought us? More secure controller parameters, still scarily subvertible by less experienced developers, but at least awareness has been raised. More restricted autoloading, for the best. Better callback management, though we try to avoid them as much as possible. Bootsnap with a significant improvement in startup times, yay!
Open source contributions this year have included a couple of minor ActiveAdmin releases including Rails 5.2 support and various PRs for the AuthorizeNet Ruby SDK.
AWS features I have been working more with this year have included ClassicLink, private subnets, piculet, Data Pipeline and managed SSL certs. Concerns over production container management have been mitigated with a mass of metrics collection with CloudWatch, Librato and Skylight.
What will the next year bring? A pragmatically managed evolution towards ‘mini-services’, Rails 6 with polished multi-database support, Ruby 2.6 with improving JIT support, Webpack as the default JavaScript handler and increasing adoption of Kubernetes.
Railsconf 2018 – Pittsburgh
Tuesday 17 April. Snow. DHH poking fun at Twitter and raising alarms about Facebook. Nick Quaranto with a GraphQL intro: best for new APIs as a mobile backend. Sean Griffin trying to encourage Rails contributions by labeling it a legacy app. Fastly presenting their not yet released alternative to docker-compose for developers. Olivier Lacan talking about the life and imminent death of CodeSchool.com. Taylor Jones with an introductory overview of Webpacker. Akira Matsuda teasing with his unfinished performance hack gems. Mark Imbriaco with a stellar career from AOL to Decisiv, 37signals, Heroku, Living Social (with Chad Fowler), GitHub, Digital Ocean and Pivotal.
Wednesday. Eileen Uchitelle keynote on upcoming Rails 6 features for scalability: baked in parallel tests (minitest) and polished multi-database support. Initially skeptical but ultimately inspired by her appeal for more companies to upstream their work. Justin Searles and Ted Kaufman talking about growing their agency. Chris Hoffman reviewing Optoro’s experiences adopting services: start with new business services, not an extraction, do something large enough to be noticed but as simple as possible, establish infrastructure standards and have developers support their services. Exhibition hall with booths by BTCOTC, Procore, GitHub, Heroku, Engine Yard, Cloud 66, Shopify, Scribd and LendingHome amongst others. After lunch James Adam recounting his struggle to popularize Rails engines and the forces shaping the framework’s evolution. Leanardo Targon of Plataformatic with an introduction to Warden. Admin frameworks BOF discussing modular monoliths, TrailBlazer and CBRA. Lightening talks including Clearwater and jsonapi-suite
Thursday. Snow again and chill winds. Sarah Mei filling in a keynote for Bari Williams: application development is interior decorating, not architecture. Sam Phippen with another well presented RSpec talk with the latest fixes to support system tests. Graham Conzett reminding how much can still be done with UJS alone. After lunch Ariel Caplan introduction to Swagger (OpenAPI) and (unmaintained?) apivore, Michael Crismali giving a quick review of JavaScript strategies, followed by Ross Kaffenberger giving actionable advice on dealing with Webpack. Finally Aaron Patterson proposing to upstream easier performance tuning into Rails.
Attendance looked up (2,000+), and more diverse. No more ‘Rails is dying’ and React/Elixir FOMO. Webpack/services/JSONAPI for sure, but not too much beyond that. Standards of the technical talks were good, especially Akira and Eileen. I missed the talks by Vladimir Dementyev and Justin Weiss and I look forward to the inspiring videos of Ernie Miller and Nicolas Means.
TIOBE Index for March 2018: Ruby in the TIOBE index top 10
TIOBE replaces their index content each month, so I quote:
“Ruby is back in the TIOBE index top 10 and now it seems to be for a longer time. If we take a look at the chart of Ruby it follows a very common pattern for programming languages. Ruby was invented a very long time ago and it remained in obscurity till 2006. That was when the Ruby on Rails framework was released. This framework made it easy to create web applications and because Ruby was the underlying language it skyrocketed in the TIOBE index at that time from position 40 to a top 10 position. It also was awarded the TIOBE programming language of the year in 2006. All new language gurus were in ecstasy about Ruby. The language peaked in 2008, but then all hipsters moved to a new language and Ruby dropped to one third of its popularity. It remained there for a long time but is now catching up very slowly. The fact that it is getting more popular so gradually is a good sign. This means that its increase in popularity is structurally instead of being pushed by hypes. Some other interesting moves this month are that both Julia and Kotlin entered the top 40, whereas Rust and Groovy lost their positions in the top 50.”
Active Admin monthly downloads nearly doubled last year
According to this blog post Active Admin monthly downloads nearly doubled last year to almost 3,000 times a day. Part of that can probably be attributed to increasing use of continuous integration, but more interesting is that Active Admin has outpaced the competition. Possible contributing factors include three releases, including a 1.0 release that coincided with RailsConf and was featured by Ruby Weekly, a GoRails episode by Chris Oliver at the end of 2016, and the blog post by Charlie Gleason on using Active Admin as a back end to a React application, that has been discovered and tweeted by new fans repeatedly. I’ld love to think that timely responses to GitHub issues and pull requests and StackOverflow answers have helped also, along with the curated wiki and continuing contributions by plugin authors. Also there have been Japanese blog posts and activity so more adoption there. At this point Active Admin has 7,800 GitHub stars and 2.9M downloads, it will interesting to see how things are another year from now.
RubyConf 2017
Arbre vs React
Arbre is a component based server side DOM rendering library written in Ruby. Arbre was extracted from Active Admin from 2011-2012 but has not gained widespread use elsewhere. As of September 2017 there were around 4M downloads to date from RubyGems and barely 450 stars on GitHub.
class Panel < Arbre::Component builder_method :panel def build(title, attributes = {}) super(attributes) h3(title, class: "panel-title") end end
React is a component based isomorphic DOM rendering library written in Javascript. npm downloads have reached 40M in the past couple of years and the project has 75,000 stars on GitHub: it’s no contest really. If you prefer Ruby over ES6 an Opal wrapper is available as hyper-react .
class App < Hyperloop::Component render(DIV) do MainNavigation {} PageContents {} Footer {} end end
The APIs for both are relatively simple.
Arbre has builder_method to register components. Each component has a build method which adds tags to an Arbre::Context that is eventually output using to_s.
React components have a render method that adds elements to a virtual DOM that is synchronized with the browser DOM as needed.
The most obvious difference is that Arbre does not integrate Javascript event handlers: it uses an unobtrusive approach that leaves registering event handlers to accompanying ES6/Coffeescript/Opal files.
Being exclusively server-side means that Arbre can and has been used with ActionView helpers and templates. There are bugs but it mostly works. Arbre is relatively simple and provides what Active Admin needs without further dependencies.
React components are careful about maintaining state and re-render when state is changed. Arbre components get re-instantiated for each request and are more ad hoc.
Is anything to be learned from this comparison? The prospects of widespread adoption of Arbre are slim to none. An increasing number of developers are going to be looking to use a Rails admin framework with React, and that is where opportunity lies.