Ruby on rails and groovy grails comparison

As a person who has had the luxury to work in both ruby on rails and groovy grails, I've found a few differences that make their approach quite a bit different.

#1 Groovy allows you to write java. While this isn't a huge deal, it can be both a positive and a negative. I've worked on teams where folks treat grails as a super simple java framework and never leverage any of groovy's dynamic goodness. While this isn't a huge problem, it does delay (or eliminate) to transition from J2EE xml configuration file hell into a more dynamic way of coding.

#2 Ruby forces you to learn "the ruby way". For folks who are only used to java, seeing ruby code is like...seeing another language. Because of this, the idioms used in java are more quickly forgotten and you more quickly become a ruby native because you MUST. Only having worked with a few other people while they moved from java to ruby, I can only speak from my personal experience. I can say that ruby's syntax is not THAT much different as long as you keep an open mind, and I found I was able to more quickly learn the "ruby way" than I was able to learn the "groovy way" simply because I was FORCED to do it with ruby.

#3 Rails uses db migrations by default. This is a huge plus for db CRUD applications. It enables you to make sure you have a migration path from version to version of your code. Grails, on the other hand doesn't come with anything (by default) to handle this.

#4 Rails has a sparse model class definition. Should you NOT decide to use db migrations, you can simply create some tables in your database, create an empty ruby class, and begin using it. You don't need a class definition that matches the db table, because the fields are put on the class via introspection of the table. This then frees you to only implement business functionality on your model.

#5 Grails integrates seamlessly with most modern J2EE environments. Newer versions of spring allow you to code groovy code INSIDE your spring configuration xml. Grails creates a war file that can be deployed with little or no modification directly into a J2EE container. Rails CAN be integrated in a similar fashion, but it is really a kind of frankenstein implementation to get JRuby on rails via a J2EE container.

#6 Ruby on rails is MUCH more nimble and dynamic for building functionality. Grails enables taglibs and meta-programming, but many of the DSLs quickly get cluttered with java-like confusion that doesn't really have any business advantage. In addition, because of the way grails works with classloading in servlet containers, it is constantly restarting the container to pick up new functionality. With rails, I can reinitialize the database, drop/create tables, completely redesign the application, and it will typically continue to run without a hitch. I've often gone an entire day add/removing domain classes, changing controllers, rebuilding tag libraries and my rails engine never has to be restarted.

#7 The groovy and grails community is more organized. That having been said, they're both pretty disorganized and certainly the "herd of cat's" syndrome is running rampant in both of them. However, when I google "groovy roadmap", my first hit is this http://groovy.codehaus.org/Roadmap, "ruby roadmap" gets me: http://redmine.ruby-lang.org/projects/ruby-19/roadmap. You choose which one seems more organized.

#8 The ruby community is larger. While still pretty small compared to the likes of PHP or java, you cannot throw a stick and help but hit someone who has at least heard of ruby on rails. Groovy/Grails is still pretty small. On the other hand, I would point out that the grails community is growing where the rails community growth seems to have leveled off in the last year or so.

In conclusion, there are a lot of other factors that make selection of one or the other of these better or worse. If I where to learn only one of these and had no prior experience, I would probably learn ruby and rails just because of the size of the community. If I were a java person, I would likely start with groovy/grails just because the learning curve is going to be less steep.

Comments

Tomas Lin said…
database migrations are on the roadmap for grails 1.4. There is currently three plugins for this.
One of the things that makes it harder for me to jump into web development with Ruby is that even today there seems to be too many alternatives to choose from. Ruby 1.8 or 1.9? Rails 2.x or Rails 3, or beeding edge or something like Sinatra? ...

The integration with Java containers works but it's far from perfect. You can build a WAR file from Redmine's sources using the Warbler gem, but results in having several JRuby runtimes in memory is very expensive (you can configure it, but it's frankensteinian as you mentioned).
cbmeeks said…
Not sure I agree with #2 there. I'm a Java developer by day and Ruby by night. And I can't say that Ruby forces me to do pretty much anything.

What are the forces and constraints you mention with Ruby?

And you're talking about the "Ruby Way?" How about the "Java Way?" As in being FORCED to write proper getters/setters all the time (if you want to be compliant, that is).

Ruby:
attr_accessor :slug

C#:
public string Slug { get; set; }

Java:
private String slug;
public String getSlug(){ return this.slug;}
public void setSlug(String slug){this.slug = slug;}
paulbonner said…
Nice summary overall, but I do have to disagree with your "Frankenstein" characterization for JRuby. I've been running my Rails stuff under JRuby using TorqueBox (a JBoss community Ruby application serverimplementation) for over a year, and from the development/deployment point of view, the learning curve is minimal and mostly revolves around making use of the quite rewarding extra capabilities provided by the container.
Anonymous said…
@cbmeeks

I thought it was comparing ruby to groovy. So ignore java.

Groovy way:
def slug

Popular posts from this blog

Please use ANSI-92 SQL Join Syntax

the myth of asynchronous JDBC

The difference between Scalability, Performance, Efficiency, and Concurrency explained