Java and Ruby

我的日常工作之一是统计非法走私信息,在国家级的行业信息系统上有一些数据,但不是我们要的格式。我们要把每个走私案件统计下来,包括走私的产品、数量、案值金额、还有涉及到哪个下属单位等信息。过去用眼镜跟手再加上 Excel 来整理实在是太麻烦了,于是我就写了一个 Ruby 程序,把导出的数据整理成我们需要的格式,输出成 HTML,大大减轻了工作量。

不过这个程序是在我的 MacBook Pro 上写的,而我们的信息系统只有内网能访问。每次使用的时候我只好导出数据,转换成 CSV 格式,然后用电子邮件发给自己,从 MacBook Pro 上收取邮件,转换编码,转换成 UNIX 格式,然后再运行程序,把生成的 HTML 页面再通过电子邮件来发回去,再进行整理。这样一来很繁琐,而来这样只有我自己才能干这件事,我休假时也没法委托别人去做。

所以前几天我考虑了一些比较适合在 Windows 上使用的编程语言,把我的 Ruby 程序移植过去。最后我选择了 Java,因为它比较容易在 Windows 上安装,而且我之前上学时还做过两个 GUI 程序,我也希望把程序做的友好一点,可以推荐给同事用。

我没有进行别的什么设计,只是简单粗暴的对照着之前的 Ruby 程序,逐行翻译过来。断断续续的调试了两天,目前弄了个大差不差的版本,只是这次我的输入输出直接是 Excel 文件,省下了转换格式、编码的步骤。我对于操作 Excel 还没有了解多少,所以还有些合并单元格、修改字体、宽度高度什么的需要加上,其它数据方面今天总算是调试成功了。

谈谈使用 Java 的感想。

我在 2010 年的时候写过一篇文章,记载着是一次用 Java 语言完成作业的经验,我那时候花了一夜完成了那一周的作业,实现了几个数据结构并且排序。那时候我用 Java 还比较熟练,有些东西不需要像现在一样查文档,结果没怎么调试居然成功了,让我对 Java 好感大增。不过这次跟 Ruby 比起来,Java 就显得太繁琐了。

过去我对 Java 的一些比较“高级”的用法不大了解,因此一些迭代器呀什么的也用的不多。这次因为在 Ruby 程序里用了很多迭代,感觉比自己苦兮兮的写数组来说方便太多了,因此就用了不少的迭代,结果每次新建一个迭代器实例,再用 hasNext()next() 函数来遍历,比起 Ruby 的一个 each 就搞定实在是繁琐。这样的另一个后果就是多了一堆代码,我在 NetBeans 里面看的眼都乱了,调试的时候直接找不到头绪。最终搞定了我是觉得没问题的,但是搞定前费的功夫实在是大。所以近年来,要完成一些任务,我绝对是偏爱脚本语言。

写到这里,不禁感叹,如果我们公司用的是 UNIX 操作系统该有多好,可惜绝对不现实呀。

过去对这方面的感触不深,但通过对比就觉得 UNIX 的编程方式实在是太方便太先进了,比起 Windows 的模模糊糊好了不知道多少倍。可惜 Ruby 在 Windows 下执行不大方便,做成可执行的 EXE 就更不容易了,简直没有头绪。

这个程序目前的输出方面,还有一些功能需要添加,不过这个 Excel API 弄得我写起来还是不顺心,也许有一个更好的用法,反正正常的写程序绝不应该是像现在这样遇到输出就一个单元格一个单元格的写,运算逻辑和输出逻辑都没有分开,之后要加点功能,处理其他格式的数据,肯定远比我过去用 Ruby 输出 HTML 时来的困难。

C C++ Java

KandR我曾经幼稚的以为C++语言是计算机编程的终极武器,因此在当年没有互联网、信息闭塞的年代,当我还在用BASIC语言的时候,我就一直梦想着的一用上、学会C++,也一直在幻想着,用C++编程会是什么样子?那时候,我对C++仅有的知识,可能就是从一些计算机普及书籍的前言部分,还有《开天辟地》、《万事无忧》等光盘中得到的吧。记得上面说C语言当代码长度超过5000行的时候就显得无力,而C++则解决了这个问题。我不知道为什么C++会没有这个问题,只是相信C++是一门更强力的语言。

