16. 困扰已久的非功能问题

非功能需求的满足程度对软件项目的成功非常关键......非功能需求分为质量属性和约束两大类。质量属性是软件系统的整体质量品质--所谓整体品质,就是往往和大多数功能都有关,而不是仅仅表现在某个功能“内部”。志宇约束性需求,它们是架构设计中必须遵循的限制,并有可能“衍生”出质量属性需求和功能需求。 -- 温昱,《软件架构设计》

那么非功能需求方面常见的问题是什么呢?......很多《需求规格说明书》中,会通过一个名为“设计原则”的小节来说明非功能需求,列出诸如高可靠性、高可用性、高扩展性等要求。但是很多开发人员根本不去看它,因为这样的定性描述是没有判断标准的,因此这种信息传递是无效的。 -- 徐峰, 《软件需求最佳实践》

软件架构设计为什么这么难?因为架构设计并不是简单的处理“纯粹的技术问题”,而是要面对“技术与业务的关系问题”。最终,要求架构师不仅懂业务,而且能理顺复杂的技术和业务之间的关系。

从面向业务的需求,到最终的面向技术的软件系统,要跨很大的鸿沟。软件架构设计就是要完成从面向业务到面向技术的转换,在鸿沟上架起一座桥梁。软件架构师根据各种需求进行架构设计,最终的软件架构包含了结构、协作、技术等方面的重要决策,为系统化的开发活动建立了基础。

接下来,请大家思考如下几个问题:

  • 架构师是否应该懂需求?
  • 功能需求、非功能需求都要懂吗?
  • 生搬硬套需求标准是“懂需求”的应有表现吗?
  • 应对如何传达非功能目标的具体需求?

16.1. “拜托,架构师不是需求分析师”

16.1.1. 故事:小魏请教老沈

为数不少架构师都认为自己是技术人员,职责是“知道需求之后设计出架构”。比如,老沈。

老沈是资深架构师,在某公司的设计部任职。一次,他首先的小魏充满虔诚的捧着几道题目来请教他。

答案分别为ABCABCD

老沈扫了一眼,皱起了眉头,语重心长的说:“小魏,你的理想不是要当首席架构师吗,怎么研究其需求来了?小伙子不要朝三暮四哟!”

小魏的表情充满了惊讶。稍过片刻,他鼓起了十二分勇气问道:“沈老师,你的意思是架构师不必深入研究需求?”

老沈道:“拜托,懂点儿软件工程好不好,现代软件工程讲究角色分工和团队合作,架构师不是需求分析师.....”

16.1.2. 探究:架构师必须懂需求

其实,除非特别简单的系统,否则架构师不能“吃透”需求,必然造成最终的系统无法很好的满足需求。但业界普遍存在的现实是:许多架构师的需求功底太差,输在架构设计的“起跑线”上。当然,架构师也是一大堆“苦衷”:

架构师不能“吃透”需求,的确出人意料。但是既然大部分企业为架构师安排了“技术晋升路线”,既然许多架构师也把自己当“纯粹的技术人员”,既然架构师必须研究“时髦技术”否则就被程序员看不起,既然设计模式和UML还在“排队”,需求吗就算了,那么架构师不能“吃透”需求,也就在情理之中了。

调侃归调侃(其实不无道理),但笔者一致认为:精通需求,是对架构师最基本的要求之一,不了解需求是现在许多架构师职业发展道路上的瓶颈。

值得强调的是,需求分析师和架构师这两个角色要掌握的需求知识并不完全一样。经典的观点是认为架构师应掌握的需求知识是需求分析师的一个子集,其实不然:

  • 例如,之前所讲的“不同需求影响架构的不同原理”,需求分析师可以不去研究。
  • 再例如,《软件工程的事实与缪误》中指出:“ 从需求转入设计时,因为制定方案过程的复杂性,会激增出大量的衍生需求(针对一种特定设计方案的需求)。设计需求是原始需求的50倍之多。

