那些日子(十)
2001 年的国内网游市场上涌现了不少的游戏,有些昙花一现,现在估计都没什么人记得了,例如我依稀记得的一款三国题材的游戏,运营没持续多长时间。还有一些一度风靡全国,拥有不少玩家,如《千年》、《红月》、《龙族》等。
《传奇》就是在这个背景下横空出世的。
陈大年是我大学时期结交的网友,跟我一般年纪,我们时常在 icq 上聊天。在我还在读书的时候,他已经辍学闯荡江湖了。他也是个程序员,似乎写 delphi 的,我早年也玩这个。我们那时候共同的爱好是想做游戏。在我还没毕业的时候,他给我看过他的公司做的网站,记得叫归谷,主推一只可爱的漫画狗。小狗叫 stammy 还是 stame 我是记不太清了,投资方有中华网的背景。
大年告诉我他们转做网游的时候,我丝毫不奇怪,游戏这么火,做网络的不做游戏才是奇怪呢。(我想,即使在那个所谓网游起步的时候,看的到网络游戏有赚钱潜力的公司根本算不上有什么独到的眼光,看不出来的没眼光才是)他和他哥哥一起做的公司,据说去韩国找了个小公司谈了个游戏,这个游戏就叫做《传奇》。
网易的《大话西游》定在了 10 月底上市(一开始大家都没有公测,也就是给大家免费试玩,这个概念),《传奇》也是这个日子左右,稍早一些。
我没有想到《传奇》会在商业上如此的成功,正如陈大年一开始也不会想到《大话西游》的未来。我把《传奇》看作是跟《千年》、《红月》这般的韩国游戏一样,一个普通的产品,没有什么特别之处。
有如网易找到了智冠,盛大也找了上海的育碧做合作发行商。一切都是按惯例循规蹈矩的进行着。《大话西游》正式发行的前几天,大年在 icq 上几次兴奋的告诉我,他们的游戏达到了多少多少人在线了。当然也试探我们的情况,我没有怎么说,因为实在是不好意思讲。
《大话西游》发布前,在广州的天河电脑城前办了一个热闹的活动。星爷过来捧场,智冠的老总致辞,好象还有一个广东什么地方的一个牙膏厂老板,不知怎么也混在里面,有些商业上的联系吧。星爷的到来,牙膏厂的老板就被大家起哄哄走了,每人愿意听他讲话,弄了个没趣。不过更没趣的时,不知道公司什么地方没有打点好,活动搞了一半,就有人(城管?)过来拆台。
就是这样,一切就在匆匆忙忙中拉开了帷幕。
正式上线前的那天,几乎所有开发人员都一夜未眠。尤其是程序,还在临时修补着 bug 。玩家在论坛上唾骂着可恶的 cd-key 制度。不管有没有 cd-key 的人都在拼命的下载更新包。当时还没有利用 BT 技术分担带宽。公司几乎把所有的带宽都增援过来用了。
client 最后还有许多已知 bug 没有解决。dingdang 说留到最后吧,到开服务器前再让大家下载最新的 client 执行文件。就这样,已经更新完补丁的玩家,甚至连 client 都不能启动。
拖延了几个小时后,古越说,好了。client 主程序放出。只隔了几分钟,便有玩家涌入。
ten 已经累的不行了,他写了一个监控脚本,当监视到服务器挂掉后,会自动重启服务器。然后就回家睡觉去了,之后是 dingdang ,慢慢的,一个个都走了。我是比较能熬的,不知为啥,选择留在了公司。其实也没太多事情好做,只是刷刷论坛。
没过多久,玩家就集体掉线了。服务器崩溃。不久,自动重启。又过了大约 10 分钟,再次崩溃。就这样一直循环下去。服务器这边的负责人全都回家了,完全无能为力。我实在看不下去了,也只好打车回家做鸵鸟。
接下来的几天,无论是 client 还是 server 的程序都不停的加班。问题一个个的解决,又一个个的蹦出新 bug 来。服务器稍稍稳定一点后,客户端又不断的报错。其中跟我有关的,是一个声音播放模块的问题,又是多线程惹的祸。
我们的这第一版 client ,居然使用了多达 4 条线程,地图处理、逻辑处理、网络处理、声音处理,大家又没有多少多线程编程的经验,一不小心就犯错误。好在底层的问题查起来容易,解决起来也快。可逻辑层面上的东西就没那么容易搞定了,古越压力很大,总看他在那里调程序,仿佛永远也做不完。
另外,用户的浏览器 IE 的版本千奇百怪,小版本的区别很多。不知道为什么,我们的 UI (借助 IE 实现的那个)在不同的机器上就是表现不一致,总会蹦出一些脚本出错的对话框。多年之后,我再回忆,可能也不完全是 IE 的毛病,跟我们写的不规范和用的不规范有关。
浏览器出错倒也不是开发期没测试出来,QC 人员很耐心的安装了各种版本的 windows 系统测试机,只是我们自己测试出错的概率要小很多。可是,一旦玩家量巨大,小概率事件就频频发生了。这种问题又实在不好重现,基本上是不了了之。
记得我还接过一个客服转过来的电话,说是一个玩家不好对付,让我帮着解释。那个略带上海口音的男性玩家,死命缠着我让我解释为什么游戏不能在他的机器上正常运行,反复申明他花了钱购买的正版游戏,要求我负责任。我想我很无奈。
丁磊也需要一个解释。对于不写程序的他,太多的 bug 导致了程序不稳定这个理由很难说服他。后来我想了个简洁的说法统一口径:IE 兼容性问题,导致了我们 client 的在不同的机器上容易出错。其实我们做程序的都明白这是个推卸责任的说法。只是太多的开发人员已经背负了很大的压力,我想选择 IE 做 UI 的这套方案是我提出来的,把责任推到 IE 上,我能帮大家多承担一些骂名。
结果令人哭笑不得的是,老丁倒是很轻易的接受了这个说法,就没怎么责怪开发团队,也没有怪我这个“罪魁祸首”。只是接下来的这么多年,时不时的拿这个段子奚落我一下:“看吧,别看我不懂程序,当时你提出来用 IE 的时候我就觉得不好,不过还是随你们去做了。让你犯过错才知道改”。(._.!)
并非我事后想推卸责任,因为无此必要。大话二最后只用了半年重生,追究大话一的责任都是没有意义的事情了。在后面的故事里,我们会看到,大话一花的这半年多的开发时间,开发人员投入的精力 80% 以上都被复用起来,如果我们把大话二的上线当做项目正式的完成,距离大话一开工前后也不过一年时间。真的是没什么遗憾了。
今天写这些故事,除了给自己做一个总结外,也是想让更多的开发人员可以借鉴到其中的经验和教训。对于“嵌入 IE ”这个貌似重大的技术决策失误,如果只看到表面,就和我写这些的初衷南辕北辙了。这里有必要展开来写一下。
如同前面在第五篇中所写的那样,选择嵌入 IE 做游戏的 UI 呈现,仅仅是从节省人力着想。因为我们当时只有 3 人做 client 开发,后来大话 2 使用的底层的 UI 模块并没有开始写。如果 4 月里动手写 UI 模块,只会拖累整体的项目进展。而选择使用 IE ,可以额外的增加人手,不至于影响已有的 3 人的开发工作。
复杂度隔离,是我这么多年做项目中悟出的最重要的一个道理。当多人合作开发时,应该尽量隔离不同的人之间的工作,每个人都专心做自己的一块,各人的工作中的失误,都不至于影响到其他人的工作,这样软件项目才能顺利开展下去。如果当初不做此决策,可能到现实中大话 2 开发完毕,大话一都完成不了。由于项目开发时间过长,本就不稳定的军心会更加涣散。所以这个技术决策,更多的考虑的就不是技术上的因素而下的。
从结果上看,大话的 client bug 非常严重,导致程序时常崩溃的,是本身程序的不稳定,而不是 UI 系统。UI 仅仅是弹出类似“脚本运行时错误”这样的讨厌的对话框而已,玩家只是部分功能不能正常使用,而不会完全不能玩游戏。而且理论上还可以指导玩家安装最新版的 IE 来解决。所谓木桶短板原理,大话西游一的短板可能在服务器,可能在玩法设计,数值设定,可能在客户端逻辑,根本轮不到 UI 这个模块。
话说回来,IE 也不是如此的不堪,我们只是用 IE 显示几条文件,几张图片,并使用 html 和 css 做一些格式排版而已。根本不会去使用网络部分的功能。所谓 IE 的安全补丁升级,大多和这部分无关。如果 IE 真的连这点事情都做不好,微软就别混了。现在使用 IE 内核做界面的软件比比皆是,也是一支潮流。IE 报告脚本出错,多半是在我们自己的开发人员身上。在经验不足,项目进度压力大的日子里,写这些 javascipt 会犯的错误,留下的 bug ,若是改成原生的代码写到 C++ 程序中,同样会出现,后果更严重。
所以,不要局限于表象,轻易得出结论:怎样的选择是对的,怎样的选择是错的。
11 月里,几乎没我多少事。因为大家的工作都是修改 bug ,而我的那块基本没有什么问题,很稳定。经过一年的开发,我想我至少在 C++ 和设计模式方面领悟了不少东西。开始回头审视整个项目。其实游戏的 client ,并非一个庞大的工程。只要合理的设计,应该能做的很稳定。
开始一个人闷头写程序。
要来了通讯协议文档后,大约花了一个月时间,我做了一个简化版的 client 。虽然只是个雏形,但很多基本功能都有了。代码很小巧,我给他起了个名字,“小话西游”。设计上最主要的地方是,把游戏 client 逻辑做了严格的分层。把对象的管理、画面精灵动画的控制等等都隔离开,并将网络包以及画面无关的逻辑部分提取出来(这点为以后引入嵌入式脚本铺平了道路)。
丁磊看到了我做的这个小玩具后,第一个反应是,“能不能压缩客互端,做一个图形聊天室?”。我想他是对《大话西游》的现状失去信心了。当时人心也比较散,开始有人离开。有些开发人员甚至私下里谈论过大家散伙。
但是我不甘心。这是我毕业后全心投入的第一个项目,我不想看着它失败。不想我那些朋友们,那些 bbs 上相互调侃的网友们,觉得云风只会口上说说,真做起项目来不过如此。我想的是,其实做这么一个“简单的”软件,只要好好规划一下,不至于程序上弄的如此的不稳定。比如 UI 的问题,当时只是项目进度和人手上的不足使用的一个权益之计。而现在,我已经全部构思好该怎么实现了。
按丁的想法,把《大话西游》保留所有的图象资源,而将程序改成一个图形聊天室,体积缩小到 100M 以下是绝对不现实的。要知道,如果我们不做那些我绞尽脑汁的方法去压缩,客户端根本塞不进一张 600M 的光盘中。程序可以再写的短小精悍一些,但图象资源却小不了了。
我想的是,重新推翻再来一次。
做大话西游的 2.0 版是 dingdang 拍板下的决定。倒不用我去主张,程序员的心是共通的。dingdang 怎么说服丁磊的我不清楚,但我想不算太困难。网易只有两条路可以走:解散游戏开发团队或是重新再来一次。
是的,一开始,我们想做的只是 2.0 版,以此作为对老版本的升级,而不是后来的《大话西游II》。我那么的想重新来过,不是因为喜欢这个游戏,而仅仅出于一个自私的理由:要证明自己可以把这件事情做好。
那时的网易可以说相当的不顺利。九月里,公司被 nasdaq 停牌。最后一天甚至跌到了五十多美分。在美国,公司面临着诉讼,因为最近的一期财报被认为掺假。历史上,惹上这种官司最终停牌的公司都没有好下场。
自主研发的游戏上市后,问题多多,反应平平。最高同时在线人数只有 5000 多,还是头几天创下的。
而国内几款韩国游戏却做的风风火火,在这个背景下,丁磊带着大猫猫去韩国寻找可以代理的游戏。丁磊在韩国的那几天,我明显感到他承受的压力。有一晚,我在写程序,他在 icq 上蹦出来,没头没脑的说了句,“失眠了,睡不着”。
我还记得大猫猫归来那天,从韩国抱回了大包小包的流氓兔,我抢到了两个。对了,公仔上有个小标签,赫然印着“Made in China” :) 。
不过正题是之后我们一起看的三个韩国新出的游戏。都是 3d 的,丁磊赞不绝口。一个叫做“Ragnarok Online”,一个叫做“MU”,还有一个是“Priston Tale”。让我也发表一下意见。我说,单看画面的技术含量和操作感,我最喜欢 MU ,其次 RO 不错。丁没说什么,不久,我们代理了 Priston Tale ,给他起了个中文的名字 ——“精灵”。
补充,我努力回忆了一下,记不请最后这段发生的具体时间了。精灵后来是 02 年夏天上线的,谈合作应该更早一些。丁从韩国回来那天,天气不算太凉,他还带了件 T shirt 送人。我不记得那是 01 年的秋天还是 02 年的春天的事情。对比精灵的运营时间来看,是 02 年春天也有可能。但这里行文方便,我假设的时间背景是 01 年秋。有机会再求证好了。下面会接着写大话二的开发,而暂时不再谈精灵,先作一个说明 :) 。
今天在家居然翻出当年大话西游一发行前夕,公司送给每位开发人员的一套网易点卡。制作非常精美。主题是网易早期的那套形象广告。我想丁更多的是想借游戏收费的契机给网易其他产品找出一条收费渠道(第一套点卡上完全没有突出游戏这个主题,可以看成一种单纯的现金卷),只是因为游戏的失败没能成功罢了。
谢绝转载
Comments
Posted by: leeonix | (33) October 2, 2009 05:20 PM
Posted by: 离别 | (32) June 27, 2008 11:05 AM
Posted by: tearshark | (31) May 12, 2008 04:47 PM
Posted by: tigerdx | (30) May 10, 2008 11:46 PM
Posted by: standing | (29) May 10, 2008 10:49 PM
Posted by: wwx | (28) May 10, 2008 09:16 PM
Posted by: cat | (27) May 10, 2008 08:20 PM
Posted by: JackH | (26) May 10, 2008 03:47 PM
Posted by: zen_yue | (25) May 10, 2008 03:47 PM
Posted by: david | (24) May 10, 2008 03:34 PM
Posted by: joe wulf | (23) May 10, 2008 02:49 PM
Posted by: 王者之剑 | (22) May 10, 2008 02:23 PM
Posted by: 胖肖 | (21) May 10, 2008 02:01 PM
Posted by: Cloud | (20) May 10, 2008 01:38 PM
Posted by: Cloud | (19) May 10, 2008 01:23 PM
Posted by: 胖肖 | (18) May 10, 2008 01:08 PM
Posted by: tigerdx | (17) May 10, 2008 12:14 PM
Posted by: hermit | (16) May 10, 2008 12:05 PM
Posted by: zen_yue | (15) May 10, 2008 11:33 AM
Posted by: wqxwy | (14) May 10, 2008 10:18 AM
Posted by: Echo. | (13) May 10, 2008 09:45 AM
Posted by: will | (12) May 10, 2008 09:39 AM
Posted by: Echo. | (11) May 10, 2008 09:35 AM
Posted by: lbaby | (10) May 10, 2008 09:26 AM
Posted by: Anonymous | (9) May 10, 2008 09:11 AM
Posted by: Anonymous | (8) May 10, 2008 09:07 AM
Posted by: srdrm | (7) May 10, 2008 09:02 AM
Posted by: srdrm | (6) May 10, 2008 09:01 AM
Posted by: du | (5) May 10, 2008 09:01 AM
Posted by: chinetman | (4) May 10, 2008 04:14 AM
Posted by: init | (3) May 10, 2008 04:02 AM
Posted by: jiali | (2) May 10, 2008 02:47 AM
Posted by: adon | (1) May 10, 2008 02:02 AM