那些日子(十一)
《大话西游》一边运营着,大家改着 bug ;另一边,2.0 版开始筹备了。
还记得深秋的那个夜里,已经很晚了。丁磊一通电话问我睡了没有,没睡的话去淘金路上一间小茶馆喝茶。聊天不去酒吧,不符合老丁的风格嘛。我依着短信上的提示,找到了那家别致的小店。包间里就两个人,丁磊和 dingdang 。dingdang 从不泡酒吧,他不喜欢喝酒,这我是知道的。
后来聊了什么完全不记得,我只是知道,以后的工作由 dingdang 来主持了。这次长谈,颇有些战事不利、临阵易帅的味道。
之后,渐渐的,micro 没有什么事情可以做了。几年前,他就在办移民加拿大的事情,需要定期坐移民监。没多久,micro 回了加拿大。dingdang 坐进了那间办公室。不过他的笔记本通常放在外面的老地方,我们还是很晚一起回家。
dingdang 工作很勤奋,也依旧在工作间隙褒着电话粥。桌子上放着 Nokia 5110 的手机,很古老的型号,上大学时我用过。打久了电池很热,但想必没有心里头热。第二年的某一天,有人提醒我看看对面 dingdang 敲键盘的手,赫然多了一枚戒指。
没有见他请婚假,没有通知同事,没有办酒席,没有度蜜月。只是接下来一个周末,我在家附近的世贸楼下吃面条。丁磊的女朋友瞅见了我,给我打了个电话,说他们正在楼上日本料理呢。我打包了面条上楼。只见四人两对,相谈正欢。那天我认识了 dingdang 的妻子。从谈吐中就能识得,真是天造地设的一对。
dingdang 上任后,寻了三个人来。一个是他的堂弟詹东,据说时下在北京网易工作,也是写程序的。另两个从 36 楼挑选的两名程序员,都是网易技术部最优秀的程序员之一。kyo 和 ruiheng 。
kyo 和我同届,暨南大学学物理的,未毕业便在网易兼职,做公司最早的产品:邮件系统;ruiheng 高我一届,华南理工计算机科班毕业,稍晚一些入职网易,他早期的产品对网易也颇为重要:网易社区论坛。此二人,完成大话二之后,kyo 转去做天下的主程;ruiheng 则任技术部经理。
我们四人开始重新制作大话西游的新版 client ,谓之曰:2.0 ,项目代号 xy2 。
在 ruiheng 的推动下,我们从 vss 移到 cvs 下工作,不久之后又转到 svn 。这次,我们每人每天都要求 update 到最新的 client 代码,保持和主干同步。
服务器那边听说也在重构,我不清楚是否犹如 client 这样彻底。但新的版本是由 dingdang 和 ten 一起主持的,并加入了新的人员,比如 陈 。大话的服务器开发历程我不了解,不便多说,暂且搁在这里好了。
继续谈新版的 Client 。
UI 模块的问题,我已经在最后那两个月完全解决了。UI 的底层是个非常繁杂的东西,要求设计人有足够多的经验才能把接口设计的好。做了这么些年软件,我觉得最复杂的东西莫过于此了。稍有不甚,就会把接口弄的污秽不堪。就连 Windows 的最为出色的界面系统,不也是发展了 20 多年才成现在这个样子,依旧被开发人员所诟病。虽然那个时候,我的想法也不成熟,可也经过一年多的思考沉淀,比大话一立项初期有把握的多了。
这次是由詹东取代古越的位置做逻辑那块东西,我依然写底层。只是这次范围更广一些,不仅要实现图象和声音这些的基本驱动(其实在大话一里已经很稳定了,延续下来用即可),还要负责 UI ,以及游戏中的逻辑对象的管理,消息分发等。
大家不约而同的想法是,新版的 client 一定要嵌入一个脚本语言,以应付连绵不绝的后期需求变化,以及用于描述多变的界面。
我首先想到的是自己实现一个解释型 C 语言,这个在北京时就着手做过。但是考虑到时间不允许,也就放弃了。当时也想过使用 CH 一个解释型的 C ,大家觉得不够好,作罢。
甚至我考虑过 java ,但网上尚没有成熟开源的 java VM ,我甚至想自己实现一个。这个想法来至于前几年一个叫做《吸血鬼》的 3d 游戏,如果你解开它的数据包,就会发现大量的 java class 文件。
还有 javascript ,因为被 IE 的事情弄出些恐惧症来,大家也不支持。
kyo 给我推荐了 python ,说是跟 java 齐名的语言。还有 ruby 等等。那时我们对这些日后名声大振的动态语言,都没有什么特别的感觉。一视同仁的去评估。因为嵌入式脚本,在国内同行中没有什么先例可供参考(早期大多数开发团队都是自己开发脚本语言),只能是靠自己的感觉来办。
最后大家一起看中了最为小巧易于嵌入的 lua 。网上比较多 lua 的相关工具,不过是针对 lua 3.2 的,当时 lua 4.0 发布不久,我们最终决定选用最新的版本,不去理会配套的第三方工具。
詹东开始研究 lua 的 C API ,以及怎样嵌入,这个工作很顺利,得益于 lua 的简洁。kyo 琢磨如何把 lua 和我写的底层桥接起来。当他最终用纯粹的 lua 代码驱动起第一个游戏内的界面对话框,我们都很高兴。ruiheng 则作力于 lua 的控制台调试器,他是 unix 背景的程序员,做出来的那个东西更像 gdb ,挺好用。哦,我做了个控制台的模块,支持彩色的信息输出。前一版的惨痛经历告诉我,一定要有一个好用的调试控制台。
说起 bug ,《大话西游一》的教训是非常惨痛的。最让我心痛的是,明明知道 bug 在那里,就是不知道该怎么改。往往改动一处,会引发新的问题。我想找到一种方法可以杜绝这种现象。所以在新版本里,引入了一种新的机制来解决。那就是给引擎加入录象功能。
所谓录象,就是让引擎记录下所有输入的消息以及发生的时刻。由于游戏 client 可以严格按帧来区分时序,时刻即帧序。所谓输入,无外乎网络包输入和键盘鼠标输入。这些只需要按次序写入记录文件即可。当有了这些数据,就可以无限制的回放给引擎。每次操作 client 玩上一段时间的游戏,只产生极少量的输入消息,而回放即可再现第一次游戏时的种种(甚至可以加快速度播放,只需要关闭和逻辑无关的显示模块即可)。这个功能是纯粹实在在引擎底层的,更上层建筑无关,顾而能为开发人员方便的使用。
如果不懂技术的读者看到这里还不明白,请联想暴雪游戏中的对战录象,星际和魔兽都支持的。
ps. 这一点是我以后做项目必须要求的基础设施。不支持录象功能的引擎是不合格的。我曾几次三番的要求服务器也加入录象功能(这比 client 更简单)但都没能如愿,直到我自己开发服务器。也有 3d 项目抱怨 3d engine 的复杂度而不能加入录象,其实没有什么道理。录象仅仅是记录操作,能不能加进去只跟 engine 处理外部输入的设计有关,跟图象呈现方式没有联系。
简单表述录象对调试的重要性,可以这样来解说。
即使我们拥有交互式单步跟踪的调试手段,当错误发生时,我们也只能向后运行程序,观察计算机内部的状态变化。而对之前发生的事情,仅仅只得一个内存快照而已。这是静态的信息,而变化的过程已经丢失。当然,内存快照已然非常有价值。比如在 unix 系统上,一个进程挂掉,可以生成一个内存快照文件,被称之为 core dump 。gdb 这种调试工具则可以分析 core dump ,还原当时的现场,程序员可以根据现场情况进行分析。
录象的威力则更进一步,不仅可以轻易拿到错误现场的快照(只需要重新回放一次),还可以让时光倒流,让你看到之前发生了什么。因为只要设计合理,每次回放,内存里任何一个对象的地址空间都不会有变化。如果我们拿不准出错时的问题是由什么前导因素造成,只需要重新回放一次在更早的时机中断下来观察即可。
有了这么一样利器,我们遇到的每个 bug 几乎都可以在当天找到根源,并修正。当 bug 是单个的出现,并迅速一个个的解决时。比同时面临多个 bug 要轻松的多。每次解决问题也都是从根源入手,而不是简单的使用 walk around 的方案。每解决一个 bug 当然不会引发新的问题了。
大话西游 2.0 的 client 非常稳定,以知的 bug 都已排除。那些日子,每天下班时我都可以这样骄傲的宣布。
那几个月,工作有条不紊,大家意气风发。我们甚至每天可以乘坐公交车回家。kyo 没结婚前住的很远,和我有一小段同路,当他转车赶上末班地铁,基本上我已到家。而他的归途一半都没走完呢。我们不再需要加班到太晚。
詹东常住北京,只是需要交流的时候才来广州住几天。大家分工明确,甚至不需要每天在一起写程序。(我想,异地合作也是我们抛弃 vss 的一大原因)所以,初期的设计比后期的实现更为重要。设计的好了,甚至缺少沟通都能把项目做好,反之,再多人再好的沟通也没有用。
甚至我都在想,这不三个月就把活干完了吗?赶快把大话换下来吧。但是 dingdang 说,不急,还不到时候。
渐渐的,开始有旧人陆续离开,先是古越接着 micro 而去,然后是果子。
古越的离开有些无奈,我没有问,因为新的项目已经没有让他参于,我想离开是必然的吧。(后来回头看,他有网易不少股票,公司股价涨到那么高,我想即使从收益上权衡,在网易干的一年也值了。可能让他遗憾的是,没有一起参与大话的起死回生吧)
果子辞职,还是有些舍不得的。他是个挺有想法的人,动手能力也很强。当时说想回家休息一下。等到再来看望我们的时候,手上居然拿着车工教材。我是学机械的,很好奇他怎么干这个起来了。他说他买了个小车床,放在家里做些东西玩。果子是个军事迷,喜欢仿真枪械。当时下载了一张德国二战时期的手枪图纸,在家自己摆弄。那天,他还给我欣赏了他自己车的枪管,很精细,比我的手艺强多了 :D 。
时不时的总能收到一些他的消息,先是说他买了部 polo ,整天大街小巷的乱窜,一天能在市区开 400 公里,堪比出租车司机;而后说是开车时用笔记本不方便,自己设计制作了一个笔记本支架,固定在坐驾里。听起来过的挺开心。
几年后,我介绍大学室友去他和古越一起开的经营短信业务的公司里写程序,果子请我吃过一顿饭,之后就联系不多了。
我不喜欢照相,相片很少。不过找到一张那段日子留下来的。好象是果子买了个摄像头,我拿过去试试拍的一张。纪念一下:
谢绝转载
Comments
Posted by: 白帝城 | (25) August 22, 2013 03:58 PM
Posted by: to_ker | (24) July 8, 2008 08:38 AM
Posted by: Cloud | (23) May 13, 2008 12:37 AM
Posted by: tearshark | (22) May 12, 2008 04:53 PM
Posted by: 鏅嬮槼 | (21) May 12, 2008 02:05 PM
Posted by: 王者之剑 | (20) May 11, 2008 06:58 PM
Posted by: bovgrey | (19) May 11, 2008 12:38 PM
Posted by: 刘应科 | (18) May 11, 2008 12:37 PM
Posted by: zen_yue | (17) May 11, 2008 10:31 AM
Posted by: 张胜 | (16) May 11, 2008 08:52 AM
Posted by: jiali | (15) May 11, 2008 01:39 AM
Posted by: tigerdx | (14) May 10, 2008 11:57 PM
Posted by: chinetman | (13) May 10, 2008 11:16 PM
Posted by: 愤怒 | (12) May 10, 2008 10:43 PM
Posted by: dfgdf | (11) May 10, 2008 10:24 PM
Posted by: Alex | (10) May 10, 2008 09:47 PM
Posted by: cat | (9) May 10, 2008 08:42 PM
Posted by: rocky | (8) May 10, 2008 08:28 PM
Posted by: 小户行 | (7) May 10, 2008 07:31 PM
Posted by: zen_yue | (6) May 10, 2008 07:00 PM
Posted by: bovgrey | (5) May 10, 2008 06:44 PM
Posted by: Jack | (4) May 10, 2008 06:06 PM
Posted by: hello_world | (3) May 10, 2008 06:05 PM
Posted by: along | (2) May 10, 2008 06:05 PM
Posted by: joe wulf | (1) May 10, 2008 05:51 PM