欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

轻架构(一):缘起--架构的核心目标是什么

程序员文章站 2022-07-03 16:45:49
...
 

 

 在现在这个时代,架构变得异常复杂,也异常艰深。轻架构这个概念,也就是让架构正本清源,回归本来面目。那什么是架构的本来面目呢?

 

架构的英文是Architecture,本身是一个从建筑行业学习来的词语,用在软件设计和开发这个领域,主要是指“系统在其环境中的最高层概念”(IEEE98),架构的任务指:建造一个系统所作出的最高层次的、以后难以更改的,商业的和技术的决定。这样的决定是有关系统设计成败的最重要决定,必须经过非常慎重的研究和考察。

 

         用一个人类社会的事情来比喻,当然,我们也常常说到,一个公司的“组织架构”,例如我们建立了一整套从总经理、副总到部门经理、助理和普通职员的组织关系,建立了这些关系之间工作指派、工作汇报和工作总结的机制;我们把公司划分为几个不同的部门 分工协作,各个部门完成自己的工作目标,从而完成正规公司的目标。

 

         上面这段话其实体现了架构的几个基本点,第一是分层以及层次之间的关系;第二是分模块以及模块之间的关系,第三个基本点是划分好各个层次、各个模块的职责。各个模块、层次各司其职,系统良好运转,架构的作用隐含于其中。人们看得见各个层次和模块,倒是忘记了这个架构本身

 

         在上面的类比中,我们可以看到。其实公司的目标,都是各个层次、各个部门来完成的,但是却没有任何实际问题是由架构本身来解决的,架构本身没有提供任何“真正”的价值,但是架构却又是最最关键的,一个不好的架构,使各个层次、各个部门之间相互掣肘,内耗严重,效率极差,解决什么问题也困难,达到总体目标就很难。

 

再来看软件架构,与上面的公司架构一致,它要完成一个系统的复杂度切分,架构本身不解决系统的任何问题,只是把系统的复杂度切分到不同的子系统或模块或层次中中。架构关心的是系统整体的耦合度。模块切分时的平衡、复杂度切分时是否合理。

 

之所以在这个时候提出这个概念,是因为架构这个词被用得太泛滥。架构这个概念包含了太多的内容,以至于架构师成为设计开发过程最累的角色,负担了太多太多的东西。而且,因为事情太多太杂,导致根本性的任务做的不好,今儿严重影响产品质量,产品常常变成大杂烩。所以,有必要正本清源,把纯粹架构的内容抽离出来说。

 

抽离出来之后,架构本身应该不解决任何问题域的问题,只是使问题域的每一个问题都更容易找到解决者。或者为每个问题,提供了一个寻找解决者的途径和方法,尽可能使问题都能更快速、更顺畅的找到解决者。架构为一个组织(一个软件)内部的控制传递、数据传递提供了好的通道和路线,但本身不发送任何控制和数据。

 

例如,设计房子画出了设计图,但是画图的设计师不卖建筑材料,不卖建筑工具。在一个公司内部,组织部门的人并不解决客户的问题。

 

轻架构的目标:

         (显式)

     系统层次和模块划分

         系统层次之间和模块之间的关系和通信

         维护概念完整性和一致性

         (隐式)

         架构复杂度的评估、模块复杂度的评估

         后续设计的规范

         技术选型、技术路线的选择

        

 

纯粹架构对系统后续的设计和开发的重要性是不言而喻的,这并不是说其它部分不重要。架构的重要,在于在切分系统时,维护概念完整性和概念一致性;大体上平衡的分配系统的复杂度和工作强度,使系统能够顺畅的进行设计和开发。

最最关键的是,把所谓模块的高内聚低耦合、最大限度设计和代码重用、用哪些设计模式、采用SSH还是SSI、Tomcat还是Jetty、设计共用(通用)组件内容从架构中剥离出去。不是说 不重要,而是这些与架构无关。

 

这样来做的话,架构似乎变得容易了,很多人都会这么看,其实不是这样的。这样来拆分,其实是希望架构师能够真正的处理好本职的工作。

 

架构师的本职工作是什么?有人说“设计高质量的产品”,这句话太通用,因为这是产品设计和开发的根本目标,也是团队的整体目标。而架构师在过程中所承担的最重要的任务,其一是维护产品的概念完整性和一致性。产品一个版本一个版本的前进,新特性不断加入,不断吸收新的需求,纳入新的概念,在这个过程中,保持产品始终围绕着一个或一组概念(否则产品会被演变成拼盘和大杂烩,变成一种技术元素的堆砌),实在不容易。因为这个是产品的长远利益,所以在以短平快为目标的团队中直接被无视,固然有一种无奈,但毕竟不是一种好的选择。

其二是分层和模块划分,这个会从根本上影响系统的可扩展性、可生长性,而之后的模块设计和代码,对可扩展性和可生长性的影响是很小的。当然,效率、安全性等非功能特性,都是应该在分层、分模块时要慎重和仔细考虑的。

 

这两个本职工作,其实也就是软件产品的设计开发过程中,最最核心价值的所在,最最本质的点,最最需要付出艰苦的脑力劳动的地方。是设计开发活动中最最需要花心思花时间和精力的关键点,关键中的关键。正是因为架构师很多都是百炼成钢,经验丰富,才会担当这样的重任。

 

         反过来想,为什么现代软件开发过程会被比喻成“焦油坑”?为什么设计行业内架构这个职位这么不好做?我觉得现在设计开发过程中,架构师的职位定义是含糊不清的。从人上,救火队员,项目经理、老兵等等;从事情上,开发底层接口、编写设计文档或伪码、到客户处沟通需求这些是架构师的工作职责。很少有人意识到上边提到的架构师的根本职责、本职工作。因为这个认识不到位,所以使架构师没有把“架构”这件事做好,带来的问题就是产品质量低下,可扩展、可延续、可生长特性非常差,人力资源浪费,高投入低回报。