有一天,机会来了。在周末的课外英语辅导班下课后,来接我的父亲给了我一份意外的礼物──在辅导班教室不远处的盗版光盘店买来的Visual Studio 6.0企业版的安装盘,一共有六张光盘,当时拿在手里也有种“沉甸甸”的感觉。其实我到今天也不明白,不懂编程的父亲怎么会挑中这么一套光盘,而我之前一点也没提起过。不过当时的兴奋已经让我无法思考这些问题了,因为我赫然在封皮背面的介绍中看到了Visual C++企业版的字样,瞬时间其它的Visual Basic 6.0、Visual J++、Visual FoxPro什么的我都看不到了,尽管后来FoxPro可能是我用的最好的(基于原先从少年宫学到的FoxBASE的基础)。

回家后第一件事就是把它装上。到现在我已经很多年没有接触过Visual Studio了,因此也早已忘记了当年那将近一小时的等待。反正经过了漫长的等待之后,我终于见到了它的庐山真面目。不过对C/C++没有丝毫概念的我自然是不会用,于是就一直物色一本相关教材了。

济南三联家电的五层(要么就是六层)上有一小块区域在卖计算机教材,记得大约有两、三个书架的样子。而我从里面竟然找到了大约有三厘米厚的《Visual C++ 5.0编程大全》,售价好像是66元。经过父母的同意后,我欢天喜地的把书捧回了家,这也是我买的第一本自己都觉得贵的书。不过相对与后来的动辄八、九十甚至一百多的计算机书,真是感觉不胜唏嘘啊。另外,后来同样是在这个地方,我也买到了另外一本对我影响很大的计算机书──谭浩强的QBasic相关的书。

回家后我就迫不及待的想把书上的例子输入进去运行试验一下。因为当时似乎英文还没怎么开窍,输入的自然很慢。我又闲书太厚,一遍压着书页一遍敲键盘不方便,还让坐在我身后的母亲帮我念着我来输,不过也是很不方便。最后终于成功后,看着在IDE下半部分输出的一串字符,似乎有种怅然若失的感觉。略微有些失望──这就是传说中的C++?

我买的那本书是很早期的C++书籍,并不像现在的C++书上来就说建议读者把脑中的C完全忘掉,把C++当成一门全新的语言来学。而那书上来的例子都是成对的,一个用C写的例子,接一个用C++写的例子。我当时固执的认为C++是比C更好的语言,而且那书上明确的写着“C++是C的超集”,我虽然那时还没学过离散数学,不知道“超集”的明确概念,但也知道是更好更大的意思。于是我看到C的例子(区分方法就是文件名以.c后缀的)就跳过去,只看C++写的例子。而且当中看到第二个C例子时,其中的一句printf()还有一堆百分号之类的东西,让我百思不得其解,甚至以为是印刷错误,于是更打消了看C例子的念头──由cout<<组成的句子看上去多直观啊?

当时越看越迷糊,但也能囫囵吞枣、隐约有些懂但又不明所以的看了下去,后来看到似乎是第八章,名叫《数组》,还有第九章,名叫《指针》。当时觉得数组挺简单,因为BASIC中也有点基础,而指针,我很早就听说了是造就C/C++语言强力的关键,因此就聚精会神的看指针。我倒是看懂了int *p = &q;之类的语句,也大概明白了其中一幅幅的示意图,但看完了全章,到底讲了什么道理,完全没有概念。我那时贯彻的精神是看不懂的就看个差不多,然后就跳过去。

