你好,我是许式伟。
今天想和大家 聊聊架构 ,和架构以外的二三事。
在过去的工作经历里,我看到不少架构师都倾向于把架构看作一项纯技术性的行为。他们的工作流程是这样的:产品经理根据用户的需求做出产品设计,架构师再依据产品设计给出实现,也就是软件的架构设计方案。
在我看来,这恐怕是个误解。 我们做架构,空有一身技术是远远不够的,知识的深度和广度,往往会对架构能力起着决定性的作用。 而 这些知识 ,从你踏入 IT 行业那一刻起,甚至更早就应该开始储备了。
关于如何学技术,怎样储备知识,我想聊聊我的个人经历,希望给你一些别样的启发。
大学时,我接触到《理论物理》这门课,发现拉普拉斯方程式可以解高中的所有物理问题,《现代数学》中的分形几何也让我颇为着迷,不仅将图书馆里所有关于分形和混沌的书都看了个遍,还专门写了程序,将接触过的分形模型都用计算机模拟了一遍。
这两门课让 我看到了许多事物之间的内在联系,并开始思考和探究背后的原因。
这种思维方式对我后来的工作有很大影响,举个例子,很多人认为,存储不就是把东西存到磁盘里吗,跟数学有什么关系呢?但我发现往高深去做,存储系统和数学有非常紧密的关联。
通常的存储服务要保证数据不丢,必须存多份,这样会增加存储成本,经典的 3 副本存储,冗余度是 3。想用更低的成本存储,就要用到域代数。域代数遵循自然代数的加减乘除规律,但数据值控制在有限区域,不管怎么算,结果都在 0 到 255 这个域里面,所以称作域代数。
存储文件可以认为是 0 到 255 的一个序列,举个例子,一个 100K 的文件拆成 10 份,每份是 10K,存在 10 个地方,但文件仍然是一份。这时用域代数里的加法(其实就是计算机中的异或操作),从这 10 份数据里取出一份校验数据,数据变成了 11 份,它的冗余度是 1.1。
这是一种基于校验码的存储方式,成本比较低,但效果和双副本差不多,其中任何一个数据丢了,都能恢复回去。利用域代数降低成本,是存储领域发展的必然方向,七牛的 [存储 2.0][3] 就已经采用了这种方式。
2000 年我加入金山,当时分配给我的任务是软件的读盘和存盘模块。这个模块当时的重要性并不高,看着也比较简单,但我发现了不少有意思的挑战,其中之一,是要求你理解软件的所有功能,以及每个功能的数据表达方式。
这让我无意中触及到软件系统最核心的东西——数据。顺着这条线索,我研究了微软 Office 各个功能模块的数据存储方式,并把一些有趣的实现方法分享给同事,他们吸收了其中有益的部分,并据此修改了原有的软件设计。
一年后金山开始研发 WPS 2002,新版本被称作“格式兼容之战”,为了实现对微软 Office 文件格式的兼容,I/O 成了战略层面的技术,存盘功能从边缘模块,一下变成了整个 WPS 研发的核心模块。
于是,在 2002 年底,我作为首席架构师,开始领导 WPS 的整体架构设计,用了 3 年的时间做出了 WPS Office 2005,完全重新架构开发,做三大兼容:文件格式兼容、二次开发接口兼容、用户操作习惯兼容,产品定位:先立后破,做 Office 的替代品。
我们在软件架构层面做出创新,引入一个数据层,抽象出所有数据的存储过程,改变了此前只能通过对命令的反操作来实现的传统“撤销 / 重做”功能,让所有数据可天然回滚,轻松支持多版本存盘、Undo/Redo(撤销 / 重做),以及各种异步操作。
这个创新并不是对微软的简单模仿,其灵感来源于对增量存盘的思考。Office 有个“快速存盘”概念,用户正在编辑的内容,如果已经存过了一次盘,修改过后再次存盘,只需在原基础上补加数据。
相当于对同一个文件,存了两个版本的数据。于是我想,既然可以做快速存盘,就不必关心用户到底做了几个操作,要实现撤销和重做功能,只需要基于数据状态做前进和回退即可。
数据层的架构大大降低了研发的复杂度,在当时的金山起到了非常重要的作用。乍看上去,我像是运气很好,做的东西从边缘模块变成了核心模块。但我相信之前很多人都接触过存盘,但有多少人深入思考过其中的原理呢?
我始终认为, 任何一件事情,想要做到极致,就必须把它当成一个学科来研究,把它琢磨透。 假设这个东西很好玩,你要去思考,如果把它做到极致,最终应该是什么样子。 如果仅仅当成一个简单的任务完成,能取得的成果会很有限 。
2006 年是我职业发展的分界点,WPS 虽然累计了不少用户,但并没有取得商业上的成功。 如果产品无法让用户买单,从某种意义上说,你的价值并没有被认证 。
彼时,国内盗版软件盛行,金山开始探索办公软件的互联网化。办公软件不同于游戏,游戏能成功转身,很重要的原因在于每个游戏都有其生命周期,但办公软件是工具,必须沿袭用户的习惯,互联网化相对难很多。
如果仅仅把办公软件在 Web 上做一套,能够为用户提供什么新的价值呢?办公互联网化,最终必须颠覆原有形态,而不是做一个 Web 上的 WPS,但在当时,我们实在找不到更好的方式。
于是突然我意识到, 光有技术远远不够,必须理解业务及其运作方式,思考产品和商业的关系。 为了拓宽眼界,我一方面广泛参加行业里的会议、沙龙,找不同朋友聊产品方向;另一方面,我做了一个技术社区 ECUG,探讨 Server 端相关技术演进。
这期间,我逐渐跳出办公,横向接触其它领域。在研究搜索引擎时,我发现分布式存储的技术门槛相对较高,并且可以发展出独立的商业模式。当时移动互联网正处于萌芽期,雷军已经开始投资这个领域的初创公司。
所以, 我预想一旦手机开始流行,键盘就不会再是人与人交互的主要形式,图片、语音、视频等富媒体会成为潮流,这将导致未来存储的需求出现爆发式增长 。
虽然确定了新的方向,但如果想以此创业,我感觉自己还是太技术化了一点,欠缺的东西很多,于是我从零开始组建团队,建立了金山实验室,自由探索新产品,重点放在分布式存储研发,并承接了金山一些内部项目,好让自己的存储产品落地。
在我刚刚成立七牛时,最初的产品方向是网盘,9 月中旬产品发布,10 月我就决定转向底层存储,期间只花了一个月时间思考。 这个决定做得很艰难,但从公司的核心竞争力考虑,必须做调整。
原因有 2 点:其一是当时国内云计算环境还不够好,七牛如果做网盘,很难找到一个第三方存储供应商,同时做底层存储和网盘应用,精力上会比较分散;其二,团队的基因偏极客,对终端用户了解不够深入,而程序员是我们最熟悉的群体,所以,权衡之下,我选择了云存储这条路。
同时,七牛也是国内第一家选择 Go 语言做服务端主体语言的公司,尽管当时 Go 的语法特性还未完全稳定,这个决定看上去有点激进和冒险,但实际上是经过我严格论证的,并非随意为之。
我一直认为: 选择和信息的对称程度有关。你越不了解一个东西,越会趋向选择保守性的方案,而当你对某个领域了解得足够透彻,你的决策过程会非常自然。
当你深入研究了新技术的思考方式,以及它要解决的问题,就会知道它和自己要解决的问题有多大的相关性,这要求你具备严谨的思维方式。或许在很多人眼里,严谨是古板的,会扼杀创新。
但在我看来, 严谨不是创新的对立面,而是创新的基础。 奇思妙想再好,如果不经过严谨的推理过程,就无法变成行动力。用这样的方式去分析,可能会出现一些比较大胆的选择,但并不是随意为之。
做架构也是一样,需要做严谨的设计推演。这就要求我们建立完整的 架构知识体系 ,看书学习当然是一个非常好的方式。但我发现,当我想推荐一本经典的架构书时,并不能快速想到推荐哪本。细数我接触过的那些与架构相关的图书,大概有以下几类:
这些架构类的图书并没有达到我个人的期望,在我看来,它们都没有揭开架构设计的全貌。所以一直以来,我就心存这样一个念头:“写一本不一样的架构书”。这个念想,正是 《许式伟的架构课》 这个专栏的由来,它和你现在能看得到的大部分架构书都不太一样。
在专栏中 ,我会通过理解软件架构的宏观视角,从零开始构建出整个信息世界,在这个过程中,阐述了架构思维范式,以及这些范式在日常工程实践中应用。
在内容设计上,我希望这是一个门槛最低的 架构设计专栏 ,不仅帮助到想成为架构师的初学者,还可以让已经成为架构师的技术人规避一些错误的经验。在行文上,我会尽量避免深奥的术语,以通俗易懂的文字描述信息世界构建者们的所思所想。
我是许式伟,七牛云 CEO,ECUG 社区发起人,一个开源爱好者。曾就职于金山、盛大,在搜索和分布式存储相关技术领域有十几年的研发经验。
在金山,以首席架构师的身份主导了 WPS Office 2005 的架构设计和开发。在创立金山实验室后,作为技术总监主导分布式存储开发。后加入盛大创新院,推出了“盛大网盘”和“盛大云”。2011 年,我成为一名创业者,建立了七牛,专注企业级存储服务。
在我目前的职业生涯中,前后大概做过十几次的架构类的演讲,但这些零星的演讲,对于 传递架构设计思维 来说,远远不够。
这个专栏 ,是我第一次完整、系统地分享自己的架构经验和思考,我会将近 20 年的经验毫无保留地分享给你,相信你一定能够学有所得。
注释:本文部分内容首发于由独立媒体人 Gracia 创立和维护的技术人攻略访谈。
专栏上线仅 1 周 ,已有 超过 12,000 人 加入学习。
限时 ¥99, 2 天后恢复原价 ¥129 , 戳此试读或订阅 。
20 年经验沉淀,好评如潮,评价可以参考:
一顿饭钱,就能看到 老许 20 年的经验总结, 获得与顶尖架构师更近一步的机会,几年后的你,会感谢自己今天的投资。
戳此订阅 ,跟着老许学架构。
更多专栏详情,可以查看 《七牛云 CEO 许式伟:首次完整架构经验分享》 。