This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,140 @@
<audio id="audio" title="20 | 从务实的角度,给你架构设计的重点知识和学习路径" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/34/80/34c0f88a9a1f5a39df52b032e1f15c80.mp3"></audio>
你好,我是王庆友。
到目前为止,我们已经讲完了业务架构和技术架构的相关内容,相信你现在对架构有了更深入的理解。
学习架构呢,要掌握的东西有很多,你是不是开始担心自己一辈子都学不完呢?其实,我们也不需要一下子铺开学习所有的架构技能,重要的是把控好学习的节奏,在适当的时间学习适当的内容,我们可以结合实际工作,一步步地成长。所以今天这一讲,我想给你提供一些架构学习的重点方向和路径建议。
## 架构原则汇总
在技术架构篇,我针对系统的高可用、高性能、可伸缩和低成本,给你介绍了很多的架构设计原则,不同的原则对应着不同的目标,这里我把这些架构原则和目标汇总成一个表格,来帮助你更直观地了解它们。
<img src="https://static001.geekbang.org/resource/image/92/23/92ff7493c75f34d4085702dcb4a57323.jpg" alt="">
限于篇幅,这里我挑选几个原则来重点说下:
- **可回滚/可禁用**
**可回滚原则**确保了系统可以向后兼容,当系统升级出现问题的时候,我们可以回滚到旧版本,保证系统始终可用。
不过有些时候,系统回滚很困难。举个例子,如果数据库的新旧表结构差异很大,除了回滚代码,我们还要回滚数据库,这样操作起来往往需要很长时间,系统的可回滚性就比较差。所以在设计时,我们要尽量考虑数据库修改和代码的兼容性,并提前做好系统回滚的预案。
**可禁用原则**要求我们提供功能是否可用的配置,在系统出现故障时,我们能够快速下线相应的功能。比如说,新的商品推荐算法有问题,我们可以通过程序开关禁用这个功能。
- **使用成熟技术**
作为开发人员我们都很想尝试新技术但我们知道新的技术还没有经过充分的验证它往往会存在很多隐藏的Bug。
所以,作为架构师,我们在做方案设计的时候,一方面,要从系统的稳定性出发,尽量选择成熟的技术,避免因为新技术的坑而导致系统可用性出现问题;另一方面,选择成熟的技术也意味着选择了团队熟悉的技术,这样学习成本低,落地快。
- **使用同质化硬件**
我们在做硬件选型的时候,要尽量选择相同的硬件和相同的配置。
比如说对于服务器我们选择同样的CPU和内存配置以及同样的操作系统版本这样我们更容易通过统一的自动化脚本对节点进行配置对系统做水平扩展时也会更加容易。
## 架构落地过程
这些架构原则都是我们要深入理解,并且在实践中要逐渐运用和掌握的。那么下面,我就带你来了解一下架构的具体落地过程,帮助你更好地理解架构师的职责和技能要求。
简单地说架构师的职责就是负责设计架构并跟踪架构的实施过程解决过程中出现的疑难问题确保架构顺利落地。在第1讲“[架构的本质](https://time.geekbang.org/column/article/200825)”中,我和你介绍过架构师的能力模型,比如抽象思维、平衡取舍、沟通能力等等。接下来,我就结合架构的落地过程和架构师的能力模型,来具体说下架构师是如何开展工作的。
<img src="https://static001.geekbang.org/resource/image/c8/f7/c8ee9fd90ed76fd4eace41fbf074a8f7.jpg" alt="">
架构师的工作从接到项目需求或者从自己主动识别系统当前的问题开始TA的工作过程可以分为三个大阶段。
首先,架构师要和产品经理或者业务人员沟通,了解业务;和开发人员沟通,了解系统。
了解完系统和业务后,架构师接下来就要设计具体的方案,方案设计要分三步走:
- 首先,架构师针对业务需求,分解相应功能到现有的各个系统,把系统的各个部分串起来,这个第一版的方案至少要能够在表面上解决当前的问题,这样就形成一个草根的方案。
- 然后,架构师要进一步深入思考业务的本质,对现有的草根方案进行升华,比如说,通过抽象,让方案更加通用,可以解决多个类似的或潜在的业务需求,这样,草根的方案就变成了一个高大上的方案,这里很考验架构师的**透过问题看本质**和**抽象总结**的能力,
- 接下来,基于现有的各项约束,比如时间、资金和人员技术能力等因素,架构师要对方案进行简化,把高大上的方案变成一个接地气的方案,以最小的代价实现最大的价值,这里很考验架构师的**平衡取舍能力**。
方案设计好之后,最后还要进行**宣讲**,架构师需要说服相关的人员接受方案,并且在后续的方案执行中,负责跟踪架构的落地,如果过程中有疑难问题,架构师还要协助解决。
所以,我们可以看到,架构师在设计方案时,会有一个反复迭代的过程,最终才能得到一个简约而不简单的方案。并且在方案设计的前后,架构师还需要和大量的人员进行沟通,这些都需要架构师具备宽广的知识面和良好的沟通能力。
## 架构师知识结构
**那么,架构师都需要掌握哪些具体的技能呢?**这里我给你提供了一个简化的架构师技能图谱,可以帮助你循序渐进地学习这些架构技能。
<img src="https://static001.geekbang.org/resource/image/bd/05/bd542ad898f1f060fdbb120d7462b005.jpg" alt="">
首先,作为架构师,我们需要了解**计算机硬件和操作系统**的相关知识它们是负责具体干活的如果对它们有深入的了解我们就能知道系统底层是怎么执行的在做具体设计的时候我们也就可以做各种优化。比如说在设计RPC通讯框架时我们可以通过IO多路复用和内存零拷贝技术来提升服务端并发处理请求的能力。
在这之上就是**具体技术**相关的内容,从浅到深可以分为三个部分:
- 第一部分是**开发相关的基本知识**,比如数据结构和算法、具体的开发语言、常用的设计模式以及开发框架等等,这样你就具备了基本的开发能力。
- 第二部分是**各种中间件知识**,常用的中间件包括数据库、缓存、消息系统、微服务框架等等,对于这些核心中间件,我们不但要了解具体的用法,还要深入理解它们的适用场景。这样你就能写出高效健壮的代码,能够独立承担一个子系统的开发。
- 继续往下深入,你还要学习**分布式系统相关的知识**,包括底层网络和分布式通信技术,这样你就可以了解系统是怎么连接在一起的。除此之外,你还要了解一些周边的系统,比如大数据平台、运维监控系统、接入系统等等,这样,你就可以了解系统端到端的运行过程,从技术架构上保证系统的稳定可用。
掌握了这些技术能力之后,你就可以逐渐往全面的架构师发展了。比如说,你可以结合业务,来设计应用体系,包括数据模型和服务设计;你可以了解各种应用架构模型,知道它们的优缺点和适用场景,能够定义一个良好的应用依赖关系。
再往上,就是成为业务领域专家。在这个阶段,你已经知道如何通过业务拆分,实现业务之间的解耦;如何通过业务抽象,实现业务的扩展和重用。
到最后,你已经对各种架构设计的目标和架构原则都非常了解了,知道面对一个具体的问题,大致都有哪些解决的手段;然后,经过大量的实践,你能够把技术架构、应用架构、业务架构融会贯通,并针对具体情况,对架构的各个目标做良好的平衡。当然,作为架构师,你还要和一系列的人员打交道,这时候就需要你培养更多的**软技能**,能把复杂的架构问题以简单的方式表达出来。
## 架构师成长路径
现在你已经清楚了作为一个架构师TA需要具备什么样的知识结构。如果你想成为一名架构师在不同的成长阶段你还需要学习不同的内容。这里我以Java为例进一步给出学习的重点内容给你提供更具体的参考。
<img src="https://static001.geekbang.org/resource/image/36/64/36078cf0b5c469893c0be152b69d8d64.jpg" alt="">
第一个阶段是**初级开发阶段**。
在这个阶段,你需要深入学习数据结构和算法,并且一定要深入掌握单体应用的分层架构,因为这是架构设计的基础。
另外对JDK的一些核心类你不能仅仅停留在使用层面而是要深入研读源代码了解它的内部设计。这样你就知道如何开发一个高效的程序如何进行各种代码级的调优。
第二个阶段是**高级开发阶段**。
首先,你需要非常了解**设计模式**,每个设计模式都可以看做是一个小型的架构设计,这里面有很好的设计原则和抽象思维,你在做系统设计时可以借鉴它们。
然后,你需要非常了解**核心的中间件**包括DB、微服务框架、缓存和消息系统要清楚地了解它们的适用场景比如消息系统的削峰、解耦和异步知道如何对它们进行调优以及了解它们都有哪些常见的坑等等核心中间件是我们做技术选型的基础。
同时,你要深入掌握**数据库设计和服务接口设计**,了解它们的最佳设计实践,它们承载了系统核心的业务数据和业务逻辑。
最后,你需要进一步**研读源码**源码是活的教材它包含了大量实用的设计原则和技巧。这里我建议你选择一些开源的开发框架和RPC通信框架去深入了解它们内部的实现原理比如Spring和Netty。
第三个阶段是**架构师阶段**,成为技术专家。
首先你需要深入了解网络通信比如说网络分层和HTTP/TCP协议还有各种常见的RPC通讯框架了解它们的特性和适用场景这样你在设计分布式系统时就能够进行合理的技术选型。
然后是了解底层系统包括JVM、操作系统和硬件原理再往上延伸到系统的接入部分了解常见的负载均衡特性和用法这样你可以对整体的系统有个透彻的了解把各个环节可以很好地衔接起来。这里我特别建议你去读下Java和JVM的规格说明书了解Java的底层设计。
最后你需要熟练掌握各种设计工具和方法论比如领域驱动设计和UML了解常用的架构设计原则这样你就能够结合业务选择合适的应用架构和技术架构并进行落地。在这一阶段对你总的要求就是能够从**端到端的角度**进行业务分析和系统设计。
第四阶段是**大师阶段**。
在这个阶段,你需要对架构的各个目标都非常了解,除了业务系统设计,你还要对运维和监控有深入的认知。同时,你需要了解业界的架构实践,跟踪技术的发展趋势,如果出来一项新技术,你可以比较准确地对它进行定位,把它纳入到自己的能力体系当中。
另外,在这个阶段,你也已经通过大量的实践,培养了很好的软技能,比如沟通能力、项目管理能力等等。那么最后,你就能做到技术和业务的融会贯通,可以平衡各种架构目标,设计非常实用和接地气的架构,并保障它的顺利落地。
## 架构师境界
你可以发现,架构师的能力是一个逐渐提升的过程,如果从架构师的境界来看,由浅到深可以分为四层:第一层看山不是山,第二层看山是山,第三层看山不是山,第四层看山是山。
这是一个螺旋式上升的过程,那么它究竟是什么意思呢?
<img src="https://static001.geekbang.org/resource/image/8d/7f/8dee8d15ad007764e3f781a3d8cdbe7f.jpg" alt="">
- 刚接手项目的时候,你对业务还不太了解,经常会被业务方冒出的术语弄得一愣一愣的,如果把现有问题比作山,那就是横看成岭侧成峰,你根本摸不透,此时**看山不是山**。
- 经过业务梳理和深入了解系统以后,你能够设计出一个简单的方案,把各个系统串起来,能解决当前的问题,对当前的这个“山”能够看清楚全貌,此时就做到了**看山是山**。但这样的方案往往设计不够,只能解决表面问题,碰到其它类似问题或者问题稍微变形,系统还需要重新开发。
- 通过进一步抽象,你能够发现问题的本质,明白了原来这个问题是共性的,后续还会有很多类似的问题。然后你就对设计进行总结和升华,得到一个通用的方案,它不光能解决当前的问题,还可以解决潜在的问题。此时,你看到的已经是问题的本质,**看山不是山**。但这样的方案往往会过度设计,太追求通用化,会创造出过多的抽象概念,理解和实现起来都特别困难,过犹不及。
- 最后回到问题本身,你能够去除过度的抽象,给出的设计简洁明了,增之一分嫌肥,减之一分嫌瘦,既能解决当前的问题,又保留了一定的扩展能力,此时问题还是那个问题,**山还是那个山**。这样的方案在了解问题本质的基础上,同时考虑到了现状,评估了未来,不多做,不少做。
你可以对照这四个境界,来评估你当前的架构能力,不断地提升对自己的要求。
## 总结
今天,我汇总了常见的技术架构设计原则,它们都是实践的总结,你在做架构设计时,可以参考这些原则,在项目中采取相应的手段来实现架构目标。值得注意的是,在做具体的架构设计时,你需要对设计进行反复迭代,才能最终得到一个高性价比的方案。
针对架构师的成长,我也给你提供了相应的知识结构和可行的进阶之路,希望你能够一步步成长,最终实现自己的理想。
**读万卷书,行万里路。**架构师的成长尤其如此,架构没有速成之路,我们先要“读万卷书”,学习各种架构需要的技能,然后“行万里路”,通过大量的实践把架构知识变成架构能力。
**最后,给你留一道思考题:**一个架构方案从调研到设计再到落地,你觉得最困难的地方是什么?
欢迎在留言区和我互动,我会第一时间给你反馈。如果这节课对你有帮助,也欢迎你把它分享给你的朋友。感谢阅读,我们下期再见。

View File

@@ -0,0 +1,100 @@
<audio id="audio" title="结束语 | 和你聊聊我的架构心路历程" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e6/34/e68e5ea914f52d05eadbea1ad0d28134.mp3"></audio>
你好,我是王庆友。
今天是专栏的最后一讲,我和你分享的核心内容马上就要结束了,我是感到既欣慰,又觉得如释重负。
说实话,架构的话题不好写,内容涉及面比较广,既要有理论的高度,又要有实践的细节,才能把这个话题讲得透彻。我看到很多的同学在评论里反馈课程的内容很干,都在反复地吸收和体会,这说明课程的内容对你有价值,相信你也有了很多的收获。在这里,我也很感谢你一直保持着学习的热情。
不知你有没有感觉到,整个专栏的内容既很虚又很实,这里“虚”指的是理论的高度概括,“实”指的是接地气的案例介绍。所以在这里,我想再和你简单地分享一下专栏的写作思路,帮助你更好地理解和使用这个专栏。
## 专栏的写作思路
整个专栏一共有7讲是理论篇这个也是专栏的主体内容框架如下图所示。
<img src="https://static001.geekbang.org/resource/image/d5/16/d50f83ee90b87ff3cf525f24274f9616.jpg" alt="">
<li>
第1讲“架构的本质”是专栏的总纲通过架构的本质和架构分类体系介绍让你迈进架构认知的大门。
</li>
<li>
<p>然后,针对业务架构和技术架构,分别有一讲内容深入介绍它们的定位,帮助你从源头区分这两种架构,**业务架构聚焦人脑如何理解业务**,针对的是业务性功能;**技术架构聚焦电脑具体如何干活**,针对的是系统性功能,这两者的目标以及处理手段都是不同的。<br>
(补充说明:应用架构更多的是业务架构的具体落地,在专栏中,我把应用架构和业务架构糅合,比如说[第4讲](https://time.geekbang.org/column/article/205832)“电商平台架构是如何演变的”,实际上讲的是应用架构。)</p>
</li>
<li>
最后,针对每种架构的核心目标,也都有一讲内容专门分析每个目标的实质和实现手段。
</li>
通过这7讲偏理论性的课程内容我希望帮你建立对架构的体系认知让你能从总体上清楚架构设计要做什么以及如何做。以后当你碰到更多的架构相关内容都可以往这个架构框框里面套进一步丰富和完善这个体系。
除了相对体系化,整个专栏还有一个特点就是**案例丰富**在我刚才说的偏理论的7讲内容当中就有大量的案例片段。此外针对4个核心的架构目标我也分别提供了3个完整的实际案例让你能够从多个角度理解实现架构目标的手段你也可以通过这些案例深入体会架构设计的具体过程。
你可以发现,无论是理论,还是案例部分,我都是用自己的语言来描述,和你分享的是我自己对架构的理解。如果你在架构上有比较多的经验,可以马上领悟到要点;如果一下子消化不了,你也可以多读几遍,相信你每次都会有新的收获。
## 我的架构实践
我在成为架构师的过程中,其实也是自己一路摸索过来的,现在回头再看这个过程,我觉得有些知识和技能,对于架构师的成长非常重要,这里我想和你分享一下,希望能对你有所启发。
- **GoF设计模式和J2EE设计模式**
我对GoF的23个设计模式和J2EE设计模式都作过深入了解**GoF设计模式的粒度比较小**,针对的是类级别的关系定义;**J2EE设计模式的粒度比较大**,针对的是企业级系统设计。
这些设计模式都很经典它们提炼了不同业务场景下的解决方案让你能够很体系地理解问题是什么What怎么解决的How以及为什么要这么做Why。通过学习这些设计模式我培养了良好的抽象设计能力也很好地了解了具体的设计手段。
- **JVM/Java规格说明**
我看过很多遍JVM/Java设计规格说明书通过理解语言的底层机制我对Java的上层特性有了更透彻的了解。比如对于Java的垃圾收集如果你很清楚它的原理和运行机制你就知道如何优化代码以及当系统出现OOM的时候如何去快速定位和解决问题。
- **源代码阅读**
对源代码的阅读也很重要, 我读过很多JDK核心类的源码比如说String、HashMap和Future等等我也深入阅读过一些开源框架比如CXF框架、Hessian通信协议等等。
通过阅读源码,你可以深入了解相应的内容,还可以通过理论结合实际,深入掌握设计技巧。
- **分布式通信**
我从开发一路走过来接触过很多分布式通信协议比如最早的DCOM、RMI、CORBA和Web Service再到后面百花齐放的Hessian、gRPC、Thrift等等至于具体的开发框架我也深入了解过Axis、Dubbo、Spring Cloud等等。对这些技术的优劣点和适用场景的系统了解和学习让我在设计分布式系统时能够选择合理的应用之间的集成方式。
- **数据库和API设计**
数据库设计和接口设计是架构设计中很重要的内容。
我做过大量的数据库设计它代表了系统数据层面的抽象。如果你能合理地定义数据模型那么系统的业务逻辑和性能基本也就确定了。另外我也曾经做过比较完整的Open API平台这些接口设计经验让我掌握了如何通过适度的抽象保证接口的复用。
- **1号店架构设计**
我在1号店承担了很多大项目的设计有些是偏业务的比如针对基础业务的服务化改造有些是偏技术的比如订单水平拆库和灰度发布系统。通过这些架构实践把我很多的架构知识变成了实际的架构能力并且通过方案的整体设计让我可以把原有各个部分的能力整合在一起。
总而言之,你可以看到,我的成长经历虽然没有一个明显的主线,但还是隐隐有迹可循的,大致可以遵循以下过程。
### 打造基础能力
首先,你要对架构设计的各个要点有深入的了解,包括数据结构和算法、设计模式、数据库和服务设计、分布式通信等等。对于这些要点,你不能仅仅停留在使用层面,而是要深入理解它们的内部机制,这样你就打造了扎实的基础能力。
### 建立体系
在了解了各个设计要点的基础上,你需要对架构设计建立体系化的认知,能够从整体上认识架构,清楚架构的设计目标、设计过程和设计手段。你之前是从各个局部来考虑问题,现在要变为从整体的角度来考虑问题。在架构设计上,我们宁可要精确的模糊,也不要模糊的精确。
### 纳入体系
有了整体的认知体系以后,你就有了存放架构内容的框架。然后,你可以从**广度和深度**两个方面,来不断丰富和完善你对架构的认知。
### 实践运用
最后,通过大量的实践,你就可以把原先储备的架构知识,以及各项基础能力有效地串接起来,最终打造完整的架构能力。
架构师的能力,既涉及到业务和技术,又涵盖了它们的广度和深度。在成为架构师的过程中,你可以积累各项能力,把以往的知识和经验串起来,这其实就相当于一个银行,你可以不断地储蓄,然后进行整体输出,这是一个很好的个人成长和发挥价值的途径。
## 写在最后
最后,我想说的是,这是技术最好的时代,我们有很好的技术可以选择,有很开放的技术分享氛围,有很好的技术回报。但这也是技术最差的时代,技术太多,变化太快,我们还需要不断地学习。
想要成为信息时代的弄潮儿,除了努力,你还需要有方向,我希望这个架构专栏,可以成为你学习架构的指路明灯,帮助你更好地成长。
好了,这就是我作为一个架构老兵,想和你分享的经历和思考。专栏的正文更新到这里就要告一段落,但是更新的结束并不意味着我们之间就要切断联系,之后呢,我还会针对整个专栏的内容,给你一套系统性的结课测试题,让你可以检测一下自己的学习成果。并且,我还会继续回复你的留言,如果你对于架构有新的问题和思考,也欢迎继续和我一起交流。
在本讲的结尾,我还为你准备了一份毕业问卷,题目不多,希望你能抽出几分钟时间填写一下,我非常希望听听你对这个课程的意见和建议,欢迎你在问卷中畅所欲言,期待你的反馈!
[<img src="https://static001.geekbang.org/resource/image/e4/1b/e4db89b21afe1d2e62e7e515e96f771b.jpg" alt="">](https://jinshuju.net/f/pYpw4i)
我是王庆友,感谢你一直以来的学习和坚持,也感谢你的留言和反馈,相信对你对我,这都是一段非常有意义的成长经历,让我们一起享受架构学习的乐趣吧,我们江湖再见!