A comparison between the #5 language (ranked popularity by Tiobe on Jan/07) and the #1 framework (ranked lovability by me!).
When it comes to programming, more specifically the development of web applications, it is important to consider all the tools of the trade before using the one that is going to be used for the job.
For some background, I have been programming web applications since I was 13 years old, over 11 years ago today. I started with a simple language called HTML, which evolved into experience with JavaScript mouseovers, then PHP counters and include files, after that onto the MySQL to store the data from the forms for dynamic input, and then into CSS. In retrospect, learning CSS was likely the most difficult thus far to learn out of all of technologies as it required a significant unlearning of the firmly committed <table> tag from my memory. After CSS had been installed, I got equipped with XHTML 1.0, and started looking at more “enterprise” level languages and came across Java, .NET, and even a bit of Perl.
We need to pause here, because this was a major decision in my career. This was now 3 years along my path of web development, and I was working at a company called Tantalus. A major Java shop on Mainland Street in Yaletown that was run by the late Patrick Whelan. It was here that I got my first cup of Java knowledge, and I must say it was hard to swallow.
My brother Martin also worked at Tantalus as a Systems Administrator, managing all their amazing Sun servers and making elegance out of the hosting required for the Java and Oracle apps they were deploying for companies such as Future Shop and other major organizations. Martin continued to push Java as my saviour, saying that if I took a 2 year course at BCIT I could be starting at 45k-60k a year right out of school (which was actually true at the time). He even gave me free books, which I still have on my book shelf (collecting dust). Even more importantly, he gave me a class map of the Java tree and I was amazed. Looking over it in amazement at all the libraries, you could do everything with Java.
Here in lies the problem. Java is a swiss army knife in your web development toolkit, if you ever do decide to learn it. You can pretty much build everything from a cell phone app, to a full on desktop application. It is an amazing language, but it’s just that. Huge. I kept the poster on my wall for months, probably even close to a year if I time-stamped it.
While considering the advice provided by my brother, I decided to take a workshop taught by one of the Tantalus Java gurus and was interested. I learned some C and C++ back in high school in a Computer Science AP (advanced placement), which was a first year university course in high school, and found some very similar characteristics.
I continued along with my PHP development and self-taught education, seeing that Java was a better language at the time, but just didn’t feel my experience at the time (which now I see as really my interest itself in Java) wasn’t solidified enough to begin learning such a massive and complex language. Concepts such as Objects, inheritance, and other OOP terminology was quite foreign. So I held off learning it, and felt once I learned PHP well enough, would upgrade.
PHP was great. With the release at the time of PHP 4 and it’’s initial object functionality I started to get up to speed with many of the OOP principles. I was building some pretty amazing Content Management Systems, Digital Asset Management Systems, even Web Top Publishing Systems. My previous commitment to learn Java was fading as my experience grew with PHP was growing, seeing that I could build all the amazing things with what I had originally felt was a subordinate language.
I continued to expand my knowledge of PHP, get into the core of the internals and sparked a desire to write some core functionality. I eventually got to meet the creator of PHP (Rasmus Lerdorf) at a Vancouver conference I helped organize back in 2004.
When I started seeing the release candidates and beta code of PHP5 I was really excited. The principles of objects which I had grown to love, were being fully supported and embraced by the language I had gained enough knowledge with to realize there was few things, if any, I could actually do with it. This shelved Java way back on the list of technologies to learn at this point. One of the only things that I can see a use for Java is a drag and drop uploader residing within the browser to avoid the one file upload field plagued by today’s forms.
In any case, PHP was my tool of choice. At this point, it had an enormous amount of libraries, nearly as many as Java. Not to mention WAYYY more open source projects on sourceforge.net that Java could ever hope for. The world supported the language, and so did I.
But. There was a problem. After building these amazing systems, that did some really cool things. I found myself repeating the same lines of code over and over again. I was creating objects that had the get and set methods within objects and had the CRUD principle embraced. I began unifying my approach. Creating a save method that did both a update and create depending on the state of the object, centralizing the objects storing and access mechanisms for my all the data within the database. Evolving to standardize date, text, string, url, and all the other MySQL data field types and personal standardized column types in a base class extended by all Models. Basically, I was simplifying tasks I was doing every time I created a new Model so I didn’t have to repeat myself over and over again.
This was a great time in my development career. Realizing that I was paving a path that I would allow me to be able to create objects that could access fields I created in the database without having to implicitly specify by introspecting what was going on, and create the guts of the Model class automatically. Realizing the productivity gains alone on this were enormous I kept on it. I got quite a long way along this path, before something happened that changed the direction of career entirely.
I found this framework called Ruby on Rails. At first I was extremely frustrated. As many would who were working so hard to create something so important for several years in the background while trying to pay the bills would, and see the tool had already evolved to a very usable state by someone else, and even had a budding community behind it. This was an interesting time, and I began to look into the framework a bit more. And more. And then I decided what was the point of developing the remaining pieces of same thing in PHP when it was already pretty much 100% of what I wanted in another language? Simple choice, learn the new language and framework and save what could be hundreds of hours development.
This was the beginning of my journey learning Ruby on Rails, as well as Ruby the language which the framework was built on.
While learning the framework, I seen some major differences between PHP and the language of Ruby. Things like “for” iterators were somewhat non-existant in a 1:1 comparison.
Something like this in PHP…
<?php
$array = array('my list', 'of', 'items');
for ($index = 0; $index < count($array); $index++) {
echo "$index. $array[$index]";
}
// alternatively
$array = array('my list', 'of', 'items');
foreach ($array as $index => $item) { echo "$index. $item"; }
?>
Looked like this in Ruby…
<%
array = ['my list', 'of', 'items']
array.each_with_index { |item, index| p "#{index}. #{item}" }
%>
The clarity of the syntax, and the language in general was purely impressive.
I continued to ride along the Rails train, finding more and more benefits along the way, such as previously described as ActiveRecord’s ability to dynamically introspect all the fields of a table and have all the functionality needed to create, update, delete, and read any row of data automatically with one line of code.
In addition, ActiveRecord could be done with any database adapter. Whether it was PostgreSQL, MySQL, Oracle, etc. The factor of connectivity alone when in PHP required additional modules such as AdoDB or PEAR::DB. Both of which has some really crazy syntax that was quite complex to learn. You had to learn SQL, then you had to learn the implementation of SQL abstraction. With Rails, this was inherited.
Another great feature of Ruby on Rails I had discovered was the simple concept of organization. A concept known as MVC was perfect. For those that haven’t heard of the term it’s called Model-View-Controller. It was directly in line with what I had done in the past with PHP projects after adopting concepts from frameworks such as FuseBox and the multitude of others sharing the same principles.
The list of benefits for Rails got better and better, the more I learned of the framework, the happier I was realizing that I wouldn’t have to repeat myself nearly as much as when I was writing PHP apps.
So, while along this learning adventure in the world of Ruby on Rails, I started to find out more about the advanced concepts of Ruby, the underlying language of Rails. The most profound realization of mine was when I learned that there was no waterfall approach to a the Class hierarchy. With PHP and many other languages, you have a Class, and you extended a Class in a new Class to inherit and then subsequently add additional functionality. With Ruby, you have a Class defined in one file, and you can change that same Class entirely in another file by overriding methods, adding new ones. The language was showing it’s true colors as one of the most dynamic tools I had ever used.
Constantly finding myself comparing Ruby to PHP while learning the syntax of the language and underlying Objects, finding the equivalents of things like “count” ([1,2,3,4].length), or “str_replace” (”string”.gsub) in Ruby continued. I found myself in a world of Object Oriented bliss, rarely looking back at the dull, functional world of the PHP library.
It’s been close to 2 years now since I started playing with Rails back in February of 2005, and I have found little reason to go back, other than the odd open source project which is too impressive not to use and save the time it would take to rebuild it in Rails.
Actually, there is one other reason I frequently look back at PHP. The documentation. My learning curve in PHP was spring-boarded due to the elegance of the hard working PHP documentation team, and their choices made to organize the information in such a manner that was instrumental to many peoples adoption and education. So much so, that even right now I find myself remembering my appreciation setting up a local version of the PHP documentation at php.inimit.com helping support the threads of access and decreased latency of users dependent on the documentation with hosting a local mirror sponsored by my development business. It never got accepted as a Canadian mirror due to what seemed like messy political tape of the core PHP team, but that’s besides the point. I still appreciate the documentation, and will continue to host the mirror regardless.
What I find in ever increasing potency is that Ruby and Ruby on Rails needs documentation like PHP. Actually, every language ever created needs documentation like PHP. It is, at least it should be, the gold standard of documentation for anyone learning a language, and could likely be construed as the single most instrumental reason why PHP has had such a significant adoption rate within the world of development.
I became a supporter of the Ruby and Rails documentation project known as Rannotate, and on December 18th, 2005 registered the domain railsmanual.org to ensure that the community benefits from the only similar version of the gold standard of documentation that PHP has. RailsManual is a great resource, but needs some major work to raise it’s value to that of the same degree as PHP.net.
There has been quite of attention as of late on this subject. The people over at caboo.se managed to raise some ~$15,000 USD to help out on the documentation effort, but have had some trouble finding people to actually write the documentation itself.
I have given my $0.02 on the mailing list on how we can solve this, which would actually take the PHP.net documentation system to the next level. It’s really a simple process.
Here is a very basic layout of how I see it looking and functioning like.