总之,架构师必须懂需求。虽然无须研究诸如需求捕获等技术,但需求类型、需求影响架构的原理、质量属性间的互相影响关系都是必须精通的。

16.2. “敢说ISO 9126不对,真牛”

16.2.1. 故事:小冯与小汪的争论

小冯和小汪争得不可开交。小冯是项目经理,他说:“不要随意扩大需求的Scope,更不要搞需求镀金,因为这些不仅意味着成本增加,还可能造成工期延误。”“是的。可是......”小汪是架构师,他的话说了半截就被打断了。小冯抢着说:“所以,既然客户仅要求‘高可靠性’,我们就不能把它换成‘持续可用性’,更不应该随意扩大需求的范围,把安全性、可管理都加上。别忘了,成本超了、工期误了,可都是我这个项目经理扛着。”“像这种直接影响企业正常运营的系统,而不仅仅是‘可靠性’。”空气中已经有点火药味了,但小汪哪里肯退让,手指着培训教材上的一页继续坚持,“再请问,分布式的系统如果安全性差,可靠性怎么可能保证呢?!”

答案分别是:A、ABCD

“《ISO 9216》的一级质量属性里就没有‘持续可用性’,而是‘可靠性’。” 小冯说。“国际标准就不会错吗?”小汪豪气冲天。“敢说ISO 9126不对,真牛......”

16.2.2. 探究:死抱需求标准,还是务实应变

科幻故事总是轻松的,现实中的故事却或多或少让人感到压力。作为架构师,你是否认为:架构师重视需求 = 熟悉领域知识和业务?对,但不全面 -- 因为还要研究质量属性需求。那么,你是否又认为:懂质量需求 = 了解《ISO 9126》呢?

我们的观点:重视标准,但在一定程度上必然要对之进行调整、扩充以适应实践要求 。例如《ISO 9126》将质量属性描述成“树”,但实际上应该是“网”,安全性影响可靠性就是一例。

16.3. “我说的很清楚,架构要灵活”

16.3.1. 故事:狮子说清了,绵羊没搞定

拿破仑说,“一只狮子率领一群绵羊的队伍,可以打败一只绵羊带领一群狮子的部队”。听到这话,许多软件企业可能觉得很高兴--因为不少公司都大量存在“一只狮子领导一群绵羊”这样的团队。

但是有这样的一个故事,就发生在“狮子带领一群绵羊”这样的团队。

卢总资历深厚,水平挺高。此时公司立项研发一款新产品,卢总亲自担纲。架构设计前期,他对几个年轻的架构师一再强调,架构一定要设计的灵活。......产品很快进入开发阶段,但是几次需求变更的来临,卢总发现架构的灵活性较差。

最后,卢总说“我的团队水平不高啊,我说的很清楚,架构要灵活,但最终还是过于僵硬。”

但真的只是团队的水平不高吗?

16.3.2. 探究:交流质量要求,如何做到“说的明白、听得清楚”

为什么说,卢总的分析只对了一半呢?因为卢总要求的“灵活性”这个目标过于笼统,既然年轻的架构师水平偏弱,不能讲架构灵活的要求“落地”也就不奇怪了。

那么交流质量要求,如何做到“说的清楚、听得明白”呢?使用“场景化”描述。

例如,通过分析将“灵活性”更明确的诠释为“客户端既可以采用.NET实现 又可以用Java实现”等一系列具体场景,对“狮子领导的绵羊团队”有效开展架构设计工作是大有裨益的。

16.4. 展望本部分的后续内容

3个故事讲完了,呈现在我们面前的是层层递进的3个要求:

  • 架构师必须懂需求
  • 需求 = 功能需求 + 非功能需求,架构师应同时关注两方面的需求,而且对质量的理解不应仅限于《ISO 9126》等标准
  • 业界的同行们在交流非功能需求的时候,普遍存在“说不透”的现象,架构师应有意识的克服

接下来,我们将着重介绍“场景”技术,以及“目标-场景-决策”表这种务实有效的、以满足非功能需求为目标的设计思维方法。

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

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

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

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