你好,我是许式伟。从本日起,我想和你一起来聊聊架构的话题。
开始之前,我先来和你大略先容下我自己。
我是 2000 年开始事情的,曾经做过 WPS 的首席架构师,也在盛大从事过技能研究方面的事情,后来在 2011 年创立了七牛云,现在我是一名创业者,CEO。但不管角色怎么轮换,我以为我的另一壁始终是一名程序员,架构师。
让我们来想象一下,如果把信息天下算作一座大厦,把程序员算作这个天下的建筑师,那么,现在的你在卖力什么样的事情呢?
当我们把程序员类比成建筑师时,按照能力水平来分,我以为大体可以分为三个层次:搬砖师、工程师、架构师。
软件搬砖师之名对应到建筑行业的建筑工人,他们的编程能力和业务基本上勾留在堆叠代码,按照哀求去实现功能需求的层面。
只要能让程序跑起来,能精确地实现业务逻辑,就可以称为“会编程”的人。有时候,我们也会瞥见程序员自称为“码农”“搬砖的”,虽然二者的工种不同,但从根本事情的相似度来说,确实有可类比的身分。
很多生手的人都会以为程序员是一个很神秘的职业,但实际上程序员的根本门槛并不算高。我自己从 2016 年 2 月开始至今,一贯在教几位 8~12 岁的小朋友学习编程。这个实践履历见告我:小学生完备有能力学编程。而且,并不是只有部分小学生可以,而是任何一位小学生都可以学会。
然而,只让代码跑起来是不足的。这个天下是不断变革的,作为程序员,我们更多的韶光是用来掩护代码:增加新的需求,对已有的功能进行调度,修正之前代码遗留下来的问题,优化性能等等。
这是由于一个软件出身之后,后续便是须要花费大量的代价去掩护它,演进它。一个人是完备掩护不过来的,须要更多的人,很多的团队一起协作。如果面临了员工离职、岗位调度等情形,还会导致软件代码在不同人之间流转。
以是,一些有追求的程序员会关注代码的质量。代码质量的评判可以有这样一些基本维度:可阅读性(方便代码流转)、可扩展性/可掩护性(方便修正功能,添加新功能)、可测试性(质量管理)、可复用性(简化后续功能开拓的难度)。
这一类致力于不断提升软件代码的工程质量的程序员,我们可以称他们为软件工程师。
△推举专栏《许式伟的架构课》,点击文末「阅读原文」试读或订阅
工程师不会大略把写代码看作一门事情,把任务交代过去就完事。他们会有“洁癖”,代码在他们眼里是一种艺术,是自己生命的一部分。
他们会把写出来的代码改了又改,直到让自己满意为止。阅读和掩护软件工程师写的代码会有一种赏心悦目的觉得。
但是,大部分商业软件都是一项极其繁芜的工程,它们远比很多传统的建筑工程繁芜得多,无论是涉及的人力、韶光还是业务的变数都要多很多。
人力上,大部分大型的软件系统都有几千乃至几万人的规模,而这几千几万人中,却没有两个人的事情是重复的,他们都是在从事着前所未有的创造性事情。
韶光上,只要软件还在做事客户中,程序员们的创造过程便不会停滞,软件系统仍旧持续迭代更新,以便形成更好的市场竞争力。
这些都与传统建筑工程的模式大相径庭。一幢建筑自它完成之后,所有的变革便紧张集中在一些软装的细节上,很少会再发生剧烈的变动,更不会持续地发生变动。但软件却不是这样,它从出身之初到其生命周期结束,自始至终都在迭代变革,从未停滞。
以是,光靠把控软件工程师的水平,依赖他们自觉保障的工程质量,是远远不足的。软件工程是一项非常繁芜的系统工程,它须要依赖一个能够掌控全体工程全局的团队,来方案和勾引全体系统的演化过程。这个团队便是架构师团队。
软件架构师的职责,并不单单是我们常日理解的,对软件系统进行边界划分和模块规格的定义。从根本目标来说,软件架构师要对软件工程的实行结果卖力,这包括:按时按质进行软件的迭代和发布、敏捷地相应需求变更、戒备软件质量风险(避免发生软件质量事件)、降落迭代掩护本钱。
△推举专栏《许式伟的架构课》,点击文末「阅读原文」试读或订阅
那怎么才能发展为精良的软件架构师?软件架构师和软件工程师最根本的差别又在哪里?我认为关键在于四个字:掌控全局。
掌控全局,便是对系统的全貌了然于胸。从传统的建筑工程来说,建筑架构师并不单单要会画建筑图纸,而是要对地基构建、土质、材料、建筑工艺等等所有有可能影响建筑质量的成分都要了然于胸。
掌控全局,并不是无所不能,不是成为全栈,怎么做到掌控全局?核心在于对知识脉络的体系化梳理。这是架构能力构建和全面提升的关键。这种方法不单单是在软件工程中适用。比如学数学,我个人非常喜好做的一件事情是自己去推导书上所有的公式。每一个公式我都亲自推导而来。
这样做的核心意义在于,我在考试测验从 0 开始去构建全体精彩纷呈的数学天下,全体数学发展史在自己的笔下重新演绎了一遍,来龙去脉清清楚楚。有时候你乃至会推导出还没有学到的公式,但是在后面学到了。这种体验非常有趣而又让人知足。
是的,掌控全局的条件是:在自己心中去重新构建出全体天下。在这个过程中,你不须要一上来沉浸在某个技能的实现细节(除非它影响了你对这个天下构建过程的理解),但是你知道全体天下的脉络,知道全体天下的骨架。
这个时候,你对这个天下的觉得是完备不同的,由于,你已经成为了这个天下的构建者。
而架构的实质,不也正是构建和创造么?
作为一个软件行业的从业职员,我们可能打仗各种各样的技能书本。有讲编程措辞的、讲数据构造与算法的、讲操作系统的、讲编译事理的、讲架构设计的,还有领域技能类的(比如数据库、存储、大数据、人工智能之类)。
大部分类别的技能书,多多少少都能够找到几本经典著作。但是,架构设计很可能是个例外,当我想推举一本经典的架构设计书时,我并不能非常快速地想到该当推举哪本。
从个人履历来说,我打仗过的与架构干系的图书,大概有如下这些分类。
架构思维类。这类图书常日从一些著名的架构理论讲起,比如开闭原则、单一职责原则、依赖颠倒原则、接口分离原则,等等。这种图书的问题在于过度理论化。打算机科学归根到底属于工程技能类,实践第一。设计模式类。这一类图书则一下子进入架构的局部细节,每个模式的来龙去脉并不随意马虎理解。就算理解了某个详细的模式,但是也很难真正做到活学活用,不知道还是不知道。分布式系统架构设计类。这类图书常日从做事真个通用问题如同等性、高可用、高并发寻衅等话题讲起,讲大型业务系统面临的寻衅。这些知识是非常有代价的,但无法延伸到通用业务架构,对大部分企业的架构实践并不具备真正的辅导意义。重构类。这类图书紧张讲怎么把坏代码一步步改进到好代码。我认为这是最实用的一类。但在没有精良架构师主导的情形下,大部分公司的代码不可避免地越变越坏,直到不堪重负末了不得不重写。实际上,一个模块最初的地基是最主要的,基本决定了这座大厦能够撑多久,而重构更多侧重于大厦建成之后,在做事于人的条件下怎么去修修补补,延长生命。这些架构类的图书并没有达到我个人的期望。由于它们都没有揭开架构设计的全貌。我自己在职业生涯中前后大概做过十几次的架构类演讲,这也是我最为重视、重复次数最多的一类演讲。但同样地,这样零散的演讲对付通报架构设计思想来说,仍旧远远不足。
以是一贯以来,我就心存着这样一个动机:“要写一本不一样的架构类图书”。这个念想,也正是本日这个专栏的由来。
这个专栏的内容组织算是我的一次考试测验。它和本日你看得到的大部分架构书并不太一样。我基本上环绕着两个脉络主线来展开内容:
如何从零开始一步步构建出全体信息天下;在全体信息天下的构建过程中,都用了哪些主要的架构思维范式,以及这些范式如何去利用于你平常的工程实践中。这两大脉络相辅相成。首先,我们通过还原信息天下的构建过程,剥离出了全体信息天下的核心骨架,这也是最真实、最伟大的架构实践案例。其次,我们结合这个伟大的架构实践来谈架构思维,避免因对架构思维的阐述过于理论化而让人难以理解。
我想,每个程序员都有一颗成为架构师的心。以是,从内容设计来说,我希望这是一个门槛最低的架构设计专栏,也希望它可以帮助到想成为架构师的初学者,达成自己的目标。
在行文上,我会只管即便避免深奥的术语,尽可能以普通易懂的笔墨,来描述信息天下构建者们的所思所想。如果你在阅读的过程中碰着了理解上的障碍,非常欢迎你来给我留言,我将尽可能地根据你的反馈,做出必要的调度。
如果你已经成为了架构师,我也希望可以为你规避一些缺点的履历。在过去的事情经历里,我看到不少架构师都会方向于把架构看作一项纯技能性的行为。他们的事情流程是这样的:产品经理根据用户的需求做出产品设计,然后架构师再依据产品设计给出实现,也便是软件的架构设计方案。
在我看来,这实在是个误解。架构关乎的是全体繁芜的软件工程,它关乎实现它的人,它又因团队的能力而异。同时,架构也关乎用户需求,作为架构师,我们不但是要知道当前的用户需求是什么,我们还要预测需求未来可能的变革,预判什么会发生,而什么一定不会发生。预测什么不会发生最为主要,只有做到这一点,才能真正防止架构的过度设计,把大略的事情繁芜化。
谈了这么多,那么,该当若何发展为精良的软件架构师?我想,一靠匠心,二靠悟心。架构设计并无标准答案,但我仍旧希望把我这些年的所思所想分享给你,更希望这些内容能给你一些启示。
专栏上新 | 《许式伟的架构课》
限时优惠 ¥99,原价 ¥129 ,订阅立减 ¥30,
点击文末「阅读原文」订阅专栏。
【彩蛋】
订阅专栏后,添加运营小姐姐微信 dididisco ,回答关键词「老许」,可领取「精选111本架构师文集」。
点击「阅读原文」订阅专栏: