==============

  周爱民:我做程序之初,只是喜欢而已,其实真的是楞头青。这个阶段看来,是代码不规范、接口随意,并且经常会推翻重来。“代码不规范”是非专业人员的通病,我在很长时间里面,都有“自己的风格”,所以还专为这个跟以前的部门经理争辩过:我同意格式化呀,但为什么要按你说的格式呢?“接口随意”是没有设计开始写代码的表现,而“经常推翻重来”则是其后果。非专业人员初通常是一个人开始练手,自己给自己写代码,接口怎么写自己都能理解,所以专门去设计反倒是麻烦。但到了团队里面,过于“独特的”程序接口则是灾难,因为你得去给每个人解释这个接口的用法,说服他们使用这种接口。而这往往会遵行强势原则:你要么屈从“更标准的接口设计”,要么团队放弃你的这些代码。

  做程序再熟练,过不了上面这个阶段谈不上合作,也谈不上设计。一个人写程序,无需多少设计的功夫。但一个团队合作,没有设计不行。因此我认为写程序的第二个阶段是团队开发和专业设计。而这两点,正是从项目管理和技术实现上来组织大规模开发的不二法门。因此,我事实上在这里想说明的是:相对于个体开发,团队开发是更高阶的技术。

  在你学会了团队开发,能够轻松地与人合作,或组织小型的开发团队时,要想在这个行业中安身立命并非难事了。至于用哪种语言,由于你是“的程序员”,因此语言的选择是应项目之所需的,所以不是接下来要谈的关键问题。

  第三个阶段是你能否在行业中脱颖而出的关键。但这个关键与技术无关,而是一个人的秉性和个性的问题。我们一方面会很阿Q地说“酒香不怕巷子深”,另一方面又说“千里马常有而伯乐不常有”。问题在于,马不能主动地找伯乐,人又为什么不能呢?马困于厩而显凡俗,人立于世可显不群。有表现自己不凡的品质的空间而不施展,根本上说还是能力问题。所以学会沟通、交往,而不是沉迷于代码,可能是第三个阶段的重要瓶颈。

  在第三个阶段,你可能面临非常多的选择。例如技术主管、项目经理或者设计师、分析师之类。但你应该会发现,这所有的选择都将使你被推到团队的前面,你必须面对整个团队,以及项目的干系人(例如客户)。而能否胜任这些,取决于你的综合素质,而非单一的软件开发技能。

  后你得记住一件事,上面的这个过程,不是一朝一夕,也不是一年两年,而是五年十年的时间。在这个过程中,所有成功者都必须具备的,是认真的态度和专业的精神。

  《程序员》:请为开发人员提供几点实践性的指导。

  ==============

  周爱民:把语言作为“称手的兵器”,那么基本技能则相当于内家修为。练石锁也能练出个李元霸,这说明单单靠“不停地写程序”,也是能写出高手来的。但是,如果一上手给个千百斤的大石锁,李元霸没练成便先牺牲了。所以凡事都有个循序渐进,所循的这个“序”,并不要求每个人都相同,别人的经验,大抵上适合做个参考。而我也不能言讲什么指导性的东西,所以上面所谈,大家尽可以当经验来看,当参考来用。是实践,却不是什么指导。

  《程序员》:请您谈谈做游戏开发与一般的软件开发,在技能上的要求有什么不同?

  ==============

  周爱民:游戏开发涉及的领域是比较复杂的。例如对界面交互,一般软件开发中有可用性测试,而游戏中叫可玩性测试。可用与可玩,已经是两种不同的界面交互设计理念了。一般软件开发很少在界面部分应用人体工程学的知识,而游戏界面交互设计中却经常要用到这种知识。但是同样的例子,如果你做游戏开发中的网络传输或者服务器端,涉及不到人体工程学。所以这里要说的是,现在游戏开发过程被分解得很细,不同的技能在游戏开发领域中都可以找到位置,但不要指望能什么技能都精通,然后一两个人搞完整套游戏。

  大多数游戏开发能涉及到的领域,在一般的软件开发中也同样会涉及到。例如数据库,很多人认为数据库与做游戏风马牛不相及。但事实上,在游戏开发中,后台数据库的存取效能、分布特性等是严重影响游戏体验的。所以你在传统软件开发中做得很好的技能,在游戏开发中一样用得到。

  然而不同之处还是有的,其中突出的几点表现在视觉、交互特性和网络性能。

  一般性的软件开发中,我们会遵从操作系统的惯例为用户提供交互体验,但游戏正好是希望给用户独特的体验,因此通常有不同的交互特性。这可能小到一个按钮的设计,大到整个操作的流程。这种交互特性又与输入输出设备的性质相关,例如手机的屏幕与键盘与PC不一样。所以游戏对整个系统的输入输出的研究,与操作系统和一般软件是不一样的,根源在于它要提供独特性。

  游戏对网络层的研究,也与传统软件不一样,但这不是独特性导致的,而是用户量级的问题。大到银行、电信这样的系统中,人们对数据传输的效能通常是由数据库系统和硬件系统来保证的,因此你只需要研究数据和库的优化。但我们总不能让用户花钱买完mssql、架完专线再来玩游戏,所以游戏开发中要在相当高的数量级上,自己来解决数据传输和数据库使用中的问题。然而游戏是多用户、强交互的系统,因此很快爆发出来的问题是分布问题、并行问题等等。这些原本在其它开发中交给某个专属领域去解决的问题在游戏中都需要用自己的方法去解决。

  我们很少去强调游戏开发与一般的应用系统开发在技能方向有什么不同。其根本的原因,在于软件技术以及其它知识都存在共通性。任何一项专精的技术都可以在某个领域上发挥它的独果,任何广博的知识也都有助于开发人员找到更合理的解决方案。除开这些之外,我认为更重要的兴趣与态度,例如游戏开发需要你去发现和寻找乐趣,而系统底层的开发则要求你有更加坚韧的毅力与深厚的基础。这些,并不是技能所能弥补的。