第四周到第六周,我一直在读书

我的实习内容是一个名字叫做WSOTA的项目,全称是Web Services Over The Air,是若干个Web Services和手机客户程序demo的集合。项目的名称有点呆,在几个星期前它的名字要好听一些,叫做SOTA,全称是Sun Over The Air。后来老板把名字改掉了,大概是觉得一个Sun表达不出项目的精确含义。

该项目涉及到很多有关Java和网络应用的知识,接触了之后才知道以前在学校里学到的那么点内容要真的用来做项目的话是根本不够用的。在实习的前三个星期里,我唯一能做的事情就是学习。老板给了我一本厚度惊人的Java教材,英文版,让我看看。但即使那本书厚达780页,也仅仅覆盖了一小部份需要用到的内容。剩下的只有到网上去找。网络是一个很丰富的图书馆,当然前提是你的英文要足够好。Sun的Java主页上有很多不错的教程,还有一个站点叫做 www.w3schools.com,上面也有不少关于网络应用的好文章。另外,www.javaworld.com也很值得一去。

在三个星期的时间里我每天对着屏幕和书本啃英文。我的英语功夫其实还不够深厚,相对于中文书而言,读起英文书来速度要慢不少,加上直接看屏幕比起看纸质的书来要不爽很多,所以那段时间里我还是比较苦闷的。当然,我也真正学到了很多的东西,比如JDBC,LDAP和JNDI,Java Beans,JSP和Servlet,XML和SOAP等等,非常的充实。

第七周和第八周,我的第一个demo和我的Pacman

从第七周开始,我动手写代码。老板给了我一个比较原始的应用程序,是前面一个西班牙实习生做的手机客户端和服务器,叫做AddressBook,客户和服务器的通信使用了SOAP。老板让我做一些修改,把服务器使用的数据源从数据库换成LDAP。

更新日志上没有提到我对服务器端修改的日程,现在回忆起来,应该是在26号以前就搞定了服务器对LDAP的支持,前后不到一个星期的时间,速度之快,令我很自豪。

从我的更新日志上看,我真正开始动手修改客户程序是9月26号星期四。那个西班牙土人虽然写程序乱缩进,而且很多注释用西班牙语写,但总的说来他的程序结构还是非常优雅的。所以在刚开始我基本没有对他的程序结构做大的改动,只是帮他缩进缩进,然后就在他的代码基础上开始做扩充。

从更新日志上看,我的客户程序的第一个版本在27号就写好了,并且可以运行,看上去也没有bug。老板对此很满意,并重新修正了他对我的评价(在刚开始他对我说,你按照你自己的节奏去做,给你做的东西不是很急的。)接下来的任务就轻松了很多,对这个基本成型的东西做一些修修补补而已。

从第八周开始,我的工作变轻松了很多,于是我又捡起了上个学期的Pacman游戏。我决定用Java重新写一遍Pacman,进一步地优化代码的结构,并以设计出一个通用的游戏编程模板为目标。我使用了一种很悠闲的态度去重新思考Pacman,先在纸上画结构图,尽可能多地提前考虑细节。这一次的重写,我使用了成熟的MVC模式和观察器模式,比起上学期用C++写的Pacman的程序结构来,应该优越了不少。

当然,这个工作是在老板不在的时候完成的。老板出现的时候,我还得继续修改那个AddressBook程序。在第九周刚开始的时候,10月7号星期一,我在AddressBook的更新日志上写下了最后一行。version 1_07,这是我的AddressBook的最新版本。

10月10号的时候,我的游戏模板的设计基本告一段落,我开始编码,着手写一些最基本的抽象类和接口。

第九周和第十周,Pacman占据了我的大部份工作时间

从第九周开始,老板就沉浸在第一个demo完成的喜悦中,没有再给我安排别的编码任务,只是叫我在不同的平台上测试我的AddressBook。我先下载了Siemens的模拟器,又下载了Palm的模拟器,再在真正的手机和掌上电脑上做测试。我那过硬的编码功夫使得这些测试都一帆风顺。

