17. 非功能目标的设计环节

为了提高综合客户满意度及不同质量属性的满意度,必须考虑计划和设计产品时的不同质量属性。 -- Stephen H.Kan,《软件质量工程》

质量属性很难定义,但它们经常可以区分产品是只完成了其应该完成的任务呢,还是使客户感到满意。 ......优秀的软件产品反映了这些竞争性质量属性的优化平衡。 -- Karl E.Wiegers, 《软件需求(第二版)》

作为决策者,架构师的工作影响着项目的成败,乃至公司的发展。我们须谨记:千万不要做“四拍”型的决策者。

决策时拍脑袋--就这么定了
指挥时拍胸脯--保证没问题
失误时拍大腿--我怎么没想到
追查时拍屁股--老子不干了
架构设计实践中,面对非功能需求目标时是最容易犯“拍脑袋”这个经典错误的。接下来介绍非功能目标的设计思维及其实践要领。

17.1. 非功能目标的设计环节简介

在我们当中,有不少人一厢情愿的任务:只要所开发的系统完成了用户期待的功能,项目就算成功了,但这不并不符合实际,忽视包括质量属性需求在内的非功能需求是很要命的。

为什么不少软件产品推出不久就要重新设计(美其名曰“架构重构”)?往往不是因为系统“不能用”,而是由于系统架构“太拙劣”--从难以维护、运行速度太慢 、稳定性差,甚至宕机频繁,到无法进行功能扩展、易遭受安全攻击等,不一而足。由此看来,软件的质量属性需求是不容忽视的,否则在大量的成本投入之后,很可能落得“失败”或“赔钱”的结果。

然而,软件的质量属性需求很“飘”,常常令架构师难以把握。如果缺乏足够的方法指导,即使勉强制定了设计决策也会觉得缺乏信心。

所以,解决问题的要害在于:如何使很“飘”的非功能目标“明确定义下来”。分析如下:

  • 需求决定架构,架构设计的成果已属于解决方案的范畴
  • 架构设计的过程是从“需求域”向“设计域”过度的过程
  • 目标很飘,就意味着根据诸如“高性能”等非功能需求直接作出“设计决策”跨度过大了
  • 需要一种“过度技术”来承上启下,它能笼统的非功能目标明确化,它能帮助架构师做出更有针对性的设计决策

它就是场景技术

一句话,非功能目标的设计是以场景技术为核心手段、以目标-场景-决策表为思维工具,致力于支撑非功能目标的理性设计过程。

17.2. 实际意义

作为架构师,有了非功能目标设计环节相关方法的指导,将获得如下几点优势:

  • 设计更有针对性
    • 设计贵在务实,贵在有针对性。试想,如果世界上没有“高性能”这个高度简练、高度抽象的词,用户会怎么描述描述他的非功能要求?他一定会说一大堆“如果......则需要......”式的场景出来!
    • 所以,将一个目标明确为N个场景,是一种回归本源的做法,可以使架构师的设计更加有针对性、更加有效。
  • 可操作性强
    • 懂得了以场景为核心的非功能目标设计思维,架构师就知道“力往哪儿使”了。他们通过研究开发、维护、使用、变更等环境可能遇到的具体情况,不断发现场景,评估场景,做出决策......这是一个可操作性很强的思维实践过程。
    • 其实所谓方法,就是帮着你将经验更系统的、更充分的使用起来的思维框架。所以,对有经验的架构师而言,他们的思维更有序、经验的应用更有理有据、面对更大的系统时信息更足。
    • 当前,很大程度上,确定支持非功能目标的设计决策的过程是“只可意会”的。例如阅读《架构设计文档》时很难搞清楚“为什么”,这给架构新手的成长造成了莫大的障碍。而现在,非功能目标的设计思维明确化了、可视化了、可操作化了,有利于架构新手学习、理解和掌握。
  • 避免过度设计
    • 单凭经验为高质量属性而设计很容易造成过度设计,即引入的很多抽象和机制是不必要的,平白增加了设计复杂性。以“目标-场景-决策”表为工作的非功能目标设计方法将场景视为“一等公民”,使架构师很容易对非功能场景进行评估,通过权衡场景发生的几率、支持场景带来的价值、遗漏场景的代价等因素,来理性决定是否应支持该场景。
  • 便于系统升级时参考
    • 当系统架构不能适应新要求时,往往要对架构进行重构,此时软件架构师常犯的毛病是过于强调系统架构的缺点,而将过去的架构设计全盘否定,这样可能造成设计出的新架构的解决了新问题的同时也失去了已有的优点。而如果将“目标-场景-决策”表文档化,则有利于避免上述问题。

17.3. 业界现状

软件行业发展到今天,依然比较年轻。一个有趣的印证就是我们经常拿自己的行业和其他行业类比 -- 今天类比建筑行业,明天类比汽车行业,后台类比拍电影。

我并不能确定把架构师和哪个职业相类比最适合,但或许,架构师最嫉妒的职业是拳击。人家的目标永远正确:打到对方。而架构师,却要面对纠结在一起的“需求”--需求不是一个攻击目标,而是一堆攻击目标,而是一堆可能不够明确、相互矛盾的目标。昨天、今天、甚至明天,都会有相同的故事在上演:笼统界定的“非功能目标”让软件工程师深感困惑...... 这就是现状。

在这种状态之下,架构师不应“坐等”明确的需求,而是应该运用目标-场景-决策表等方法主动出击,设计成更有针对性的架构。

17.4. 实践要领

17.4.1. 场景思维

非功能需求支持是否到位,关键是靠场景思维的应用。归纳了场景思维在非功能目标设计中的重要性。

17.4.2. 纵穿环节

有著名厂商任务,架构设计的“第几步”应该是非功能考虑,这种观点是危险的。

非功能需求不可能是“速决战”,它必然是“持久战”,连编码都会影响到性能动能非功能属性,更何况概念架构设计和细化架构设计呢?所以架构师必须注意,非功能目标的考虑是纵穿架构师设计始终的环节。

下一节:软件的质量是设计出来的,这是公认的基本观点。 -- 邓成飞, 《软件工程管理》

很少有需求文档能够以一种可测试的细节捕获系统所有的质量需求,现实情况是设计师通常不得不填补空白并协调冲突。 -- Len Bass, 《软件架构实践(第2版)》

核心竞争力是什么?答案是:能力的稀缺性。

接下来介绍的目标-场景-决策表方法,可以帮助架构师快速建立非功能目标的设计思维,更理性的应对架构师普遍感到棘手的非功能支持问题,提升自己的核心竞争力。