那些日子(十五)

大话西游 2.0 在 02 年五一封闭内测的时候,已经更名为大话二。因为丁觉得,反正是重新做的,就应该以新名字重新来推广。

由于先前的刘铁等几个策划离开,月心被调离大话组,转到 3d 项目中(这也一定程度的导致了这个 3d 项目最终被命名为天下二)。Micro 在他回加拿大前的一个月,开始重新为游戏策划招兵买马。

萝卜从大话西游的界面设计师改行做游戏策划,黄华被提升为大话西游的主策划。而丁丁(日后的《梦幻西游》产品经理)就是这个时候入职网易的。这是 2002 年四月间的事情。

按我讲述这个故事的前后习惯,所有提到的人均用我平时在公司对他们的称呼。那么就用丁丁代这么个人了(有人也把丁磊称作丁丁,不过不是我的习惯)。公司里也有人称他为老妖,那是他的一个网名吧。

丁丁总是带着一副彩色的眼镜,年龄看起来比实际上的小许多。在当时的游戏开发团队里,只有 dingdang 比他年长一点。他从学校里出来的早,所以工作经历比其他人要多许多。据说早年卖过花,早早的起来去花市里,把花架在自行车上运出去卖,收入还不错;后来手工焊过线路板,做数控机床的驱动电源,赚了不少钱 …… 也算是久经江湖了吧。

那一年末他又离开网易,但不久以后再次回来,一直做到现在,已经是游戏部门的领导了。

这段时间有前同事跟我在泡泡上聊,说怀念过去的工作经历,想再回来网易,但是又担心回去后受到不公正的评价,影响日后的发展。其实中途离开过公司,之后又回来的的例子很多很多。在这个故事里提到的人中就有 ruiheng 和丁丁。我现在也管理一个团队了,从内心中感到,其实用人往往还是希望更熟悉点,所谓知己知彼,百战不怠。大多数领导团队的人,还是希望那些自己离开的同事可以回来继续共事的。何况周而复返,更能说明经过了深思熟虑。

丁丁来的那一晚,Micro 叫我一起去吃饭,说要给新朋友接风。饭局不太隆重,我们就在工业园中的明记大排档吃的。天气开始有点热了,老板说屋子里有空调,大家就坐进去。我跟丁丁之前没有见过面,但是一聊起来发现还有点缘分。他是《古龙群侠传》的数值策划,那么就是郭伟的老同事了。我们立刻就有了共同话题。


大话二的 client 放出后,作为引擎开发者,我已经没太多事情。我给自己找了些事情做,那就是想方设法减少外挂和加速器对游戏的危害。

外挂问题,是一个长期的处理过程,前后持续投入了一两年。但都是断断续续的在做。灵感来了,添点东西,从来不是我的主要工作。相关的一些方面,前面已经谈起过,不再累赘技术细节。下面简单提一下加速器的监测。

所谓加速器,就是让 client 以高出常规频率向 server 发送一些指令包。早期的 MMORPG 服务器都是单纯的包驱动,即,根据 client 发送过来的指令,在检查了逻辑合法性后,做出相应的处理以及反馈。大多数网络服务都是这么做的,比如 web server 用的 http 协议就是这样。用户从浏览器发起一个请求,服务器就做出一个回应。普通的网络服务仅仅在防止恶意攻击时,才限制一下同一处来的并发请求数。但 MMORPG 则不够,因为时间信息也是影响游戏规则的一部分,我们需要保证时间间隔信息的合法,以此维护游戏公平。另一方面,也要阻止非法用户吃掉过多的 server 带宽和 cpu 资源。

今天看起来很简单的道理,当时我并不是一开始就意识到的(虽然着手处理加速器的工作更早就开始做了)。最早是 tarcy 给我讲的一件事,让我意识到这个问题的严重性。

tarcy 在九城测试《奇迹》时就开始为这个游戏写外挂了。我一开始很奇怪,不是说《奇迹》的战斗逻辑都放在服务器计算的吗?那么就不再会出现《精灵》那种修改 client 就能做到无敌天下的问题。使用外挂又有什么特别的好处呢?tarcy 说他们写的外挂很好用,可以让火球提高最高八倍的攻击力。一开始我不相信,他一解释就明白了。原来只是提高的发火球的频率而已。(btw ,tarcy 的奇迹外挂后来据说达到六位数的注册用户,还发展了海外代理,赚了个钵满盆盈 :D 如果单单是个人想赚点钱,这比为网游写程序要来的容易多了)

