2007年8月2日星期四

马尼拉项目回忆录(一)

马尼拉项目终于结束了,一个花费了我们小组整整一年半时间的项目终于圆满了。不带一丝遗憾的结束,不带一个残留FT的结束。

有位同事第一时间给我道贺说:“听到你们项目结束比听到北京申奥成功还感动!”,这让我着实深深愧疚了一把,因为我自己都没有这么感动呢。不过想想也对,我身在其中一年半多,这个项目都成了我生活的一部分了(嗯,应该还是挺大的一部分),最后结束也象是水到渠成,非常自然,反而就没这么激动了。

回想这一年半来,我恐怕是这个项目中感触最多的人了。从这个项目中,我学到了很多东西,除了技术本身,还有项目管理,成本核算等等。再加上同时在交大读工程硕士,像很多武侠小说中印证功夫一样,我也把书上的东西和现实中的运用一一印证,的确受益颇多啊。

想写篇小小的回忆录,却一时间都不知道从那里说起。

还是从最开始说起吧,这恐怕是我第一次把一个项目这么完整的写下来。

项目开始

大约在2005年11月份,部门经理Jay来找我,“Hey,凌浩,有没有兴趣做manila项目啊,这是个很不错的项目哦~”。“好啊!”。这么一句简短的话,我就开始进入这个项目。同时公司的一纸任命书也下来了。WPM-Working Package Manager,一个我至今还搞不清楚做什么的职务。由于当时我们的RIS(相当于系统架构师)不在,因此我也代理了他的工作。PM也是一个刚刚来公司的新人,对AFC(自动售检票)系统没有任何了解。而我也就多看了几个月的代码,稍微在其他项目为某个package改改FT(我们对bug的称呼),也是相当缺乏经验。同时加入的还有一位同济大学的实习生。于是三个新丁就开始了一个真正的AFC项目。

公司这么做的原因恐怕首先是认为这个项目相比其他项目是小项目,而且又有所有的源代码,风险已经降到最低了。所以才放心大胆的放到我们手里。其实恐怕也是没的选,当时公司人太少。

但是事实证明,这个项目比其他很多大项目都难缠。有一段时间弄得我精疲力尽。这个在后面细说。

平台迁移

我们首先遇到了一个难题,就是源代码的升级工作。原来的系统是dos6.22+win3.1+win nt4.0 + access 2.0 + sql server 6.5 的系统。我们现在要全面升级到windows 2000 , xp,2003 server + sql server 2005的平台。我们有两个选择:一是看懂源代码,然后抛弃掉,自己重写一份;二保持原来代码,一点一点在上面改。基于公司一贯的保守政策,我们采取了后者。事实证明,这样做真的把我们害苦了。

如果我们当时做些成本估算,绝对是前者成本低很多。特别是到维护期间。一开始的选择错误,会在项目后期慢慢显现出其巨大的危害。到那个时候,维护的成本呈几何级上升。

我们首先花了将近两个月时间学习原来的业务逻辑和研究代码难点。我们发现进程间通讯协议是DDE,这个极其古老的进程间数据交换方式。我提出了使用COM,被无情的拒绝.......

最复杂的通讯协议

最复杂的还是和设备的通讯,使用的是一种20年前写的协议--ADLC。这是项目中最难的一个难点。因为原先有一块硬件电路板,用来负责和设备的通讯。但是现在这种板子已经完全停产了。没办法,只能用软件代替。幸运的是我们已经有最底层通讯代码了。但是这些代码是用法文写的,就连变量名都是法文,几千行的代码,我过了一遍,愣是一点没看懂。

这时候RIS从曼谷回来了,他开始进入这个项目,他首先负责设计了ADLC协议应用层的程序框架,由那位同济的实习生来负责编写具体代码。在整个项目中,这块代码是改的最多的,前前后后基本上改了一年多才终于稳定下来。

我和这位RIS的家挺近的,我们都买了一辆自行车,每天一起下班,锻炼身体+聊天,真是很开心的一段日子。