然后有一天,我惊讶的发现竟然跳过了书的第一部分,而第二部分的开篇就用煽动性、似乎相当惊喜的语气告诉我们,要接触一个全新的、美妙的部分了──面向对象。这是大概十多章之后的内容。然后就是类的概念,我发现我似乎又能看懂一些了,然后就继续往下看,中间讲了什么也全忘了。然后后面就带过了Windows API编程,有几章讲了MFC编程什么的。然后全书完,我则没有些许概念。或许可以用C/C++写点给半径算圆的面积周长之类的小程序,反正就是用C的语法写BASIC程序。

直到多年以后,我买来了谭浩强的经典的《C语言程序设计》来看,才终于搞懂了printf()函数中引号中那一堆百分号的意思,也稍微了解了一下指针的作用。才发现一切与我想象的是那么的遥远。

中间有一阵子我一直想学会C语言,但那一阵子我的主修语言是Pascal。后来上了大学后才逐渐开始用起了C。本来我觉得自己有一些基础的,用C写作业基本上是小儿科。可一次又一次的bus error让我十分受伤。而且我发现我连最普通的字符串的概念都不清晰,什么时候用数组形式,什么时候用指针形式,这点都还搞错。写东西的时候凭感觉觉得是完全按照要求写的,可运行起来完全不是那么回事。这让我有一阵子特别不愿用C语言来写东西。

duke同时我在学校学一、二年级的课的时候,很多时候都是用Java来写作业的。开始的时候我特别不想用Java,觉得它太罗唆。在C中只要几行的打开文件,在Java中非要放入try中才能编译。不过随着经验的增多,以及C给我的一次次的打击,我渐渐的感受到了Java的好处来。尤其是垃圾回收机制,让我免于bus error的困扰。随着软件工程课程的进行,我逐渐学了Unit Test,并应用在了项目作业中,才感受到了TDD的好处。

两个星期前的计算机网络的实验,让我们用C语言写SOCKET程序。服务器端从文件中读入公交车的到站时间,客户端给出目前时间和公交车的号码,服务器端返回下一趟车的到站时间,要TCP和UDP的两个版本。我本来心中有些惴惴,后来一写下来竟然非常顺利。把读入文件、和查询时间写在单独的模块中,让TCP和UDP版本的都能调用,避免了冗余。这样下来让我信心大增。

后来又开始写计算机组织的第一次作业:用C或C++写一个简单的虚拟机,老师给出了硬件的设计和编译器,我们的虚拟机解析二进制字节码并执行。当时写下来觉得没有什么语言上面的问题。但今天看到了老师给的标准答案,还是让我很汗颜,让我觉得自己的水平实在够烂的。中间我还穿插着用C语言解决一些密码学作业上的问题,感觉C语言用的更加顺手了。

总结我之前的不足,我汗颜的认识到实在是基本功不扎实的原因。原先我不知道怎么用fgets()来读一行字符,而总是用gets()而不顾编译器的警告。后来也是通过操作系统的作业和实验才习惯用fgets的。而字符串之类的问题则更是如此了。

之前我曾经分析过我学习编程语言的过程,发现真正让我有所提高的是学习完语法后的练手的过程。我学BASIC的时候,虽然感觉进步最大的是有一天下午在姥姥家躺在床上几乎看完了一本从书橱里翻出来的谭浩强写的一本很古老的计算机教材的后半的讲BASIC的部分(前半部分介绍的主流计算机是国产的DJS,你就知道有多老了),那本书是我二姨的大学教材,看完后我了解了大多数BASIC语法。但真正让我把BASIC语言运用的烂熟于心的是我后来用BASIC写的一系列程序(求闰年之类的)。我的Pascal语言的语法阶段的提升是在升高中那年暑假在山师上奥赛班时看的一本《计算机奥林匹克(提高版)》,但真正让我熟练运用Pascal的是后来做的一系列奥赛题目。其它语言,比如Perl和Python都是如此,Ruby语言还没有经历这一步,因此现在也不算很熟。而我中间曾想用这种方法提高自己的C语言功力,试图在USACO注册一个新帐号,从头做起,通过做题来练C语言。结果后来因为时间问题而没有坚持下来。

现在的几次作业让我又一次有了这种感觉,我希望能在近期突破这一层吧。

项目体验

