« October 2013 | Main | December 2013 »

November 27, 2013

一个 Bump Pointer Allocator

最近抽时间在读 Milo Yip 翻译的《游戏引擎架构》。书还没有出版,我应邀给这个译本写序,所以先拿到了电子版,正在加紧读一遍。全书接近 800 页,我已经读了 600 页左右,希望这个周末可以抽时间读完。

这本书是由顽皮狗的主程之一 Jason Gregory 写的,内容很精彩,Milo Yip 翻译的也相当不错。有很多章节我读的很有共鸣,想先挑一点来写写。

由于作者的主要技术背景是 Console game 开发,而 Console 目前内存非常有限,且没有虚拟内存,对内存的管理和使用就非常苛刻。很多 PC 平台上几乎被忽视的问题到了 Console 平台上就需要仔细考虑了。我很有共鸣是因为 10 多年前在开发大话西游时,要求在 64M 内存上跑起来,同样写了好多内存管理相关的代码。

比如栈式内存管理,就是在堆上模拟一个栈,只管分配,然后记住一个标记点一起释放。

又比如双端分配器,自己管理一大块内存,根据需求不同从两端向中间分配,这个还可以配合上面的分配器一起工作。

把对象的生命期绑定在渲染帧上,在一帧渲染完后把当帧的临时内存全部释放;或者做的更复杂一点,做一个乒乓开关,临时内存可以保留到下一帧结束。呵呵,这些以前都写过。

04 年的时候在网易公司内部做个一个比赛,就是在一块固定大小的内存内实现自己的内存管理器。用我们从梦幻西游,以及大话西游的客户端中实际采集来的数据做比赛评分,分别按允许速度和碎片率打分。我自己虽然没有参赛,但当时也写过一份程序拿到了最高分 :) 当时比赛的前三名现在都是网易项目(或离职后是新公司的主程)的主程。


现在关注的问题不太一样了,在 PC 平台上开发,一般就直接把 jemalloc 等成熟库拿来用,不太关注这部分的优化了。只在最近做 iOS 开发才重新和阿楠讨论过内存受限平台的内存管理问题。我们定制了一个 iOS 上供 Lua 用的特制分配器,用实际项目的数据采集结果做特定优化,效果还不错。


书中提到顽皮狗的引擎在做资源管理时,一律使用 handle 而不是直接内存地址指针来索引对象。这样,所有被内存管理器管理的内存块都是可以被移动的。因为使用的是 handle 来做相互引用,就不存在指针重定位问题。

引擎可以利用空闲时间,慢慢做内存整理工作。把释放掉的内存块空间压实,做到内存碎片率为零。Cache 利用率也相当高。

如果所有的引擎模块都是自己维护,那么这么做相当棒,据说顽皮狗的引擎可以保证这一点。即使用了第三方库,谨慎选择这些库,通过定制分配器也可以适配的不错。

我以前想过这个做法,但没有实际试验过。书读到这里,突然有了点兴趣。Talk is cheap, show me the code . 花了点时间,我写了段简单的代码实现了这么一个 Bump Pointer Allocator

这个库可以管理你指定的内存块,切割内存使用。所有内存块都用 id 索引,id 不会复用(在 32bit 用完前),所以你可以方便的知道一个 id 已经无效,这相当于支持了弱引用。从 id 映射到地址的操作是 O(1) 的,非常廉价,在显式执行整理操作前,内存不会移动。

内存分配也是 O(1) 的,只在少数情况下会退化成 O(n) 。释放操作只是减引用,也是 O(1) 的。内存整理工作可以定帧调用,虽然它需要 stop the world ,但可以保证在固定时间做完至少一步(除非有单个内存块特别大)。

内存块支持引用计数,由于有弱引用支持,所以使用者可以比较容易的回避循环引用的问题。

它还有许多改进空间:例如支持多线程;支持某些块禁止移动,方便外部保有指针。

如果谁有兴趣可以加以改进。

November 17, 2013

云风:一个编程的自由人(图灵访谈)

这篇访谈是 2013 年 8 月 30 日在北京参加 SDCC2013 期间在会场的一个餐厅做的,图灵社区的同学根据接近 5 小时的录音整理了这样一篇文字,登载在图灵社区 上。

初稿在刊登出来之前交给我看过,我觉得很多地方口语化过强有些重复罗嗦,作为聊天可以,但作为文字恐怕不那么易读。所以我又做了修改。主要是删掉了一些我觉得拖沓的口头语,细微调整了叙事的结构,其他基本保留了采访稿的原貌。

下面在自己的 blog 上收录的是我最后修改后的稿子,没有和图灵社区的版本比较过,不知道是否后来编辑有无改动。


云风:一个编程的自由人

属于小伙伴们的年代

他不知道我是个小孩,他到我家里找老吴,我妈以为找我爸的,然后就把我爸从单位里面叫回来,说有一个老头找你。其实他是来给我送十块钱的软件注册费的。

  • 你从什么时候开始编程的?

