# 游戏编程随想

这段时间赋闲在家，对近些年的工作进行了复盘。工作么多年，一点小心得，分享一下。 如何定义一个能力很强的游戏程序员 + 拥有很强的battle能力，从根本上去说服一个人，改变一个人的看法，让他配合自己的工作，这个非常难（反例:级别压制，我是你是上级，或者我的上级要求这么做

>这段时间赋闲在家，对近些年的工作进行了复盘。工作么多年，一点小心得，分享一下。

# 如何定义一个能力很强的游戏程序员
+ 拥有很强的battle能力，从根本上去说服一个人，改变一个人的看法，让他配合自己的工作，这个非常难（反例:级别压制，我是你是上级，或者我的上级要求这么做），更高阶是做倒知己知彼，站在多方角度考虑，给出靠谱方案。
+ 具备一定的前瞻性，在设计框架的时候充分考虑到将来的迭代计划，能预计到将来策划可能会提什么样的需求（纵使策划现在矢口否认），在现有的框架下，尽可能快的满足策划的需求。
+ 独当一面的能力，在项目的某一个方面或者某个模块，做到事无巨细，是团队里最熟悉这一模块的一员，不仅能出色得完成份内工作，还能驱动需求的迭代，给其它岗位的同事提出建议和解决方案。
+ 工作效率高，善用各类工具或者能自己写一些自动化工具进行编码，测试等。具体体现在，交付速度快，bug少，返工少，加班少。
+ 攻坚能力，有能解决核心问题，如关键算法，修复致命bug。
+ 知识面要广，不拘限于某种单一的语言或者技术。每一种语言或者技术都有它擅长的邻域，只要把它用在恰当的地方即可。

# 如何定义一个能力很强的主程
+ 首先应该是一个能力很强的程序员plus
+ 具备很强的识人能力，在短短的面试阶段，能甄别出真正适合自己团队的人才，所谓的适合不是面试笔试对答如流，而是具备上面说的优秀程序员的特性，或者非常有潜力成为这样的程序。
+ 合理的安排任务，不把下属当工具人：根据团队成员的特性指派合适的任务，并给予高度自主权，所谓的合适，可能是该程序在某一方面的特长，或者是某一方面的技能需要历练，在出色的完成工作同时能得到能力上的提升。
+ 把控进度的能力。对于完成策划需求的用时预估要准确，在给下属留有一定缓冲的同时，尽可能早的让策划看到原型。
+ 对游戏有深刻理解，知道策划最终想要什么，还有他们此时此刻最想要什么。这有助于版本的快速迭代和上面说的进度把控。
+ 留得往人。给下属争取更多的利益，给下属足够的发展空间。很简单直接，要么钱给够，要么不让人受委屈。 

# 关于开源
+ 代码就像是程序员的底裤，不能随便给人看的。代码开源，就是把自己的内裤扒出来给人看。秀出来的，一定是很屌的东西。
+ 不能为了开源而开源。开源应该是一个造轮子的过程，这个轮子不能重复造。一定是因为某个项目，或者库，可能会对别人有帮助。不能是说，以前我做了个很牛很牛的项目，现在把它的代码开源，来炫一下技。还有一些通过歪门邪道来骗赞的就不说了。
+ 开源可以让自己的综合能力得到迅速提高。开源，其实说白了就是相互白嫖的过程。社区里什么牛马蛇神都有，大家共同维护一个项目，无私奉献和拿来主意都能各取所需，大家者有各自的需求。在这里，每设计一个接口，每提供一个功能，都会不由自主的考虑，这是不是大部分人想要的？会不会让项目变能冗余？能不能做的更通用点？扩展性好不好？等等这些问题，我们的自己的闭源项目里是很少思考的。长期以往，就会本能的写出更优质的代码，我们程序员最向往的高内聚，低耦合的代码。


# 如何提升业务开发效率(大佬给的建议，实测好评)
+ 第一步，对策划对案子。在开三方会议前，先把需求文档过一遍，有疑问的记下来，或者直接找策划问清楚。等到开三方的时候，与策划逐行对需求文档，把所有的疑问都解决掉。(这一步很重要)
+ 第二步，与策划一起商定配置表的字段和格式，要求策划配一些能覆盖测试的临时数据，定好之后，写好导表检查。(这一步非常重要，当配置表搞定之后，整个数据模型已经完整的呈现在你的脑海里)
+ 第三步，前后端沟通定协议。后端还要定一下要落地的数据库结构。这一步，前后端的通讯和交互也定了一下来了
+ 第四步，写测试用例（有条件的话，最好加上这一步，并将其提前到第四位）
+ 第五步，写代码(这个时候你对整个系统的需求已经了如指撑了，闭着眼都能写)
+ 第六步，交付测试，然后愉快的摸鱼

# 如何看待加班
+ 没人会喜欢加班，但是身处游戏行业，又不得不加班。加班通常是为了实现一个共同的目标，比如在某一个时间点完成某一个版本，而团队里的每一个成员都必须在场。
+ 加班其实是能力不足的表现，或者说是在正常上班时间摸鱼造成的。一般来说，人如果全身心投入去工作，从早上9点到晚上9点，会非常非常累。
+ 只要不是公司制度上强制加班的，我都能接受。虽然加班的时候我大多数情况都在摸鱼，但是摸鱼也可以摸的有价值。比如做一些优化，为将来的版本做准备。
+ 游戏团队是需要大量的面对面沟通，所以团队成员加班的节奏应该保持一致，不要出现错峰加班的情况，比如有些人加班到很晚，第二天很晚才来，而另一些人刚好错开这个时间，有时候想突然想找人对一下案子，却一直找不到人，卡进度，就很烦。

# 其它的一些感想与收获
+ 技术专家是团队的加分项，但不是必选项。不是交付为目的的技术研究都是耍流氓。
+ 代码一定要简洁易懂，最好是，非程序岗的同事，能看的懂你的代码，并能从你的代码找出bug。
+ 游戏行业发展到现如今，除非是在前沿开路的大佬们，绝大部分我们在开发的过程遇到的问题都是有标准答案的，不管是策划还是程序的方案，只要是脱离了主流的解决方案的，一定要留个心眼，你能想到的，别人一定有想过，别人为什么最终没有这么做，那他一定是踩到了什么坑。
+ 当你发现很久之前代码有一段匪夷所思的代码，别着急删掉，代码是不会说谎的，一定是产品/策划在作妖。
+ 备注是什么，不需要的，代码本身就是最好的备注。(除了有些地方是特殊处理，临时代码，还是要写一下备注，至少//TODO，否则被喷)
+ 程序员的本质是什么，程序员的本质就是与计算机沟通的桥梁，我们写的每一行代码，本质上都应该是为了将来减少更多的重复的体力劳动，为此我们可以是大费周章绞尽脑汁也在所不辞。因此，一个程序的优秀特性应该是，勤于动脑，懒于动手。
+ 切勿过度优化，特别是服务端，有些程序员甚至还在纠结++i和i++比哪个高效，殊不知现在的硬件已经是白菜价了。项目的进度比这些无意义的优化重要多了，除非某些地方成为了瓶颈，否则不要为了优化而优化。