第九周和第十周我的大部份工作时间都花在了我的Pacman和游戏模板上(游戏模板的名字叫做gatem,Game Template),它的更新日志几乎每天都在被刷新。按照我的构想,我的游戏模板正在一天天地变的具体起来,而我也在上面浸注了大量的热情。我一直坚信,这个游戏模板将是一个非常优秀的作品。

当然,编码过程中也有很多的麻烦需要排除。最可怕的一个是有关线程的。Java的某些绘图方法会悄悄地创建一个线程来完成具体的绘制工作,而方法本身则会立刻返回,根本不等待图片被绘制完成。而在绘制的时候需要用到的一些对象的数据成员,在绘图方法的后面就将被修改,这就导致了多线程的数据不一致现像。这个问题我研究了很长时间,那些莫名其妙出现的bug差点把我搞死,Java API的文档里又没有写明哪些方法是创建线程然后立刻返回的,我只好自己试验来判断。。。有关多线程的debug简直是一场恶梦,特别是你不知道到底有哪些线程是自动被创建的时候。

在10月21号星期一的时候,我的gatem更新日志暂告一个段落。这一天,我的一个原始的Pacman游戏已经可以运行了,一个控制自如的Pacman和四个妖怪,加上四颗小豆子和一颗大豆子,背景是性感的李玟,而且支持卷屏地图。游戏角色间可以相互作用,所有的被发现的bug都得到了修正,运行若干次也没有发现新的bug。在那一天,老板又给了我一个新的任务:开发一个SAP服务器的手机客户端。

第十一周,一个流产的XML手机类库

10月21号,我花一天的时间搞定了SAP客户程序的全部界面设计。

