在最近的一两个月工作中,自己做了一些工具,还有一些测试的自动化脚本。大量地使用了Python,总的来说,我觉得Python是一门值得学习的脚本语言。
先说说我使用这三门脚本语言的认识历史和程度。我最早听过的脚本语言是Perl,那时候我买了一本叫做《24小时精通Perl》的书,不过可惜了,因为我没有翻到第三章。第二个接触的语言是Python,那大概是在2002年我读大三的时候,买了一本书,也是看了看,不了了之。我知道Ruby也大概是那个时候,不过要晚于Python,是在一期程序员杂志里面读到的,后来我惊奇的发现原来Red Hat里面带了Ruby的解析器。
到了我工作之后,我发现公司里用得最多的是Perl。这可以理解,因为Perl的历史最悠久,而我们公司是一家老字号的欧洲企业,所以Perl是内部最常用的脚本语言。我在刚进公司做SCM工作的时候,用Perl写过一些脚本,辅助我日常的工作。但都是一些特别简单的脚本,也不能算懂Perl,只是会用些简单的功能。三个月之后,我开始第一个项目,我发现爱尔兰人还是很前卫,他们使用Python和Jython做测试框架。不过因为这个Framework我们也不需要改什么,只需要手动写一些Case,所以也基本不能算会用Python。不过我不太喜欢Python的缩进规则,有的时候确实很麻烦。
我真正第一个学会的脚本是Ruby,那个时候Rails刚刚红,我就开始找了本<Programming Ruby>电子书学习,大概是2006年夏天的时候。坦白说,直到今天,我都认为Ruby是脚本设计中语法最优雅的。完全的面向对象,不鼓励Perl的那种简写形式,没有Begin但是有End的设计让我觉的Pascal, Delphi和VB的设计师脸红:) 我喜欢她的纯粹,这是我经常举的例子,取一个数组的长度,在Python里面你一定要写len(arr),可是Ruby中你就可以写成arr.length。别小看这一点点,语法的一致性非常重要,因为她可以让你少犯很多错误。最重要的是,我觉得Ruby的文档设计比Python强很多,坦白说,Python的文档真得不太好用。我用Ruby写过一个上Baidu下载Top100歌曲的工具,还挺好用的。当然,我也学习过时髦的Rails,不过我并没有用Rails做过真正的项目。不过Ruby至今都是我推荐的一个语言。如果你的项目不是企业级的,而且你喜欢那种自由快乐的写程序,请优先考虑Ruby。
现在,Python是这三种语言中我使用最熟悉的一种。当然我还是不太会metaclass这种高级的主题。Python的语法,我觉得不如Ruby好,美;而且Python的文档系统实在有些糟糕。也许你会说仁者见仁,可是我可以很负责人的说,对这一点抱怨的Python程序员绝对不止我一个。不过Python有他自己的一些特色,有的甚至非常重要。首先,Python的库很丰富,尤其自带的库就很丰富。这一点,比Ruby强太多。日常工作中的,线程啊,网络啊,等等,都自带了。其次,Python很多库的设计就是照搬UNIX的函数,对于我们这种长期在UNIX环境工作的程序员来说,太熟悉了。这里我不得不说一个题外话,UNIX的API设计的真优雅。如果你熟悉UNIX,那么那些函数你会很习惯。譬如底层的Socket啊,这些,调用方法几乎一样。第三点,Python的虚拟机比Ruby快,而且线程支持是真正的线程。这个东西在一些简单工具上没有用,可是如果你需要提升一下性能,那么就会体现出Python的优势。第四个,不是一个技术原因。因为Python的历史比Ruby长,所以很多公司是允许使用Python的,Ruby就不一定了。也许你使用Ruby,要走一个很长的申请流程。如果你经常需要在单位中写一些工具,或者测试脚本,那么Python是你不二的选择。
等等,你把老大哥Perl放在什么地方了?坦白说,如果不是为了看懂Legacy的代码,我不会学习Perl。为什么呢?因为Perl太灵活了。灵活不好吗?好,也不好。如果用Perl写一个脚本,就几个文件,每个不超过一屏幕,我觉得Perl的简洁就很好。可是,如果是一个上千行的脚本,设计到N个对象的交互,如果我是系统设计师,我一定要放弃Perl。为什么呢?第1点,在企业中,维护一个软件源代码的成本高于创建一个源代码。而Perl由于太灵活(有个同事把自带的变量,例如什么$_, @_打印出来,足足两张A4),对于看代码的人来说很痛苦。第2点,不能本质的支持基于对象的程序设计。我知道Perl可以OO,C也可以,不过那要自己做很多工作。我也明白OO不是银弹,OB也不是银弹,不过现实是,在很多情况下,基于对象的程序好维护,利于维护。当然,Perl有很多有点,速度很快,正则表达式能力最强,而且库最多。关键是,感觉在我们领域,会Perl的人比Python多,更比Ruby多。而且基本企业都允许使用Perl(Google是个例外)。
好了,总结一下我的体会吧。在工作中,如果是一个全新的东西,我绝对使用Python2.6(我不会使用3.x,因为很多库还不支持3.x)。如果是自己玩,我会选择Ruby或者Python。如果需要维护现有系统,我还是会在Perl系统里面使用Perl。
「以上仅为我自己的体会,求同存异]