Ask HN: Is Ruby on Rails still relevant?

106 points by contr-error ↗ HN
I'm currently going through Destroy All Software's screencasts [0]. They're heavily based on Ruby + Rails and TDD, although most of the concepts probably do do translate to other languages.

Since the screencasts are over 10 years old now, I'm wondering if Ruby on Rails is still going strong. What resources would you recommend to get into Ruby/Rails specifically? Same question for TDD? Thanks!

[0] https://www.destroyallsoftware.com/screencasts/catalog

159 comments

[ 2.2 ms ] story [ 247 ms ] thread
Yes.

According to Hired's State of Software engineers 2022, Rails is the 2nd most in demand skill.

https://hired.com/2022-state-of-software-engineers/

That post seems extremely suspect. I'm guessing that what they mean when they say "the most in demand skills" is the skills that when present on a resume, increase the odds of a user being contacted by recruiters, which isn't so much in demand as hard to find. By that metric COBOL would probably have been at the top of the list if hired had clients that used it.
Do you have any evidence at all to support this or is it just a guess?
The evidence is that their "most in demand" includes none of top programming languages/tools according to pretty much anyone else. Therefore it's clearly not "in demand" in the sense that there are more job openings for those techs than for others. The explanation I posited seems like the most likely alternate definition.
The fact that there's entries for Ruby and Ruby on Rails also makes me think this, perhaps this data was just parsed.
I thought that was strange myself.

At the bottom of the page we get:

Methodology

This report is based on proprietary data gathered and analyzed by Hired’s data science teams. For the purpose of this report, Hired examined software engineering candidate interview requests and salary data from January 2020 through December 2021 inclusive. The data included reflects over 366,000 interactions between companies and software engineering candidates during this time period.

In addition to our proprietary data, we collected survey responses from more than 2,000 software engineers on the Hired marketplace to inform our understanding of software engineers’ working preferences.

I had a call with a recruiter a few months back who said that the highest commissions were for Rails devs.
I wish this was true for my country. I also haven‘t seen many international remote roles for Rails.
More so than React Native?!
React Native devs are gonna probably get paid in Equity.

Contracted Rails devs are probably working on an enterprise product that is already mature and making money.

This would seem to indicate it is hard to find Rails devs, which itself might indicate devs don't like Ruby/Rails. If devs liked it and the market was growing as fast as devs were learning or slower, then commissions would stagnate or go down. So either the number of open jobs is increasing, devs are leaving, it's harder to learn than the sales pitch indicates, or a combination.
Or that the fast growing startups using it are large-scale now and hoovering up available talent. Github, shopify, airbnb, gitlab, coinbase, hulu, twitch, etc.
My personal experience (myself and my social group) suggests there's serious brain drain.

All my peers who started their careers with Rails that know it like the back of their hands have zero desire to ever work with it again professionally. They're all exceptional engineers who had no problems picking up/migrating to Scala/Rust without productivity loss.

On the other side, I see all the upcoming engineers that missed the initial Rails popularity wave. To them, Rails is often times much more frustrating than TS/Python offerings. There's very little freely available quality onboarding materials, getting the environment set up is incredibly frustrating with how fickle bundler has become, and deployments are still complicated.

My take is Rails is good for those who already know Rails, since the stability of it lets seasoned Rails developers carry forward all their experience. But for someone without that history, TS/Python frameworks offer a much faster/smoother onboarding process, especially with the massive familiarity advantage devs already have with Python/JS from schooling/web.

If you're going to go out of the way to learn a new language, why would you learn one that occupies the same space as one you already know?

I 100% agree with your first part, but offer a slightly different conclusion - Ruby on Rails heavily skews to small startups (for various reasons not worth getting into here). Startups also tend towards Senior engineers, because they don't have the bandwidth to train junior engineers. So those recruiters are often looking for "Senior Rails" engineers which is even harder to find.

