忆往昔

博维尔

  2005年,我加入了一家位于武汉光谷的小公司,这也是我就职的第一个正式的互联网公司。我们预备做一个门户网站,目标用户是一线城市的小区业主。以小区为基本单位,集合博客、二手交易、论坛、活动等各种功能。但很遗憾的是,公司由于资金问题在2006年解散了。
  在博维尔的一年,我学到了很多。还记得最高兴的一件事,是因为在几个同事中,工作完成的最快最好,奖励了我一个电风扇。想起来那时真是无忧无虑啊,只知道撸起袖子干活,啥都不用想。

千橡

  2006年下半年,博维尔解散后,很多同事都来到千橡的武汉分公司工作,我也被之前的同事推荐到了这里。
  上手的第一个项目,是修改5QZone的BT种子发布网站。这个网站是从一个国外的开源项目修改而来,当时在武大和华工还比较有知名度。当时的压力很大,觉得担子很重,怕干不好。但一旦开始了,那些顾虑也就抛到了脑后,花了两个多礼拜,把所有的代码整理了一遍,格式化、加注释、改Bug、加功能,领导和自己都非常满意。
  也不知是不是从那时起,养成了习惯,觉得代码除了实现功能,还得好看、精简,否则就心里不舒服。空行缩进什么的,每次都调的不亦乐乎。把300行代码变成200行,别人觉得没啥意义,而我却甘之若饴!
  做完这个,我提前转正了,工资直接提升了60%,当时都乐疯了。心里想着,加班加点,殚精竭虑,总归是有回报的,想着要继续拼命干,报答公司。
  后来,公司想做一个聚合项目,大致是将各大论坛的十大和热帖,抓取过来,放在一个聚合首页上。当时也没有足够的人手,就带了几个实习生一起做。
  记得有一个叫黄毅的同学,非常牛逼,在学校已经自学了好几种语言。当时我负责做这个项目的数据抓取部分,他推荐我们使用Python。我回去查了一些资料,也觉得Python挺好,我俩一拍即合,于是就开始捣鼓。但在具体实现上,我俩产生了分歧,他想用单线程异步处理,而我觉得多线程可能更快。当时大家都觉得自己的想法更牛逼,但谁也说不出一个所以然来,于是大家相约各自出成品实际测试比谁快。一个多星期之后的某个早上,我们开始PK了,那场面,公司所有的人都过来围观,大家各自站在自己支持的人旁边,盯着显示器。最终还是我略胜半筹,维护住了身为入门导师的面子。黄毅这小伙真的不错,据说毕业后去了腾讯。
  在这之后,就是校内广场这个项目了。当时是看猫扑论坛很火,校内也想弄一个。于是就吭哧吭哧,完全从无到有的做。不得不说,当时领导真的是很信任我们啊,几个毛头小伙,对每日几百万PV完全没有概念。多亏了我的领导张洁,那真是个技术大牛,让我去研究Memcache、Squid,加了各种静态文件、动态数据缓存,上线总算没有掉链子,百万PV,几台服务器愣是撑住了。
  这也是我当时接触的最复杂最有技术含量的项目,积累了很多宝贵的经验。当时那种对未知事物不畏惧,努力学习和研究的态度,让我受益至今。
  2007年,是我人生的一个转折。武汉分公司决定,将研发部门迁移到北京,去还是不去,是一个艰难的抉择。虽然工资提了80%,但到了另一个陌生的城市,远离家乡,我是否能够站住脚?
  最后,在媳妇的鼓励下,我迈出了人生最大的一步,从武汉来到了北京。当时在武汉的工资不到3000,工作也没多久,存的一点钱,交完押一付三的房租,以及各种开销,就没多少了。那段时间真的非常紧张,好在后来都还比较顺利,慢慢的好了起来。

