什么是软件体系结构?

软件体系结构过程涉及获得并分析客户要求,然后生成能满足客户需求的软件设计。成功的软件设计必须平衡因相互冲突的要求而产生的必然取舍,遵循设计原则和不断变化的良好实践技术;并完善现代硬件、网络和管理系统。强大的软件体系结构涉及大量的理论和实践课题经验,以及将看似模糊的业务方案和要求转换为扎实、实用的工作设计所需的构想。

软件体系结构包括定义能满足所有技术和业务要求的结构化解决方案,同时优化性能、安全性和可管理性等常见的质量特性。它需要根据各种因素作出一系列决策,而每项决策都会对软件的质量、性能、可维护性和全面成功产生相当大的影响。

现代软件很少是相互独立的。至少在多数情况下,它会与数据源(如公开软件用户使用的信息的企业数据库)交互。通常,现代软件还必须与其他服务和网络功能交互,以执行身份验证、获取和发布信息,并提供整合的用户体验。没有适当的体系结构,软件可能很难(甚至无法)部署、操作、维护并与其他系统成功集成,且无法满足用户要求。

我们可以将软件体系结构看作一款软件必须实现的目标与作为代码的实现细节之间的映射。将体系结构合理化可确保要求和结果之间的最佳匹配。架构合理的软件将在最初要求的参数内执行指定的任务,并以最大限度提高性能、安全性、可靠性及众多其他因素的方式来实现此目标。

在最高级别,体系结构设计应公开系统结构,但隐藏实现细节;实现所有用例和方案;设法解决所有利益相关者的要求;并尽可能满足所有功能和质量要求。

软件体系结构为何重要?

随着用户对其应用程序的期望不断提高,对现代软件的要求也日益复杂。简单的独立式桌面应用程序在大多数业务和商业应用情景中已不再能完全满足需求。在我们的互连世界里,应用程序必须与其他应用程序和服务交互,并在云等多种环境中以及在便携式设备上运行。过去常见的整体式设计已被组件化、面向服务的软件所取代,后者使用框架、操作系统、运行时主机和网络来实现几年前闻所未闻的功能。

这种复杂性不仅会影响设计,还会影响软件的部署、维护和管理。软件的总拥有成本 (TCO) 目前主要是由部署后成本组成。架构良好的应用程序能够减少部署应用程序所需的成本和时间,从而最大限度地降低 TCO,同时使应用程序持续运行,根据不断变化的要求更新应用程序并解决问题。它还将简化用户支持和管理。

为了取得成功,软件还必须满足几项关键标准。它必须提供安全性,使应用程序及其数据不受恶意攻击和意外错误的损害。它必须稳定可靠,从而尽可能减少故障和相关成本。它必须在所需参数内执行以满足客户需求,如最长响应时间或特定的工作负载能力。软件必须易于维护,以尽可能降低管理和支持成本;还必须具有足够的可扩展性,以顾及随时间推移而必然需要进行的更改和升级。

上述所有因素都涉及某些取舍。例如,通过复杂加密实现最安全的机制将会影响性能。实现范围广泛的配置和升级选项又会使部署和管理更加复杂。此外,设计越复杂,实现起来所需的成本也越高。优秀的体系结构将力求平衡上述因素,针对特定方案产生最佳结果。

软件架构师的工作内容是什么?

软件架构从一组要求开始。这些要求的表达形式可能是图表、流程图、模型或记录的软件必须执行的操作任务列表。通常,客户或合作伙伴还会表达一些不太精确的要求,如外观或某些用户界面执行常见任务应采取的方式。此外,这些要求还必须包含新软件将与之连接的现有软件、系统、硬件和网络的相关信息;以及部署和维护计划等其他因素,当然还包括项目的可用预算。

软件架构师必须考虑客户的需求。不过,“客户”这一常用语通常包含三个相互冲突的职责领域:业务要求、用户要求及系统要求。业务要求通常定义一系列因素,如业务流程、性能因素(如安全性、可靠性和吞吐量)以及预算和成本限制。用户要求包括软件的界面设计、操作功能和易用性。系统要求包括硬件、网络和运行时环境功能和限制。图 1 显示了上述不同要求的不同之处,因此架构师必须设法实现一款适合重叠区域的设计。

典型客户的相互冲突的要求
图 1 — 典型客户的相互冲突的要求

