上篇文章“浅谈架构设计(上)”主要参考了《软件构建实践(第2版)》和一些前辈的经验总结,谈了架构设计的一些定义、作用以及表现形式,相当于架构设计的“形”,但是架构师在做实际的架构设计时,背后的思考逻辑是什么,形成这些成果的过程中是怎样考虑的,这些问题在上篇文章中并不太容易看出。
在本文中,我想通过讨论若干问题,来说明我所认为的架构设计工作背后的思考逻辑,这其中既有几位前辈架构师的观点,也有我自己的经验之谈。(特别说明:架构师要关注的东西很多,我这里挂一漏万,在本文中没有提及的,并不代表不重要;我之所以强调下文中的若干问题,是因为我认为这些问题对我当前所在领域的架构设计工作具有指导意义。)
1、架构设计和架构师的目标
想清楚架构设计所追求的目标是什么,这一点很重要。对于架构师自己来说,心里要清楚,架构设计所追求的是什么,架构设计要解决哪些问题,架构设计要关注哪些因素?对于组织和团队来讲,要知道对架构师的要求是什么,出了哪些问题后需要通过架构设计来解决、而不是其他什么手段。
在系统设计与架构设计的对比中已经指出,架构设计是为了“能够给出一个框架能够更好的实现所有需求”,那么怎么理解这个“更好”?下面分几点说说我的理解。
1.1 技术上,好的架构要能够保证系统满足相应质量属性的目标要求。
在《软件构建实践(第2版)》中指出,架构阻止或支持软件系统的质量属性实现。用户对质量属性等级的期望和/或设计师所选择的质量属性的等级是架构早期的关键决策的输入,也就是说,质量属性的需求影响着架构的选择、现有技术选择等关键技术决策。而一旦架构的关键决策完成了,架构一旦成形,那么这个系统所能达到的质量属性的等级几乎就已经确定了,如果想在此架构基础上提升质量属性等级,往往意味着较高的代价甚至只能调整架构。
当然有一点需要说明的是,有些质量属性之间是相互制约的,架构并不能使所有方面的质量属性需求都得到满足。所以架构设计的一个关键问题是要对该系统的质量属性需求进行识别和权衡,要选择出若干个最看重的质量属性需求,然后以此为目标进行架构设计。
综上,应当在架构设计过程中选中若干关键的质量属性需求,将其视为整个系统的质量属性目标,所设计出来的架构应当满足这些质量属性的要求。这应当是架构设计的最基本要求。
1.2 管理上,好的架构能够支持将一个复杂系统的开发工作分解为若干个小组工作,并使开发工作更容易、更有效率。
在第1条确定了技术目标后,接下来是达成该技术目标的开发过程。
好的架构首先能够支撑对整个开发工作的分解,以便于分工到各小组进行开发。大家都知道架构是对复杂系统进行模块化分解,分工的基础是模块划分;那么模块的功能单一、内聚和边界清楚,就决定着该模块的开发小组的职责单一、沟通界面清楚。
如果模块的功能不单一,那么就对这个开发小组的人员能力要求多,工作界面宽,工作流程也很难标准化。长此以往会带来团队建设和人员稳定的问题:人员的工作能力构建成本高,尤其是新员工需要花更多时间来学习和了解,人员替换成本高,团队成员需要在不同工作间切换,效率低、感觉累。“模块功能单一”在组织层面的好处是降低了对人员的技能要求。
如果模块的功能边界不清楚,那么就意味着模块之间的功能定位不清晰,当设计一个新功能时常常造成开发人员的困惑和纠结。比如对于一个新功能需求,不知道是该在模块A做还是模块B做,或者不知道这个新功能该如何在模块A和B之间做分解,最终的结果就是模块A的开发小组与模块B的开发小组各持己见、工作迟迟无法开展;对两个开发小组来讲,如果没有明确的架构原则来支撑,工作量常常就成为最主要的考量因素,让谁做都觉得自己吃亏;相互都说服不了对方的最后结果就是上架构评审会决策。“大事小事都要上架构评审会、不上会就无法分解工作,架构师忙于决策各种问题”是模块边界不清楚的另一个具体表现。
虽然以上这些问题不可能绝对的完全避免,但是一个好的架构应当致力于尽量避免这些问题:
当遇到一个具有通用意义的新需求出现分解上的分歧时,要讨论这类需求对架构的影响:或者修正架构原则、以确保这类需求在后续再次出现时能够快速达成一致而无需再决策;或者进行架构变更,以使架构能够满足这类新需求的开发,目标仍然是当该类需求再次出现时能够快速达成一致。
因此,一个模块边界定义清晰的架构,可以使各开发小组更容易的对功能进行分解,确定自己的工作并聚焦,从而避免开发小组间的扯皮和减少上会决策,提高开发效率。对一个架构师来说,应当致力于搭出这样一个利于工作分解、减少分歧的架构,并让各个开发小组明白无误的理解它,以便使各个开发小组能够有序的并行工作并支撑系统目标的最终达成,即使出现一些分歧,也能够快速决策、提高整体工作效率。
模块化的架构设计带来的另外一个好处是并行开发和渐增构建。模块边界清晰后,两个开发小组可以快速对功能进行分解并确定模块间的接口是否受影响,若不受影响则可直接并行开发,若需变更接口,则确定接口后两个小组的开发工作可以并行而不相互依赖,等到系统集成测试时做联调就可以。渐增构建可以使开发团队逐步构建和交付系统,降低整体工作复杂度和风险,实现渐增构建的前提是模块间的依赖关系要明确,尤其不能有环形依赖。并行开发和渐增构建带来的好处是开发和交付效率的提升。
本文系转载,作者:HW-YB
篇幅过长,楼下继续~







































苏公安网备 32011402010933号