后来 wow 是用技能冷却 ( CD : Cool Down) 时间来回避这个问题的,这也是欧美系网游一贯传承下来的方法。今天被很多游戏学了去,但那个时候却不普遍。

最开始,我去解决加速器引起的问题,只是想阻止玩家用不合法的手段在虚拟场景中移动的比正常速度快,也就是避免玩家以非法的频率发送移动指令。玩家做到这一点,甚至不需要修改 client 程序。他只需要用一个小软件修改操作系统的时钟逻辑频率即可,这样的软件比比皆是,被称为变速齿轮。

我们的服务器程序设计的并不好,mudOS 的底层也没有精确控制时间的设计。在做这件事情时,和通讯加密一样,我尽量避免要求服务器做大的修改。

方法是很简单的,就是在通讯底层加上时间戳。也就是在时间流逝后,发送一个时间信息包,通知 socket 上的对方自己本地的时刻。理论上,socket 两端的时间流逝速度应该是一致的。假设一开始通讯时,client 和 server 的时刻校对一致,由于网络通讯需要消耗一段时间,所以,server 收到的 client 发送的时间戳时,时间戳表示的时刻都应该比本地时间慢一些。一旦快于本地时间,就可认为 client 在作弊。

这个方法很多游戏开发团队都想到了。

头一年(01 年)国庆的时候,我曾经去上海拜访过新浪游戏论坛上的一群网友。小箭2000 带着 freemind ,analyst ,softboy 等一帮人在上海为金智塔做《星河贝贝》。那是个下午,小箭的电话始终没有人接。analyst 说他就是这习惯,睡觉不关手机,也不接电话,等醒了会打回来。freemind 请我吃螃蟹,他说来到上海后,就开始喜欢吃这个东西了。还专门买了个蒸螃蟹的锅,周末从菜市场提上一串回家,放点冰糖一蒸,那可是人间美味。

吃完饭去他们办公室打星际。之后我们没交流太多技术问题,唯一印象深刻的一个就是谈这个加速器检测的方案。

这个方案从理论上看起来没错,但实际应用中,经常会发生误判。原因有二,一是准确对时非常困难 ,尤其在对时过程中 client 系统和通讯网络不稳定,会极大的影响后面的判定;第二是,PC 机的各钟主板,甚至运行的操作系统,都会导致时钟精度的不一致

所以在用时,这个方案还是有许多细节需要改进的。大话西游二的测试期间,不完善的检测手段,冤枉过不少可怜的玩家。kyo 的保守作风在这个问题上发挥了作用,原本我认为理论上完全可以判定出是否使用了加速器,但 kyo 一再坚持,即使检测到,也需要累积多次再做处理,这样大大减少了误判对玩家造成的影响。


2002 年的夏天,我基本脱离了《大话西游二》的开发。因为我总是自己找事情做,所以公司就没有指派给我任何任务。这期间读了几本书,影响了我好几年。

第一本书是著名的 C++ D&E :《C++语言的设计和演化》,我读了两遍,读的很快,但很透彻。这本书让我又一次重新认识了 C++ 。

第二本则是侯捷写的《STL 源码剖析》,我并没有读完。而是在实体书出版前, kyo 介绍我读了侯捷放出了前四章电子版。因为这本书,我把 STL 的源代码几乎浏览了一遍。发现 template 这个东西居然如此奇妙,从此陷入在把玩 template 的智力游戏中,一晃就是三年多。

02 年被我自己称为 C++ 年,C++ 的有关经典著作不断的被翻译,程序员杂志也在推波助澜。各大开发论坛的 C++ 版块都异常火爆。我在 csdn 注册了一个帐号,没发多少帖子,仅有的一些全在 C++ 版里了。我想我读了那几年翻译出版的所有的关于 C++ 的书,也为自己重新发现 C++ 这样一把无所不能的开发利刃而沾沾自喜。

ps. 通过 google 翻出当年的一个论战贴,讨论多重继承和组合模式的。我想很多同学在学习 C++ 时都有这类经历 :) 。

那些日子,不断的把自己学到的领悟到的新东西教给同事,我想,许多人都受到了感染。对于许多年轻的程序员,都会为找到一样可以证明自己比别人更聪明的玩具而兴奋不已。