我们《软件工程》课上的项目作业快到了第一阶段的截止日期了,因此近期我们的工作量都大了起来。之前我从来没与别人合作写过程序,也从来没有写过复杂逻辑的程序(从来没用过Java的package),因此这次也学到了很多。

今天我花了一天的时间在完善项目上,感觉到了一个比较严重的问题──怎么也想不起来这个函数是什么时候写的、谁写的以及做真么用的了。每次遇到这种情况,我都要从项目的第一天回溯过来,想这段代码是怎么演化到今天的。如果是自己写的还好说(我们两人写后端,绝大多数的代码都是我输入的,同伴主要出谋划策与设计算法,因此印象比较深刻),但由于我们两人的代码量较大,另两个人完成他们的部分后,开始帮忙做我们的部分,有时他们会改动一些内容,这就常常让我困惑不已。

今天把多数工作都完成了后,我决心改善这种状况──为几乎每一个函数都写Javadoc。几乎的意思是除了一些非常明显的accessor外,每一个都注明用途、变量性质、返回值性质等说明。这样的好处有二:一是在将来忘了函数作用后可以方便的查看Javadoc;而是因为我为每一个函数都加上了注释,也相当于我又从头开始复习了一下整个程序,对整体的了解也更进了一步。

全Mac团队

今天讲一件我前天发生的事情。

这学期我选了一门《软件工程》课,课程要求我们组成5人或6人的开发小组完成老师布置的项目。小组模拟现实生活中的软件开发进行XP编程:小组中的一人充当用户,由他在老师给下的软件要求的基础上进行充实,我们关于软件要求的问题也问他;另外的人分成两个小队,分配任务后进行结对编程。前天正好是我们小组约定第三次开会的日子。

我讲的事情与敏捷开发无关,而是关于我们的开发环境的。

我之前写过一篇文章《学校应当使用跨平台软件》,提到我在得知我们小组使用Java来做我们的项目时有多么课开心。得知这一消息是在我们小组第一次开会之前,那时我们还没见面,只是简单的用电子邮件讨论了一下。

在我们第一次的会议上,我就看到我们小组5人中,除了我以外有两人在用MacBook Pro。这让我一下子安心了许多。第一次的会议决定了用eclipse来作为我们的开发环境就顺理成章了。不过由于eclipse的GUI Builder不如NetBeans那么好用,我们又换成了NetBeans这样的工具。

几天后我与和我组队的同学进行结对开发的时候,我发现她带了和我一样的MacBook。这样我们小组用Mac的人又多了一人了。这样就只差我们组的用户没有被确认了。中间的一次会议中,他来的有点晚,我们还猜过他用什么电脑,有人说他可能是用的PC,不过都不会影响大局了。

前天的会议末尾,我们“正式”的问了他的开发环境,他向我们确认了他也在使用Mac。这下我们全部的成员都使用MacBook了。我们的leader打趣说,我们甚至可以使用Cocoa来开发程序的界面,因为结合XCode,用Cocoa写界面实在太简单了。我们还讨论了大家用Mac的原因,多数人同一它的笔记本质量实在太好了。这一点我是深有体会。

其实,全组成员都用Mac倒不是重点,重点是大家都使用Java。我在那篇《学校应当使用跨平台软件》上表达了对学校要求学生使用非跨平台的软件的不解。我觉得学生有权利选择自习喜欢的平台,而学校强制学生使用单一平台上的软件,相当于剥夺了学生对平台选择的权利。有人说Windows平台的使用人数最多,证明Windows平台好用,因此学校使用Windows平台教学也无可厚非。对于哪个平台好用,我觉得别人永远都无法代替我做出决定。即时全球的人都用Windows,我还是觉得Windows难用。我对Word的态度也是一样。

