这几天在twitter上说到不少Ruby到底好不好的事情,总结一下,写了这个blog。
今年年初开始我打算深入体验一下Ruby on rails,对我来说,已经很多年没有接触"新语言"了。在这个深入体验开始之前的几年,也有若干次浅尝辄止,基本都是玩了几下,觉得要学的东西真多,用PHP顺手写一个也很简单嘛,就放弃了。
但我想一个东西迅速风靡世界一定是有原因的,就算我最终不去真正使用它,弄清楚背后的原因也是值得的。于是我就放下了老程序员的心态,像一个初学者一样从最基本的文档看起,尝试各种大家称赞的项目,搞不懂的地方就去问熟悉Ruby的人,不仅问如何实现,还要问"为什么会这样","过去什么样","其他语言解决某个问题的方法在这里如何对应"。几个月下来,虽然我还没能用ror真正开发一个完全独立的项目,但总算是有了一个全貌的概括性了解,也知道了历史和文化,体会了社区的氛围。这个时候,我想大概是可以对rails发表一些评论了。
在这一次尝试之前,我最担心的事情是"性能问题",现在看来这是一个伪问题,首先Ruby的性能并没有这么差(前几年确实不太好,不过现在已经很好了);其次,用来做一个网站应用,无论是什么语言,最后都要依靠缓存和分布来解决,也就是说最终都要依赖于正确的系统架构,而不是语言本身的性能;最后,就算是性能真的差又完全不可解决的问题,完全可以用效率更高的语言来写,把处理的结果通过各种通讯方式交给Ruby就是了。在计算机硬件发展到今天这样,性能问题大多不存在,只有架构师水平的差距。我见过很多用了几十台机器的系统但抗不住几十万的负载,这能怪语言和平台本身的性能差吗?
在所有关于Ruby优点中,我唯一不能认同的是"学习曲线平缓",事实上,Ruby的学习难度比较高,确实远远高于PHP,要说平缓,大概是相对于J2EE的平缓。我相信这是很多对Ruby误解和攻击的来源,从表面上看起来,要学会Ruby尤其是ror,至少需要理解设计模式,知道服务器系统的运作方式,甚至需要熟悉操作系统,要用好ror,更需要接触各种项目和各种标准,这些都需要花去很多学习时间。同时配合的还有各种测试工具,部署工具,虽然不是必须,但最终还是要学的(这里我还欠缺很多呢)。我曾经开玩笑说Ruby社区的人破坏了英语的纯粹性,因为他们fork新项目太容易,大家都喜欢创造各种开源项目,直接符合功能的名字都被用光了,于是只好用各种奇怪的相关的英语单词,以至于搜索很多英文单词竟然会找出来Ruby的项目。这些东西直接塞给一个初学者确实有很大的压力。Ruby on rails的Getting start又太停留在表面,勉强算是尝鲜,距离真正实用差的太远。相对来说,PHP就简单多了,页面直观对应在PHP文件上,什么都不用懂也能写(当然写好也很不容易),这造成的结果就是谁都可以懂PHP,但不是谁都能懂Ruby。人们为了掩盖学习的痛苦,就容易去攻击对方无用。在我这次下决心深入学习之前,我也觉得PHP最好,记得之前某次尝试的时候 @rainux跟我说,刚刚上手是很难感觉到ror的好处,需要持续用一段时间才会慢慢发现。
ror在架构和开发流程管理也坚定的支持了很多理论,比如MVC,比如敏捷,比如TDD...这些同样增加了学习成本,当然也增加了被攻击的接口,比如:TDD太扯淡了,所以ror也扯淡。或者:我最讨厌敏捷了,所以也讨厌ror。实际上,敏捷和TDD本身都没错,他们都有成熟的方法论和实践,有足够好的工具配合,能解决很多问题。如果不认同这个,只能说是开发和项目管理经验太少,没碰上过复杂问题。有错的是对敏捷和TDD的错误鼓吹,两者不能混在一起。
另外一个常见说法是寻找Ruby的大流量项目案例。但其实寻找Ruby开发的"top项目"没意义。DHH和37s创造的都不是适合所有人的产品,他们只愿意在某一领域做到最好。不是所有人都有兴趣创造亿级别产品,何况也没几个人真能做成。对大部分项目,千万是一个很好的级别,那是ror最佳实践领域,而在现实中,大部分项目能做到100万pv,已经算了不起了,想亿级别pv的技术方案未免过早了。
在组织技术团队的问题上,流行语言的难度是差不多的,10个人的团队任何语言都很容易组织起来,但换个角度看,任何语言也很不容易组织10个人的团队,只不过难的方法不一样。A语言可能是找人难,一周就收到1份简历,B语言可能是鉴别难,一天收到200份简历,看都看不过来。其实最难的事情是组织一个10个人的靠谱团队,这个团队用什么语言相对于寻找10个靠谱的人的难度可以忽略不计。
选择一个语言,并不是选择语言本身,同时也是选择社区。Ruby社区的活力,友好,规整,统一的审美,给我留下了非常深刻的印象。DHH和37s对这个社区影响巨大,我也相信他们的理念,小公司未必不好,小公司未必不伟大,追求pv不如追求极致的产品。我们创造一个产品,是为了解决一类人的问题,并不是为了超越谁或和谁竞争。
15年前,PHP 3.0之前的版本完全不可用(当然,那时候PHP的简称还叫做Personal HomePage),那时候用c写cgi/isapi或者用perl是网站最常见的开发形式。那时候说PHP是下一代语言,很多程序员都会不同意,他们会挑出来PHP一万个不如c或者不如perl的地方。这些都没错,但世界是会变化的。PHP今天确实成了一种应用广泛,老幼皆宜的语言。我并不认为未来Ruby会取代PHP,但至少,我认为下一代高质量的互联网产品出现在Ruby社区的机会更大,这就像当年PHP vs perl一样,乃大势所趋。
最后我说一句可能不太好听的话,如果你没有下决心转型成为一个写信教主那样的专门忽悠的人,如果你还觉得技术有点意思,还想自己创造点产品,那么应该保持足够的技术敏感力,认真的学习一些新东西,而不是给自己寻找各种借口。就像这张漫画一样。要多问问自己,是这东西真的不好,还是自己学不进去了?当然,承认后者是很难的。一年前我也确实没学进去。
原文链接:http://blog.devep.net/virushuo/2011/03/23/rubyror.html
【编辑推荐】