本文第一次写于2015年06年29日,我收到永航科技实习Offer的前一天。蹭一下游戏十年的热点,决定把文章重写,原文名为《记忆回溯-王思妮》。
我的初中是就读在湘阴县茶湖谭的永红中学,就在那木窗之中,木椅之上的那一天。她说她很喜欢炫舞,能不能做个单机版。年少无知的我夸下了海口,听的人也未必当真。无法兑现的承诺伴随着时光,也许只有听的我有着当年的记忆。
然而对游戏业的热爱是远远和王思妮无关的,直到现在,我也没有打开过QQ炫舞端游玩上一把对局。第一次见到电脑,256MB的内存存储就和现在的4g内存条一样珍贵。而第一次见到的游戏,在当时的乡镇,还是如日中天(为什么我以前写文章还会用成语)的传奇。我并没有玩过这个游戏,但对这个游戏的印象非常深刻。是表哥带我第一次见到了游戏,就这样脑海中就一直挥之不去.....
第一次等到自己接触电脑的时候,我来到了一个刚在发展中的城市广东省河源市。我已经很多年没去过河源了,我也忘记了那我带我走进黑网吧的喜欢红色警戒的同学叫什么名字了。我接触的第一个游戏是CS1.5,和一个同学1V1对战,他帮我选择了匪。于是拿着雷包不知道怎么丢掉的我,输了人生的第一场游戏对战:用着WASD在地图乱逛的我,被同学乱枪打死。
十二年前的我打游戏就充值了,因为那个时候整个广州最火的就是梦幻西游。这个游戏让我堕落,让我迷失。其中发生了太多的故事,久远到我已经找不到河源市那家我就读的学校了。那个网吧,我记得当时还有两台液晶显示屏机器,最好的配置,给人玩3D游戏的。那个游戏的名字我已经忘了,同事李阳就来源于这家公司。我从未玩过这个游戏,但是我还记得我常用这个和人吹牛逼,记忆剥离了身边人的存在,只剩下了自己在一座孤城。
现在的我已经不愿意提及CF开挂和魔兽地图编辑器的那些事。在非“学习”的路上,中二的我,总是想做一个完美的产品,却不知道换来的,对于年轻人来说:唯一的成本,就是时间。耗费大量时间的我,中间发生了种种故事让其被尘埃掩盖在历史的垃圾堆中,到最后只剩一下一个硬盘,当硬盘在网吧挂掉的那一天,我走上了人生的另外一条道路。
一不小心就浪费了大量的笔墨来讲述永航无关的故事。
大学无所事事的我,开始学习各类游戏程序相关的技术,越学越菜的图形学,乌龟一样的前进。然后来到了北京应聘(那个给我发面试邀请的HR已经离职了)。我应聘了两年公司,其中一家给京东做服务的创业公司,名字都不记得了。因为完全看不到这家公司工作的前景,然后就去应聘了北京永航科技,我去面试的还在想,估计是面试不过的。
首先发了邮件的我,以为都会像在其他招聘网站一样石沉大海。万万没想到HR会给当时到家屁股还没坐稳的我打电话叫我去面试,我只好买了一张从长沙到北京的站票,就这样来到了帝都。当时我是在OPENGPU看到了郑大师发的帖子,那个帖子招聘的是有经验的引擎开发,而我投了一个实习。
面试的时候,先是给了七页的CPP笔试题,从基础考到设计。我大概做了一个小时,自认为做得还不错吧。接着是超哥面试的我,当时的我没想到还能回到上来,刷新了自己对自己的认知。当时应该是郑哥不在,面试的时候是周五,做机试题的时候我做了一个小时,第二题卡了好久。我于是选择了离开。忘记当时是一个怎么样的流程,还要叫我周一复试,当时住的旅馆实在是太贵了,心都是痛的,但是我又不得不珍惜来之不易的机会。
我周六日搜索了第二题的思路,我当时想都没有想第三题,我也没想到到还有周一过去还是机试。我在想第一题我用了一个O(n^2)的算法本来就不出彩,还是看了一下第三题吧。没想到第三题是如此的简单(一些写了一部分的正则搜索,加上+的支持),加上调试也就不到十几分钟。郑哥还以为我接触过正则,实际上我一起碰都没有碰过。我当时的想法是:"是不是没有人做第三题,都以为第三题更难?"
接下来是HR面试,怀揣着特殊的心情。我知道已经稳了,心潮澎湃的我决定写一篇文章。因为是QQ炫舞的开发商,当时还在感叹命运,这辈子难道会开发一个单机的炫舞吗,没想到了居然面试了正版公司。当然还有一些比较特殊的元素,让我对这个公司充满了一些好感,比如说郑哥是湖南人,我很喜欢王小波。
王小波在《我怎样做青年的思想工作》一文中写到::我有个外甥,天资聪明,虽然不甚用功,也考进了清华大学-----这个人就是叔叔
我在公司做的第一个活是分析炫舞时代的运行时库依赖,第二个活是给炫舞时代的战斗系统加上技能支持。这个系统大概在现在还是有bug的 。 在做第二个活的时候我就知道了北京凌晨是看不到家乡那样的皓月。做的第三个活是炫舞时代web端的自动打包工具,我记得开发了大约有一个月,尽管这个工具没有多少代码,做的事情就是把别的功能拉起。做完这三个功能的我明白了一个人的力量到底有多渺小。
第一个工作我还记得结论是没有优化的地步了,那是我第一次感觉到了挫败感。做了一段时间的分析,结果得出啥也不能做让我对自身能力产生了质疑。
第二个工作让我感受到了一个端游项目代码的庞大,我以前从未见过如此大的工程。我一开始的心态完全是惶恐,不知道打开那个项目的文件,在那个角落开始写代码。第一次操作Perforce就差点把整个代码目录给删除,最后找汕哥帮我解决了问题。在我接受这个功能的时候,炫舞时代已经有初步的战斗系统。我和汕哥一起合作写这个功能,汕哥把具体技能效果怎么实现交给了我。在我把那陀代码重写之前(没错,我在实习就重写了一个......一个类的全部实现,我当时并没有意思到这个类的接口设计有问题,我只是重写了实现),代码中已经有了初步的技能释放,判断,效果流程。我把技能的判定全部重写,buff的判定逻辑进行了调整。
很快我遇到了大量的bug。具体的细节我已经记不太清楚了,都是因为流程上的问题。我们战斗是一个回合制的机制,一个技能操作在之前的流程中只会造成一次判定,一次计算,产生一个OP,并产生一次效果。但是策划案中有个技能是连击箭,人物射出多个箭矢,他们的判定是独立的,我不得不在计算代码中了加了一些特殊处理完成了这个逻辑。
还有一些很蛋疼的问题,比如说一个人物死亡之后,但是操作时序还没走到他,按理来说他是不能被判定的,但是策划案中要支持复活,又不得不把上层操作的判断给稍微了改了一下,大量的bug让我失去了对代码大动刀锋的勇气,生怕自己见不到明天的太阳。在紧迫的时间内,写出来符合功能的代码是没有问题,但是有多少美学你是根本无法把控的。
很快有个是糊if else糊不动的bug。客户端表现,服务器数据计算状态不同步了。这个bug来源于一个叫嘲讽的技能,这个技能的机制是随机选择一个怪来嘲讽,测试发现在组队的时候,A使用嘲讽,A看到的是石头怪打自己,B看到的是兔子怪打A。这个bug的根本原因是随机,随机就要用到随机种子。A和B随机出了不同的值,随机种子是服务器下发给客户端了,值是一样的,这意味着。两边的随机次数不一样。为什么会这样,因为在策划案中当一个技能不能用的时候技能要变灰。UI层的代码直接使用了技能判断类的计算技能目标的接口(这个接口直接返回一个vector),然后UI判断vector是否非空来判定是否能用。而当A有嘲讽技能,B没有时,A的UI层调用了无数次嘲讽的技能判断,随机种子已经大大的和B不同了!!!
至于第三个工作,我只能说写打包工具能把人逼到离职。其中最大的问题是难以调试,难以调试不是说没有源码,没有环境。而是打包程序运行时间的太漫长了,比如说有个bug总是在最后一步才出错,而这个时候已经是五个小时后了。为了确保没有问题,我选择了在发版本那天待到了第二天早上,看看到底是哪里出了问题。而现在已经是两点了,我感觉已经不够精力支持继续写这篇文章了。而我没有离职的原因是因为这个web打包工具并没有执行具体的逻辑,我只是把一大坨工具组合在一起,从前一个进程取到结果送给下一个进程。遇到了最大的一个问题是,有个工具的代码找不到,找到了里面的代码好像是故意写错的(害我待了一晚上定位)。
未完待续