架构设计是一门解决复杂问题的艺术
设计任何复杂系统时,软件架构是不可或缺的。下面从两个方面理解什么是软件架构。
一:软件架构为谁而设计
1)为用户而设计
为什么要开发某个软件系统呢?因为要给用户使用,或辅助用户完成一些工作,帮助用户管理某些信息,或给用户带来娱乐体验。用户要功能也要质量。
2)为管理人员设计
软件变得越来越复杂,单兵作战不再普遍,取而代之的是团队开发。而团队开发又反过来是软件开发更加复杂,因为现在不仅仅要面临技术复杂性的问题了,还有管理复杂性的问题。
开发人员之间的依赖,源自他们负责的程序之间的依赖。要理清并管理人员协作,就应该搞清楚系统一级“模块+交互”的设计,搞清楚架构。可见,架构是开发管理的核心基础。例如从架构设计的角度分解模块,把不同模块分给不同小组分头开发。
3)为开发人员设计
设计架构,就是要交由开发人员编程,最终实现。例如可扩展性,可重用性,可移植性是软件开发人员和负责升级维护的开发人员最关心的。架构的好坏直接影响开发人员的工作,使开发更顺畅抑或更艰难。
总之,架构应当为项目相关的不同角色而设计。
二:软件架构视图
架构视图是一种设计架构,描述架构的核心手段,架构要涵盖的内容和决策太多了,超过了人脑“一蹴而就”的能力范围,因此采用分而治之的方法从不同视角分别设计。然后通过视图和不同角色的人进行交流和传递设计思想。
最常用的是逻辑架构视图和物理架构视图。
1)逻辑架构
软件的逻辑架构规定了系统有哪些逻辑元素组成以及这些逻辑元素之间的关系。具体而言,组成软件系统的逻辑元素可以是逻辑层,功能子系统,模块。下图是一个邮件系统的逻辑视图。
2)物理架构
软件的物理架构可以反映出软件系统动态运行时的组织情况。物理元素可以是进程,线程,以及作为类的运行时实例的对象等,而进程调度,线程同步,通信等则进一步反映物理架构的动态行为。
例如,随着分布式系统的流行,物理层和分布相关。通过将一个整体的软件系统划分为不同的物理层,可以把它部署到分布在不同位置的多台计算机上,从而为远程访问和负载均衡等问题提供了手段。下图是一个邮件系统的物理视图