那篇文章发布了之后,过去的同学在Twitter给我说“Windows已经是事实上的标准,而且买电脑都有Windows的使用授权。世界上有那么多人选择windows本身已经证明windows好用了……”,最后还诘问我“我很难理解你为什么对m$那么大意见,而不是对intel”。其实我对微软没有什么意见,从一个计算机专业的学生的角度来看,微软能做出像Windows这样的产品本身就很了不起了。微软的前领导人Bill Gates我也非常尊重。我也从来不写“M$”,因为我觉得微软的软件定价也没有不合理之处。只是Windows的操作习惯不符合我的口味而已。Intel的CPU好不好,我不做CPU层面的开发工作,无法判断。不过我身边有同学用HP的笔记本,用的是AMD的CPU,经常开机没一会风扇就嗡嗡响倒是真的。

我非常感激Sun,它的Java基本上实现了跨平台的理想。Swing也比.NET、Cocoa、GTK+、QT之类的图形类库更跨平台。我曾经想过,如果Sun运作得当的话,可以像Apple那样推出家用计算机,硬件上用自己的Sparc,软件跑的是Solaris,应该也会相当不错。只可惜没落到了今天这般地步。

学校应当使用跨平台软件

今天下午收到课程项目小组的邮件,多数人支持使用Eclipse来作为我们项目的开发工具,当时我就松了一口气。我今年暑假选了一门《软件工程》课,课程要求5到6个同学组成小组来完成老师布置的项目。课程不限用什么语言和工具来开发,只要支持软件工程,如重构、XP等操作的开发环境都可以使用,只要小组成员都支持就可以。老师预先批准的开发工具有Visual C#.NET、Visual Basic.NET和Eclipse/Java。其它的开发环境也可以,但要老师批准。

让我一直很担心的原因是我在课间听到很多同学都在讨论用C#来开发。我日常使用MacBook,没有在上面用BootCamp安装Windows环境,也不希望使用Windows。因此即使微软提供了供学生下载使用的免费版的Visual Studio 2008 Express,我们三年级以上的学生有校园版的MSDNAA可以下载企业版的Visual Studio,我因为没有Windows平台,也无法安装它们。如果我们小组的多数成员投Visual Studio的票,我下功夫学习C#倒是其次,而且要很难受的用学校的电脑来完成项目。

用Java的好处是它是跨平台的。目前Java的虚拟机已经支持绝大多数平台,而它的编译工具也支持很广泛的平台环境。更何况还有Eclipse这个横跨Windows、Linux和Mac OS X的优秀集成开发环境,因此我觉得Java是一个更不错的选择。而且我们之前的课多数是要求用Java来写作业,因此我们可以省去了熟悉语言环境的时间。

我过去一直以为欧美的大学里应该自由软件相当盛行才对,不过到了加拿大才知道这里也是相当落后的。从学校的机房来看,大机房里90%的机器都是用Novell网络集成的WindowsXP,只有一排机器运行Solaris和Cent OS。而且那些运行Windows的机器早已换成了大屏幕,UNIX机器还在使用可怜的15寸显示器。我以为至少计算机系会多用一些自由软件,结果只有少数老师的机器运行Linux,多数运行的是Windows和Mac OS X。更有我们上学期的计算机伦理课老师,要求我们提交Word格式的作业,却拒绝接受PDF格式的。我们学校还算好的,滑铁卢大学的计算机系因为和微软有协议,我们使用Java的时候,他们的学生都要使用C#来做作业,真是骇人听闻。好在和国内相比,加拿大的Mac电脑使用量较高,因此学校对非Windows系统还算支持,学校的统一网络也是UNIX服务器来支持的。

我不是自由软件的强硬支持者,因为毕竟自由软件的商业模式还有待发展。我现在希望的是至少学校应该使用跨平台的软件。就拿普通作业来说吧,为什么一定要求学生提交Word格式的文档呢?虽然现在可以运行在其它平台上的文档工具也支持Word,但毕竟Word不是那么的方便。Adobe Acrobat应该也支持PDF文档批注的功能,学生用Word或者Pages或者TeX把作业导出成PDF格式再提交不也是可以批注吗?上学期老师在要求我们提交Word格式的作业时说,学校的任何Windows机器上都有Word 2007可以使用,因此我们也可以完成作业。但这给学生带来了相当大的不便,自己的机器用的才是最顺手的,为了完成作业要到学校的机房进行,这多么令人难过。而我在Mac OS X上有Pages可以把文档保存成Word格式,还要因为担心兼容问题而在Windows机器上用Word再检查一遍。

