新的开始

2014-09-23

上周五离职了,收拾好心情,本周正式进入团队,也算是翻开了创业的人生新篇章。Ex 公司是个好公司,给了我足够的重视和机会,在公司两年期间成功带出来了两个项目,而且都在线上运营,跑得很欢快,虽然说游戏运营收入不是很理想。但是从服务器程序员的角度来看,稳定就是最大的肯定。 这次换工作主要是技术上的考虑。毕业后入游戏这行也有四年多了,一直使用 c++ 语言开发,前后供职的两家公司都有较成熟的框架。有框架的好处是开发便捷,做项目时不用考虑太多架构和设计上的问题;坏处是有历史的框架难免背上历史包袱,诸多无奈,程序员们都懂的,而且用时间久了难免导致思维的局限性,长远来看不利于个人发展。 总之,我希望借创业这个机会把之前的游戏开发经验重新梳理一遍。不管是做设计写代码,还是团队协作项目管理,都期望会有阶段性的提高。 这个系列文章会不定期更新,并不准备详细记录每周的项目进度或者工作内容,以分享模块设计思路、系统方案选择为主。欢迎读者朋友们讨论或批评。

大致介绍一下项目情况。 项目是一款魔兽主题手机卡牌游戏,战斗采用回合制,战斗过程有一些实时操作元素。目前团队共 11 人,我担任服务器主程序。项目预计半年时间完成游戏内容开发(不包括运营活动、接平台 SDK 等),现在项目刚启动一个月左右,因为之前 我没有过来,前面的工作主要集中在美术和客户端场景、UI 等基础功能试验。 游戏服务器使用 Go 语言,不使用第三方框架。客户端使用 Unity3D,脚本用 c# 语言。客户端服务器网络通信使用 HTTP,消息封包使用 Google Protocol Buffer。

说明一下选择 Go 语言的原因。 我们两个服务器程序最熟悉的是 c++,同样都是四年多开发经验。 c/c++ 的问题是语言本身缺少对开发一个网络游戏服务器必要的支持,包括网络、并发、RPC 等。要开发一个游戏项目势必要重新造一些轮子,影响项目进度是其一,造出来的轮子到时候能不能转起来还得另说。当然我们可以引入库来解决,比如 boost::asio、ZMQ、c++11 的 std::thread,只是要把各种库整合起来还是得费不少精力。我们还可以选择采用前公司的服务器框架,但如此就背离了“甩开包袱重零开始”的初衷了。 另一个放弃 c/c++ 的原因是很难招到合格的 c/c++ 程序员。在前公司有参与面试招聘工作,大约每 3 个月才能出现一个技术水平合格的 c++ 程序,每半年才能有一个合适的入职……水平一般的程序员,写 c/c++ 的远比写其他语言的要危险得多。 于是 c/c++ 被否决。

我们想要静态类型、编译型的语言。长期的 c++ 开发经历导致我们非常依赖 IDE 的智能提示和编译器的语法检查类型校验。平时开发简单的游戏功能时,几百行代码本地编译过了就直接提交到测试服务器上运行,不测试也不调试,极少出 bug。有段时间帮客户端调试 lua 代码,简直是痛不欲生…… 于是 node.js、lua、php、ruby 等不再考虑。

其他的选择不细说了。比如 Java(太复杂,审美不合),Python(一直觉得代码是歪的……),Erlang(看完一本书后自认无力独立驾驭),c#(貌似开发 WinForm 和 Web 居多,开发网络服务器恐怕查资料很麻烦)。

总结一下 Go 语言的优势。 标准库对网络、http、RPC 等支持优秀,语言级别的并发支持。 静态类型,编译型,能在编译期间提前发现代码的问题。 工具链对 IDE 友好,使用各种编辑器都可打开智能提示。 指针没有算术运算,有 GC,较之 c/c++ 稳定性高出不少。 和 c++ 类似的过程式语言,符合 c++ 程序员的思维习惯,而且合理 goroutine 可以不使用回调很好地处理异步过程,代码逻辑上会更加顺畅。 应用领域主要是网络服务器开发,遇到问题查资料很方便。


欢迎加入技术讨论 QQ 群: 745157974