If the above is correct, it presents an interesting question to junior engineers: is it worth it to learn Ruby on Rails as a junior engineer? While there are advantages to learning Rails (it's heavily opinionated, what you learn maps very well to what professional projects look like), there is more job supply in the "python + LeetCode" path (how that relates to competition - who knows).

That could be because there are less and less of them. I don't think there is enough money in the world to convince me to take on a legacy RoR system.
Are you learning Rails from decade-old material? Because a lot has changed since then.
Yes for three reasons:

- There's lots of RoR jobs.

- They keep improving it.

- What RoR taught me made me a better architect in every other stack.

> - What RoR taught me made me a better architect in every other stack.

I really have to second this point. I'm not 100% sure if DHH was the one who coined the phrase, "Convention over Configuration", but he's the first popular technical communicator who I remember emphasizing it in a clear way. Simply trying to be consistent about naming certain things like models or database tables (singular vs. plural) is a big win for any project. Nobody gets everything right, but RoR is filled with lots of little smart choices like that that are worth considering for your own projects.

Yes because it is still a hyper-effective and flexible way to build and iterate many products. And it's not just rails. The library breadth and quality of ruby libraries IME is off the hook great. Some kind of magic has happened.
Shopify is hiring like crazy, and their stack is almost all Rails.
Not if you want to make building websites complex so that you can charge your client more.
This guy SaaS

Its a good point, there are absolutely much more simpler frameworks out there, which are good for your own side projects, your own large projects, and what fun and exciting production companies are using.

Yes. It’s not the super cool framework it once was but it’s still excellent, and still in active development. Rails 7 is a fantastic release too.
I think it depends on the region. I started a project in Rails, and when I tried to hire people to help I found out there are very few people in my city who know anything about Rails. It's all Python and Java here.

So I'd recommend to look for job ads on local platforms and check if companies are looking for rails devs.

Definitely a valid concern!

Though I would not let that dictate my choice of tools.

However if you want the biggest pool of "talent" and potentially the cheapest "talent" then going with the most popular is probably a good idea

Doesn't mean I'd advocate for the most obscure tech either, but it's all about trade-offs and your situation.

But hiring engineers isn't constrained by region or location so this feels like an odd argument to me.

Rails has been around long enough that there's surely no shortage of junior to very very senior engineers that will write code for you from wherever they happen to live.

Programming is not tied to geography unless you are dealing with physical equipment (you probably don't want three grocery store self checkout machines in your living room) or have any sort of security requirements for the project.
I get the argument for sure. Neither example is a really good environment for choosing rails specifically.

Also, not that it really matters but I just happen to be a counterpoint to both examples. I'm at home surrounded by hardware for my current work and also wrote / led a remote team instrumental in passing a federal banking audit atop infrastructure as code.

I'm on team sure there's use-cases for local hiring but they're so hard in the minority these days + it's a rails thread that I felt like my stance in my prior comment probably did hold in all cases where that might be the right tool for the job. Like all things though, it depends. :)

I'm good enough at English, and I've learned to collaborate somewhat effectively remotely, but if given the choice, I still prefer collaborating with people in person and speaking my native language.
Perfectly reasonable. I'll freely admit I'd never considered this argument and a language barrier does make a lot of sense. In some cases that constraint could affect the talent pool significantly.
Funny. I got my first full time programming job because they really wanted to do a project in Rails but there wasn't anybody else in town who knew anything about it!
It's not only not dead, I'm excited about the new stuff in Rails 7.
Define dead. Some people don't think Cobol is deal. Or Fortran. In this sense the code is still run somewhere and there are still jobs to be had.

But the question is probably around one's personal choices: is this the framework to invest my energy and time? Are there far better frameworks? Where is the market headed?

In the early days of Rails, and indeed any popular framework, the sense we get of an explosive growth. As a result of this there is an imbalance of jobs and developers and jobs seem easy, plentiful and well compensated.

This is really a question of the ratio of dev:positions. Most answers to this tend to focus on the positions component (take a look at stack, or upwork or indeed or whatever!). Perhaps someone on HN will suggest a metric or public gauge for the competition as well.

Edit: added slightly more context

I wouldn't choose RoR as a new tech to pick up in 2022. Think of it like a more stylish PHP - lots of it out there, but mostly not in companies working on things that are compelling, and the market share is on the decline.
Github, Airbnb, Stripe, and Gitlab all use Ruby (on Rails) to a significant extend. Compelling things, if you ask me. Stripe is even developing Sorbet [0], a Ruby type checker.

Not that those are reason enough to use it. But I wouldn't call it the wrong decision either.

0 - https://sorbet.org/

They all started the projects from 2009-2013 picking Rails, the most popular web framework at the time: https://insights.stackoverflow.com/trends?tags=ruby-on-rails...

If you were to follow in their footsteps, you'd also be picking the top popularity web framework for your time, which as of now is things like Next.js and Django.

Big recent-era startups:

OpenSea (Django / Next.js)

Notion (Node.js)

ScaleAI (Python, Node.js, Next.js)

Substack (Node.js)

Rippling (Django / Next.js)

We're still starting new greenfield projects in Rails every week, and I still believe it's the best foundation for SaaS products. It's great for developer speed and efficiency, the ecosystem of gems is amazing, and we've been able to scale every project we've needed to. We're incorporating React and GraphQL more these days for complex components and APIs but they pair nicely with Rails.
I work at a company with a large Ruby monolith and it’s a disaster.

If you’re face deep in the Ruby ecosystem then I’m sure it makes sense, but trying to build services alongside it is truly awful.

You want a scalable system that’s easy to write and will grow with you? Write basic Go services.

Why is a disaster?

I ask this genuinely as I am interested to see what pain point people have with Rails.

in my experience, the main pain point people experience is:

a) they don't like Ruby for whatever reason, b) they probably only deal in backend or only deal in frontend, and so don't understand the value of the bundled dev experience rails delivers, and therefore c) because of a + b they find the moderate learning curve to be extra painful, so they lash out.