It’s really quite simple, but to the point. No one person needs to create the documentation It’s a collaborative approach. The main area of concern for such a collaborative system is the prevention around the area of spam. Without registration, or confirmation of email validity, the site will eventually become ridden with Spam, as nearly every blog has been plagued by.
It may appear that I have digressed on my comparison of PHP vs. Ruby on Rails, but I haven’t really. The one area of Ruby and Ruby on Rails that is flawed, or at least needs major improvement, is the documentation. Everything else about Ruby language at it’s core and the framework of Rails, is amazing.
One thing I have simply glazed over at this point is the fact that Rails is a framework, and PHP is a language. And as the saying goes, you should really compare Apples with Apples, and not Apples (Programming Languages) with Oranges (Frameworks). Ruby on Rails is indeed a framework. One which extends upon the foundation programming language known as Ruby. This means that Rails provides additional functionality on top of Ruby. Including a many number of Objects enhancing capabilities within any application built on top of the Rails layer. These Rails enhancements are specifically catered to those building web applications.
Now to go back in my story, remembering when I mentioned how Java was the swiss army knife that could be used to help create everything a programmer wants, specializing in nothing. PHP in this case, is just that now except it caters to web applications. It is also a programming language that can create everything a programmer wants, but it was built first as a web development language. Where Java could do everything a programmer could want, PHP is falling victim to the same virus that creeps into anything that has been around long enough. Unintended growth in all directions. This isn’t entirely a flaw, but now enough leaves room for something better to come along that is focused on one area rather than all areas.
Ruby is the same as PHP, and even can be compared at a fundamental level to that of Java with one major difference I would like to point out. Ruby is as well focused on doing as much as a programmer wants and needs. But it does it with the elegance, simplicity, and dynamism that is lost with PHP, and next to non existent with Java.
So now that we are somewhat clear of comparisons, realizing that PHP and Ruby on Rails are fundamentally different. Seeing that we are actually comparing a language with a framework. Let’s compare a PHP framework such as PHP on Trax, a clone of Ruby on Rails written in PHP, compared to the original framework that sparked the clone wars - being Ruby on Rails.
For this, we look at an ActiveRecord example from each. Starting with a class definition in PHP on Trax written in PHP.
<?php
class Product extends ActiveRecord {
public function validate_title() {
if ($this->title == '')
return array(false, "Title can't be empty");
if ($this->find_first("title = '{$this->title}'") != false)
return array(false, "Title must be unique");
return array(true);
}
public function validate_description() {
if ($this->description == '')
return array(false, "Description can't be empty");
return array(true);
}
public function salable_items() {
return $this->find_all("date_available <= now()", "date_available desc");
}
}
?>
And now in the same class in Ruby on Rails, inherently written in Ruby.
<%
class Product < ActiveRecord::Base
validates_presence_of :title, :message => "Title can't be empty"
validates_uniqueness_of :title, :message => "Title must be unique"
validates_presence_of :description, :message => "Description can't be blank"
def salable_items
Product.find(:all, :conditions => 'date_available <= now()', :order => 'date_available desc')
end
end
%>
This is a real comparison between the two frameworks, and you can clearly see just by the lines of code alone. Ruby on Rails is less. Ruby on Rails even helps to clean up the validations to mere single lines of code having inherited functionality built within ActiveRecord::Base. And when it comes to Ruby, ignoring entirely all what is actually happening as far as functionality is concerned within the framework’s Class, you see the language really shine. The precision of each character is far from being wasted. There is next to nothing there that doesn’t need to be, allowing for even those understanding the logical order of words an intuitive grasp of what is happening within the lines of code written.
Now, when we decide to stop ignoring what is actually going on, we may ask “What are each of these blocks of code really doing?”.
Each sample creates a Object called Product that you can access throughout your application providing the programmer with:
1) Access to all rows of data in the “products” table through a single interface to create, update, read, and delete.
2) Optional validations for any data that is set to be stored in the database passes certain conditions
3) Integrated error handling
4) As well as inheriting tons, and I mean _tons_ of additional functionality provided by ActiveRecord (PHP on Trax) and ActiveRecord::Base (Ruby on Rails) respectively.
So, now that we have compared only a single slice of each each of the Apples (Languages) as well as the Oranges (Frameworks). We can see the decision really comes down to how much we enjoy the taste of simplicity at this point. Developing in either framework boils down to nearly the same thing. Saving the programmer time when it comes to creating and maintaining and displaying the data within applications.
Ruby provides to Ruby on Rails the simplicity to save more time for programmers compared to the other frameworks. Provides the ability for programmers to write less lines of code than the comparable frameworks. Requires less time for even the most novice programmer to understand what’s going on. And is quite simply more elegant to work with.
Rails has and will continue to be imitated as it has already been in nearly every language. Whether it’s PHP (PHP on Trax), Java (Sails), Perl (Catalyst), Python (Turbo Gears, Django), and even .NET (Castle) - developers from every language recognize the benefits which Ruby on Rails, as proven by their implementations in their native languages.
Yet with all these framework imitations in their respective languages, it comes down to Ruby at the foundation that makes Rails at the heat of it all, so simple, so elegant, so much the reason why it has caught fire so fast and so far across the globe that nearly every developer that is at all interested in keeping their job, has at least heard of it.
The way I see it, the only framework that is going to replace Ruby on Rails, is another one built in Ruby. It’s not the framework that makes it so simple, elegant, and tasty as a whole. It’s the language the framework is built on that makes Rails what it is today.
I would love to hear your thoughts on this, please do comment below or send me a private email from my website.
Have you converted from PHP for the greener pastures of Rails?