经过一段时间,我们开始有点上手了,代码也改的快多了,但是我们慢慢发现,这些代码似乎是未完成品,很多地方有明显的缺陷。代码错误随处可见。那时候可真把我们郁闷坏了,不仅要看逻辑,还要看很多莫名其妙的代码错误。

在闷头苦干中,我们终于迎来了2006年新年。我那时候对这个项目充满了干劲,而且觉得这个项目绝对能完美的成功。因为升级工作出奇的顺利,很多问题基本上不过夜。

集成的教训

新年后回来上班,我们终于迎来了第一个集成。设备模拟器和车站系统的集成。这个集成是个大失败,几乎什么功能都跑不起来。首次失败让我的心情有点沮丧,不过后来仔细考虑了一下。当时做集成显然时机未到,unittest都没有做好,就开始做连调,实际上所暴露出来的问题都是应该在unittest的时候解决的。因此PM开会,分发任务,各人又回去完成自己未完成的事情。我认为,即使release时间来不及,也要做好unittest后再integrated test。UnitTest在软件开发过程中绝对重要。那时候,我也开始了解到CppUnit的威力。但当时想在公司推广被拒,一气之下再也没有提过。连自己都不用了,整整过了一年才重新拾起。

极尽重用之能事

这时候又一位同济的实习生加入了我们,负责线路级系统的开发,主要负责各个机器之间的通讯。原先的系统使用的是NamedPipe和拨号联机。现在显然不可能再用拨号方式,于是又一次展开讨论--在车站和线路之间用什么通讯方式比较好。由于公司一直相当抵触Socket(公司宁愿用shared folder+ copy file这种一点也不可靠的低级方式也不愿意用Socket让我始终觉得相当奇怪),最后还是采用了NamedPipe,因为有现成的代码可以重用。省钱啊~~PM和RIS的算盘打的就是比我好!果然技术人员和管理人员看到的就是不一样!想想在新技术层出不穷的年代,我们还使用如此古老的技术,真让人汗颜啊~。最终的代码就是NamedPipe上面包一层DDE通讯,呼,这种代码我看了就想吐。多线程资源共享和互斥,数据传输机制过于繁琐等等问题至今还存在其中,但我也懒得管了。这些问题就如跗骨之蛀,除非整个机制重写,否则再改也没有用。

我们的系统见证了windows的变迁

2006年3月28号,系统Internal Release,我至今还记得这一天。我记得那天终于我们有了真正的测试环。一台windows server 2003, 两台windows xp pro,一台windows 2000 pro,一台dos7.22 + windows 3.11,我们的软件真是见证了几个windows 系列几个时代的变迁啊。

不过测试刚开始就遇到许多设置问题,让新来的测试工程师大为恼火。事实上我作为开发人员也希望能够提供简单,方便的软件,不需要过多复杂的设置就可以运作 良好。可是这毕竟不是通用软件,专门软件就只有一份,在这点资金下面,我们没有更多的余力(也不想做)来完成那些额外的功能了。

在回家路上感叹manila项目设置困难,结果同事笑着告诉我,bangkok项目的安装配置才叫地狱呢。仅仅安装手册(不包括使用手册)就有400多 页,那里的测试系统有我们的人在的时候还能听使唤,我们的人一走,那里没几天就完蛋了。超级复杂的安装,配置系统曾经差点逼疯一个工程师。我听得瞠目结 舌。

提供傻瓜式的安装程序

我一直感叹我们公司项目的安装实在过于复杂,我终于下定决心要做一个安装文件。我选用的辅助工具是Inno Setup。这是个得过多次大奖的安装工具。制作安装程序相当简单,还提供一定的脚本编程能力。最后我们的程序基本上只要next, next就可以顺利安装上目标机器,并自动完成大多数设置。这个工具在后来的北京项目中也开始使用。我相信,大多数客户还是会喜欢这样的方式。至少,我们的客户看到这个安装程序时大为满意。

第一次正式Release是马拉松的开始

