软件设计与架构
软件设计与架构关注软件系统如何被构建成组件和连接器,职责如何分解,以及设计决策如何满足功能需求和质量属性。
用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
Learn & explore
视频即将推出
Definition
软件设计是定义系统架构、组件、接口和其他特征的过程,而软件架构是构成系统元素、它们之间的关系以及两者属性的结构集合。
Scope
此领域涵盖架构风格和模式(分层、客户端-服务器、微服务、事件驱动、管道与过滤器);设计原则,如模块化、信息隐藏、内聚、耦合和关注点分离;面向对象和基于组件的设计;设计模式;架构质量属性及其权衡;以及用于表达设计的UML等建模符号。
Sub-topics
Core questions
- 系统应如何分解为模块和组件?
- 哪种架构风格最能支持所需的质量属性?
- 耦合和内聚等设计原则如何指导良好的结构?
- 如何通过可重用模式解决重复出现的设计问题?
Key theories
- 信息隐藏和模块化
- Parnas认为,模块的定义应隐藏可能在稳定接口后发生变化的设计决策,从而使变化局部化;这一原则是模块化、封装和低耦合的基础。
- 架构质量属性和权衡
- 架构受性能、可修改性、可用性和安全性等质量属性驱动;由于这些属性之间存在冲突,架构本质上是通过策略和模式指导的权衡推理。
- 设计模式
- 重复出现的设计问题有众所周知的命名解决方案——创建型、结构型和行为型模式——它们捕捉了专家实践,并为面向对象设计提供了共享词汇。
Clinical relevance
架构决策在后期最难更改,并且最强烈地决定了系统的质量属性,因此良好的设计和架构可以降低长期维护成本,实现可伸缩性和演进,并塑造团队组织。
Evidence & guidelines
ISO/IEC/IEEE 42010 标准化了架构描述,而SWEBOK软件设计知识领域以及《Software Architecture in Practice》等参考文本提供了共识性指导。
History
模块化设计原则由Parnas在20世纪70年代早期阐明。面向对象设计和设计模式在20世纪80年代和90年代成熟,软件架构在20世纪90年代中期随着Shaw和Garlan的工作而成为一个独立的学科,服务导向和微服务风格则在21世纪初和21世纪10年代相继出现。
Debates
- 单体架构与微服务架构
- 将系统构建为单一可部署的单体还是许多独立可部署的服务,这一问题广受争议;微服务以分布式系统复杂性为代价提供了独立的扩展和部署,因此正确的选择取决于规模和组织结构。
Key figures
- David Parnas
- Mary Shaw
- Len Bass
- Erich Gamma
- Grady Booch
Related topics
Seminal works
- parnas1972
- gamma1994
- bass2012
Frequently asked questions
- 设计和架构有什么区别?
- 架构关注最高层次的结构和更改成本最高的决策——主要组件、它们的交互以及系统范围的质量属性——而设计涵盖这些组件更详细的内部结构;两者的界限是重要性而非明确的划分。
- 设计模式为何重要?
- 模式捕捉了重复出现的设计问题的成熟解决方案,并为工程师提供了共享词汇,使设计更容易沟通、推理和演进;它们是需要审慎应用的指导,而非强制性的食谱。