组件构建原则是用来指导如何将各个组件组合成独立完成部署的软件系统,组件聚合是常用的组件构建方法。
在软件架构设计中,组件聚合是指将多个相关的组件组合在一起,形成一个相对独立的、可交付的子系统或模块。它的优点:
其中有三个基本原则:
REP 是一个关注重用性的原则,他要求在设计组件时,尽可能地提高组件重用性,减少重复劳动。
核心思想是将通用功能和行为封装为可重用的组件,以便在多个应用场景下使用
软件复用的最小粒度应等同于其发布的最小粒度,一般会要求组件的开发由某种发布流程来驱动,并且有明确的版本号,如果没有,就没有办法保证被复用的组件之间能够彼此兼容。比如某数据平台的通用数据结构处理组件等。
CCP 是一个关注耦合性的原则,他要求在设计组件时,尽可能地降低组件之间的耦合度,提高组件的独立性。
CRP 是一个关注内聚性的原则,他要求在设计组件时,尽可能地提高组件的内聚性,减少组件内部的复杂度。
这里的组件聚合原则和前面的 SOLID + CRAP + LoD 原则的区别是什么?
基于对 REP 、 CCP 、 CRP 三个原则的理解,会发现这三个原则之间彼此存在着竞争的关系: REP 和 CCP 是黏合性的原则,基于这两个原则会让组件变得更大,但 CRP 原则是建议拆分原则,会尽量让组件变小,三者共存,如何取舍?
这时候就需要架构师在这三者之间找到平衡,在团队能力水平、业务场景复杂度、发布流程等因素的动态变化中,根据团队状况进行动态调整。
下图是三大原则的张力图,张力线描述了忽视对应原则的后果。
从图中可见:如果架构设计师过于关注 REP 和 CCP,会导致太多不必要的发布。
总体来说,要在三者之间取得平衡,早起可能需要偏向 REP 和 CCP,后期可以逐渐朝着 CRP 的方向发展。这对架构师的要求是很高的,需要架构师在实际的项目中灵活运用这些原则,结合具体情况做出合理适当的决策。
组件构建原则指导我们如何设计组件,而耦合原则是用来指导我们如何设计组件之间的关系。耦合是指组件之间相互依赖的程度,耦合度的高低直接影响可维护性、可扩展性和可重用性。
在软件架构设计的过程中,需要定期对系统进行耦合度评估,如果出现高耦合,可以按照以下路径进行优化:
组件耦合原则对于软件架构的健壮性和可维护性至关重要。通过遵循控制组件耦合原则,软件设计者可以建立灵活且可扩展的系统,提高系统的稳定性和可维护性。在设计和开发过程中,不断优化耦合关系,确保系统在不同阶段都能够维持良好的设计质量。
在进行软件架构设计时,识别复杂度是非常重要的一环。以下是一些方面,可以帮助你在架构设计中识别和评估复杂度:
深度了解业务需求、功能需求和非功能需求是进行架构设计的输入,也是评估复杂度的关键因素。为了更好地分析需求,建议你把需求分解为更小的部分,有助于更好地理解需求和评估复杂度。
架构设计时,一般场景中包括以下关键元素,而对这些关键元素的特性、关系和交互方式是评估复杂度的关键:
分析不同元素之间的交互同样,也是架构设计过程中进行复杂度评估的一个核心点。比如数据传输、调用方法、发消息等。架构设计时,需要对这些交互方式可以进行识别和评估,比如频率、数据量、时效性等。
对于任何系统来说,高性能和可扩展性是基本要求。性能维度主要考虑 RT 、 QPS 等指标。
扩展性是关注你设计的系统架构是否能适应业务增长和新技术引入。
安全是一个系统架构必须考虑的重要因素,包括系统身份验证、用户授权、数据隐私合规等。
同时安全性还需要考虑潜在的攻击面、敏感数据的暴露程度和合规要求。
对现有系统进行架构重构和升级时,是一定要了解现有系统的技术债务,比如代码结构、代码规范、代码质量、技术栈的兼容性、测试覆盖率等。这对系统的架构重构和升级至关重要。
团队成员的技术能力、技术经验和熟悉的技能、工具、语言等都会影响架构设计的难度和复杂度。
在设计过程中识别可能的风险因素,这些风险都会成为架构设计的复杂度,需要对识别出来的风险制定和实施有效的风险管控策略。
采用迭代式的研发模式,从每个迭代中学习并及时调整。
通过收集反馈和监控指标,更好地理解复杂度并进行优化。
确保有清晰的文档记录,包括需求文档、技术文档和代码注释。
有效的沟通可以确保团队对架构设计方案有一致的理解,降低复杂度。
综上所述,通过全面考虑这些方面,才能够更好地识别和评估软件架构设计中的复杂度,并采取相应的优化策略。
在你现在参与或者负责的系统中,从架构设计角度都有什么样的复杂度?
在软件架构设计过程中,对可能出现的风险因素进行识别、评估和解决是至关重要的,以下是一些常见的架构设计风险和相应的识别与解决方法:
过度的需求变更可能导致架构设计的频繁调整,增加开发成本
在架构设计阶段,充分了解业务需求,进行详尽的需求分析和业务建模,以减少对需求变更的敏感性
技术债务可能由于技术决策的短期利益而产生的长期问题。比如选择不合适的编程语言、框架等会都会增加架构设计的复杂度和维护成本
在架构设计阶段,对现有系统的技术债务进行评估和管理,确保技术决策考虑了长期影响
性能是考虑一个软件产品系统的重要指标,如果性能不行,你的架构再厉害都是无稽之谈。性能风险包括响应时间慢、吞吐量低、高并发处理能力不足、大数据处理能力差等
在架构设计阶段,需要对产品系统的性能进行充分评估和优化,确保设计出来的架构满足性能需求
业务和技术都是不断往前发展的,要求系统架构是能够适应业务的增长和新技术的引入。如果架构不具备扩展性,就会导致系统架构无法适应未来的业务增长和新技术的引入
在架构设计时,设定目标,确保架构在一定时期内不需要变动,并具备在三年内通过配置化、灵活扩展的方式支撑业务变化的能力
安全性一般包括身份验证、授权、数据隐私合规、资金安全等,这些一旦出现风险会导致数据泄露、系统被攻击、资金亏损等
在架构设计阶段,要对业务场景进行全面的分析,对安全层面的风险进行充分评估和应对方案的设计,确保系统可以具备强安全性
缺乏维护性和可读性会导致系统难以维护和更新
在架构设计时,要注重代码的清晰结构、规范和文档记录,确保系统具备良好的维护性和可读性
与其他系统或组件集成时可能出现的问题,如接口不兼容、数据格式协议不一致等
在架构设计阶段,充分考虑集成问题,定义清晰的接口和协议,进行充分的集成测试
成员技能不足、沟通不畅、进度管控不当等问题可能导致项目失败
在项目管理中,注重团队成员的培训与技能提升、有效的沟通机制、合理的进度管控和风险管理
在你现在参与或者负责的系统中,从架构设计角度都有什么样的风险?
软件架构设计是一个综合性的过程,需要考虑多个因素。需要遵循设计原则、构建原则、耦合原则,识别复杂度和风险以及有效地解决风险,是构建可靠、灵活和可维护性软件系统的关键。同时,通过团队的不断学习、迭代和有效的沟通,可以更好地适应业务和技术的变化,确保软件系统的长期健康。