It's funny that you say you became a supporter of Rannotate. When you registered railsmanual.org and set up rannotate there, you *forked* the documentation and basically killed any momentum that might have ever built around the rannotate system. The creator of Rannotate asked you not to fork and you ignored his requests. How does that make you a supporter?
Rails has and will continue to be imitated as it has already been in nearly every language. Whether it's PHP (PHP on Trax), Java (Sails), Perl (Catalyst), Python (Turbo Gears, Django), and even .NET (Castle)
Catalyst is older than Ruby on Rails. Development of Django and Ruby on Rails started roughly in parallel, see the Snakes & Rubies talks, so not everyone is copying RoR just because they use the MVC and ActiveRecord design patterns.
You're also comparing apples and oranges. PHP is a programming language while RoR is a framework for the programming language Ruby. You should've compared RoR to another framework like Symfony, CakePHP, ... you name it.
@Jon: It's also funny that he mentions meeting Rasmus at a PHP conference he helped organize. What he neglects to mention is that he ended up alienating most of the speakers that came because he did not clearly state that the event was for profit and not sponsored by the local user group. Nathan has a long history of alienating people in the Ruby and PHP communities in Vancouver with his attempts to monetize open source.
PHP is totally not functional. It's procedural.
Ruby is more functionally oriented than PHP.
I think the editors at O'Reilly could have done a better job on this piece.
Thanks for the article. Its always interesting to read about other people's experiences. I also like Ruby, but I also like Python. Python has a much richer library (at least for now). Ruby has Rails though.
I think it is foolishness that people compare frameworks or programming languages, as owners of the software world, we should look at creating frameworks, that my granny can use by typing in English or any other language rather than sing praises of a certain framework or language. Till then we are all seekers, not people of a certain community alone. However nice job on bringing RoR closer to people, to make the dream possible.
I think that ActiveRecord is good because it is better than DAO when it comes to scripting languages. It is also proved more flexible and easy to use than heavy-weighted ORM solution when it comes to agile languages. However, IMHO, Ruby on Rails becomes cool in its approach to Front Controller and Router convention.
Zend Framework, SolarPHP Framework learns from RoR the Front Controller and Router ideas but the core developer find that ActiveRecord is not perfect as many people think. Almost Ruby on Rails apps are simple CRUD ones with fancy Ajax interface and are hyped by marketing crowd. It says nothing about RoR ability when working with complex solutions.
@Jon: I really am at a loss for words if you believe using an open source project such as Rannotate for the general benefit of all can actually hurt the momentum. If you look, you will see yet again that rails.outertrack.com has crashed, and nobody is able to use it. The same reason why I started it in the first place. Ensuring that I can use it when I need to.
@Anonymous Coward: The imitators have taken the some if not all of the same chocies and implemented them in their respective frameworks.
The illustration of Apples and Oranges may not have as clear as needed for you, but that was the point of the article. To point out for those asking the differences between Ruby on Rails and PHP, and that they really can't be compared directly. I did however result in comparing PHP on Trax with Ruby on Rails?
@JeffG: I don't think we need to bring up how I was treated by the board members to result in my taking a stance and refusing to be overpowered by a few finger pointing board members that had to have it their way or else.
@Danno: My point is that the entire PHP library is accessed using functions like "str_replace('here is my string', 'string', 'replacement')", while Ruby's library is accessed using methods of Objects like "'here is a string'.gsub('string', 'replacement')".
@Anonymous: This is a blog. There are no "editors".
@Mark: I have been meaning to get into Python and check out Django. As much as I say that Rails will likely only be replaced by a cousin in the same family, each of the other frameworks I mentioned have very different approaches in some respects. Would be great to see cross polination between all the camps. There are many great concepts which are isolated to each framework's own implementation that would be great to see factored out into new Patterns that can be digested and reimplemented by the other frameworks without having to get dirty learning a new language and mess with the code itself to extract.
@Jayanth: You really hit the mark. This was indeed my goal when starting to write the PHP layer I mentioned, and still is. To create simplicity. So much so that it no longer requires "code" to create applications. DabbleDB here in Vancouver did a great job of showing that this is possible to some degree, but needs to take it the next level. The dream is that anyone from all walks of life can create applications without knowing how to program. Ruby on Rails and other frameworks in tune with its principles are one step closer to making this a reality.
@pcdinh: Rails is about removing the much discussed 80% of repetitiveness, and leaving the remaining pieces of true customization to the programmer by having open ports such as Rails's ActiveRecord Model.find_by_sql within the framework. These ports allow you to go your own way when the inherited opinions either need enhancement or differ from your own. Whether you are building a small app or a large one, the same principles and rewards apply.
People who enjoyed this article will probably also get their kicks with this guy's Cleaning the Air
This might be the longest post with the least substance I've read in a long time. Why would you use this space to tout your history? How did you get post access on the O'Reilly Ruby Blog? What are you contributing to the community?
Oh, and Perl != PERL (you spell it both ways).
@Walfredo: History lessons are fun :)
@Kevin: Thanks for sharing.
My point is that the entire PHP library is accessed using functions like "str_replace('here is my string', 'string', 'replacement')", while Ruby's library is accessed using methods of Objects like "'here is a string'.gsub('string', 'replacement')".
A functional language isn't a language that has functions. It is a language that has the capability to manipulate functions using higher-order functions, like LISP or Haskell. What you are describing is in fact a procedural API, not a functional one. How can you write an entire post about PHP and not even know the fundamental classification of the language?
@Nathaniel: No really, I'm curious now. How do you justify your place here? What are you doing for the Ruby community?
@Josh: You clearly know more about the classification of languages than me. Thanks for clarifying.
@Kevin: I'll leave it up to you to find out for yourself and form your own opinion.
This is Nathaniel's modus operandi. The people who linked me to this described it as a "career suicide note," and they couldn't be more accurate. The O'Reilly Ruby Blog is the only public place he's still welcome: he's no longer welcome in the PHP community; he's alienated himself in the same ways from the Rails community; and he's well known by the geek community in Vancouver for the things he's done.
He does this occasionally, and the effect is usually the same. The problem is: he's a poor programmer, and a worse writer, and he doesn't realize either. Until he realizes that these posts don't *help* his reputation, the rest of us have a source of amusement every few months when he gets hungry and tries to sound important in public.
I'm wondering the same thing as Kevin. Just what ARE you contributing to the community? I mean, I know you started out with HTML.... but what are you doing with Ruby now?
Seeing as I am being interrogated to the 3rd degree. Can I ask one simple question. This was supposed to be a simple story of one developers evolution through programming languages.
What has this turned into? Actually, let me answer that myself.
Me proving that I have contributed enough to even be heard, and tell a story. This wasn't a scientific evaluation of Ruby on Rails compared to PHP and it's frameworks. It was an article written on my pure overall experiences with the languages, and what has become of it.
This intense negativity I am feeling from liars such as Steven Baker (srbaker) who are ready to crticise everyone from his boss, to other speakers (which I described in detail in my previous post that Walfredo mentioned above) at one of the events I organized, his words should not and actually do not mean much to me. But that is not to say others won't believe in his destructive attitude he carry's with him.
What have I contributed? Nothing at all it seems by Kevin's measure. But hey, that's not going to keep me from trying :)
Now please. I beg of you. Stop with the negativity already. This world has enough war going without the public tearing apart an honest story of one man's path.
I understand your defensiveness, but realize you still haven't answered any of my questions. *shrugs*
Thanks for the article. I think some commenters need to remember that they're not being forced to read anything.
In your first syntax comparison, you've used the (much nicer) Ruby array literal syntax in your PHP snippet. It actually made me stop and wonder if PHP had quietly slipped support for this syntax in a recent release... alas no.
Really not sure why I am doing this. It serves no purpose what so ever. But for the sake of people that may find this post and benifit from the projects... here we go:
http://svn.toolbocks.com - Complete repository of all my open source projects I have created or co-created
http://slidewheel.com - Slideshows from some of the presentations I have done
http://datebocks.inimit.com - Intuitive Date Input
http://railsmanual.org - Sponsoring the hosting overhead and time required to maintain and secure it
http://canadaonrails.com - Put on the first conference for Ruby on Rails (this is a business venture, but still requires effort)
This is by no means a list of achievements. I am still trying to contribute something which I personally consider of paramount importance to Open Source. I continue to do what I can, as I report on my blog, and am pleased when not torn apart, to be able to share some of my experiences doing such here.
So... you created active_merchant? After all, it's in your repo. Whose the liar again?
P.S. - It's benefit, not benifit.
Just to clarify, just about nothing in that repo is Nathaniel's creation or "co-creation." Maybe all his OSS contributions are in there, but most of what is in there is not his. It's the classic square-rectangle issue (a square is a rectangle but a rectangle is not necessarily a square).
The only thing that appears to be actually his is DateBocks.
Man, I can't believe people are so vicious. I followed a similar path in learning to code, and reaping the benefits of new tools in small little leaps and bounds. I have almost no public-blogging material to share with anyone but I make tons of money off of coding Rails solutions for businesses, and I enjoy reading anything that people (like Nathan or not) have to say about their experiences. Lighten up guys. Not all blog entries have to be perfectly written essays by 'community contributers'.
It's not about whether it's poorly written or he has little experience, Mike C, but rather that Nathaniel is a community leech. He takes others work and takes credit for it, messes with user groups, and other sleazy-if-not-downright-wrong behavior.
So whenever he pops his nasty little head up, there are those of us ready with the Whack-a-mole hammers.
The Rails and Ruby communities have embraced the contributions, however small, of many, many newbies -- who act like honest people.
>>Anon E Mouse:
Thats hysterical. It'd probably be a waste of time to dig any deeper, but, if thats true, then kudos to your diligence. The Whack-o-mole comment made me spit out my Mountain Dew in mirth.
@GT: It is there as a mirror. I did not claim that I created it, nor is anything at all altered in the README within the file.
To reiterate, the SVN url I posted contains a "complete repository of all my open source projects I have created or co-created". Do your research. Check the README's before you start assuming my false claims of creation.
@Anonymous Coward: Read above. And no, there is more than DateBocks in there if you opened your eyes and actaully took a look ;)
These two recent posts from comp.lang.ruby
an apology
and
the recognition of the apology
epitomize the best of an open source community at work. Thanks for showing us the opposite, Nate!
Pointing out a bug, and/or hacking on your own branch, is not "creating or co-creating." It's at best a derivative work.
You did not create ActiveMerchant nor, for example, the Flickr plugin for Mephisto. Nor did you "co-create" them. I'm sure the authors of both these two example OSS projects would find it very intriguing to see you claiming such credit. Leaving a post on someone's blog saying "Hey I made a bunch of changes" is not "co-creation" either.
But, to your thinking, that's probably just a by-product of the very open MIT license. Right?
Nathaniel,
After working with Ruby on Rails for about 4 months, I have found railsmanual.org very helpful and it has always been one of the first places that I look when I am trying to figure out why a form helper isn't working the way it should be. Thank you for your efforts! It can be hard to get the specifics of what can and cannot be done with rails helper functions. railsmanual helps but there are a lot of times that I wish there was more reference material about the Rails framework. I'm looking forward to Rails in a Nutshell, which is probably the book I need the most for my day to day development with RoR.
I didn't even know that the site was generated by Rannotate, but I don't see anything wrong with forking a project when it creates something that is beneficial to the Ruby on Rails community. There needs to be a much greater emphasis on easily accessible documentation and in my opinion it really shouldn't be about putting out your ego as much as it should be about actually producing helpful information. Looking at the caboo.se page that gives out props to everyone who has contributed towards such a noble cause is great, but it doesn't mean very much if caboo.se can't figure out how to make that money useful with regards to producing solid documentation.
@Walfredo: Trust me, I would apologize if I felt I was in error. Steven Baker unfortunately did not tell the truth about what happened. I gave every _single_ speaker what was promised, and hopefully more. Simply ask each one of them. Why would I treat Steven of all people, the guy I was having doing a workshop with, less equal than those who were only presenting at the event? Doesn't make sense to any extent. Any it simply isn't true. He lied about me promising him compensation, and continues to avoid showing any evidence which he claims are within chat logs of me promising anything different than what was delivered.
When it comes to RailsManual.org, it is a public resource, one which I should, and actually will credit the source code which generated it. I in no way claim credit for the project, nor have forked it in any way shape or form. It's simply a tribute, a testiment, nahh.. a monument to the work that has been done on the code. In a simple analogy which I see as the reason why I now have decided to give credit back. I see a link to rannotate as something of a plaque at the bottom of a structure which was built in it's honor. The purpose does not change in the least. It's a tool for me to continue to reference and learn the Rails library.
@Anonymous Coward: Again, before you go assuming away, do your research. Email Paul, ask him if I put up my modified version of the code up there so he could merge it into his own project. Purely so that there was no fork.
And as I said before, my copy of ActiveMerchant within the repository is simply a mirror. I have not claimed any credit, and simply want to be able to access it when I need to for future projects. When I checked in the code, there were issues with the original SVN otherwise I wouldn't have done it in the first place.
@Nick: Thanks for your kind words in a clout of disgust. I will do my best to continue ensuring that railsmanual.org stays up as and be as stable as possible. BTW, I haven't forked it either. I am using the same code that is in trunk right now. I may have modified the theme a bit, but nothing functional has changed :)
Wow. I hope you were very drunk when you wrote this. There is not a single paragraph without a multitude of spelling and/or grammatical errors. Not one. Posting without proofreading, or at least using a spell checker, doesn't do much to improve the apparently horrible reputation you have in the community.
Then, of course, there is the lack of congruency, the factual errors, the veiled whining. Remove those and all that's left is a jumble of merit-less fluff that has no actual meaning or worth.
Come on, a LOC comparison? How 2004. We get it already. RAILS SI LESSAR LIINEZ!!111 Big deal. If you're going to go on at length and bore us with the inanities of how you became a PHP haxx0r, at least compare something real. Give us some sustenance with which to fill our brains after demolishing them with triteness.
Your story sounds familiar to me :
When PHP semmed to be the only game in town as far as Web dev was concerned I did develop my own PHP framework (RefleXiveCMS).
Fighting with the language, I did my best to remove naming clashes, #include madness and many other PHP's irks.
This went to the point that I couldn't bear the idea of using PHP outside my framework. Not very useful when the user community is reduced to oneself !
"When you can't beat them join them" was my instant feeling when I stumbled on RoR.
Throwing away something you've created and worked on for one year is hard but, all the same, no looking back.
As for the clones, I believe we must look forward to stable JRuby or RubyCLR implementaions but I agree Ruby is what makes RoR what it is and clones will never gather a signifcant community.
Your PHP code, above, is wrong. PHP has no syntax for specifying an array as [1, 6, 9], instead you have to call the array() function (I was very surprised to see this code, thinking that I had missed some very nice PHP syntax, but I tested it on my PHP 5.1.6-enabled webserver and it didn't work).
Nathaniel,
Comparisons are only helpful when they teach us something, rather than simply show the contrast of one thing from another.
Also, this article would have much less noise if you cut down on the personal back story. As it stands, this is more of an opinion piece than an article, which is okay, but please file it that way.
# Ruby:
array = ['my list', 'of', 'items']
array.each { |item| p item }
# PHP:
$array = array('my list', 'of', 'items');
foreach ($array as $item) echo $item;
Ruby wouldn't look so impressive if you didn't write PHP like a retard.
as others have mentioned your php code is a little bit screwed up... Maybe this would be a nicer comparison (that actually works):
$array = array('my list', 'of', 'items');
foreach ($array as $item) {
echo $item;
}
@Philippe Lachaise: Sounds like more details of the same story :) Although, I do find myself in the same situation now with Rails. At least with respect to the ActiveRecord gem.
@Manuzhai: My apologies. I have updated it accordingly.
@Greg: I remember looking at both categories and flipping a coin which resulted in classifying it as an Article. In hindsight, this does feel more like an opinion piece than an article. Thanks.
@JB: Looking at the alternate version I put up just for you. Ruby still seems nicer. Maybe not by the magnitude originally portrayed, but still nicer none-the-less :)
@Michael: Thanks! Reminds me again just how much I love objects such as Array.
>Trust me, I would apologize if I felt I was in error.
I'm not sure what you're talking about, but it sounds like the back story behind this article and the other one is perfect for the O'Reilly ruby blog.
I keep getting accused of being a liar, and it's really unfortunate. What's interesting is that no matter how many times Nathaniel says it, I haven't noticed his accusations affect my ability to find work or support my family. This is nothing but a big source of amusement for me.
I'm not the only person in the Rails community that won't work with him. Wait until the CoR Toronto speaker list comes out, and see how many repeat visits he books with speakers from CoR Vancouver. And I'm sure it's more than just a coincidence when we were looking for a place to host our Vancouver Ruby Brigade meetings, two venues asked us "You're not affiliated with Nathaniel Brown, are you? Because if you are, the answer is no."
It's been brought up here by others, but Nathan keeps side-stepping the facts: He's no longer welcome in the PHP community, he's no longer a welcome figure in the Ruby community. He should know why, he keeps getting asked nicely to stop exploiting people. He keeps continuing to cash in heavily on the sweat of others. Every ecosystem has its parasites, I suppose.
Walfredo: the back story is, he's hungry, and he's tryng to sound profound and drum up some attention again. Unfortunately for him, he (once again) drummed up the wrong kind of attention.
Minor correction: Django is not an imitation of Rails - it started development (in a closed source environment) in late 2003, but was not open-sourceed until some time after Rails had been released. That's not to say that there aren't some features now in Django that were inspired by Rails, but it certainly isn't Just Another Rails Clone.
@Walfredo: I was speaking of my character. Ironically enough, you can see even in the comment above me apologizing in error. Those who know me, know that I am an honest person and simply do not respect those that lie.
@Steven: Regardless of your position, I am actually very happy I have not hurt you or your family. My words are meant to enlighten others of your character, and allow them to tread with caution when dealing with you, if they do choose to do so.
And regardless to what you may have heard, all of the speakers from the original Canada on Rails conference I have asked have expressed interest in returning to Toronto this fall. David may not be able to make it out as he continues to turn down speaking at other engagements, but it will provide the void needed for other speakers to step up and shine.
I am suprised to hear your interpretation from the venues in Vancouver. You can't please everyone all the time, but the venues I have worked with in the past I continue to work with on a good standing and will continue to do so. So it must have been something personal and likely trivial for them to say something like that, if you are in fact telling the truth.
The few within the PHP community that you may speak with, have their reasons. And I have mine for not dealing with them. This is a mutual separation, and as unfortunate as any separation, I am thankful that it happened. Otherwise I wouldn't have opened my eyes to see Rails when I did.
As for the Ruby community, and for everyone elses sake. Speak for yourself and stop forcing words out of peoples mouths.
Nathaniel,srbaker is right in saying your reputation in the Ruby community is not exactly stellar.
Rather than continuing to be so defensive, perhaps you can listen to what people are saying and if you do care about what the community thinks of you, try to learn from these experiences.
It does seem like some folks here are just stirring up bad blood, but why not take the high road and *show* your worth to the community, rather than just telling us how much you've done for us.
Speaking of conferences... Nathaniel has perpetrated one of the most classless "tech event" behaviors I've ever seen. He hired "actresses" (escorts? straight-up hookers?) to handle the event registration and trounce up and down the aisles with the contest prizes.
It wasn't only those of us in the front row who could see your hungry eyes, Nathan. And it was disgusting.
>@Jon: I really am at a loss for words if you believe using an open >source project such as Rannotate for the general benefit of all can >actually hurt the momentum. If you look, you will see yet again >that rails.outertrack.com has crashed, and nobody is able to use >it. The same reason why I started it in the first place. Ensuring >that I can use it when I need to.
It's not just SOFTWARE you took, Nathaniel. The point of the outertrack site was to be THE place for annotated rails docs. If you split and create another place for them, you're diffusing the effort.
I'm sure the outertrack site is down and unstable now because the effort has been all but ruined by your fork.
I don't really have to explain this to you, though. You knew what you were doing. The purpose of railsmanual.org is to link to your commercial web sites in an effort to make money. It has NOTHING to do with supporting the community.
You truly are a community cancer. What would it take to get you to move on to Java or .NET (or COBOL or something)?
@Jon, I'd say he's more like a wart on the genitals of open source. He's not really killing us, but he's painful and makes chicks not want to sleep with us.
Hurray! A flame war! Now we are all being professional!
Uh, that's miscellanEous, bro. Is that you, NHBS?
In light of your little brouhaha, I think _why is going to have to rewrite his explanation of why the Ruby community is so "nice".
Nathaniel,
Thanks for such a good blog post - it's of near article quality. It's easy to put a nasty 1 line , anonymous comment, but there's more than a couple of hours work in your original post (small example over on the Java side of things.)
What's impressive is your obvious knowledge of both PHP and Ruby, and the hard decision that you made to move from one to the other.
Paul
How did you get posting access to O'Reilly Ruby? I mean, I don't think anyone views you in the same authority range as Pat Eyler, Curt Hibbs, or pretty much anyone else who posts here...
I don't think the O'Reilly blog needs to be authoritative. In fact, the original call for contributors explicitly said you didn't have to be a guru to be posting here. I think that in theory, that works really well.
To me, a good poster on this blog is not measured by the conferences they've spoken at or the high profile projects they are involved in, but rather by two simple things:
1) Having an interest in contributing to the ruby community
2) Having something of ruby-related substance to offer the readers of this blog.
I don't think this is a good soap box for personal agendas, and also don't think that we should even have to be having this discussion. If I could sum up my feelings on this matter, code and interesting explanations of code prevail in signal, all else is just noise.
is there a point to this shit?
No, there is point. Its highly amusing though. Its a social dynamic that I've never seen on the web. I've seen hatemail, evil comments, spam comments, but not drama spanning over several physical events, multiple blog posts, and tons of comments. Its easy to forget that behind all these disembodied community voices, there are real people with shortcomings. So to re-iterate, there is no point, Anonymous. Drama usually reserved for the real world, has crept into our blogspace, and its irritating, depressing yet interesting.
Michael Cerna: When #Caboose Attacks, coming soon to Fox.
OMFG all of you shut up. Sheesh. NHBS is a stinking leech, but you're all being douchebags.
Wow, just the attack alone on this authors rep, is making me think twice about the credibility of his words, however, I think we can all agree Ruby on Rails is becoming a favorite for both Web Programmers as well as Enterprises. The power of the word of mouth ... WOOT
Nathaniel: What we are seeing here is not an argument between two people, nor is it a case of several people being "out to get you". It is obviously a general dissatisfaction with your actions. It is absolutely absurd for you to expect people to believe that the reputation you have is the result of anything but your own actions. It is even more absurd to suggest that this reputation could be the fault of a single person's unhappiness with the way he was treated by you: there's more to your bad reputation than one incident.
It is especially hard to believe your excuses, since you have a history of being unwelcome in software development communities. You have been rejected by not one, but *two* software development communities. The software development communities that have rejected you are not wrong: you are obviously doing something wrong.
If your behaviour is not working for you (which it is obviously not, if you have to spend time defending yourself against dozens of people every time you post something in public) perhaps you should consider your behaviour.
You have been provided many opportunities to redeem yourself, and many suggestions on how to do so. Instead of heeding this advice, you continue to be defensive and refuse to learn from the mistakes you're making. This negativity will follow you for as long as you continue to exploit the hard work of others.
I followed a link here from somewhere. I've never done anything with Ruby on Rails... wouldn't know it if it bit me on the ass. I also don't know who all you people are. I will say that Nathan appears to be taking the high road in this "discussion". (And thanks for the article, Nathan.) You other people sound like pre-pubescent kids fighting over a candy bar on the playground. I mean come on: "wart on the genitals of open source"?!?! Does your mother know you talk like that? Perhaps Nathan is as bad a person as you all say. Perhaps not. Don't care. I know you're all losing the argument with your hyperbole.
I know absolutely nothing about the characters behind this, but I think it's a pretty poor show to line up to piss on an article I found quite interesting. I have heard a great deal about the "friendly" Rails community, but I'm beginning to wonder now... It seems to me that many of the commenters believe the author should be wearing sackcloth and ashes for all eternity - I was under the impression that it was supposed to be a temporary state. He has, after all, written *some* stuff, and seeking to monetise free software is not a hanging offence (RMS sold Emacs, after all). He may be guilty of social faux-pas (I don't know), but that doesn't exactly seem to be confined to him. After the first post, I went to Rannotate, and sure enough, it's down. The explanation given in a subsequent post is that the author has sucked away all the momentum by setting up his own site, but guys, this is *so* not the free software approach! If you think something is worth writing, you'll write it even if you're the only user - it's called "scratching an itch". You don't do it for the glamour or the fame - that may come, but it's shouldn't be the prime motive. How you can expect momentum to build if your site isn't even on line, I don't know. I suppose all this bitchyness is what we get when a bunch of Mac-users start getting involved in free software! (That was a joke, by the way, in case any of you hyperactive commenters get your underwear in a twist!) Chill out, guys, and remember that if you don't like someone you don't have to interact with them - ignoring people is probably more effective than trying to assemble a mob with pitchforks.
I agree with the last comment. It seems like the ones to be worried about are not Nathaniel. He seems like he's got a great attitude toward the political side of Ruby, Rails and the open source community.
I also wanted to talk about this notion that you shouldn't make money while supporting open source. Give me a break. How many PHP, Ruby or even now Solaris books have you seen where authors, publicists and everyone else has their hand i getting paid for the knowledge of others. I could go on all day with examples of businesses doing this. It boils down to people will pay for anything if they feel there is value in the service or information, and from the sounds of these conferences that were sold out! A lot of people found value in both. Listening to a developer stand on their Herman Miller chair yelling Community!, Community! it makes me laugh. These are the same people that use the "community" to share knowledge so they can improve their programming ability to get beter jobs, better wages and start their own businesses that will utilize the same Opensource technology they claim someone like Nathaniel is ruining.
Oh and about the guy who was pissed his Ruby doc and support site died because Nathaniel did up a site that had better information and more people visited, get a clue. The next time you fail at something how about you don't blame someone smarter and more qualified, but rather blame yourself.
Nathaniel, keep up he good work. My only advise is to give up blogging. It only enables these guys to hide behind anonymous posts to sling mud and feel better about their mediocrity.
I also think "Anon E. Mouse" is that Steve guy. What a tool.
I'm form the Vancouver IT community and the people who have this issue with Nathan have it because they don't like his approach. Oddly enough its the same people who are in the PHP Users Group and now the Rails community. It's the theory a few bad apples spoil the bunch. Like a previous poster described, the bad apples have ropes and pitch forks and are looking for blood. My guess is, and I know all of them; is that they are pissed off that he doesn't go by the beat of their drum. Get over it and move on.
Hello, I've enjoyed your post. Thanks for that.
Now I'm not too sure why some visitors are blatantly rude and crass, but if they diss you for pointing me towards a Rails manual (which surely is a good thing), then what is their contribution? Towards more obscure code, which doesn't do anything to help a beginner like me? I've trawled rubyonrails' website, and documentation is so hard to come by! I mean, it's great that they're making the rails framework better, etc, but at least spend some time in telling us what to do with it? Most of the "tutorials" are way above any beginner's grasp, and it's all the hype "what it can do" malarkey, but no "how to go about doing the bloody thing".
Thanks for the post.
The "Manual" he pointed to is his site, which uses a codebase he didn't write, which merely displays the API docs (available everywhere, including your own Rails installation) in a form that is commentable (which again, he didn't write). I don't know Nathan, but I've never pointed anyone to his site because he only did it to point to his other projects and make money. Check the web archive and you'll see, since after people railed him on this article he changed it.
The commentary of a blog is a forum for discussion, but also a document and a record. People with no prior knowledge of the participants wander in and are of course confused.
Like anyone, I enjoy a nice flame war now and again, but I think one needs to recognize when one is fanning the flames.
Allegations should be documented. This is trivially easy, so long as one remembers the </a>. If a person is seen sufficiently harmful to merit mole-whacking vigilance, then it is not really that much more trouble to compile a brief history of past misdeeds and likely behaviors to which others may refer. They are thus better informed of both of the danger and of the quality of the accusation. Empowered, even.
Documents should, of course, be documented as well.
Conflict distracts from a great many things. It is distracting me from untangling my library dependencies, which are most woeful, as I am just utterly mad for libraries. It is distracting you from the important work you should be doing, providing me with more wonderful toys to play with. It is distracting the defendant, most likely, from several things to which he should have long ago turned his attention.
Thus, the initial rush of pleasure, adrenaline, and indignation aside, none of us have a great deal to gain here. I cannot discern amongst the sneers and dislikes without a substantiated context, nor can all of you can take pride, exactly, in your words; nor is the attention offered the defendant of any help or value to him, or any he may encounter. It is not reasonable to expect a person to back down, suddenly and publicly, in the face of such concerted ridicule and hostility. Shame only influences those who are still offered the possibility of pride.
(Please note that the above opinions reflect the views of my company, and should not be in any way mistaken or represented as my own.)
OOP is a big hoax.
>finding the equivalents of things like "count" ([1,2,3,4].length), or >"str_replace" ("string".gsub) in Ruby continued. I found myself in a world of >Object Oriented bliss, rarely looking back at the dull, functional world of >the PHP library.
This does not make any sense. So using A.f rather than f(A) is an argument in itself?
You make it sound like users have to chose a camp.
Yes, somewhere after Assembly, we just lost our way...
very good story. Thx very much.
wow... I can tell you that I have never posted a comment on a blog site before today. I'm really distrubed by this whole thing. Here is my rant so I can leave this damn site without taking the bad feelings with me. Please don't read the following if you are sensative.
This has to be the best example of what happens when a bunch of big egos get butt hurt. This is bad for RoR, PHP and all of open source. Why would I want to contribute to a project when there are people like this in the community? I think both sides are totally fucked up in this case. What is it going to take, should we drag Nate out in the street and ass rape him with the magic keyboard Linus used to write the first few lines of the Linux Kernel and then post it on YouTube? Maybe that will make him respect open source. Ya'll need to find a valium or a blunt and relax. Who really cares if he is making money off of his CoR or the railsmanual.org. Unless you didn't know people do all sorts of stuff to make money that is less than ethical. How about all of that internet porn all of you are jacking off to? Did you think that was open source porn where the authors did it for free or did you not realize that the girl who got a face load is getting expoited? This is totally screwed up for everybody to be doing this on a blog like this. If you think little Nate is lame why not just ignore him, or maybe we should add fuel to the fire. I'm lame for even posting here and wasting my damn time on this.