在最为狂热时,我把 C++ 的字样印上了个人名片。和今天相比,当时的心境真是判若两人。

那段时间,我开始重新写 gui 的模块,想用“更 C++” 的方式来表达设计。编译期运算、(用 template)函数式编程、泛型抽象,无所不用之极。那套东西被我称之为 glow ( game library of windsoul) ,这名字还真是热情洋溢啊 :D 。

之后,便翻新重写“风魂”。不过鉴于 glow 开发时发现的一些问题,如编译速度过于迟缓、调试不便等,这个新版的“风魂”就不那么 C++ 了。也正庆幸这一点,这个版本可以一直用下去并被人持续维护,成为了后来《梦幻西游》以及其它几个网易产品的底层代码,甚至还用在了《天下二》的 GUI 模块中。

直到 2006 年,我开始对 C++ 开发项目进行反思。等到 2007 年写下 C 的回归 这篇颇有争议的 blog 时,我很能理解那些反对声音,如同理解当年的自己。


看到大话西游二顺利的发展,每天都能看到在线人数有新的突破,不多久就超过三万人在线了。我心里长舒了一口气,总算搞定了。

庞鑫离开后不久的一天,dingdang 把几个开发人员叫到了会议室。分别发给大家了一份文件。说是网易的期权。

所谓期权,就是一种在一段时间内,以一定价格买入指定股票的权利。这个价格往往就是制作期权文件那天的公开价位。虽然不是现金,但期权自有它的价值,这个在金融方面早有定论,不过当时我是没有太多概念。

简单的理解,就是当持有一支股票的期权,若它日后涨了,你可以以当初的价格买入。如果你在行使期权的当天再在公开市场上将股票卖出,其中的差价就是立刻能入手的获利了。而如果股价跌了,你可以放弃期权,也没有什么损失。在美国这样成熟的金融市场上,期权这种金融工具本身,甚至都可以被炒来炒去。

上市公司常常以颁发期权这种方式奖励员工,并鼓励员工努力工作,一同把公司发展的更好。一旦公司股价上涨,大家能有很大的收益。

直到 2004 年,网易每年都为所有正式员工颁发期权。无论是前台接待,还是仅入职几天的程序员,人人皆有。那一天,我手上的文件上写着 70 美分一股的价格,五年的有效期。等到 2006 年底即将过期时,我将这些期权全部行使,变成股票存放时,股价已经翻了一百多倍。

dingdang 向我解释说,本来我入职时间不长,可以拿到的数字比文件上的要少一些。但是由于一些同事的离开,大家商量后给我多一点。我所做的只需要签一个字了。

记得当时我很犹豫,迟迟不肯落笔。因为我觉得自己的事情都做完了,心里盘算着离开。


ps. 闲扯几句关于网易期权的事情吧。虽然公司里不让讨论大家各自期权多少和分配方案,但具体的情况,多少我还是有所耳闻的。当初那几年,我绝口不跟人谈这个,一是理解公司在这方面保密的苦心,二也是的确不太关心,否则也不至于每笔期权都到最后快过期的关头才着急行使,弄成每年都要做一次的大事。甚至感觉有些麻烦。

如今,公司已经不是人人发期权了,股价也涨到很高,我想再难有几十上百倍的收益。那些高收益的期权文件今天已经几乎都过了有效期限。有人在涨到 20 倍、30 倍时迫不及待的兑现,有人像我这样留到了最后,最终收益和当初期权数量反而关系不大。从金融角度看,当时的期权多少的差别其价值的绝对差距就不高。今天来谈这些,已经不太所谓了。

其实游戏部门的期权一开始总体不算多。这点我曾和其他部门一个头(已经离开网易)聊天时,他帮我打抱不平过。他说游戏部门为公司做出了很大的贡献,但在为自己部门谋福利这点上,dingdang 争取的太少。由于游戏部门人多,机构大,一平摊就没多少了。往往部门人一多,普遍级别就不高(官少),分期权的时候,级别又占了很大权重。他劝我去申请提一个级别,省得比别的部门干活少的多的人拿的还少。

利益分配真是个难题啊,共患难容易,共富贵难。

后来几年,让 dingdang 殚精竭虑的问题之一,就有如何奖励这个越来越大的团队中的每个成员。这绝不是一个写个程序,套个公式,就能完成的任务。它需要更多的智慧。


谢绝转载

那些日子(目录)