校内

  2007年8月底,我来到了校内网!回想起来,当时和刘姥姥进大观园差不多,整洁明亮的办公场所,帅哥靓妹无数,眼都花了。还有一个叫童真鸣的GG在整面墙上花了涂鸦,当时惊为天人,我和武汉来的同事都惊呆了。心想着,在这里工作,洒家这一辈子也就值了。
  在校内网的内部晚会上,我见到了传说中的陈一舟,还有各种帅哥美女同事精心准备的节目。最令我感动的,是颁发给我了2007年的校内网突出贡献奖,一个印有奖项和姓名的马克杯。当时激动的一塌糊涂,心想着虽然校内广场没有大红大紫,但是领导还是看到了我的努力和执着。那天晚上,整晚都高兴的没有睡好觉!
  在校内网的第一项工作,是做一个奥运火炬手的投票项目。以前都是搞PHP的,但这次要用Java,压力山大。是否能短时间内转型,似乎是来到北京面临的第一个重大挑战。一个多星期后,这个项目上线了,其中的艰辛,请允许我此处省略一万字。看着网页上自己幸苦工作的成果,那一刻突然有一种泪水湿润眼眶的感觉。
  在这之后,是开发校内的礼物中心,也就是现在人人网的礼物商城。大约做了两个礼拜,突然觉得这和我想的未来不一样,不想做了。也许是之前一直太顺,觉得自己应该干大事,而现在做的事情小而无趣。现在回想起来,那时的我真是不知天高地厚,无知者无畏啊。多亏了了一直有贵人相助,加上运气还行,否则结果真不敢想。
  在副总许朝军和我直接领导张洁的一再挽留下,我还是决意离开。每当想起这件事,都觉得心里酸酸的。他们对我人生的帮助,我一辈子都无法忘记,却不知道如何去报答。
  在办完离职手续之后,当时千橡的人力资源总监(很遗憾忘记了她的名字),问我愿不愿意去一家创业中的公司,我答应去看看。后来才知道,这家创业公司的老总,是从千橡出去的,也一直和千橡保持着良好的关系。

