一文一点|你是如何理解软件架构设计的

Posted 程序架道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文一点|你是如何理解软件架构设计的相关的知识,希望对你有一定的参考价值。

这是【一文一点】的第5篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。

1、

当谈到软件架构的时候你不能只想到spirng、springmvc、mysql,你也真不应该想到它们,虽然它们是你落地的载体。

 

至少你不能先想到它们,软件架构不依赖这些框架或者具体的数据库,这些东西统统需要延后,延后。

 

正像《架构整洁之道》序言中余晟老师讲到的,架构设计是一门复杂的学问,要综合考虑编码、质量、部署、运维、排障、升级等各种因素,并作出权衡。

 

所以,架构设计就不是指首先想到的那些框架,那么的简单了。

 

软件架构应该要独立于框架、独立于UI、独立于数据库、独立于任何外部库。

 

2、

如果是想要描述架构的话,可以用4+1视图,这里的4是指逻辑视图、实现视图、进程视图、部署视图,这里的1是指场景。

 

             

图来自网络

 

刚才我们也提到了软件架构设计是一件比较复杂的事情,包含了很多种因素,同时呢,它不仅要满足用户的功能需求,某个场景的用户需求流程是怎样的,对应到设计中应该是什么样的模式和设计流程。

 

还要满足系统的可靠性、可用性、安全性、性能、容量等架构的质量属性,这往往会涉及到基础平台、框架应用、甚至还有硬件。

 

这就需要多方合作才能最终落地实现架构的设计目标,这中间会有软件研发人员、测试人员、运维人员、产品人员、业务运营人员的参与,也就是说我们设计的软件架构包含了他们所有人员的参与。

 

有这么多角色参与的工程,如果有一个框架或模式能够把它们串起来,是再好不过的了,而4+1视图就可以起到这样的作用。

 

4+1视图可以让架构师自顶向下的去分解架构设计,还可以形成合理的抽象,从而将我们刚才说的这么多角色”拉在一起“。

 

因为要使得架构落地必须有他们的参与和协同工作。

 

3、

另外,在做架构设计的时候,我们也不能仅仅高谈阔论,总聊"高大上"的理论,虽然那些理论可能是有用的。

 

一个被架构设计指导的软件项目总归是要通过一行行的代码实现的,"脱离了一行行的代码,脱离了具体的细节设计,架构设计就无从谈起"。

 

以至于在《架构整洁之道》一书中,提到,软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关,甚至还有说到,“对于代码,应无情地做重构”。

 

所以你在架构设计的时候还要引入一些模式或者原则性的编码指导,比如SOLID原则。

 

除此之外,我们还要考虑架构的可扩展性,毕竟一个落地的架构,不仅要满足用户、系统的一时的需求,还要满足后面他们持续的需求。

 

如果你要设计一个弹性、"皮实"的架构,至少你要考虑这三方面的事情,避免过度设计,向内依赖设计、面向失败设计。

 

说了以上这么多,到底什么是软件架构设计呢,正像《架构整洁之道》这本书描述的。

 

所谓软件架构,就是你希望项目在一开始就能做对,但是却不一定能够做的对的决策的集合。

 

为什么这么说呢,架构设计,架构设计,虽然有【设计】俩字,但架构真不是"设计"出来的,而是演进出来的。

 

4、

优秀的软件架构也不是一成不变的,需要经过不断的打磨,迭代改进。

 

             

 

在《演进式架构》这本书里面,在如何构建可演进式的架构方面给了我们指导性建议,从三方面考虑:适应度函数、增量变化、适当耦合。

 

我们首先来看什么是适应度函数。

 

按照这本书中介绍的,适应度函数是进化计算中的一个概念,进化计算有多种机制,通过对每一代软件进行小的变更使方案逐渐成形。

 

另外书中也给了一个明确的定义:架构的适应度函数为某些【架构特征】提供了客观的完整性评估。

 

那什么是架构特征呢。

 

系统被提的要求可能不太相同,比如有的系统要求高吞吐量和低延迟,有的系统要求安全性要高,有的系统要求自我故障恢复的能力要强,这些呢,都是架构的特征。

 

举一个比较容易理解的适应度函数的例子,就是功能测试,一个测试用例可以看成是某一个单一功能的适应度函数,增量开发应该在测试成功的约束下进行变更。

 

而适应度函数这个概念,则就很好的体现了这些架构特征的保护,有关适应度函数更多的理解大家可以去详细阅读这本书。

 

再来看增量变化。

 

架构应该支持增量开发和增量部署。

 

增量开发也就是,我编写了一个功能的代码,可以立马提交,并可以被进行功能测试,性能测试。

 

增量部署的意思可以理解为AB发布,比如书中举了github的例子,每次功能重构上线,github都先随机挑选1%的用户进行旧功能与新功能同步执行,持续4天输出结果相同时,将用新代码替换掉旧代码。

 

这是一个非常值得借鉴的思路。

 

最后,来看适当耦合。

 

我们反对强耦合,但世界上却没有不耦合的系统,你试想,如果你的系统之间没有一点耦合,企业系统还怎么对外统一提供服务呢。

 

因此,我们才一直强调的是弱耦合,过渡耦合使得架构难以演进,但我们要保持适当耦合。

 

 

关于适应度函数、增量变化、适当耦合的内容,同时也参考了 知乎上面的这篇文章https://zhuanlan.zhihu.com/p/133517172

 

5、

软件设计如果又从宏观视角来看的话,包括需求、研发、运维,那么其中维护的成本又是最高的。

 

另外呢,还有一条真理性的警句:世上没有不出问题的系统。

 

那么致力于高可用上的成本也是不小的隐性成本,甚至有的公司专门对此有对称职位,比如google就有SRE工程师,全称是 Site Reliability Engineer 网站可靠性工程师。

 

好了,我又写完一个知识点,希望对你有一点帮助。


以上是关于一文一点|你是如何理解软件架构设计的的主要内容,如果未能解决你的问题,请参考以下文章

架构和框架的区别,你是如何理解的?

一文读懂微服务架构设计

软件架构分解LinkedIn日志系统GWT HTML5支持——架构周报

软件架构师如何工作

小议软件架构设计要点

软件架构师如何工作