Simon Brown的《程序员必读之软件架构》从程序员角度叙述了一个架构师和一个程序员之间的区别。希望成为架构师的程序员,推荐可以找来看看。
其中有一个部分很有意思:架构中的质量属性(非功能需求)。目前大家的软件工程,不论是Agile,Lean还是Devops,都强调功能性需求,对于如何在项目中开发非功能性需求的论述都很少。
非功能性需求呢?业务和产品经理技术出身还好,非技术出身对非功能性需求几乎一点感觉都没有。而非功能性需求,对于项目的进度、范围和成本的影响,比表面上看却大得多。现在工作当中,重功能需求轻非功能性需求是一种常态,这也造成从项目一开始就欠了一屁股技术债,只能从生产宕机中一次次交学费。这就是软件架构师在项目当中的需要承担的重要职责,对系统的非功能性需求进行设计!
书中的第22章《质量属性(非功能需求)》很好的介绍了非功能性需求中涉及的种种概念概念。希望可以借此,提供给软件架构师们一个结构化思考的方法。
常见质量属性
1.性能
性能就是一个东西有多快,通常指响应时间或延迟。
- 响应时间:从发出请求到收到响应所用的时间,比如用户点击网页中的超链接或桌面应用程序中的按钮
- 延迟:消息从A点到B点,通过你的系统所用的时间。
就算构建的不是“高性能”软件系统,性能也可应用于Web应用系统、桌面应用系统、面向服务架构、消息系统等几乎所有你要构建的软件系统。
2.可伸缩性
可伸缩性基本上就是软件处理更多用户、请求、数据、消息等的能力。可伸缩性和并发机制密不可分,因此能在相同的时间内处理更多的东西(比如每秒的请求)。
3.可用性
可用性是软件对服务请求的可操作和可见程度。你常会看到用“9”来衡量或指代可用性,如99.99%(四个9)或99.999%(五个9)。这些数字指的是正常运行时间的百分比。另一边是可以容忍的停机时间。99.9%(三个9)的正常运行时间意味着留给计划维护、升级和意外故障的时间每天只有1分多钟。
衡量可用性的数学指标如下:
- 服务平均无故障时间 MTBF(Mean Time Between Failure)
- 服务平均恢复时间 MTTR(Mean Time To Restoration)
- 可用性 = ( MTBF / (MTBF + MTTR)) * 100%
其中 MTBF 的计算方法如下:
4.安全性
安全性涵盖了从认证和授权到数据在运输和存储中的机密性的所有事情。和性能一样,安全性很有可能在一定程度上对你很重要。对于部署到互联网的web应用程序,安全性应该被视为最基础的东西。开放Web应用程序安全项目(OWASP中文站, Open Web Application Security Project)是学习安全性的一个很好的出发点。
5.灾难恢复
如果失去一个运行了你的软件的硬盘、服务器或数据中心,会发生什么?灾难恢复处理的就是这些。如果你的软件系统至关重要,就会经常听到人们谈论业务连续性过程,也就是发生灾难事件时,应该做什么才能保持持续运行的状态。
6.可访问性
可访问性通常是指像W3C的可访问标准这样的东西,指的是如何让视觉障碍之类的残疾人也能使用你的软件。
7.监控
作为企业级应用,对于如何监测软件系统才能确保他们正常运行和满足服务请求,应该有特别的要求。这可能包括将软件与平台特定的监控功能(比如Java平台的JMX)集成,或发生故障时间集中监测仪表发送报警(比如通过SNMP)。
8.管理
监控通常提供一个软件系统的只读视图,有时会有运行时的管理需求。例如,有必要的话,暴露一些功能,使得操作人员能够修改系统运行时的拓扑结构或配置元素,刷新只读缓存等。
9.审计
人们往往需要一个引起软件系统中数据或行为变化的事件的日志(即审计日志),特别是涉及钱的时候。通常这些日志需要捕获与变动由谁做出、什么时候做出以及为什么做出相关的信息。变动本身(即变动前后的值)往往也需要记录。
10.灵活性
灵活性是一个优点滥用和含混的属于,值得是软件执行多个任务,或以不同方式执行某个任务的“灵活性”。一个很好的灵活性需求的例子是非技术人员修改软件内部使用的业务规则的能力。
11.可扩展性
可扩展性也使滥用和模糊的,但它指的是扩展软件使其可以做一些现在还不能做的事的能力,也许是通过使用插件和API。一些产品(如微软Dynamics CRM)允许非技术用户扩展存储的数据和改变其他用户与数据交互的方式)。
12.可维护性
可维护性往往被认为是一个需求。作为软件开发者,我们通常会努力打造“可维护”的软件,但值得我们思考的是,代码库以后将由谁维护。可维护性很难量化,所以应该认真思考我们可以遵循的架构和开发原则(架构规范和代码规范),因为这些是编写可维护代码的驱动。
13.法律法规
有些行业受到当地法律或监管机构的严格管理,导致了与数据保留或审计日志等相关的额外需求。
比如金融行业,要求托管业务的影像保存时间需要达到15年,反洗钱需要保留完整的审计日志等等。这就需要我们在考虑系统设计时候,完善备份清理策略。
14.国际化(i18n)
很多软件系统,特别是部署在互联网上的,不再以单一的语言交付。国际化是指以多种语言交付软件中用户可见元素的能力。
15.本地化(i10n)
和国际化相关的是本地化,是指以符合最终用户文化习俗的方式展现数字、货币、日期等内容。有时候,国际化和本地化统称为全球化。
根据领域的不同,每个软件系统的质量属性不尽相同。比如,金融行业中基于Web的系统的质量属性可能就不同于电信行业使用的软件系统。做好这些质量属性的具体规范,也是架构管理工作中的中重要内容。