还记得几个月前我曾经说只有当我闲到无聊的时候才会去学学ruby,我说谎了。在我毕设答辩最忙的时候,我在偷偷地看programming ruby。在我工作的间歇,我在偷偷地看agile web development with rails。在我有机会写一些小应用的时候,我拼命地抓住机会用ruby。人的好奇心真是奇怪的东西,当ruby和ruby on rails整个community如此火热的时候,我没有挡住这种诱惑。
尽管我现在写过的ruby代码行数可能不到500行,尽管我甚至没有用rails写过web应用,但是我必须承认我当时的想法错了。ruby是那种第一眼看上去并不怎么样,但越用就越爱不释手的东西,有些东西只有用过之后才会有感觉。
很难通过哪一个点说出ruby比其它语言(尤其是Java优秀),有的时候一些语法的改进似乎是那么的不起眼,但是当这些细小的东西组合在一起的时候,那么种感觉是Oh my god!,真是太爽了。记得当时JDK 5引入了一个for each循环的时候,感觉只是一点点语法的改动,但是真正写起代码时才感觉到真是太方便了,而ruby远不止是for each循环这样的语法糖,当好多这些组合在一起的时候,给人的感觉是写程序竟然会那么easy,那么有趣。
Closure、正则表达式、range所有这些特性给人的感觉是写ruby的程序就象写诗一样,它是比Java更高级的语言,或者抽象程度更高的语言。ruby is beautiful。
然而,当全世界都在喧嚷着Java将会被ruby或被动态脚本语言所替代时,我不得不保持我的理智,语言的美丽并不能保证它会被大众所接受。很多人认为ruby很简单,因为它是比Java更高级的语言,因此它比Java更容易。他们错了。也许从语法上来说,他们是对的,尽管ruby的语法更具有灵活性,但是这点语法灵活性不会给ruby带来太大的学习门槛。也许因为类型的动态性,使IDE的IntelliSense statement completion不能用会造成很多人的不适应。也许因为ruby的动态类型,使很多的重构功能都不能使用会给人带来不变。
然而真正的问题是,ruby的动态数据类型会给人带来思维上的转变,而这种转变使得ruby的使用者所遵守的协议变得松散。
1、ruby的duck type使我们的面向对象思维颠覆,也使我们需要重新思考所有现有设计模式,因为我们不需要interface了,这曾经是我们面向对象设计的精华。类的核心是对象的行为,而不是类型,这就是duck type的基本理论,只要你飞得象鸭子、叫得象鸭子,那你就是鸭子。无需求任何abstract class或interface的约束,我们就可以完成任何事情!这真是太爽了, 太灵活了, 但这种灵活性使开发者无需去遵守interface所规定的协议,因为我们根本不需要interface的类型规定。但是同时这意味着危险性,这真的是一把可怕的双刃剑。使用不当,我们的程序将变成一堆散沙,很难追踪它的线索和思路。
2、method missing,动态数据类型、class的随处扩展使程序的追踪和可读性变得很困难。我们经常查了半天搞不清楚别人的方法到底是在哪里定义的,方法的返回值到底在哪里。
DHH用ruby写出了rails这样的framework,Dave Thomas可以在两个多月里写出5万行的ruby代码。ruby的这些特性对于Dave Thomas来说只有power,而绝没有上述这些困挠。但是come on, 全世界有多少个Dave Thomas?现在大部分的程序员是希望早上九点上班、晚上五点回家,过着幸福的小日子的年轻人,让他们用ruby开发大项目的后果会是怎么的? 我不敢想象。
ruby会成为软件工匠最好的利器,会使很多人有超爽的感觉,但是它究竟能达到什么地步?能不能取代java? 我只能拭目以待了。