at the end of the day it's all just code. why would it be harder to integrate a service in Rails than in Go? of course it isn't.

Two primary reasons:

1. Ruby is a very flexible language, and that has its ups and downs. While it makes it a very pleasurable easily modifiable syntax, it also leaves a lot of room for bad patterns. Ruby won't judge someone for taking an ill-advised approach to a problem, so it's easy for newcomers or novices to lay foundations that cause trouble later on.

2. Ruby is very prominent in startups, which are the companies most interested in immediate results. This often leads to favoring short-term advantages such as getting a feature out today to secure a deal rather than long-term advantages such as taking the time to keep a maintainable code base. Some startups with strict budgets will also hire people with less experience early on, leading this to pair with point 1 more often than we'd like.

That said, I'm a Ruby dev and have no interest in working in any other language (other than JS on the frontend). It's a beautiful tool to those who treat it well and I'll happily use it for just about any project.

I work at a company with a large Rails monolith and it's a delight, and so is the monolith.
Rails does not have to be written as a monolith. Typically, junior programmers who are trying to move very fast do that. Most of the places where I have talked to people who have a monolith are looking for ways to split it into services.

If you wrote a system in Go as a monolith, it would be hard to trim down, too. Architecture matters MUCH more than the implementation language.

Not sure Go is a very good example here, compiled languages have a huge maintainability advantage in monoliths (at the cost of compile time).

Ruby/Rails' culture is a huge contributor to why Rails monoliths are so much more difficult to maintain compared to other dynamic languages. Things in Rubyland just love to be global and manipulate things globally and go out of their way to make that behavior hidden.

"Rails monoliths are so much more difficult to maintain"

I question that assertion. I have plenty of anecdotes which are the exact opposite: a Rails monolith is much easier to maintain compared to similar approaches in other languages.

"manipulate things globally"

Not sure what you mean by that to be quite honest. If you mean monkey-patching, that's generally been frowned upon except at the framework-level in the Ruby community for quite a while now.

Global? In "Rubyland?" No. That's just not true. Not at all.
That's totally fair, it seems to trend toward a monolith though, just from what I've seen
"trying to build services alongside it is truly awful"

That makes no sense. It's very easy to build a REST API in Rails in which case you can connect to that API from services written in other languages. Conversely, you can easily call out to other services' APIs from Rails.