我从小学一年级开始接触电脑。80年代初,电视都没有普及,我爸喜欢编程序。家里就买了一台9寸的黑白电视,专门为了接电脑,因为以前电脑是没有显示器的。所以电视就没看电视节目看,反正也没什么节目可看。那台电脑Z80的CPU,只有16K的内存,比Apple II 都差远了。这台电脑基本上只能写一些很简单的程序。我爸喜欢,这是他的玩具。

我刚上学,我爸就会给我写一些很简单的游戏。他最早给我练习100以内的加减法的程序也是用游戏形式呈现的。我爸给我写一些小游戏玩,我估计写程序是他的爱好,他不会觉得写出来的游戏好玩,但是我觉得游戏也是极好玩的。那时候写高性能的游戏程序就需要使用汇编。而电脑上没有什么开发工具,我爸当时都是手写的汇编,然后拿手册去翻译成机器码,再导到机器里边,当时用的磁带机,程序需要保存在磁带上面。在磁带封壳上用笔标注每段程序的位置,玩的时候进带到那个位置,再连接上电脑读出来。

我小时候喜欢看书,家里的书我都拿来看,无论看不看得懂,反正我觉得有字的就看。有几本写程序的书,我就拿来读,看起来写程序可以帮助我完成学校留下的作业。我妈当时在上成人大学,学校开了个编程的课。他们是晚上上课,白天上班。她看我有兴趣,于是就把我拎到课堂上去听课。当时课堂上就我一个小孩,其他都是大人。很多人可能只是想要个文凭,所以那个课程都不大用心听。但我有兴趣,很认真的听课。老师很高兴,认真批改我交的作业。

  • 真正系统学编程是什么时候?

真正系统学习是读初一的时候。我们中学新开了一个机房,购了一批中华学习机,也就是苹果2在中国的山寨版。学校没有什么老师教,唯一的一个计算机老师是我爸的大学同学,他想让我爸去代课,于是我爸就成了我们初中的计算机老师。编程课程整个学校只开了一个班大概有20、30个人,一个星期2节课,就在学校机房里上课。

当时气氛很好,玩得好的那些小伙伴,他们大部分现在也在写程序。我们有了个小圈子,在一起大家会有共同话题。不知道哪天开始就想自己做游戏玩,因为各种各样的游戏都玩过了,觉得也没什么,自己也可以做。所谓环境就是有很多同龄的孩子一起都在学这个,大家会比较,会交换自己写的程序,会讨论一下哪里没有写好。没什么资料,有些复杂的问题大家就会去想怎么把它做好。

当时的工具比较缺,不像现在电脑上什么编程工具都没有。所以你可能得顺带连工具一起做,比如说在Apple II上没有好的汇编器,你就得用BASIC自己写一个。那时候也没有互联网,书店里面的书虽然没有现在这么丰富,和编程有关的也有很多。我们没钱把书全买下来,就挑着买,大家买不同的互相借阅。

  • 小时候有没有自己做出一些成型的软件?

我上中学的时候,就开始做一个看电子书的软件。我先在拨号BBS上发。后来《电脑报》每年出合集光盘的时候把它收进去了。当时见过很多共享软件需要注册,我就学样做了个启动几分钟后会弹出来的注册框。说你需要注册才能继续使用,注册费10块钱人民币,并留了地址。结果还真有人给我寄钱。那是我第一次靠写程序赚钱。我用一个本把谁买过这个软件记下来,用平信把注册码寄回去。互联网流行之前,比较流行干这种事情。软件几年间大概卖了100份,也有1000块钱。

这里还有一个有趣的故事。竟然有一个退休的老头,他真的按我在软件里留的地址找到我家里去了,他去到我家里说找老吴,我妈以为找我爸的。打电话把我爸从单位里面叫回家,说有一个老头找你。后来问来问去说是找我啊,我当时在长沙读书。他是来送十块钱的。

上大二的时候,我有几个师兄接了个单:广东佛山有一个图书馆要做一个软件。我跟我发小,中学的朋友就想在假期打份零工。听说师兄们准备8月份去,我们就打算7月份跑过去先去做了。等那些人来,就没他们什么事了。就这样,事先没联系,一放假我们就直接坐火车跑到佛山去了。

他们的需求很简单,图书馆购置了一台当时很少见的光盘刻录机和扫描仪,想靠这个赚些外快。利用这些把附近居民拍的照片扫描成电子版,做成电子相册。图书馆的馆长说,你们有两个人,如果觉得一个人做这个东西就够了的话,我再给你们点事情。所以我们又帮他们做了一个图书馆的管理系统,两个人各做各的,拿当时比较新潮的 Delphi 做了两个星期。管吃管住之外额外收了几百块钱。我觉得过程挺有意思的,虽然他们有点抠门,但至少比学校的老师好多了。

  • 大学毕业之后干什么去了?

临毕业最后一年我已经在北京一家游戏公司做兼职了。认识了一些朋友,刚毕业的时候,打算做手机平台的游戏。诺基亚刚发布了市面上唯一的一款智能机,投资人觉得手机应用会是未来的一个趋势。我刚毕业的那会,一直在折腾这个事情,我们的切入点就是做一个手机游戏的引擎。我们想做一个开发平台,大家在上面可以做游戏。当时选的是塞班平台。

