本文主要是对我两年程序员生涯的一些心得体会进行总结,主要是技术相关。Cocos2D-X 最流行的那年,我选择加入了 Cocos2D-X 团队,凭借着自己的一腔热血和对游戏的热爱,我选择了技术推广作为我的第一份职业。然而,好景不长,技术推广需要专业的,有激情的团队,而我们无法组建这样的团队。

最终,我选择了离开成都,来到厦门引擎团队,开始我的 Cocos2D-X 引擎维护的工作。

收获

这两年的收获其实挺多的,这里摘取了 5 条我认为对自己比较重要的。

掌握 Emacs

学会 Emacs 应该是我的程序员生涯最重要和最划算的投资,它就像学会走路和学会说话一样重要。虽然我的 Emacs 水平还处于进阶阶段,但是它带给我的效率提升以及编程乐趣是无穷的,而且这种影响将会伴随我的一生。我第一次深刻地体会到了什么叫做“Happy hacking”以及函数式编程和自由软件的魅力。通过学习 Emacs,我学习了 ELisp 和 Scheme,通过阅读《The little Scheme》一书,我对递归的认识更加深刻,而且这也促进了我对命令式编程语言的理解。

以前读教科书上的“程序=数据结构+算法”只是当作公式背下来了,完全不明白里面的深层次含义。通过对函数式编程的学习和运用,我好像突然打开了程序世界的大门了,感觉自己以前的编程大多是凭经验和模仿,鲜有深入思考后的设计和编码,大多数时候被框架和 API 给取代了。

另外,学习 Emacs 我认识了很多志同道合的朋友。以前我觉得 Ruby 社区是全中国最好的技术社区,现在,我觉得 Emacs 才是。虽然 Emacs 党在中国真的少得可怜(相比于 Vim 党来说),但是我加入的 Emacs 技术群以及与 Emacs 党的讨论,都是质量非常高的。我推荐每一个专业程序员都应该学习 Emacs,我并不推荐用 Emacs 去做任何事情,把 Emacs 当作一个操作系统(虽然它真的就是一个操作系统)。Emacs 只是工具,任何时候我们解决问题的时候都应该选择合适的工具。但是 Emacs 在很多时候都是那个最适合你的工具,因为它在你的多年调教下,就像你的第三只手一样,常助你一臂之力。

掌握 Git 和 Github

Git 和 Github 应该是 21 世纪程序员的标配技能了,Google Code 和 SourceForge 都已宣布退出,开源社区几乎已经全面转向 Github。基于 Github 的协作开发已经成为开源项目的新引擎,越来越多的公司把自己的项目迁移到 Github 上面,这里面不乏 Google 和微软这样的巨头。通过简单的 Pull Request 机制,给开源项目贡献代码变得前所未有的简单。

也有越来越多的程序员把自己的配置文件(dotfiles 和编辑器配置)和 Side project 托管到 Github 上面,有人使用 Github Page 写博客,有人用 Github 来发动社区翻译优秀的英文资料,有人用 Github 来写开源书籍,有人拿 Github Wiki 和 Pages 写项目文档。另外,Github 还提供 gist 机制,可以让你保存一些代码片断。

Git 和 Github 虽好,但是它也有一些问题。比如很多人不重视 Clean commit history,不会用 rebase 和 squash 来整理 PR,导致很多开源项目的版本历史很难看。

另外,通过 Github 可以非常方便地找到一些轮子,把这些轮子拿过来用可以减少项目开发成本,但是也有风险,因为有些轮子可能造的不够好。不过可以通过 start 数量和 fork 数量轻易地排除一大片不合格的轮子。

掌握 Jenkins 持续集成

现在软件开发都讲究快速迭代,而持续集成对于快速迭代开发非常重要。只有保证每一行提交到版本库里的代码都经过严格的 Code Review 和全面的测试覆盖,才可能将技术债务和 Bug 减少到最低。Jenkins 还可以把很多原本很多需要大量人力去做的任务自动化,它就像一个服务员一样,可以给你提供各种贴心的服务,比如 Daily Build,PR Build 等。

对编程语言和程序设计有了更深的理解

编程语言

编程语言建立了一座你和机器之间沟通的桥梁,不同语言只不过是提供了不同的抽象原语和一些惯用的解决问题的思路。比如我在使用过程式语言进行编程的时候,我会想当然地编写一些全局函数来完成一个任务。而使用面向对象语言的时候,我会对待解决的问题进行面向对象分析和建模,最后通过创建一些对象来完成最终的任务。

不存在最好的语言,语言只不过是解决具体问题的工具而已。而很多语言设计之初就是为了解决某些特定领域的问题(比如 Javascript),或者改进已有语言的一些不足(C++),只不过很多语言设计者把 “通用编程语言”当作其设计目标,而语言的学习者在花费相当多精力掌握一门语言的时候, 它就会想把它应用到更多的领域。有时候,会产生一些连语言设计者都想象不到的妙用。但是,更多时候,可能是“手里有一把锤子,看到什么都是钉子”。

而编程语言的发展大多数是相互借鉴,而在借鉴的过程中可能又会引入一些坑。然后又会设计一些编码规范和惯用法来填这些坑。学习不同的语言,有助于了解这些坑以及语言为何要如此设计。

有人说,优秀的程序员至少需要掌握六门编程语言。每年学习一种编程语言,吸取不同语言的编程思想和解决问题的思路,可以开阔思路,有助于解决手头问题时的触类旁通,创新往往此时就产生了。

程序设计

多关心你的数据,因为程序=数据结构+算法。关心你的数据结构和操作这些数据的方法,可以更容易地理解现有的代码。同时,如果使用面向对象程序设计,这样可以更容易发现不好的设计。如果是使用别人提供的类,应该更关心接口,而改进已有的设计和修复 bug 则更应该关心数据结构。

另外,尽量少造轮子,多复用。(PS:真心希望 C/C++设计一个包管理器啊,这样代码复用会变得更加容易。)另外, KISS 和 DRY 是两个非常重要的原则。

Do more, promise less

做得更多,承诺得更少。

另外,Talk is cheap, show me the code。在讨论一个问题之前尽量先想解决方案,否则只会陷入 无意义的争论。

小结

下一篇我将谈谈我这两年经历的教训。