2007年11月9日

为什么我从Ruby on Rails转向Django又转回来

作者 非鱼

趁有时间,再翻译一篇文章,原文地址:http://blog.carlmercier.com/2007/01/30/why-i-moved-from-ruby-on-rails-to-pythondjango-and-back/

在2006年3月份的时候,我决定完全重写Ajaxwhois.com网站。我已经学了很长时间的Ruby on Rails,知道它就是最合适的平台。Ruby on Rails可能对刚刚从Java或.Net转过来的程序员有点难用,但是只要很短的时间,你就会适应它。

透明的代码生成,糟糕的IDE工具,还有更坏的,没有好用的调试器,这些导致我转向Ruby遇到了一些困难,我已经习惯了Visual Studio .net,习惯了它的智能感知。我好怀念它啊。

每一个使用Rails的新手都会很快的明白它为什么会这么流行。首先,既便我还不是一个太熟练的Rails程序员,我现在使用ROR的开发效率仍然能够达到asp.net和C#两倍以上。这要多亏了MVC(Model, View, Controller),DRY(Don’t Repeat Yourself)和约定高于配置的理念。所有的数据库处理代码都已经自动生成(甚至不需要运行任何代码生成工具),还有自带的模板系统和Ajax支持。

用ROR的日子是美好的,用的越久我就越喜欢它,直到2006年的8月初。我已经准备好了Ajaxwhois网站的2.0版本,准备上线了。认识了很多Rails专家,我以为把我的程序发布到生产环境服务器是件很简单的事,但是,我错了。虽然安装Linux(Ubuntu Daper Drake 64位)、Lighttpd、Mysql和Mongrel都很正常,但是我遇到了很奇怪的问题,主要是Mongrel的问题。有时候,Mongrel进程就那样死掉了,进程列表中看不到,也没有任何明确的原因,这时候服务器还没有任何流量,因为我还没把DNS转过来。还有的时候,Mongrel疯狂的占用CPU到99%,我不得不手动Kill掉它再重启。

经过一番搜索和无数次的重装,我发现Mongrel跟64位Ubuntu不太兼容。Mongrel打过这个补丁,但是并没有解决我的问题,它还是会每天死很多次,而且我找不出哪里出的问题。问了几个Rails专家级的朋友,他们也都没有办法,我受不了了。

我不能再浪费更多的时间了,于是我拿了本Python的书,并且又一次重写了整个网站,在Python里我使用了Django框架。我从来没有Python和Django的编程经验,但是转换是相当容易的,因为Ruby和Python的语法很多地方很想像。

Python和Django给我的体验非常棒,每个开发人员都应该考虑一下。不过,我很快就怀念ROR了。Ruby支持真正的private/public/protected方法(Python只是用它的命名方式模拟一下),而且它的语法更宽松(Python里面每个方法都要写(),烦死我了)。Django不像Rails那么简单,需要更多的代码完成相同的工作。Django还有些小问题让人觉得很不爽,比如需要手工传递参数到view,数据库处理也不像Rails的ActiveRecord完成的那么漂亮。这种问题还有很多。

另一方面,Python比Ruby要快,而且内存占用更少。而且我真的爱上了Python的缩进语法。更重要的,Python和Django工作正常。我从来没有遇到过像Rails那样当机的问题。

那么,为什么我在下个项目的时候又回到了Rails上呢?三个字:FUN。我觉得ROR用的更爽,社区庞大活跃而且很有用。可用的Rails插件很多而且核心代码的改进相当快。Rails需要的代码量更少,没有self.__awkward_method_calls()这种东西,有内建的Ajax和REST支持,更复杂的数据库操作和模板引擎。

那死机的问题怎么办呢?还有速度的问题呢?嗯,死机的问题消失了。别问我怎么弄的,我也不知道,它就那样消失了,我发誓!某个时间某个问题的修复解决了我的问题。但是速度的问题仍然是Rails的一个软肋。使用缓存和优化代码可以解决很多情况下的问题,而且Ruby的作者Matz正在努力的写成一个新的虚拟机,以便让Ruby至少像Python那样快。

我的建议是:两个都试用足够长的时间,才能发现哪一个更适合你。如果你已经有Python的编程经验,Django当然是最好的,但是如果你有Java/Perl/Smalltalk背景,ROR可能更合适。

PS:我的Rails问题也不能全怪Mongrel,因为我也不知道具体是哪里的问题。Mongrel是个优秀的软件,我真心的推荐它。只是如果你使用64位Ubuntu的话,盯紧一点!