上大学的时候,没想过去拉投资什么的,就是被人带着玩,开始比较有意思,搞了几个月,兴趣就没有那么大了。我觉得那时候手机上做游戏,只能做贪吃蛇、连连看,这些游戏不符合我的游戏观,我喜欢玩复杂一点的游戏。

在要签投资合同的时候,我作为创始团队成员,需要保证在这个团队若干年。我发现我要是未来几年全做手机游戏,就做不了我想做的东西了。于是在签字之前,说我不干了。大家也挺理解的。

接下来被北京游戏圈的朋友叫去做 web 游戏,那家叫可乐吧的公司。干了半年后没什么兴趣,就离开北京回武汉了。

网易那些年

丁磊最后说,你走也没关系,在网易留一个宿舍,你可以住这里,没问题。我觉得我在网易干得很开心,在这里不受限制。我不觉得公司欠我什么,我也不欠公司什么。

  • 怎么去网易的?

大学快毕业的时候,我曾经帮一家游戏公司做了点东西。他们有一款游戏用了我的游戏引擎,需要我在此基础上再写一个模块。他们问我要多少报酬,我没多想,就按照同学在外面做家教的行情算了一下,我说就按家教1个小时10块钱算就行了。最后给了几百块钱,关系不错。

后来他们公司被网易收购,网易启动了《大话西游》项目,听说我没在工作,于是就继续让我帮他们做东西。我在武汉家中写一些模块,当然再不能按10块钱时薪做了,当时一个月有4000块兼职工资吧。做了段时间,他们觉得沟通太麻烦。丁磊打电话给我说,你不如就来广州网易干,机票帮你买好了,公司也帮你在公司旁边租了房子,过了马路就到办公室。你安心每天来上班,不用打卡。我爸说,你这么整天窝在家里也不像话,我就飞去了广州。

  • 在网易做的第一个项目是什么?

2001 年的网易人还不多,就几十个人吧,我感觉那里的人都挺好的,特亲切。跟游戏部门一开始没在一起上班,他们上他们的,我上我的,我只需要完成需求。《大话西游》做了一年多就完成了。当时网易对他们的进度要求挺紧,似乎在按进度走,但我自己觉得质量很有问题,只是抢时间把它做出来。理所当然的,完成以后问题特别多,服务器容易宕机,客户端容易崩溃。

当时也没想过网络游戏后来会怎么发展,网易应该是因为石器时代的火爆而收购这个团队的。但网易当时的思路都是传统游戏开发运营的那一套,比如要找代理商来卖游戏客户端,就像一个有网络功能的传统游戏一样。

  • 《大话西游》第一版不太成功,你接着做《大话西游2》了吗?

刚到网易时,我没把自己看成是游戏团队成员,只是他们让我做什么,我觉得事情还有点意思,就用心把图形引擎一小块的事情做好。项目结束后,整个项目没做好,觉得很不爽。丁磊那时候也没有信心,好在网易靠短信的业务开始赚钱了。

我记得那段时间,公司附近特别多的酒吧,丁磊喜欢泡酒吧。我就住在旁边,他在酒吧就打电话把我叫出来,也没什么事情,就是喝酒聊天。我记得那时候他觉得游戏没做好,而网易的聊天室服务还挺热闹,他就想把大话西游第一版改成一个图形聊天室。我说这个不好,客户端太大,那时候带宽又小,不行。

我始终觉得很多东西我来做的话,做好也挺容易的。原来的客户端不稳定,我在家里闷头搞了两三个月,重新写了客户端的雏形。弄好之后给大家看,说其实把客户端做稳定也不难。丁磊安排了原来技术部门的叮当来负责游戏项目,叮当从网易技术部门抽调了当时在网易技术最好的几个程序,决定把项目重做一遍。然后我就认认真真开始做这个项目了,这就是《大话西游》第二版。

在 2002 年,我们其实花了很短的时间,就把它重写完了。游戏的大框架都在,只是前一版程序写得不好。新的版本完成以后不放心,内部测试了很久很久,直到技术上没什么问题,才推了出来。我当时的想法就是在程序这个方面我尽力了,比以前稳定,至少不会崩溃,也没有内存泄露。

  • 你在《大话西游2》上完全实现自己技术上的想法了吗?

我的一些想法也实施了,因为以前客户端很容易崩,我没太想去读老的代码。只是感觉如果按照我的想法做,会稳定一些。也的确好了很多。以前没把项目当成自己的东西做,所以有想法,最多说说,不会用力去推。后来到这个项目,就觉得是自己的项目,尽量把它做好,很多想法之前就考虑过,当时也比较成熟了。

我大学头两年以及中学时代主要是用C语言做开发,到大四开始写C++的程序。后来几年都对 C++ 很有热情,有新的项目开始也就有了新的实践想法的机会。C++ 里可以玩的东西很多,每接触到一些就会想着如何用到项目里去。当时对语言特别热情,还做过C++的T恤,把C++印到名片上,利用公司的资源开办了一个 C++ 讨论组邮件列表,邀请了国内很多玩 C++ 的程序员参加。

