技术人攻略:七牛是国内第一家选Go语言做服务端的公司,你也曾多次谈到选择Go的理由,创业公司做这种重大决策要冒很大风险,能不能谈谈做这些决策背后的思路?
蛮多人质疑七牛,为什么早在2011年,Go的语法还没完全稳定下来的情况下,选择Go作为存储服务端的主体语言。这种看上去激进和冒险的决定,实际上经过了严格的论证过程,并不是随意为之。我一直认为:选择和信息的对称程度有关系。当你越不了解一个东西,越会趋向选择保守性的方案,而当你对某个领域了解得足够透彻,你的决策过程会非常自然。
我做决策前,会先试图了解整个背景,看别人一般怎么做,有哪些新兴的idea,这些idea是不是靠谱,如果我来做,会倾向于往哪个方向走。当你深入研究了新技术的思考方式,以及它要解决的问题,就会知道它和自己要解决的问题有多大的相关性。这就要求你具备严谨的思维方式,在很多人眼里,严谨是古板的,会扼杀创新。但在我看来,严谨不是创新的对立面,而是创新的基础。奇思妙想再好,如果不经过严谨的推理过程,就无法变成行动力。用这样的方式分析,有可能会出现一些比较大胆的选择,但其实并不是随意决定。如果你仅仅知道一些名词,不了解背后的具体原理,必然会倾向于选最保守的方案。
我曾多次公开分享过Go语言的亮点,包括它的并发编程模型、对软件工程的支持,以及对编程哲学的重塑。在我看来,Go对并发与分布式的支持算不上特别,所有新兴的语言也都有工程化的思想,所以编程哲学的重塑才是Go语言独树一帜的根本原因,其它语言仍难以摆脱OOP或函数式编程的烙印,只有Go完全放弃了这些,对编程范式重新思考,对热门的面向对象编程提供极度简约但却完备的支持。Go把其全新的编程理念,称为面向连接的语言。作为一名老程序员,我认为Go的编程哲学独具魅力,超越其它新兴语言。
前VMware云平台的首席技术官Derek Collison,曾在2012年断言Go语言将在两年内制霸云计算。我认为他的说法略有激进,但和实际的发展趋势吻合,Docker、CoreOS等新的云计算基础设施都基于Go。在我看来,Go是互联网时代的C语言,不仅会制霸云计算,10年内将会制霸整个IT领域。
技术人攻略:你这种不迷信权威,独立思考的思维方式,是从什么时候形成的?这种思维方式给你带来了哪些益处?
从初中起,我就发现大人们有时也会做出不可理喻的决定,于是就开始有了独立思考的习惯。核心就是一句话:凡事都要问个为什么,要有打破沙锅问到底的精神,不可人云亦云。所以在学习的时候,我不喜欢简单地去记老师教的结论,而是用推演的方式,研究书上的公式和理论到底是怎么来的。
进大学之后,接触到《理论物理》这门课,学到拉普拉斯方程,能解高中所有物理问题。这个方程给了我很深的触动,牛顿经典力学几个公式看起来并没有推导关系,但其背后却原来有非常自然的内在关联。
另一门《现代数学》也让我受益很深,它对多维几何、群论、分形学、混沌理论比较现代化的数学分支都有涉猎。其中分形几何实际上是一面数学和计算机图形学的交叉学科,让我很想往深去挖,于是把图书馆所有关于分形和混沌的书都看了一遍,还写了一个程序,把接触过的分形模型都用计算机模拟了一遍。
这两门课让我看到了许多事物从不相关到相关的内在联系,也推动了我去思考和探究背后的原因。长此以往,我发现从某种意义上看,这个世界没有学科之分,计算机、代数、物理,并没有非常明显的边界。
这种思维方式对我后来的工作有很大影响,举个例子,蛮多人会认为,存储不就是把东西存到磁盘里吗,跟数学有什么关系呢?实际上往高深去做,存储系统和数学有非常紧密的关联。通常的存储服务要保证数据不丢,必须存多份,存多份就会增加存储成本,经典的3副本存储,冗余度是3。想用更低的成本去存,就要用到域代数。
域代数遵循自然代数的加减乘除规律,但数据值控制在有限区域,不管怎么算,结果都在0到255这个域里面,所以叫域代数。存储文件可以认为是0到255的一个序列,举个例子,一个100K的文件拆成10份,每份是10K,存在10个地方,但文件仍然是一份。这时候用域代数里的加法(其实就是计算机中的异或操作),从这10份数据里取出一份校验数据,数据变成了11份,它的冗余度是1.1。这是一种基于校验码的存储方式,成本比较低,但效果和双副本差不多,其中任何一个数据丢了,都能恢复回去。
利用域代数降低成本,在存储领域是发展的必然方向,七牛的存储2.0已经采用了这种方式。由此可以发现,任何一个方向的技术要做到顶峰,都必须横向地去理解,因为世界上所有的事情都有关联。想要对云存储理解得更透彻,你必须理解整个世界,而不光是云存储。所以学技术实际上是不能专精的,在专精的过程中遇到瓶颈,就要往广度方向去挖掘。
技术人攻略:除了用域代数降低存储成本,存储的未来还会有哪些趋势?
从降低存储成本的角度看,算数冗余已经在算法上做到了比较极致的状况,存储领域接下来的突破,应该发生在材料科学上。生活中各种东西都在电子化,现实世界会逐步映射到比特世界,如果以这种方式疯狂使用,必然会面临能源危机。如何能让存储系统在常温、不耗能的情况下运行,是接下来我们要面临的一个重要问题。
可能大家会觉得七牛谈这件事有点奇怪,但我却认为未必。创业是一个不断降低不确定性的过程,刚开始创业的时候,充满了各种不确定性和不可控性,但不能停滞不前。这个过程中最麻烦的,是不能把自己看成必须怎样做,要完全放空,不从各种可能性上去限制自己。至少走一步,大不了发现错了回头,其实也不晚。
如果七牛真要把存储做到极致,一定会往材料这个方向走,因为它关系到我们能不能把存储做长久。当然现阶段,材料不是我们首要的关注点,我们的重点是针对客户的诉求点,解决数据应用层面的问题。
之前网盘一直在打存储配额战,但都停留在把用户的数据存下来,没把它们用起来,所以网盘的用户粘性很低,这也是我放弃做网盘产品的其中一个原因。直到现在我仍然看好个人云存储的市场潜力,但我相信最后的产品形态不会是网盘,应该是更加垂直化的、由场景驱动的、让数据流动起来的一种形态。
存储领域真正的战争发生在应用层面,在数据量越来越大的情况下,所有公司都会面临数据管理的难题。数据一定要流动起来才会产生价值,如果仅仅解决存储,数据最终留在七牛的可能性不是特别高。七牛会对针对数据的使用场景,帮助客户做标准化处理,实现数据价值的最大化。例如目前存储最多的数据是图片,图片用户的典型使用场景,是需要不同尺寸的缩略图,我们提供了这样的功能,用户就省心多了,不用去重复去建设这个过程。
技术人攻略:回顾一下你的过往经历,毕业后仅用2年时间,就成为WPS的首席架构师,这个过程是如何实现的?
金山在管理上给员工较大的自由度,所以个人的成长空间也挺大。我2000年加入金山,实习期间参与了WPS Office 2001的开发。分配给我的任务,是软件的读盘和存盘模块。这个模块当时的重要性并不那么高,它看上去简单,但我发现其中有不少有意思的挑战。挑战之一,是要求你理解软件的所有功能,以及每个功能的数据表达方式。这让我无意中触及到一个软件系统最核心的东西——数据。顺着这条线索,我研究了微软Office各个功能模块的数据存储方式,并把一些有趣的实现方法分享给同事们,他们会吸收其中有益的部分,据此修改原有软件的设计。
凑巧的是,一年之后,金山开始研发WPS 2002。新版本被称作“格式兼容之战”,为了实现对微软Office文件格式的兼容,I/O成了战略层面的技术,存盘功能从边缘模块,一下变成了整个WPS研发的核心模块。从2002年底,我领导WPS整体架构设计,开始了WPS 2005长达3年的研发。
随着对存储更深入的理解,我们在软件架构层面做出了创新,引入了一个数据层,抽象出所有数据的存储过程。数据层诞生之前,传统的“撤销/重做”功能,通过对命令的反操作实现。这种做法非常笨重,所有新开发的功能,都必须考虑反操作怎么做。而数据层带来的好处,是让所有的数据天然可回滚,可以轻松支持多版本存盘、Undo/Redo(撤销/重做),以及各种异步操作。
这个创新并不是对微软的简单模仿,其灵感来源于对增量存盘的思考。Office有个“快速存盘”概念,用户正在编辑的内容,如果已经存过了一次盘,修改过后再次存盘,只需要在原来基础上补加数据。相当于对同一个文件,存了两个版本的数据。我想既然可以做快速存盘,那么就不必关心用户到底做了几个操作,要实现撤销和重做功能,只需要基于数据状态做前进和回退即可。
数据层的架构大大降低了研发的复杂度,在当时的金山起到了非常重要的作用。看上去,我像是很幸运,做的东西从边缘模块变成了核心模块。我相信之前很多人接触过存盘,但有多少人深入思考过其中的原理呢?我始终认为,任何一件事情,想要做到极致,必须把它当成一个学科来研究,把它琢磨透。假设这个东西很好玩,思考如果要把它做到极致,最终应该是什么样子。如果仅仅当成一个简单的任务完成,能取得的成果会很有限。
技术人攻略:你曾说过,金山向互联网转型的这个阶段,也是你自己职业生涯中很痛苦的阶段,你是如何度过的?
2006年是我职业发展的一个分界点,之前专心致志做WPS,没有任何二心。但在这一年,我遇到了瓶颈,对自己如何往下走,感到十分迷茫。国内软件业因为盗版盛行,生存堪忧,WPS虽然有不少用户,但并没有取得商业上的成功。从2002年起,我已经开始负责WPS的整体架构,但职位上的提升并没有带来任何成就感。如果产品无法让最终用户买单,从某种意义上说,你的价值并没有被认证。
中国软件产业被盗版打击得根本起不来,而互联网能天然抑制盗版,金山蛮早意识到这一点,开始探索办公软件的互联网化。游戏是第一个从软件变成互联网的服务,游戏能成功转身,很重要的原因,是因为单个游戏天然有生命周期,下个游戏不提供单机游戏,用户自然也会接受。办公软件是工具,必须沿袭用户的习惯,互联网化相对难很多。如果仅仅把办公软件在Web上做一套,能够为用户提供什么新的价值呢?办公互联网化,最终必须颠覆原有形态,而不是做一个Web上的WPS,但在当时,我们实在找不到更好的方式。
2006年是我成为产品人的开始,一下子感觉到光有技术真的不行,必须理解业务及其运作方式,思考产品和商业的关系。为了拓宽眼界,我一方面广泛参加行业里的会议、沙龙,找不同朋友聊产品方向;另一方面,我做了一个技术社区ECUG,探讨Server端相关技术演进。这期间,我逐渐跳出办公,横向接触其它领域。
在苦苦思索办公软件的未来方向时,我开始研究搜索引擎,顺着这条线,发现分布式存储的技术门槛相对较高,并且有可能发展出独立的商业模式。当时移动互联网正处于萌芽期,雷军已经开始投资这个领域的初创公司。我认为手机一旦开始流行,键盘就不会再是人与人交互的主要形式,图片、语音、视频等富媒体会成为潮流,这将导致未来存储的需求出现爆发式增长。
虽然已经确定了新的方向,如果想以此创业,又感觉自己还是太技术化了一点,欠缺的东西很多,独立创业的难度蛮高。当时有两个选择,一是去刚成立的Google,但仍然是做桌面开发(Google Desktop),不符合我未来的发展方向;二是留在金山,成立金山实验室,可自由探索新产品,这显然更符合我的发展预期。
技术人攻略:后来你离开金山去盛大,又经历了哪些故事?
金山实验室成立的初衷是做一个偏孵化器的机构,可以脱离开WPS既定方向,借鉴Google 20%自由时间的管理方式,做一些全新的产品探索。于是先从内部拉了几位志同道合的同事,从零开始组建团队,顶峰时期差不多有10人。早期我们的步子不敢迈得太快,产品重点放在分布式存储研发,并承接了金山一些内部项目,好让自己的存储产品落地。