两年前我有幸加入了一家行业内一流的公司(进入这家公司前是这么认为的.:P), 当时公司颇有几个高手, 大家对于建立公司的程序库或叫做游戏引擎进行了广泛而热烈的讨论, 随着公司项目的进展, 大家也做了很多努力, 但最终未能见到什么成果. 事隔一年, 公司来了几个热血青年, 刚刚从学校出来, 领导决定让他们负责一个项目, 他们对建立重用的代码库的热情就象我们当初那样高. 我在一旁观察了1.5年, 最后我给他们下的结论是, 他们比我们当初更加失败. 这两次事件一直在我脑海中旋转,感想颇多, 终于忍不住想写出来了.:)
因为这里主要讲的是我个人的项目体验, 所以要先来介绍一下项目背景. 我这里所说的项目主要是指大型游戏项目, 开发周期一般在1.5年以上, C/C++代码30万左右, 参与项目的程序一般在5人左右. 在这里我主要想谈三点感受:
1.写出可以重用的代码对开发者的要求非常之高.
写出好的可重用的代码需要成熟的开发者. 所谓的成熟首先需要对自身所处的技术领域的历史和现况都要有相当广泛的了解, 其次要开发过规模相当的项目, 最好是相似的类型的, 这样才能对需要做什么, 怎么做有足够的认知.
变化是与项目的进展如影随形的, 这种变化不单单是指需求等外因在变, 作为开发者, 我们自身也在随项目变化. 随着项目的发展, 自己对项目的理解越来越深入, 自己在相应的技术领域越来懂的越多, 越来越熟练, 理解的越来越深入, 而我们写出的代码却时静静的躺在那里的. 我想, 评定自己是否是一个成熟的开发者的标准(只对与此项目或者此领域啊)就在于, 当你伴随着项目不断成长的时候, 你是否会改变初衷, 即是否想对项目之初所做的整体设计进行大规模的修改. 如果你的项目做了一半, 你就对之前做的设计不满意, 甚至憎恶了, 那你这个项目产生的代码你会用到下一个项目吗?
还有一个问题曾经令我非常困惑, 那就是项目中总是存在我们不熟悉的技术或者其它东西, 总有那样的方面, 让我们感觉自己不够成熟, 这怎么办呢? 面对这样无法回避的问题, 我们没有那么多的时间去学习, 去练习, 以使得自己变成熟, 我们只有随项目的发展而不断成熟. 应对这样的问题, 我想“重构“这个概念是一济良药, 项目不断发展, 我们自己不断发展, 当发现代码中的bad small时, 就要即时清除.
2.代码重用要先从在当前项目中实现代码重用开始.
我见过几位同事, 他们言必及我们现在做的模块要作为公司的代码积累, 公司以后可以一直用下去. 我是个比较实际的人, 我认为做好眼前的项目是首位的, 代码重用首先是代码需要在本项目中被重复利用. 我觉得这一点往往被忽视, 而且很多人会觉得那是当然的, 而我觉得它并不象想象中的那样简单.
例如, 在项目中我所负责的模块和另外一个同事负责的模块都需要一个生成简单几何体Mesh的功能. 但是我们两个在具体的需求上还是有些差异, 最后我们还是每个人写了一个这样的小模块. 所以我想讲, 需要良好的沟通, 良好的规划, 以及对对项目良好的掌控才能尽量减少这种在单个项目中的重复开发的现象.
我还想谈一点就是, 代码重用还要从重用好自己的代码开始. 我就曾经见过有的兄弟将一段代码重复的拷贝到多个地方, 而不是使用一个函数. :( 函数, 模板, class都是最基本的代码重用的工具, 基本上是coding层面的东西, 如果这些都掌握不好, 就先不着急谈项目之间的代码重用吧.
3.应该从小模块开发, 如果想上来就设计一个超过10万行的可重用的FrameWork, 除非您是天才, 否则注定失败.
对于我个人处的这个小小的软件开发的分支--游戏开发来说, 我觉得在很多技术点上, 与欧美相比我们还算跟的上, 很多同事可以写一个HDR或者Soft Shadow的DEMO. 但是我感觉在FramwWork层面, 我们还太嫩了(或许是我眼界太窄, 没见到强的), 一些FrameWork常见的概念很少见诸与国内的引擎中. 我见过的一些引擎, 在结构层面都相当简陋, 一个引擎能用在3个项目上就已经算上生命力非常顽强的了. 更多的情况上一个引擎经历了两个项目的使用, 改来改去的就已经满目疮痍了.
最后, 我想谈一下为什么我觉得原来公司里那几个热血青年比我们当时进公司时的那次代码重用实践还要失败, 借此给那些比我年轻些的朋友提个醒. 我认为他们水平还远远没有达到可以写出可重用代码的时候, 就过早的强调了这一点. 他们花费了大量的时间去完善文档, 反复修改代码, 但是, 就我观察他们所完成的代码能够满足当前项目的稳定运行就哦米托佛了. 例如他们一个兄弟用了大约1人年的时间去写一个GUI的模块, 同样的模块我们项目只用了2人月, 更可笑的是最后那哥们因为水平实在太差被开除了! 这样的模块你在项目里用着放心吗? 如果有机会不用这个模块, 你肯放弃这条活路吗? 这不得不说是一个失败的案例.