接下来网易开始《梦幻西游》的项目,我参与的一个很大的动力是觉得C++可以换个玩法,能够把新学到的东西用进去,可以换个方法写程序。因为前面一个项目还是比较传统的C++的用法,后来就在《梦幻西游》里面用了当时比较新潮的C++技术。等到2004年《梦幻西游》项目开发结束后,我就逐渐对C++没兴趣了。然后到2005年的时候,在上海开了一次C++的会议,我被邀请去做一个演讲。那时候,我记得听了一些关于C++语言编程的高级玩法,虽然之前自己也花了许多时间去研究,但突然就觉得这些只是一个智力游戏了。

  • 那个时候你写了一本书吧?

04年是我最闲的时候,我写了一本书,到05年的时候,那个书出版,我也到杭州工作,开始忙了。从 2005 年我正式写博客,最初的想法挺简单:我的书出版了,里面有很多错误的地方,以及想法的变迁,我想利用网络平台,来更正我写过的东西,所以这个博客最早的作用是维护勘误表,接着把新的想法写在上面。

我从 1997 年开始维护了很多年个人网站,之前也经常写些东西,网站本来就有一些固定的读者。在书出版后,有很多人就因为那本书找到我的博客,读者就更多了。我发现博客有更好的交互性,坚持写下来,一直没有停,写到现在。

  • 你怎么去到杭州的?

2005年的网易,我已经算是干的比较久的员工。一些老员工离开了。我当时的想法是既然项目做完,《大话西游》都有几十万在线,在国内算是最好的一个网络游戏,那么我对自己的工作有了个很好的交代。网易的待遇不错,第一笔的期权收益拿到,似乎日后的生活没有问题。就想离开重新做点别的。

没想好去哪,当时也有其它公司让我过去,第一个找我的是盛大。盛大的陈大年在我读大学时,我们就是网友。他说想搞个研究院,问我有没有兴趣。

我直接跟领导叮当(前网易COO詹钟晖,于2011年5月15日卸任网易首席运营官,离职前是网易管理团队重要成员。他于1999年10月加入网易公司,2001年4月加入在线游戏事业部。2006年5月,詹钟晖被任命为网易联合首席运营官,2009年3月,詹钟晖担任网易首席运营官,主要负责游戏业务。)说我想换个地方,换个环境生活。盛大的朋友邀请我过去。他就问,去盛大能做啥呢?在网易不能做吗?

当晚丁磊找我喝酒,说你觉得哪里环境比较好,我说杭州感觉不错,然后他就说不如我们在杭州开个分公司吧,我说好啊。丁磊是浙江人,在杭州开分公司的事情估计他也是想了很久,恰巧借我的口提了出来。这个事情网易董事会批的很快,没几天我就一个人到杭州折腾去了。

刚到杭州,我在西湖边租了一个小办公室。一开始的几个人是我在游戏圈子里的朋友,还有过去的同学。接下来就是自己招人,初期人手不够时我还兼职过前台,行政,出纳。

  • 当时在杭州想做什么?

一开始就想做游戏引擎,除了游戏引擎,还想做一款跟市面上的网络游戏不一样的游戏。04、05年是整个网易感觉最好的时期。没有竞争对手,收入不错,自我感觉非常好。刚到杭州时,老板不急,我们也不急,耐着心做就行了,我们想做一个不一样的游戏。我不太喜欢MMO的枯燥模式,觉得很枯燥。2004年,《魔兽世界》在美国在Beta测试,我却玩得挺开心的。发现网络游戏也不是那么无趣。

我想做点好玩的游戏,但觉得需要一步一步的来。技术跟不上,就先把技术做好,然后再做好的游戏。我想法很单纯,只想做事。我们只要7、8个人就可以了,人多了也管不过来。后来网易开始把重心移到杭州,前期因为在杭州已经有了我们这个办公室,并注册了分公司,成立杭州研究院也就方便了很多。早期我们在杭州研究院的筹备工作上做了不少事情,但后来的杭研的实际业务和我那里也没有什么关系。

  • 看起来工作有些琐碎,你一个人能兼顾这些工作和开发吗?

我的确有一些非技术的工作,比如说我需要做公司内部的技术评审。除了杭州的事情,也经常回广州帮广州的项目解决一些问题,频率大约半年一次吧。因为丁磊的用人风格就是信任他熟悉的人。如果有项目出现问题,他觉得谁能搞定,他就把这个人调过去帮帮忙,他对我技术方面解决难题的能力很信任。经常把我叫回去做点这个,做点那个。我也乐意去做。

开发进行了几年后,我们有几个主要的程序员觉得累了,换到别的部门去。每次有人离开,我都很苦恼,因为需要接手那些原本别人负责的模块。后来发现我自己接的事情越来越多,我光接那些别人做的东西,就没有什么精力做新的东西了。每走一个人,我把他们做的东西都看一遍,再接着做,很累。最终整个工作室可能只有我知道所有的数十万行代码都是怎么回事。

在开发上我们摇摆过很多次,又想把游戏做好,又想把引擎做好,结果两件事情都没有做好。技术上的东西也是做了又改,改了又做。一开始我们的想法就是什么都自己做,觉得如果用公开的东西,外挂就容易钻漏进来。比如,如果我们连runtime都自己写的话,可以做出很强的加密壳。我们还可以自己开发脚本语言,不仅可以贴合游戏的需求,还不容易被人分析。这些想法现在看来是很可笑的,但在头一年,我们的确是在做这些。估计是受公司大气氛的影响,觉得不用着急,什么都可以慢慢来。做着做着就发现,软件大厦不是几个人就可以搭起来的,你不能说自己干就从头自己干,我们当时不仅做了runtime,还做了执行代码的加载器,我们做得特别特别细,干了许多本该是操作系统做的琐碎工作。一年多以后才醒悟精力不应该放在这些上面。

  • 最后你们有成型的产品吗?

我们最后的3D引擎半成品没有对外公开。到2010年的时候,网易的情况已经不一样了,网易的竞争者在08、09年之后开始多起来。但是我们还是比较封闭,没有很快的思路转换,觉得什么事情慢慢踏踏实实做就可以了,也不用管市场需要什么,因为网易有很多赚钱的产品,也不缺我这一个。我当时觉得有些东西做出来,公司内部可以用,我在里面学到的东西,我可以跟公司内部去分享。那段时间做的挺多的就是到广州做内部的分享,给大家讲我们做的东西,网易的技术氛围一直很好。

在杭州开发游戏引擎期间,我们工作室出过一款完整的卡牌游戏,我自己很喜欢,但用户不多,喜欢的人都很喜欢,不喜欢的人似乎也很难吸引他们来玩。公司也不愿意花资源去推这种特别小众市场的游戏。

我在杭州做的东西没有特别成功的,但是有很多技术上的想法,以及对游戏的想法总在和整个公司的同事分享。3D引擎这个东西也很难做,它是需要很多年积累的,现在自己做3D引擎的人也比较少。我们尝试过和广州的小组合作开发游戏,但没有合作成功。最后我们觉得我们小组要想在公司活下去有发言权,还得自己做游戏。所以到2010年,就开始重新招人自己做游戏。但这个时候,公司的环境对我们的支持已经不如2005年。

因为只是想先让工作室生存下去,所以也没什么高追求,加上之前做的卡牌游戏不被市场接受,我们这次觉得做一个市场认可的游戏就可以了,不打算做什么惊世骇俗的东西。最终开发时间太紧。2010 年底这个游戏就叫停了。其实对于公司来说,确实应该停掉,公司已经有太多项目了,没有特别的理由保留我们这个并不特殊的项目。

  • 有没有想过把这个3D引擎项目开源?

到2010年工作室解散的时候,我想过这事,和叮当说的时候,他说他做不了主,所以我们就退一步在公司内部开源。但毕竟在网易顶多也就1000个程序员,形成不了开源软件良好发展的社区,我们在这个引擎上继续做的工作很多。我跟丁磊说,我们做的东西如果公司不用,不妨把它开源,让大家一起完善。当时我们工作室刚解散,丁磊觉得我心里有想法。他有话直说,说你花公司的钱,做了4年的东西。你没做成功,就觉得你要找回一定的价值。你觉得开源就可以把自己这4年做的东西的价值体现出来。我说我不是这样想的,我只是很单纯觉得技术发展依赖交流分享。这个也是我最后走的原因之一,我觉得和老板有些理念很难达成一致。丁磊是很独断的一个人,公司什么都是他说了算,他认可的东西就很认可,他不认可的东西别人跟他解释也没用。丁磊为人不错,网易整体也很好,尤其是技术氛围,但并不是事事让人满意。

  • 那时候是不是人也走的比较多,他也比较茫然,看问题负面的东西比较多?

网易游戏在前两年离开的核心人员比较多。大话西游的核心团队突然就走掉了一大拨,当时丁磊心里不舒服,突然飞到杭州。我带他去我一个朋友开的小酒吧,喝了一晚上红酒听了一晚上抱怨。最后我那朋友一直在我背后催我说太晚了要打烊了。

那个时候经常被他叫过去在办公室闲聊。我记得有一次他跟我说,中国搞航天什么的,花这么多钱,太浪费了。我说我跟你看法不一样,然后他就一个劲的说这个没用没用,浪费钱。他就觉得搞航天不如养猪,他有他自己的一整套的道理,所以你是很难说服他的。

到2011年的夏天的时候我离开。丁磊最后说,你走了也没关系,在网易大楼里给你留一个宿舍,你想住就住在这里,没问题。我觉得我在网易干得很开心,在这里不受限制。我不觉得公司欠我什么,我也不欠公司什么。

  • 现在网易还有你这种类似于“自由人”的角色吗?

网易的牛人很多,我这种闲人现在估计没有了。我在广州的时候,以及杭州工作室解散后,经常在各个部门,工作室跑来跑去,对跟我没关系的业务发表些意见。比如Twitter正火的时候,我就说我们要不要做一个,我有很多想法。有事没事,我就会找人问说你们部门是不是闲了,我有个点子不错,我们要不要搞一下。因为我自己是闲不下来,就算没事,我也会到一些部门去问,你们最近有没有遇到什么问题,我们一起看一看。我在网易工作 10 年多,大部分时间就是一个人,不用管人,也没人管我。我和谈得来的同事说,最近有些好玩的东西,我们研究一下。如果碰上可以做的事情,可能就搞上一两个星期。

最近听老同事说现在网易跟以前有点不一样了,以前老员工在网易还是比较悠闲的,爱什么时候上班,就什么时候上班。比如我当年就经常下午去上班,半夜离开。现在好象不行了,不管你有没有资历。

自由的程序员

  • 每个人都会有自己的挑战,对别人来说很简单,但是对你来说很难,其实你都可以一点一点来完成。 后来怎么想到自己出来创业的?

2011年,我离开网易的时候想的蛮简单,觉得不在网易可能更自由一点。比如我想把我写的东西开源就开源,而在网易是不行的。我就想让自己独立出来玩一玩,想做点事情也好,更随便一点。

叮当比我早几个月离开,一开始我就知道他们几个人在想创业的事情。他们最后才找到我。起初一起合伙的人有做美术的,有做市场的,而做技术的人没有确定。后来这一伙人好些人还是留在网易了,并没有走。

他们一直缺个做技术的合伙人,我单身没有负担,是创业很好的合伙人选。叮当跟我联系。我本来是想先休息,不过又想想,其实创业的话,能自己说了算也挺好的。我在网易07、08年以后研究的东西,都是做网游的平台,如果我是一个人做着玩,缺乏个平台,绝对是没法继续搞这些东西的。一个产品需要有很多的用户,游戏这东西不可能一个人弄。若是组建起新团队,做这些东西,知识和技能便可以延续下来,这个事情也蛮好的。

  • 你们拉了很多网易的同事出来吗?

我们不太想找网易的人,之前大话西游的团队离开我也看到丁磊挺受伤。我知道这个对他确实打击挺大,以至于后来公司管理风格都变了很多。所以我们出来不太想找网易的人,我觉得就我们几个核心足够了,我们市场有市场的人,做产品有产品的人,做技术我也很有信心。

  • 那你现在公司也成立了两年了,那你觉得达到你的目的了吗?

不到两年,还算达到了。其实我跟叮当干也蛮多波折,最主要是我觉得他们一开始人太多。都是很牛的人,我觉得做事情不能这么多人开圆桌会议来决定事情,所以我当时只有一个要求,我说叮当我跟你干,我听你的,没问题。反正我一直是你下属早习惯了。但是以后做核心决策加上我不应超过3个人。他们也挺犹豫的,毕竟我是后来的。

最后的结果是我们三个人出资成立了现在这家公司,然后再以我们三个人的名义去找了风险投资。最后公司董事会有 8 个人。

  • 新产品什么时候上线?

我们的 MMO 产品叫《斗罗大陆》,这原本是起点一部非常有名的网络小说。原计划是今年底上线,但是现在可能进度赶不上。最大的原因是我们代理了一家由成都一家公司开发的产品《狂刃》。代理的产品有很多技术问题,我们抽调了很多人员帮他们去解决问题。不光是技术,还有产品的设计,都有问题。

《狂刃》已经上线。当初开董事会我赞成做这个代理项目的主要原因是可以借机锻炼一下运营团队,况且我们原本也有计划做用户平台,付费支付系统等。把这些用户平台提前做好,我们自己产品上线也会顺利一点。因为游戏最怕的就是刚上线时各种不稳定因素。大话西游那个团队出去,第一个产品失败遇到的重大问题之一就是他们的用户平台没有经过检验,第一次砸的宣传费几百万,因为第一天用户的接入平台出问题,搞了8个小时玩家不能登陆。这等于一个 BUG就浪费了几百万的市场费用。我们提前验证一下自己开发的用户平台,代理一个游戏是个很好的机会。《狂刃》的第一天也出了用户登陆故障的事故,但是我们10分钟就搞定了,应急速度很快。估计等我们自己的产品上线的时候,出现这种问题的机会就更少了,也有了应急的经验。

  • 你好象在 skynet 上面花了好多心思吧?

skynet 是我们服务器的一套框架程序。最初想法是在2010年,我们正在筹备做新的游戏的过程产生了新的想法。由于游戏项目后来迅速停掉,想法也没有实践。到2011年出来了以后,反正要做新项目了,就想想该怎么做。写了半年后尝试做开源。因为一直都想把自己做的东西迅速的放到程序员社区里面,大家都可以用,然后得到反馈,我们再改进。我一直觉得这是可以提高我们在技术圈中的影响力的好方法,同时也可以监督我们把自己的东西质量提高。

最近有很长一段时间,我在手游上面做开发研究,所以也不是全部精力在做这个东西。iOS游戏开发方面,也是我们全部自己做的。不过手游项目没有开源是因为有很多东西做得太快,针对性的代码太多,还没整理好。

我们写的很多东西跟业务没有关系的都尽量开源了。我对现在的同事也是这么说,如果你觉得你的东西值得拿出来,我们都鼓励你去开源。开源有一个好处,你如果能把项目推上正轨,有很多人会为它出力。就像我们skynet出来以后,一开始都是我一个人在维护,慢慢的发现有一些别的公司的项目也在用。会给你提意见,会推一些代码,发现BUG也会告诉我,慢慢这个社区就起来了。

  • 手游方面你们是不是可以借用一些现有的游戏框架,比如 Cocos2d ?

也有人问我们为什么不用Cocos2d,我曾考察过一些iOS上面的图形引擎。我从大学开始就做2D游戏,包括后来做《大话西游》、《梦幻西游》。我对这个领域很熟悉,知道2D图形核心部分没有太多工作。所以我觉得没有必要用别人的东西。如果要开发3D游戏,我们会选一个3D引擎的开源东西做,因为自己做过3D引擎,知道这里面代码量特别大,从头做很难。如果想尽早出产品,没有必要把精力花在引擎上面。但是2D的东西,我自己花了一个星期的时间,就把基础的东西做的差不多了,工作量对我来说就是两周的工作时间。如果去用现成的2D 引擎,可能我也需要两周时间去熟悉。而自己写的引擎,可以更清楚如何优化。手机游戏性能优化很重要,有点像20年前的感觉。机器性能都很差,你必须把优化做好一点。这方面我觉得自己还是比较擅长的。有很多东西新鲜有趣,比如在手机上考虑怎么省电等等。如果用现成的东西,还会放弃这些有趣的过程,我选择了自己来做。

  • 你刚刚一直在提你觉得好玩的游戏,还有你的游戏观,你觉得好玩的游戏应该是什么样的?

我们现在做的3D网游是按照魔兽世界的模式在做,我们不敢说做的比它好,因为我自己也是魔兽世界的玩家,我觉得做得比它好很难,但是我们是走这种模式,庞大的世界观,丰富的情节,有很多很多的细节,然后让你觉得是一个世界。

单纯个人选择来说,我觉得游戏系统越复杂,越有挑战性,我就觉得越好。比如说我原来不怎么玩手机游戏,我觉得手机游戏太简单。过年吸引我玩手游的第一个游戏是COC(《部落战争》),我突然觉得挺好玩,有人玩这个游戏就觉得不花钱就玩不下去了。而我反而觉得不花钱才是乐趣,有挑战。我没花钱但玩得挺嗨的。

我玩游戏对图象声效没什么要求,只需要它系统好玩。我也玩一些用字符拼出来的抽象游戏,比如矮人要塞这样的,画面上只有一些符号,但它有一个很复杂的游戏机制。还有一些策略游戏,通常会选最高难度,要求一步一步的精心策划,不准犯一点错误。可能我会不停的失败,但是我觉得失败也是一种乐趣,只要最终能成功就挺开心。

我玩游戏的口味跟大多数普通的玩家可能真不一样,所以我们自己的游戏,我不提太多的意见,交给策划去做。而我喜欢的东西,市场可能不接受。

  • 你在业余时间经常攀岩?玩了多少年了?

我04年开始玩攀岩,05年就停了,在2011年工作闲下来才捡回来。我的身体素质不太适合玩这个,因为我体力不好,力量不怎么样,个子太高,韧带又不太好。攀岩比较适合1米7几的人玩,亚洲人超过1米8,力量就不太跟的上。虽然攀岩运动在20出头是黄金年龄,但玩到60、70岁绝对没问题。这不是项跟人较劲的运动,只是不断的挑战自己而已。这个东西,自己觉得开心就好。不为什么,甚至不是为了锻炼身体,纯粹是喜欢。玩攀岩也不占用什么时间,每次1个小时,一周三次不过3个小时。当然偶尔会开车出去玩。花上一个周末在野外。

攀岩是一项孤独的运动,就是让你觉得定期有事情做,让你觉得有很多挑战要去完成,每个人都会有自己的挑战,对别人来说很简单,对你来说很难,你可以一点一点来完成。你可以去各个地方,一直爬下去。玩攀岩的圈子,除了大学生刚毕业的以外,我认识圈子里面坚持下来的人,就是玩了好多年的人,很多岩友都是三四十岁。我现在是34,至少10年内我不会觉得玩得吃力。去野外爬,你经常会见到五六十岁的人挂在岩壁上。它不是一个纯年轻人做的事情。

今天完成不了的线路,明天可能也完成不了,但是你坚持,过一段时间,突然开窍了,就会发现很简单。攀岩是用脑子玩的,有的东西说不清,要自己体会。突然之间,原来很难的东西变简单了,然后你就会找下一个目标,可以爬更难的线路。也不一定是需要越爬越难,还可以尝试各种风格的,不同的岩壁。

  • 你作为程序员出来创业,有什么切身感受?要是其他码农有这样的机会的话,鼓励他们出来创业吗?

我很满意现在的情况。虽然我们公司还没有正收益,我们还在花钱。现在公司最好的一点是我们可以很好的分工合作,大家做各自擅长的事情。就像我现在写程序,不管人。做开发的阶段,我只要把我的事情做好就行了。每个人把擅长的东西做好就行了。如果想自己什么都做,那就会很累。我自己的负面经验就是在杭州干了几年,什么都管,觉得自己什么都能做。当时想,只要其他人能做的事情,肯学肯适应,你都能做。结果是你没有那么多精力。还是把自己喜欢做的事情做好。你不喜欢、不擅长的事情,有人却喜欢擅长,交给他们就好了。

组建创业公司,做事的规则很重要。我觉得与人合作,矛盾迟早会有的。一开始就应该把决策机制和遇到矛盾大家怎么来协调定好。把坏的事情事先想好。不能依靠朋友间的友情来处理问题。

November 11, 2013

虚惊一场

周五的时候,肥龙同学偶然发现我们机房的内部网段出现了一个奇怪的 ARP 广播,一个并不是我们配置的 ip 地址 192.168.0.120 不断在交换机上广播。经扫描,它提供了包括 ssh/http/https/vnc 的服务,但是我们每次想连接上去看看是什么服务的时候,都会把连接断开,同时,这个 ip 对应的 mac 地址在不断变化。

各种奇怪的现象似乎在说,我们被攻击了。

我们的防火墙规则还是非常严格的,系统安全方面也很注意。我觉得即使被人下了木马,也不大可能被大面积入侵。何况有几台机器从外网不可能进入,如果需要感染这些机器,必须先突破允许外网连接的机器才行。

但是花了很多时间都无法确定是哪台机器出的问题。从交换机上看,几乎每个口上都有奇怪的,并非我们配置的 ip 出现。我们甚至怀疑是交换机本身被攻击,或者是 arp 协议有什么不被我们知道的漏洞。因为理论上,交换机学习 mac 的途径必须经过物理接入的端口上,从上收到的包中提取出 mac 地址。也就是说,插在 1 口上的设备无论如何都无法伪造 2 口上的 mac 地址的。

可是我们的交换机上却发现了大量我们不知道的 mac 地址。

最简单的方法是一台台机器物理断线,可是这些机器都运行着不能中断的服务,我们只好用各种不断线的方法去做测试。

我们花时间在交换机上逐个屏蔽了那些多出来的 mac 地址。并把布置在机房的两个串联的交换机隔离开(它们都出现了相同的症状),想确定问题的源头。最后很多迹象表明问题出在一台看起来最不可能出问题的 linux 机器上。

然后,花了几个小时去审核这台机器。由于不能停机,只好用一些软件以及临时写一些小程序辅助检查。可是我们无法在上面找到多余的网络设备,内核里也找不到可疑的文件句柄。蜗牛同学甚至觉得,如果这是一个木马,那也太高端了一点,除非它自己实现了 IP 协议栈从最底层截获了网卡数据,否则不可能隐藏的这么干净。

搞到半夜我们才发现是虚惊一场。当我们从交换机上屏蔽掉几乎所有的多出来的 mac 地址,只留下一个时,然后我们在 linux 系统中同时也绑定了这个 mac 地址和 ip 地址的对应关系;接下来用 ssh 把 80 以及 433 口转发到办公室里来(因为那台机器外网无法直接连接);我们终于用浏览器打开了这个奇怪的网站。

原来是 DELL 服务器自带的管理页面 :( 它是一个独立的网络设备,串在网卡上,直接做在服务器里了。所以机房给我们的电话也说是看不到任何外接的其它设备,当然看不到了。

由于我们采购的是同一批 DELL 的服务器设备,它们的管理 ip 地址默认都是相同的,在同一个交换机上发生了冲突,我们无法访问它们提供的服务,看起来好像被攻击了似的。

November 04, 2013

简悦招聘 Unity3D 程序员

12 月 10 日: 此招聘已经结束, 谢谢大家.

由于我们公司业务发展, 希望更多志趣相投的同学加入。

最近,公司开始了两个手游项目,其中 2d 游戏使用自己开发的图形引擎;而 3d 项目则使用 Unity3D 。之前我们已经有一个端游项目 斗罗大陆 Online 已经用 Unity3D 开发了 2 年,积累了不少经验。

这次,我们招聘 1 到 2 名程序,希望能具备 Unity3D 的开发经验,参与我们的手游的客户端开发。

我们可以提供一个程序员乐于工作其中的环境。工作地点在广州天河区中心地段,办公室舒适宽松,同事以开发人员为主。公司雇有厨师,有自己的食堂提供所有人的中餐和晚餐。早上十点上班,一天八小时工作,周末节假日正常放假。

如果你想成为我们中的一员,那么还希望能有开放的心态,乐于和人交流,热爱编程。邮件发简历给我们(可以发到我的 blog 上所列 gmail 邮箱),我们将和你沟通联系,看看有没有机会一起工作。