很早之前,朝陽科技大學資訊管理系洪朝貴写过一篇文章——《好公民不助長非法拷貝 — 請停止散佈 .doc 檔》,讲了Word格式的文档的盛行带来的社会问题。其中“后记(II)”里写到:

有些人說: 「微軟已提供免費的 reader, 怎麼可以說散佈 .doc 檔就是助長非法拷貝呢? 」 問題是, 這 reader 只能在 Windows 底下執行。 對於不使用 Windows 作業系統的人而言, 這當然是鼓勵他非法拷貝啊! 換做是您, 會為了讀一個檔案去買一個作業系統嗎? 說實話, 不要假清高。

这些内容解释了为什么非跨平台的软件给社会带来了不便,这是我在学校切实的体会。2008年秋季学期开始时,我选了一门《人机界面交互》课程。里面的作业要求学生使用C#来完成。说实在的,人机界面不过是研究界面对用户的影响之类的问题,与使用什么工具来实现没有什么关系。但限于教授的知识结构,生生的把我们限制在了一个并不便宜也不好用的操作系统上。那门课我学得相当难受,因为每次作业我都要去学校的机房去做。结果期中考完试后我忍无可忍,注销了那门课。用一门语言把学生逼死,这不是相当令人难过吗?亏了这门课不是必修。

蔡志浩写过一篇文章《放下屠刀,立地成佛》,里面讨论台湾的学校使用商业的微软Office而不是自由免费跨平台的OpenOffice.org。文中的最后一段话我相当赞同:

請各位老師停止使用微軟的辦公室軟體,改用 OpenOffice.org。放下屠刀,立地成佛。這不是軟體使用偏好的問題,而是教育工作者的良心問題。要做到這一步,其實並不難。你知道該怎麼做,你也找得到時間去做。這只是一念之間的事:學生的受教權,在你的一念之間;你使用軟體的自由,也在一念之間。就看你能否作出正確的選擇了。

在这里我希望计算机教育业者能思考同样的问题。

对脚本语言的感觉

今天上午考完了《面向对象》这门课,往后一段时间就不用再接触继承(这还好)、Shadowing、Refinement、Overloading之类的概念了。相对来说我还是更喜欢可以快速开发的脚本语言的。

我们这门课接触了三门语言:Java,C++,和Ruby。纵观每次作业的代码量,Ruby是最少的。里面Java用的多,感觉还好。C++里面那些C的东西就太讨厌了,指针啊什么的传来传去,自己回收对象也容易犯错。编译器对包的控制也比Java落后,不像Java那样可以搜寻CLASSPATH里的类,而必须要自己来控制#include。总之,再怀念一次脚本语言。

我目前比较熟悉的脚本语言有四种(可能不严谨):Python、Perl、Scheme、Ruby,这个顺序是以我的熟悉程度来算的。之前也有花大半天时间来从零开始用PHP来写网站的,不过以失败而告终,我的眼还没有练就在一堆HTML tag里看出PHP语言的逻辑的境界,因此可以忽略。正好一门课告一段落,今天就记录一下我对它们的看法。

Scheme是我最想学好的一门。理由很简单,单就SICP在计算机界的地位就已经足够了。我买过裘宗燕翻译的中文版,也下载过作者放在网上的讲课视频,不过都没有什么精力自习看。其实Scheme很简单,这也是我喜欢它的原因之一,区区50页的R5RS对我很有吸引力。而且因为如此,要想查找一个什么函数也就很简单,因为实在没有太多需要查的。但Scheme蕴含的思想,也就是SICP里的东西,我还没有领悟。