In fact, I'll go so far as to say building a few choice services in particularly performant (lower-level) languages alongside a main Rails monolith is the best organizational pattern for larger applications and enterprise deployments. You get all the benefits of Ruby & Rails for most happy paths, as well as the benefits of "This goes to 11!!!" performance for the critical paths which need that.

Yup its just that everyone else needs to learn the spaghetti code in the monolith. Which is universally hated by everyone not in the rails ecosystem
A Go monolith would be just as hard to maintain as an RoR monolith. This is not a shortcoming of the framework.
Nope, Go is more opinionated and was designed to work on large teams and codebases with junior engineers. It enforces best practices where Ruby just lets you shoot yourself in the foot
Ruby may not be opinionated but Rails is - convention over configuration is a core philosophy. It's one of the reasons it's so easy to get started with.
I've been at a company that did this, they started migrating everything to Go because it was the new cool thing to do and everyone was in love with it.

One year later it was a mess of network calls, no ORMs and nearly-raw queries because who needs an ORM, migrations run by SQL statements on bash scripts because who needs migrations. Validations were custom wrappers on some validation libraries and validation errors were of course not consistent across all of the microservices, not because of lack of agreement, but because new ideas and ways to "do it better" showed up all the time.

Some of these "services" needed translations (for emails, hooks, and some html responses) so a custom "very simple" translation system was invented.

It became an infinite mesh of proxy services on top of proxy services on top of proxy services on top of kubernetes.... and at the end of the day, guess what was paying the bills? guess what still had all the business logic and was the source of truth?

The Rails application.

if just 10% of the effort were put on improving the existing Rails application, all the Go microservices crazynes that was going on at this place would have been avoided.

Do you know why it went everything that way? Because management decided that if they blocked people from using Go then people would leave the company. I was one of the managers there, and pretty opposed to this as you can notice.

But I think this is a huge reality around here. People want to play with new shiny, without even thinking of the drawbacks or if they do have a concurrency or raw cpu performance in their application.

People want to make a CV in what they want to use in their next job. And Rails is not fashionable anymore so "the monolith is bad" and "Go microservices" are good. You're not google 99% of the time.

Thankfully I left all that madness and now I'm in a more sane (although "not so cool" technologically) place where we focus on shipping product and keeping things maintainable, robust and secure.

This is so true. Now there's ORM for Go (Gorm), and maybe a few web frameworks, but it just feels like any other beginning ecosystem - not much on Stackoverflow if you run into problems, docs aren't that good yet, incomplete APIs, missing functionality. And it has the same Node mindset of not having a major framework to tie everything together like Rails does- which I hate.

To go to your bosses and tell them you have to migrate from Ruby to Go to improve productivity is a blatant lie.

Well, the usual "reasoning" is that Go is easier to maintain, faster, will require less hardware, etc... all of those things might be true. What is not told in is the other side of the story, the one where you will have to write, test, document and maintain a TON more code... which usually ends up in just overall lower quality as it is pretty hard to find developers writing better code than the code you usually find in popular full stack frameworks.

But managers/directors, etc aren't idiots. They swallow it and they accept it even if they know the trade offs, because what's not told here is that if management says "No, that's madness" then people quit, and that's worse. So there we go with our super performant microservices for our 10 reqs/s app.

Go autodocuments really well

Go has better safeguards to prevent bad dev behavior

There shouldn't be any more tests, you're testing an API either way

We're not talking here about documenting apis.

We're talking about documenting an architecture, how pieces work together, what tools are available, where to put things, etc. Check the documentation of any major web framework. That's what we're talking about.

What do you mean there shouldn't be any more tests?
Huh, well I've written lots of Go services and worked in lots of Go architectures and it was all worked really well actually. Looks a lot better than spaghetti code in a monolith

Maybe you're doing it wrong?

Maybe I'm not that interested in how nice it looks and more in how many people are necessary to maintain it and provide something useful to customers at a reasonable cost for my employer.
> One year later it was a mess of network calls, no ORMs and nearly-raw queries because who needs an ORM, migrations run by SQL statements on bash scripts because who needs migrations.

“Those who cannot remember the past are condemned to repeat it.” – George Santayana, The Life of Reason, 1905.