Soap通信的时候发现kSOAP类库(http://ksoap.enhydra.org)不支持Vector,可是我们偏偏要用到Vector,于是一气之下决定自己写一个kSOAP出来。

我先从SOAP类库着手,后来发现需要用到XML解析器,于是又开始动手编写XML解析器,一直苦干了一个星期,终于在第十二周的开始完成了一个DOM式的解析器(其实那个时候我还不知道什么是DOM什么是SAX)。我的解析器可以读入一段XML,进行语法分析,然后生成一棵树,并支持在这棵树上进行查找。我正在为此得意的时候,老板叫我停止这个庞大东东的继续开发。老板说,你写这个东西什么时候才能写完?我说再给我一个星期就可以了,可是老板不相信。老板又问我,你实现的是DOM还是SAX,我说不知道。老板看了我的XML解析器后说,你用的是DOM,生成一棵树对于手机而言太大了,手机没有足够的内存来完成这个任务。你应该用SAX。

后来我既没有用DOM也没有用SAX,老板最后一个问题让我很泄气,我决定停止开发这个新的kSOAP,而转为就该客户端需要使用到的功能写个独立的,强耦合的类来了事。

这个星期没有在我的SAP客户程序的更新日志和gatem/Pacman的更新日志上留下什么太多的痕迹。

第十二周,快乐的万圣节和南方三日游

不按时记日记的一个坏处是,当我决定补记的时候,我不得不不停地参考我的程序更新日志以回忆起我当时在做些什么,非常的麻烦。

按照SAP客户程序的更新日记来看,在10月30号星期三的时候,我的SAP客户端已经基本完成了,在那一天我修正了一个较大的手机数据库存储的一个bug,并对程序做了一些初步的优化以节约手机的可怜内存。

按照gatem/Pacman的更新日记来看,在10月29号星期四的时候我对Pacman做了一个小改动,让它显示的更加漂亮整齐一些,仅此而已。在SAP客户开发阶段,gatem/Pacman的开发几乎是停滞的。

去年的万圣节我有一个星期的假期,今年我是一个实习生,假期可怜到只有一天(星期五)。我和另外三个朋友约了一起去南方玩耍,大家订的是星期三晚上的夜车,于是我和大老板Pascal请了一天的假。星期四的早晨八点半,当我的小老板还没有到公司的时候,我已经出现在尼斯火车站了。

星期四到星期六的三天简直是高强度运动。第一天我们逗留在尼斯,在蓝色海岸(Cote d’Azur)和尼斯老城区花掉了我们大部份的时间,中途还登上了尼斯半山腰的一个城堡并在上面睡了近半个小时。晚上是万圣节的前夜,尼斯有大量的人在装神弄鬼,把自己打扮成戴着尖帽子骑着扫把的巫婆,或者吸血鬼什么的。在这个城市里鬼们获得的尊重远比在巴黎要多。我们穿过那些快乐的人群,来到海边,在那里扔石子和打水漂,一起喝红葡萄酒,然后再一次穿越人群,回到我们寄居的旅馆睡觉。第二天我们去了摩纳哥,一个从阿尔卑斯山脉的半山腰一直延伸到地中海的城市。我们一出火车站就可以看见大海,却不得不做公交绕着盘山公路走很远才能到达。那些盘山公路远看有着优雅而性感的曲线美,让人留连忘返。

在地中海里我们游了泳。水很清,但很冷,我下水的时候浑身都在发抖,但神奇般地没有抽筋。这是我第一次在大海里游泳,我试着游的远一些,结果很快就喝了一口水。当然,这也是我第一次在大海里喝水,水很咸,比我想象中的还要咸,并且略带苦味。我从海里爬上岸,然后对其他人说,我喝到了传说中的海水。

海水的清澈可以这样来形容:清澈见底。在一个延伸得较远的堤岸上我可以清楚地看见底,还有许许多多的鱼游来游去。那些鱼都很大,而且长势不错。我又想起了包明给我说过的一个笑话,我想如果站在这里的是包明的妈妈,她一定能分辨出那些明目张胆游泳的鱼是链子鱼还是鲫鱼。

晚上我们去了一个名字叫做Cafe de Paris的赌场,并在那里赌掉了五欧元。赌博的确是一个诱人的游戏,在我赌完最后一个币的那一瞬间我曾有过再去换20欧元的冲动。我们走出赌场,在外面排列着大量的名车,在两辆法拉利中间的奔驰和在一辆劳斯来斯边上的宝马显得非常的拙劣。这是一个富人的城市,我们磕着瓜子背着旅行背包穿行于名车之间,却有着莫名的自豪感,很奇怪。

摩纳哥还有一个更大的赌场叫做Casino,可是我们没有去。晚上近九点的时候我们乘上火车,20分钟后就回到了尼斯。

第三天的上午,我们去了尼斯旁边的一个叫做Peillon的小村庄。杨盛看着旅游手册说,Peillon是尼斯旁边最美丽的一个村庄。我想应该是对的。

下了火车我们走错了路,好在很快就被一个当地的居民纠正了。走了不久我们可以看见远远的三座山峰,中间的一座上建了一座城市。当时我们并不知道那就是Peillon。我对杨盛说,看啊,这样的景色并不只是存在在童话中的。

我们在另外一个村民的指导下开始沿着盘山公路行进。从我们身边不时地有车开过去,我们持续了一个小时的步行后终于发现这条盘山公路原来并不适合步行。

近两个小时后,就在我们接近绝望的边缘时,转过一个弯我们的面前出现了一个喷泉,在喷泉的后面是那座建在山顶上的城市入口。在入口处我们向山下眺望我们当时眺望这个城市的地方,它遥远得让我们充满了成就感。

一进村庄我就觉得着两个小时的非人步行是值得的。这真是一个神奇的地方,所有的街道都很窄,不是台阶就是山洞,错综复杂,鬼斧神工。我们走了不久就来到了村庄的最高处,是一个教堂。我们在教堂的前面照像,还喝了教堂旁边用打水机打出的水。

下山的路比较好走,为了进一步节约体力我们决定绕开一部份盘山公路,直接走铁道。我们穿过了一个很长的铁路桥,在桥的下面是深渊,我朝下张望,兴奋莫名,我想如果这是个古老的吊桥就更好了。

第三天的下午我们去了嘎纳。由于电影节的关系我们对嘎纳都抱有太多的想象,结果却令人失望。嘎纳是个很普通的海滨城市,唯一不同的就是它的海滩是真正的沙滩,而不象尼斯和摩纳哥那样是石滩。

在嘎纳的一个小码头上我远眺大海。天色已晚,这里的海不及尼斯那么温柔,浪头一个一个地扑到岸上。我在小码头上等待着那些波的迭加可以制造出一个更大的海浪出来。我等啊等啊,等了半天,终于等来了我期望中的浪花。那个海浪以迅雷不及掩耳之势飞驰而来,盖过码头,哗啦啦哗啦啦。我回头就跑,可是在大海面前我又能怎么样呢?浪花无情地淹过我的鞋子,并打湿了我的屁股。这是嘎纳给我的最快乐的记忆了。

星期六的晚上,我们从嘎纳上车。一夜之后,火车带着我们回到了巴黎。这就是我们快乐的万圣节的南方之行。

同行者三人,他们是:刘毅,上海交大毕业,现在Ecole Nationale des Arts et Metiers;杨盛和他的女朋友范维,上海交大毕业,现在Ecole Nationale des Telecommunications。

尼斯,2002年11月

尼斯,2002年11月

尼斯,2002年11月

尼斯,2002年11月

尼斯,2002年11月

尼斯,2002年11月

2002-11-04,星期一 ~ 2002-11-07,星期四

这个星期大概由于假期的惯性,一直没有回过神来,上班好象梦游一样。老板要求的SAP客户程序已经基本完工,在J2ME WTK上测试运行通过,能找到的bug也都被改正了。可是不幸的是,在大概是星期二的时候,我突然发现这个程序对于Siemens模拟器不再正常运行了,反反复复地出现同一个错误:HTTP response error code 500, internal error。

先大致解释一下所谓的SOAP的工作原理。简单地说,SOAP就是一种远程方法调用的协议,类似于Java RMI或者CORBA。我的客户程序先和服务器之间建立一个HTTP连接,然后通过该连接发送一个SOAP请求(实质就是一个XML文件),服务器接受到该请求,对XML文件进行语法分析,获得请求调用的方法名和参数,然后调用服务器端的方法,把返回值封装在一个XML文件里,通过该HTTP连接发送给我的客户。

我查看了错误内容,服务器说,XML parsing error, missing root element。就是说,我发送过去的XML语法错误。我使用了tcptunnel来截获发送和收到的报文,发现我发送过去的XML文件没有问题。我改用J2ME WTK运行程序,发送的XML报文内容一模一样,这一次服务器就不报parsing error。我试图在报文的各个位置删除回车换行符或者加上回车换行符,可是无论怎么折腾都是同样的问题:用J2ME WTK就没有问题,一使用Siemens模拟器就parsing error。这真是一个不可逾越的bug。

一直到星期三我都被迫和这个bug纠缠。这是一件很无趣的工作,对这样不合逻辑的事情根本就没有道理可讲(就好象某些女人一样)。老板也试图帮助我找到问题的根源,他也无能为力(显然的),可是他还是不厌其烦地说,我们得找到问题的所在。我已经受够了,如果让我继续在这个鬼东西上浪费时间的话我想我一定会对编程兴趣大减。所以,在老板不在的时候,我选择上网闲逛。

星期三的时候我决定开始学习Entreprise JavaBeans。我取出老板给我的一本EJB教程开始研究,可是很快就放弃了。那本书写的很笼统,加上那天我困顿不已,看了很多页还是一头雾水。我合上书,做出一个判断,就是这几天我不在状态。于是我决定去接受现实,继续上网。

星期四上了一整天的网。