昆仑

  2007年10月,我第一次来到那个传说中很靠谱的创业公司的时候,公司还在阜成门的万通新世界,那时公司只有40多个人,办公环境也比较简陋,远不如校内网。
  记得当时是大牛方汉面试的我,我还不知道这个大叔就是Linux四剑客之一。他问了我好些问题,有好几个我都没有答上来,心想完了没戏了。但没想到,紧接着,是公司的老大周亚辉的面试。我当时很紧张,老周进来的第一句话,就是让我别紧张。我们聊了很长时间,我当时就觉得,这是一个很诚恳很靠谱的人,值得我跟着。
  在知道公司有很多大牛,Linux四剑客有三个在公司,校内网的技术总监也是这几个大牛培养出来的之后,我决定了我一定要在这里工作。
  刚进公司我就被震撼了一把,我们居然是要做一个网页游戏!我一个刚进城的土包子,当时都不知道什么是网页游戏,直接就被惊呆了。说实话,那段时间,压力真的非常大。不是害怕未知事物,而是怕辜负了大家对我的信任。我们几个完全没有做过游戏的人,也算是无知者无畏,就这么开始干了。
  我们的项目叫《三国风云》,借鉴了当时一个叫《部落战争》的游戏,当时大家都玩的很投入,我还专门用Python写了个外挂。
  我负责游戏的战斗、武将部分,对我来说,战斗这个玩意,真的是灰常灰常复杂啊!而且除了写服务端PHP逻辑,还要搞HTML和JavaScript,其中的艰辛再次省略一万字。那段时间吃不好睡不好,整天就在想着这个地方怎么实现,那个地方怎么优化,真的要非常感谢大牛于明俭老师对我无私的帮助。
  虽说很苦,但是大家都很快乐,因为大家都能感觉自己在飞快的成长。还记得我把自己和组里同学买饮料喝完剩下的易拉罐,在办公桌上磊了一整面围墙,有四层高,成了公司的一道风景。后来搬去西直门的时候,都给打扫卫生的阿姨了,她高兴了好久。
  大约半年后,我们的项目终于上线了。那场面,锣鼓喧天,鞭炮齐鸣,人山人海啊,直接导致服务器刚开没多久就挂了,大家泪流满面,不知该哭还是该笑。记得当时好像是600人,后来大家卯足了劲个儿,在之前的系统没有数据缓存机制的情况下,两个小时就给关键性数据加上了Memcache数据缓存,然后更新开服,1000多人的时候又挂了。那段时间,各种折腾,大家都绷紧了一根弦。终于磕磕碰碰的,我们可以撑到2000的在线了。直到现在都还很怀念那一段时光,这毕竟是我做的第一个游戏。
  2007年最开心的事情,莫过于得了公司年底评的A类员工。那时我刚到公司2个月,甚至还在试用期,实在没想到公司能把这么有限和宝贵的荣誉赋予给我。我深刻的感觉到,这不仅是一种荣耀,也是一份沉重的责任。
  2008年6月,大约是在我刚做完校内的合作版本开发,公司想做自己的平台了,把这个艰巨的任务交给了我。那时我心想着,游戏都做了,这算个啥,于是便欣然领命。但很快我就为自己的骄傲付出了代价,用户系统还好说,各种充值渠道的接入把我折腾的欲仙欲死啊。好几次都搞到凌晨两三点,折腾了整整一个月,终于该接的都接了,该做的都做了,我也光荣的交了担子。
  我的下一个项目,也是一个页游,名字非常奇葩,叫《龙与乡巴佬》。这是一个魔幻题材、融合了RPG的SLG游戏,玩法和设计,在当时是非常新潮的,也是后来《魔法风云》的雏形。我依旧是负责和战斗相关的系统,虽然这次战斗系统的设计和《三国风云》有本质的区别,但我屹然是见过大阵仗的人了,对此毫不畏惧。我们在前端用上了大量的Ajax,服务端也用上了刘毅、潘占东和我捣鼓出来的新框架,负载能力大幅提升。大家雄心壮志,一心想再创《三国风云》的辉煌。
  特别感谢东东同学,他教会了我很多设计模式、OO相关的知识,让我这个野路子,第一次踏进了面向对象程序设计的大门。
  但现实是残酷的,我们精耕细作,用了太久的时间。那时已经有一些公司开始使用Flash做SLG游戏的前端了,我们的前端表现力已经显得不够,再加上国内用户对魔幻题材的接受度不高,这个我认为非常牛逼的游戏,最终没能够成功。
  我们依然没有气馁,决定再搏一把!当时是通过李振春老师的一次讲座,了解到了Flex。听完讲座,我和东东同学都惊呆了,世界上还有这么好用的东西存在呢?东东说,咱用Flex吧?我说,必须的!我俩当时就一拍即合,马上跑去找李老师说去了。
  于是,《龙与乡巴佬》1.4版,也就是后来的《魔法风云》,前端用上了Flex。东东同学彻底转了前端,我则客串了一把,帮着做了好些页面。在《魔法风云》中,我们除了大大调整了原来的系统之外,还增加了许多新的玩法,做了好几个月,满心欢喜的上线了。
  但残酷的现实又一次打击了我们,让我们知道,游戏要成功并不是那么容易的。那时,很多游戏已经在使用动画战报了,而我们还在使用文字战报。上线后,我们也讨论过是否要改成动画战报,但考虑到时间和人力,没能下定这个决心。最终,战斗这个核心系统的表现跟不上,被认为是最大的失败原因。
  不仅仅是公司,我们全组人也对《魔法风云》赋予了极高的期望。这一次,对我的打击非常大,我们十分努力,却依旧是惨败;我们觉得产品的素质和技术水平已经非常高了,市场却不认账。
  不得不说,公司是宽容的。如果换成在其他公司,投入1年多的时间和大量推广成本去做一个游戏,而最终没有赚到钱,团队的结局恐怕不会很好。而公司不仅没有责怪我们,还一直在安慰大家。最令我感动的是,我们的项目没有盈利,公司确依旧给予我们足够的荣誉和尊重。我和东东同学,都被评为了2008年的A类员工,当时公司已经有800人,A类员工的名额不足10%。
  另一个值得欣喜的事情,是在这个项目认识了孙晓辉。你看他的样子,绝猜不出他是一个90后,太成熟了,绝对的少年老成。我们都亲切的称他小辉子!这小伙真的很不错,踏实肯干,肯吃苦肯钻研。刚进公司几乎啥也不会,但带了两三个星期就能基本上手了。每天都能看见身边的人在快速成长,也是一见幸福的事情。直到我被调走的时候,晓辉已经可以独当一面了,于是我很放心的拍拍屁股就走了,哈哈!
  2010年3月,我又开始了我新的旅程,这次是一个关于荒岛生存的SocialGame,也是我第一次开发社交游戏。这个项目的开发时间很短,只有几个月时间,但是我的收获是很大的。
  当时公司已经做了好几个SocialGame了,前人栽树,后人乘凉,很多经验我也就坐享其成了。我首次接触到了NoSQL,有了数据分布式存储的概念,那时用的是TokyoTyrant,俗称TTServer。
  当时的客户端主程赵进也是个大牛,比我还小5岁。我俩研究出了精简版的AMF协议,数据传输量小了40%以上。
  还首次使用了批量命令提交的方式,通过增加客户端的计算比重,减少与服务器的交互次数。举个例子,客户端进行数据改变相关的操作时,把操作命令和参数加入命令序列,客户端计算并即时反应结果,积累到10个指令以后,再提交给服务器验证,如果验证不通过,则客户端重取数据,回滚到10个指令操作前的状态。这个思想,在当时还是比较先进的,现在的不少手游产品,也都使用了类似的方法。
  但上帝貌似打盹了,幸运依然没有降临在我们头上。虽然这个项目创新十足,大家也都赋予极高的期望,上线后却没有能够创造期望的利润。已经不是第一次失败,发现自己的心理承受能力强了很多。于是我安慰自己,这一次的失败,是在为下一次的成功积蓄更大的力量。
  2010年10月,我加入了老伙计刘一鹏的新项目《Chronicles of Merlin》(《梅林传说》)。听名字你就该知道这是个啥游戏了!没错,这是一款奇幻风格的SLG页游,人物都来自欧洲神话,和当时刚出的《傲视天地》有些类似。
  在这个项目中,我们开始使用长连接,交互模式和设计思维都需要转变,但这对于一直劈荆斩棘的我来说,不是啥大问题。长连接服务器GameWorld是李振春老师用C++写的,客户端只与长连接服务器交互,遇到需要后端处理的请求,就转发给PHP-FPM,处理完毕后将结果转发给客户端。除了数据压缩、大数据包拆分、协议加密、消息推送、消息反射、单用户保持请求顺序等各种高级功能以外,还支持分布式处理和跨服交互,实在是非常凶残。
  做这个项目已经算是轻车熟路了,没有什么大的波折。像样点的成绩,是把服务端的PHP框架做重构和优化,基于之前长时间开发经验的积累,让这次的重构有了本质上的改善。另外,我还迷上了Redis,这真是个好东西啊,配置简单,功能强,运行速度和效率比Memcache还要高。而且提供了丰富的数据格式,支持持久化,便于开发复杂的业务逻辑功能。项目里的数据缓存、排行榜,各种用,效果非常好。TokyoTyrant也没丢掉,像战报这种日积月累,越来越大,又不方便删除的数据,显然是不能存在Redis里的,用TokyoTyrant存真是太合适了,直接扔那里不管就行了,速度有保障而且超稳定。
  在这个项目我还认识了另外一个牛逼的小伙,叫曹雍喆,人称吉吉。此人乍一看,打扮得很时尚,很爱玩的样子,像是个非主流,其实是个老实人。和小辉子有同样的特质,踏实肯干,肯吃苦肯钻研,让做啥就做啥。凡事布置给他的,基本就不用操心了。遇到问题,也是往往只用提点一句,然后就能自己想明白。人长的又帅,在组内可谓人见人爱,花见花开,车见车爆胎啊,哥都有点嫉妒了!
  2011年初,我又空着双手,得到了2010年度A类员工的殊荣,并且在公司在三亚举办的年度计划会议上,被提升为技术专家、高级经理。心情很沉重,很复杂,再一次安慰自己,现在的沉默是在为即将的爆发积蓄力量。
  2011年10月,我调到了下一个项目,吉吉这货顺势承担了主程的责任,我再一次很潇洒的拍拍屁股就走了!虽然《梅林传说》在PC上没有太出众的表现,但手机版(《风云三国》)据说还挺不错的!深深的缓了口气,这次总算没有一败涂地,这点微末的成绩,多多少少算是有点交代吧。
  2011年11月,一个二战题材的新项目《战争风云》立项了。我再次接到了一个艰巨的任务:用NodeJS做一个融合RTS与RPG的战斗系统。最大的困难在于,NodeJS对我而言,只是闻名但从未见面,毫无经验可言。而即时制的战斗系统,更是从来都没有做过,心里一点底都没有。
  已经习惯了承担压力的我,毅然接过了这个重担。在给力的客户端主程朱春阳的配合下,我们不到一个月就完成了战斗系统Demo,领导和我们自己都非常满意。
  随后,项目正式开始了,困难也接踵而至。NodeJS用的人不多,遇到问题一般都很难找到答案,需要自己钻研解决。NodeJS继承了JavaScript难调试的特点,让人十分头疼。它的异步回调模式,也经常让我在处理复杂逻辑时晕头转向。好在NodeJS只处理战斗部分,这是一个以逻辑为主的系统,战斗数据存在内存中即可。最后,我将所有和数据库缓存交互的逻辑都拿出去了,绝大部分逻辑变成了顺序处理的模式,思路终于顺畅了,不用总是跳来跳去。缺点是把数据存取交给了同步的PHP,增加了中间步骤,并丧失了NodeJS异步处理的好处。
  异步无阻塞无疑是NodeJS最大的优点之一,当我一直在纠结,这样做到底对不对时,李老师一句话点醒了我。“我们需要的是一门比PHP更高效的语言来实现这个系统,现在目的已经达到了。异步无阻塞无非是能够更加充分的利用CPU资源,你多开几个进程也是可以的。”
  经过几个月的艰苦努力,项目终于上线封测了。但一上线,我们就碰上了麻烦。虽然对于NPC寻路对服务器负载的压力有所预期和准备,但显然我低估它的影响。由于每个副本的NPC过多,视野过大,以及跟随玩家的部队过多,每个副本同时寻路的NPC有数十个。游戏主要内容就是副本战斗,在线人数高的时候,这个数量级显然非常的惊人。服务器很快就满载了,于是开始思考和落实各种优化策略,路径缓存、路径复用、优化直线算法兼容一些小障碍、目标位置变动超过一定值才触发重新寻路、减少NPC数量和视野等等,能给用上的办法都给用上了,前前后后折腾了一个礼拜,几乎天天搞到11点,总算把负载降了下来。
  这个项目,让我停滞了很久的技术水平,又有了一个明显的提升。但遗憾的是,这个没有竞品、充满创新、大家都以为会成功的产品,最终还是没能达到公司产品合格的标准。我们和公司都为它付出了太多,结果是我们得到了巨大的成长,满载而归,而公司却没有得到付出匹配的收获。我只能满怀愧疚,感谢公司一次又一次的给我们交学费,就像一个溺爱子女的父亲一样,孩子总是犯错,却从不忍心责备。
  2013年3月,我终于能闲一点了,于是就开始各种瞎捣鼓。一个偶尔的机会,看到了Go语言,深入了解之下,我对Go一见钟情。Go是那么简洁优雅,各种优点,都是我在编程生涯中期待已久而不可得的。于是我一头扎进了各种中英文的学习资料中,开始愉快的学习和体验Go语言。
  学习了大概两三个礼拜,突然觉得光这么看资料也不是个事儿,于是给自己定了一个任务,用Go复刻了一个GameWorld(前文提到的李老师用C++写的长连接服务器)。就这么边学边做,大概两个礼拜后,Go版的GameWorld诞生了,基本功能都实现了,当时兴奋的不行。于是写了个测试工具,想测试下性能。结果发现高兴的太早了,并发下还有很多问题,而且在全服广播消息多的时候,性能下降的很快。艰苦的Debug和优化工作立即展开了,经过又一个礼拜的努力,服务器已经能在4000左右的并发下稳定工作了,主要还是受限于PHP-FPM和MySQL的处理速度。后续还有一些扩展开发的思考,比如:现在是连接单组PHP-FPM,如果改成能连接多组,再把PHP-FPM给分布了,应该能有很大提升;聊天系统和用户消息队列,应该还能进一步优化,减少高并发时出问题的可能性。但开始忙了,就一直搁下了,想起来还是很遗憾的。
  在学Go的过程中,还关注了一下Lua,这门脚本语言现在很火。初学的时候,被其变态的语法和各种反人类特点别扭的不行,后来慢慢习惯了,发现Lua还是蛮不错的,至少在执行效率上确实没话说。
  有次听见同事们谈论OpenResty,听起来很牛的样子,就回去仔细了解了一下。不看不知道,一看吓一跳,这真是个好东西啊。无阻塞、连接池、LuaJit,各种梦寐以求的特性啊。最可贵的是,无阻塞由底层实现,代码还是习惯的顺序编程模式,实在是太爽了。当然,还得数据说话,于是用Lua和PHP实现了相同的业务逻辑(4次数据库查询,4次Redis查询),随后进行了AB测试,OpenResty+Lua的效率是PHP的3-5倍。当时我就惊呆了,立马找李老师和方总游说去了。经过我的死乞白赖死缠烂打,呃不对,是有理有据数据说话,大牛们终于同意在新的手游项目中使用OpenResty了。
  现在,新项目已经开始了,积累了许久的气运应该能够爆发了吧?哈哈,这次连自己都很期待呢。

未完待续……

分享 评论
comments powered by Disqus