招技术人员的时候,经常是我来面试。很多次下来,发现无论是新手还是老鸟,多多少少会受手游这个行业前辈们的影响——游击队式的开发理念。 虽然我也不是什么大神,但做了好多年独立游戏,进入手机游戏这个行业也有四五年,前后呆过三家手游公司,看过很多前辈们的代码,也接触了很多很多业内的朋友,对国内这个行业,也算是一知半解。现在斗胆对手游行业开发人员的一些问题进行剖析。
国内这个行业大部分是从05年左右开始,当时以J2ME、Symbian为主,后来有了MTK、Android。其中J2ME至今兴盛了五六年的时间,直到现在的Android、IOS两大主要阵营,很多前辈们的理念仍然被保留了下来。我说的游击队式的开发理念,并不是我贬低前辈们,也并不是所有的人都这样,很多技术结晶还是值得我们去发扬光大,这里我仅指出少量不好的地方进行剖析。
1)编码不规范:
这个应该算是整个IT行业的问题,不过手游很多人是培训学校速成,而且以小项目为主,没有正规的质量监管,所以问题尤为凸显。从最简单的包命名、类命名、变量命名到代码组织、注释,甚至空格、换行都应该有严格的规范制度。但我见过很多奇葩的代码,比如命名aa、bb或者拼音缩写,不知其含义;变量定义跟方法定义穿插在一起,代码上下混乱,可读性极差;类成员全部public甚至不写访问级;注释也是描述不清,爱写不写,爱怎么写怎么写。
之前呆过一家单位,一款上线一年多的手机网游的代码需要维护,结果我发现所有报文的收发写在了一个类里,一个长达2000多行的switch case,其间穿插了对各种名为AA、CH等类的依赖,这对维护人来来说简直是噩梦。一款网游产品,它的后期可能是需要不断更新,不断扩充功能的,如果代码组织不合理,缺乏正规注释,缺乏文档,难以想象这个项目最终怎么做下去。浪费时间在解读和维护这些代码上,直接导致开发成本大大提升。
另一个例子,我看过某几个业内知名公司的J2ME代码,单机游戏。整包仅有寥寥三四个类,一个Canvas(J2ME负责屏幕绘制与更新的主要父类)里集合了上万行代码,囊括了整个游戏的所有逻辑。试想,假如这个源码放在硬盘里n年后要拿出来移植,作者面对上万行的AAA、BBB以及几十个1、2、3、4、5状态的swich case,会不会泪流满面?以后每修改一个功能,都从这上万行里捞出相关模块修改,太可怕了。
我认为,开发人员在编码的时候,应该以“这些代码别人不需要太多文档就能看懂”为原则,严格规范代码,添加注释。一个开发团队工作时,无论一个技术人员负责哪个模块,整个项目的代码他都能手到擒来,任意接手维护;不同编码者之间的接口调用,无需太多面对面沟通,仅通过先期文档和当前注释就应该知道如何使用,这就是规范的威力。
对于编码规范,如果使用java,建议了解一下CheckStyle、PMD、FindBugs这几个静态检查工具,它们可以有效地规范代码,改正不良习惯。之前的代码建议经常重构,以保持健壮的代码以后随时可以复用。重构我推荐一本书:《重构:改善现有代码的设计》。
2)死啃技术,不注重软件设计:
很多人为自己实现了一个多么华丽的粒子效果沾沾自喜,或是多么高效地利用了字库,又或是自己写了一个多么复杂的场景编辑器……我曾经面试了一个Android技术人员,前后他一直在描述自己封装了一套基于OPENGL的图象绘制框架,它能带来显著的效率提升。但当我问到他ArrayList与Vector有什么区别时,他甚至表示都没用过,我简单介绍以后他表示还是用数组比较习惯。钻研各种算法、实现技术固然是好,但是这些最多算是解决问题的一些方法、技巧,它不能成为开发人员发展的重点,最多当是点缀来了解学习。比如J2ME一大把的图象拉伸算法到Android上自带的Matrix就能完美解决,这些技巧总是有不适用和过时的时候,百度能轻松找到代码解决的东西不算什么牛逼的技术,只有软件设计能力才是核心技能。
那软件设计能力具体指什么?UML、设计模式、编译原理、计算机网络编程等等。
UML的作用,软件设计之初,不妨简单地进行UML建模,不求各个视图都具备,起码有大概的类图,对整个框架有个把握,对构建整个项目和后期修改拓展都提供清晰的思路。
设计模式,那有太多的东西要说了。就面向对象的语言而言,开发人员对设计模式的理解,完全可以代表他的开发能力。只知道如何实现方法,如何写逻辑那不叫面向对象,面向对象语言执行效率相对较低,如果再不发挥它们开发效率高、设计优雅的优势,简直就是浪费。很多从业人员忽视设计模式,代码设计完全不考虑关联、依赖,做不到低耦合、高内聚,导致项目各个功能无法模块化,一处修改,处处有问题。
关于设计模式,如果是新手,这里我推荐几本书:《HeadFirst设计模式》、《JAVA与模式》、《大话设计模式》、《敏捷软件开发:原则、模式与实践》。
本篇到此,下一篇继续内容:
3)一个人战斗:
4)开发流程混乱:
5)测试流程:
评论列表: