感谢完美

算一下,从完美离职,差不多已经一年。很多事情放在当时看不清楚,而只有放在一个相对较远的时间点再去看,才能看的明白。

我在完美,算是运气极好的那种人吧。当时面试的时候我并不知道我面的是哪个部门,进去之后才知道是数据安全部。刚开始有些诧异这个部门是做什么的,后来才发现,它有点类似于完美的研究院,各种基础性的研发,比如数据库、网络框架、OS定制化都是在这里做。但是它又和纯研究性质的研究院不同,它也做项目。而我所参与的,就是它的第一个游戏项目。

回过头想,你说一个刚毕业不久的学生,最需要什么?户口?很高的起薪?这些完美都提供了,但是倘若被这些蒙蔽,那么就有些可惜了。刚进完美的时候,panpan给我们开了一个会,我至今记忆深刻。大意是说,这里只有一种职业,程序员。我们分初级程序员、中级程序员、高级程序员,而没有游戏程序员、3D程序员这样的title。所以你就想,如果你想做好一个程序员,该从哪些方面提升自己?

我想,对于一个刚毕业的学生来说,最重要的就是,拼命写代码,安安稳稳的写3-5年代码,再去想什么HA啊、分布式啊这些事情。完美是一个非常重视研发,尤其是非常重视程序员的游戏公司,和其它互联网公司不同的是,他更像是一个传统的软件公司,制定开发计划,每天写工作报告,反复迭代。刚毕业的学生,写的代码都是惨不忍睹,管你清华的还是北邮的,都是如此。一个个的BUG被揪出来,慢慢的就会养成一些好习惯,比如减小临时变量的作用域,把函数不要写太长。这些,光看《Effectivce C++》这样的书是不行的。因为这些书不是系统的讲一个问题,而是一条一条的,想的什么就说什么,而且其中有些是过于偏激的。只有多实践,才能写出好的代码。在完美,工作强度是很大,但是相比于高三的学生来说,咱还是轻松很多吧?想超越普通人的成功,就得花出不一般的勤奋。

如果我当时留在Sina,那么走的就完全是另外的一条路。熟悉更多的开源产品,比如MongoDB、Mysql Proxy,略读他们的代码,然后在拼装上做的更熟练,美其名曰:"架构师"。但是对技术产品的认识,始终是停留在一个比较浅的层面。假如,现在有一个新的开源产品出现,我该如何去了解它?我认为,分三步:

  1. What? 它是做什么的,适用于什么领域。拿Protocol Buffer来说,它就是一个序列化框架,凡是要把一个对象通过IO(文件、数据库、网络)传输的时候,都可以用它。
  2. How? 它是怎么实现的?仿sun rpcgen,定义格式,生成代码。Message Format、整数的变长化编码等等。
  3. Why? 它为什么要这么做?比如,为什么要采用key/value这样的方式,每个data前面加一个tag id。通常,想完这个问题之后,会再回头去想第一个问题。

通过阅读文档,能得到第一个答案。而继续阅读文档和代码,能得到第二个答案。但是第三个答案,却需要和开发者沟通,才能真的搞透彻,否则就像看小说一样,1000个读者心中有1000个哈姆雷特。

回头说完美的好处。它不仅把所有基础库的代码都公开给新人看,而且,非常耐心于解答第三个问题,Why。panpan虽身为VP,他的办公室却可以随时敲门而入,只要没人在,就可以进去问技术上的问题,细致到每行代码为什么这么做,以及当时的历史背景。在我临走的时候,他在写一套mail server。每个做过SA的人都对sendmail、qmail这样的东西心怀恐惧吧?而让你利用闲暇时间,从头把rfc 2811、2812这些完整的实现一遍,可知难度。而这是他在完美写的第二套了。所以我对他的敬佩不来自于职位高低,他的技术能力远远在我们所有人之上。

我对自己的目标是做一个技术优秀的程序员,以及更优秀。最近一年突然想明白很多事情,朦朦胧胧的看到技术产品背后的更深、更通用的东西。比如对于protocol buffer,一旦把What/How/Why这三个问题想明白了,那么我就可以对完美所用的那套序列化代码作轻微的修改,让它能像Protocol buffer那样工作。而不是一遍遍的测Thrift和protocol buffer的性能,纠结于用哪个好。所以,我认为freeware的价值不在于免去了软件授权费,而在于技术人员之间相互学习、相互促进。

另外,非常感谢lch以及xdb项目。xdb是个了不起的东西,它最了不起在于,根本很难用一句话说清楚它到底是个什么。它不是一个数据库,或者,不只是数据库。一两句话解释不明白。

于是我就想到panpan另一个非常向我们强调的事情:程序员要学会做推销,推销自己的产品。抄袭多没意思?我们想做的肯定不是抄袭。那么我们究竟做了什么?为什么很好?一个技术人员,越是技术做的好,越是思维异于常人,越是在沟通上有问题。这仿佛是一个很天然的困难。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