> if just 10% of the effort were put on improving the existing Rails application, all the Go microservices crazynes that was going on at this place would have been avoided.

https://www.joelonsoftware.com/2000/04/06/things-you-should-...

Gosh I'm old.

> You want a scalable system that’s easy to write and will grow with you? Write basic Go service

What's so easy about Go? I don't get it. Honestly. What's so hard for you to do in Ruby? And who's to say that in 15 years those shiny Go services you're working on won't become shit after dozens of changing devs had their way with them? Turning a codebase into shit takes time.

Go was designed to prevent this is why its great, Ruby was designed in a way that fosters bad dev practices
I've had great experiences with both Ruby and Go. Both are a joy to write, and can handle most use cases. When I'm writing Ruby I sometimes wish I had Go's type system and lightning fast test suites. When I'm writing Go, I sometimes wish there were more conventions so I didn't burn so much time thinking through the absolute perfect way to architect every little thing. Still, they're both wonderful languages that hopefully fade to the background of your consciousness so you can focus on the actual business goals at hand.
Use Sorbet. It provides a better type system than the go typing system.
Monoliths can be great or a disaster, as can total services setups. We took a monolith built by a small team into scores of services across 4 teams of 150 engineers, even implementing some of them in Scala (this was 2012ish). On the internal tools side, we created a gem and later a bower package (so vintage) that was a bootstrap-derived design system that worked across almost all 30 internal tools apps & services. I know other teams did the same (at least consumer and merchant), but I didn't work on those projects so I can't speak to them.

I've seen great ruby/rails code and I've seen abysmal ruby/rails code. A lot comes down to who wrote it and if they ever refactored the smelly parts.

After 20+ years, I often see that no one likes to refactor the smelly stuff until they're forced to, and we often end up working with a cool racketball of code covered in 2' of duct tape patches.

Go is the new hotness, as was Rails at one point, and in the near future it will be something else. There's a strong neophillic bent to most developers. It's a lot more fun to work in something that's new and evolving and solving crazy problems than something that is stable.

These are all tools in the tool kit. Use what lets you ship.

> n great ruby/rails code and I've seen abysmal ruby/rails code. A lot comes down to who wrote it and if they ever refactored the smelly parts.

This is largely the problem, Go enforces good dev behavior, Ruby leaves it up to the dev

How so? Go does not prevent you from writing a monolith. Furthermore, Go does not actually require that you check the err return value of functions.
You can write "complected" monoliths in any language. You can also write SOAs in any language. If you need native performance, Crystal is a better option, as it provides much of the same syntax, semantics, and stdlib as Ruby, but with Strong Typing. Go is a bit too simple.
Monolith vs microservices is not the problem. It's architecture and code design in most cases.

When i hear "Rails monolith is a disaster" what it usually boils down to 8 out of 10 times is people putting their business logic inside models or controllers, when really it should live in its own set of classes, usually called services or service objects.

Here's a guide https://codeclimate.com/blog/7-ways-to-decompose-fat-activer...

My company uses it for multiple web apps and uses ActiveRecord for scripts too.
Yes, and it’s only getting better over time! Building complex front-ends, with states synced across different users, is a sheer joy using Turbo & Stimulus. It’s amazing how little JS is needed to create UIs that—when built in e.g. React—would have needed a ton of client-side code. I continue to be amazed how easy and fast it is to develop in RoR.
I think Ruby on Rails was the killer app that kept Ruby relevant. This kept Ruby relevant for a while but has fallen off in a lot of developer surveys. I think enough competitors in major programming languages have emerged to the point where I would consider it dying.
I share that opinion. The competition is strong, the killer app is gone.

It is for dark matter developers now, SV dark matter but dark matter.

Look for the job market in your region and field and then address e it for yourself

I have what I call my 80/80 rule of early-stage startups, which is that for 80% of new startups, 80% of what they need is CRUD operations (create, read, update, delete). So basically, input data in this format, store it in this format, then display it in this format.

I think Rails is one of the most productive and capable frameworks for building and evolving CRUD applications, which is the reason it still remains my recommendation for new startups.