我上学期用Scheme的次数比较多,那门“科学计算”课上的作业我没少用Scheme来写。奇怪的是我虽然不是很熟悉它,但我写的Scheme程序很少有错误,不知道是不是因为它的括号语法让我写起来必须要加倍小心的原因。另外一个因素可能是它的交互式环境更方便调试,我在上学期的“编程语言概念”课上用J语言的时候也很少犯错(不过J的语法我估计现在已经忘了)。

我机器上一直有scheme48。我遇到要进行数值运算的时候最喜欢用Scheme来作为计算工具。Emacs结合Scheme运行起来很方便。

Perl语言是我学的第一门脚本语言,因此我对它的感情很深。我的Perl入门读物是《Perl语言入门(第三版)中文版》。那本书翻译的相当不错,原作中幽默的笔调,译作中完全体现出来了,因此它是我那时候的厕上读物之一。可以说这本书打开了我对脚本语言喜爱的感情。不过那时候学习忙,没有时间实践,我多数时间是凭空看书,在脑子里空想。不过奇怪的是反而印象深刻。后来出于对Perl的喜爱,又去买了厚厚的“大骆驼书”──《Perl程序设计语言》。不知道是不是因为这书太厚还是因为翻译的问题,我读这本书的前半部分时感觉非常枯燥。因此我后来只看后面的专题部分,如POD、调试、C语言接口之类的。

Perl对语言格式的思路我非常喜爱,TIMTOTTDI。它衍生出来的种种Perl艺术也令我相当震惊。不过我对自己写Perl诗没有什么兴趣。不过因为学了面向对象,写了很多很长的程序,现在养成了把代码弄的很整齐的习惯,结果Perl代码我也是写的比较易读。

最近因为用了Movable Type的原因,我又拾起了Perl。处理HTML、XML的两个小脚本来获取dict.cn的翻译和Twitter到校内同步的工具我都是用Perl写的。期间有一种感觉,似乎Perl的实现比Python来的简单,更贴近于C。比如写往校内上修改status的时候,用Python怎么试都不成功,后来是用的Perl,就是因为对Python的字符串还不甚了解。另一个感觉是Perl更容易结合其它语言,而Python似乎更容易在自己的内部来工作。

我对Perl的负面感觉是没有交互式的界面。我用Python写程序时离开了交互式环境就没有什么思路,一定要先试验一下再整理初代码。写Perl的时候虽然不这样,但有时总感觉不方便。另一点是目前网上的中文Perl资料越来越少了,而且都不是很新。国内程序员追逐的风气在几年前就往Python移动了,近几年大概都转移到了Ruby上了吧。还有就是我用Python写多了程序后,再写脚本都容易忘了在句子的结尾写分号……

我学Python的时候有点障碍,当时看的是一本《Python宝典》,怎么也看不下去。当时冷静想了一下是因为看Perl太久了,对Python不习惯。后来出国以后我再逼着自己看《Dive into Python》,才可以开始使用Python。后来对Python熟悉之后就喜欢上了Python,不过对于Perl的感情还是无法取代。当时看了《Dive into Python》里处理HTML那一章后,在2007年圣诞那会写了段Python脚本来获取RubyConf 07的演讲视频,感觉不错。

不过我经常感觉Python有点“超出掌控”的感觉。经常会出现摸不着编辑的错误,尤其是字符串方面,弄的我挺郁闷。似乎相对与Perl,离C之类的低级语言更远了,因此也导致我不熟悉。另外,Python的面向对象机制我还没学通,因此Django之类的代码框架我就不大在行了。

我知道Ruby还挺早,记得高中时看过《程序员》上有文章介绍Ruby。当时的印象就是“日本人发明的语言”、“一切都是对象”。那时没有深入的接触Ruby,也没有想到后来RoR能如此之火。后来想用Rails写网站的时候看了一部分Ruby,感觉就是代码挺诡异(我觉得比Perl要诡异的多)。后来这门“面向对象”课上老师用Ruby来解释动态语言的面向对象机制,我算是多接触了一些Ruby,并用它写了此作业。不过这次的学习只是学Ruby里面关于面向对象方面的机制与语法,Ruby里面那些诡异的语句我还是不明白。