3月的最后一天,也是个值得纪念的里程碑。一个振奋人心的好消息从法国RIS那里传来,我们发给法国的第一个版本就能和真实设备连通了。几个多月的努力没有白费。这个项目终于出现了一曙光。

线路系统也已经external release出去。接下来就是新的一轮开发了。第一次迭代开发也快接近尾声。主要剩下的就是联调,微调。让我们的程序更健壮。这个阶段往往会发现很多原先注重功能开发阶段不注意的程序错误。而一些深层次的程序问题也暴露出来。这个阶段持续了很长一段时间。不停的向外面发Release,不停的测试,不停的修改。

签证风波

5月份,我要到法国去和真正的设备集成测试了。我在4月份办签证整整用了一个月。公司一向让我们办Training,但是没有人告诉我,于是我傻乎乎地对签证官说我去工作。因为我知道对签证官要诚实。于是签证官要求我叫法国那边警署出一个劳动证明,同时法国Thales还要出我地用工证明。

结果这两个东西法国那边都办不出来,护照又被扣在了大使馆,这里公司找了好多人,托了好多关系,甚至让法国地大老板打电话过来,还是不行。没办法,公司不如Alcatel有名啊,听说他们申请签证可以走特殊通道,很容易申请到。

最后我没辙了,准备好了另外一封资料,在去领退回来地签证时候,同时递交另外一份申请。因为我的飞机就在几天后。时间已经不允许我再预约一次了。但可恶的法国签证官一眼看出了我的企图,坚决的回绝了我。在我万般无奈的时候,里面的中国签证官出面让这个法国签证官放过了我,似乎她官大一级,法国签证官也无话可说。其实从这里就可以发现,法国人的等级观念很严重的。上级说的话,下级几乎没有反驳的余地。可惜我在最近才真正体会到这一点,可以看《对不起,我逾越了》。

终于,我还是拿到了签证,和另外一个同事一起,坐上了开往巴黎的飞机。说来惭愧,这还是我这个乡巴佬第一次做飞机。样样透着新奇,就像刘姥姥进了大观园一样。接下来,我就要开始一个人在巴黎度过一个月时间了。

2007年8月1日星期三

删不掉的目录

今天学到了一招,觉得非常有用。那就是--“Windows上删不掉的目录”。

首先看看我这里的一个目录:c:\tomcat.6.0.14. 嘿嘿,看起来很正常是不是?我们来打开看看。当我双击它,想打开看个究竟时立刻出现了一个错误“c:\tomcat6.0.14.引用了一个不可用的位置......”


当你想删除它时,windows提示无法删除文件!
够布尔比的目录了。看又不能看,删又不能删。那这个文件夹到底怎么产生的呢?真相只有一个,那就是--这个文件夹不叫这个名字。

开始->运行里面打开cmd,在c:\根目录下打
c:\rmdir tomcat.6.0.14..\

你就会发现这个目录被轻易的删除了。原来这个目录真正的名字是tomcat.6.0.14..\ 注意最后的.\ 这个在windows里面被隐藏起来了。做GUI的程序员没有把这部分显示出来,因此在资源管理器里面看出来的就是tomcat.6.0.14. 因为前面有这么多点了,最后一个点大家也不会特别注意,因此就起到了掩人耳目的作用。

创建这类目录也很容易,在命令行里面打
c:\mkdir tomcat.6.0.14..\
那么看到这里,聪明人就知道怎么利用这个漏洞了,在里面放点不想让别人看到的图片啊之类的东西(嘿嘿,某人很猥琐的笑笑),或者放点木马,病毒之类的,统统没法被杀毒软件查出来。这个目录还无法显示大小,一般人根本不会注意到自己的硬盘上被划分出去这样一块空间。其实最先找到这个bug的还是黑客们,他们通过这个在目标机器上放程序或者在肉鸡上面创建这样的目录来存放中间文件。

不过奉劝大家一声,看过了就算了,不要做坏事情啊,要遭雷劈的!(假如做坏事,也不要放在C盘根目录下面这么明显的地方)