软件架构师都有各自的方法,用来收集和分析要求并定义相应的体系结构。不过,他们通常需要回答的问题包括“用户将如何使用应用程序?”,“如何将应用程序部署到生产中并加以管理?”,“应用程序有哪些质量特性要求(如安全性、性能、并发性、国际化和配置)?”,“如何设计灵活并可随时间推移加以维护的应用程序?”,以及“有哪些架构趋势可能会在目前或应用程序部署后对应用程序产生影响?”

最后一个问题既有趣又很重要。优秀的软件设计不仅能在目前满足客户要求,而且在可预见的将来也能如此。这会影响架构师必须作出的以下相关决策:硬件、组件、框架、运行时平台、管理软件系统及软件中内置或软件必须与之集成的众多其他功能。

与软件设计和开发领域的多数任务一样,设计体系结构既是一个前期过程,又是一个迭代过程。许多初始任务(如要求分析、技术研究及目标确定)通常在流程开始时进行。下一步是确定设计的关键方案。这些就是软件必须满足的基本要求及软件必须在其中运行的限制。架构师可以通过这些信息生成应用程序的概述。此概述包括高层次的细节,如应用程序类型(Web、手机、桌面或云),部署体系结构(通常是一种分层设计,其组件通过硬件和网络边界通信),需要遵循的适当体系结构风格(如 n 层、客户端服务器或面向服务),以及最适合相关方案的实现技术。

自此,架构师可以开始生成候选设计,满足之前确定的高层次要求和最重要的要求。然后会针对关键方案对该设计进行审查和测试,通常会结合客户提供的反馈及试用或测试版本,以确保提供最佳解决方案。这在首次迭代过程中是不可能的,但随着这个循环过程的反复进行,设计将集中于要求和关键方案。图 2 显示了这种迭代方法。

迭代体系结构设计过程
图 2 — 迭代体系结构设计过程

随着设计变得更为精细,并确定了单个任务和组件,架构师就可以在每个阶段进一步完善和补充细节。例如,确定体系结构风格和部署方法后,架构师即可作出分层和组件之间通信的相关决策。这可能涉及根据目前和将来的要求选择协议,并预先考虑到即将发布的标准中定义的新技术和功能。

架构师工作的最终产品通常是一组从几个方面定义应用程序的图表、模型及文档,以便在结合使用时为开发人员、测试团队、管理员和管理人员提供实现该设计所需的所有信息。此类信息将说明各个组成部分及应用层的结构和布局;日志记录和验证等交叉关注点的处理方式;测试和部署计划;以及为开发人员、管理员和支持人员提供帮助的文档。

此外,最终设计还必须规定应用程序必须满足的质量特性。这些都是架构师与客户商讨后经过深思熟虑并权衡再三后的结果。其中包括安全要求的定义及安全实现计划,在目标平台上部署时所需的可伸缩性及性能,实现可维护性和可扩展性的方式,以及实现与其他系统的互操作性的功能。

软件架构师需要具备哪些技能?

显而易见,软件架构师必须具备各种软、硬技能。在要求分析和审查阶段,架构师必须与客户合作,与合作伙伴及其他团队成员磋商,并充当经理、用户和系统管理员之间的“中间人”。擅长这些软技能可产生更好的初始计划及一组更准确的要求,从而在以后节省时间和精力。

此外,软件架构师必须具备必需的硬技能,以了解现代软件系统、框架和硬件如何为相关要求提供支持;网络和操作系统因素如何影响设计决策;以及这些领域的趋势和变化如何对设计产生影响。在进行初始要求分析后,软件架构师还必须运用设计模式、通信和消息传送标准、代码功能、安全问题和性能限制方面的硬技能。这一切都要求熟练掌握将用来实现最终软件的各种技术。

当然,软件体系结构还需要会构想。能够看到系统如何结合在一起并进行交互操作,如何对系统进行分区和部署,系统如何与用户交互通常只有在架构师可以在头脑中看到整体解决方案时才能确定。这需要一种组织化的方法和对细节的大量关注,以整理和理解所有的要求和限制,并在流畅而全面的技术设计中逐渐转化这些要求和限制。不过,还需要具备天分和想像力才能直观呈现最终结果,然后通过有条不紊的工作努力实现理想的解决方案。