I have been working on a Rails app at a rapidly growing organization for the past 6 years and I consider myself very lucky to be able to do so. Shopify, GitHub, and Stripe (to name some of the more prominent companies) all regularly contribute to the Ruby and/or Rails ecosystem, and there have been loads of wonderful improvements to both over the last several years: vastly improved performance in Ruby 3, support for static typing using RBS and Sorbet, Hotwire in Rails 7 for super low-lift client-side interactivity, and many, many more.

It’s a great time to start using Ruby for web projects.

RoR is the Supreme t-shirts and Air Jordans of programming. They very much matter and are the center of the universe to the people who care, everyone else just kinda shrugs and goes about their day.
Still relevant. We're deploying a lot of customer apps that are written on Rails
Ruby has been on the downswing for a while, getting squeezed from all sides from the meteoric rise of Python on one side, JS/Typescript on the other, to higher performing static languages on another:

https://octoverse.github.com/#top-languages-over-the-years

It also has a funky syntax, while not a big deal, doesn't do it any favors in a C --> Javascript world. Django, golang, etc. are free. I don't recommend starting new projects in ruby, but as always YMMV.

This is the right answer. Yes people still write on rails but in my experience it’s because they haven’t used other tools.

I had a couple die hard rails members at my last company who claimed nothing was better. We made them write Go for a year and now they are die hard Go fans.

If I were writing a web app I would start with Go. It’s a great language that’s easy to learn and fast to write, with all the security of static compilation. It scales exceptionally well with large teams

I've never understood the Go / RoR comparisons. If someone goes from being a die-hard Rails fan to a die-hard Go fan, that feels very much like they're choosing their tools based on fashion / fandom vs. picking the right tool for the job.

Go and RoR couldn't be more dissimilar from each other. One is a relatively slow language with one of the most full-featured and robust frameworks available today, and one is a very fast language with relatively minimal tools for building web applications. The types of projects they're suitable for are completely different

I'm a die hard Ruby guy and now writing some Go and I pretty much hate it. I don't really care for performance or compile speed, I could barely care less. I want a good web framework with tons of community support and a language that lets me easily express my thoughts into code. I'm not getting that with Go.
Well said. I've been a great fan of Clojure for a long time but what stops me from using it for clients is the attitude in the Clojure community that libraries are favoured over frameworks. That's not to say there aren't a few web/REST frameworks in Clojure-land but they are invariably the product of a few individuals with no community support. And they wonder why Clojure has negligible adoption.
Go is great until you need to interface with a C library via cgo then you are in a world of pain with segfaults and the general mismatch between goroutines and C's ideas about concurrency.
Your comment about "funky syntax" is meaningful.

I have found that people from the world of Java and similar c-style syntaxes, and especially strongly typed languages, have a sort of allergic reaction to Ruby. The reverse is also often true.

This is a matter of personal preference that actually tells nothing about what any of those languages might be good for.

Ruby/rails is less popular than it once was but it's still pretty popular. It's worth considering if you are open to the style of programming it uses. But if you love the c-style syntax, yes, you'll have problems getting used to Ruby and should try something else.

I think the server side rendering part of rails has largely become obsolete but the api backend side of rails is still going strong. Some day other things like rust might replace it but I don’t see that happening any time soon.
Hmm, SSR is used quite often, it has just reached the boring stage. Also, rust is too BDSM for rapid CRUD building needs.
Obsolete is probably an overstatement but its in decline IMO. The last few companies I have worked at have moved away from SSR which seems to reflect a wider industry trend. I have worked mostly in enterprise web apps which client side rendering suits better which might have some bias.
If anything, I've seen the start of the reverse happening. The warts are starting to show on the pure SPA approach, and people are either finding ways to do more SSR with the SPA tools, or taking new approaches like LiveView in Phoenix or Hotwire in Rails to provide richer experiences while still generating HTML on the server.

The heyday of "SPA is the right approach for everything" feels like it peaked at least a few years ago.

Your sample is hardly representative. The big-league Node frameworks are all SSR-based due to the problem presented by pure front-end SPAs. Have a look at Next.js and Remix.