“心念不同,判断力自然不同。” -- 严定道,《格局决定结局》
全面认识需求,是生成出高质量软件所必须的“第一项修炼” -- 温昱,《软件架构设计》
Pre-architecture 阶段包括4个步骤,咱们先讲讲前两步。
* 第1步,需求结构化
* 第2步,分析约束影响
4.1. 为什么必须进行需求结构化
需求是有结构的。
许多实践者不懂这一点,更不知道如何“主动运用”这一点。在他们眼中,架构设计要应对的需求往往是又多又乱的,而且遗漏了关键需求也发现不了......
相反,有经验的架构师懂得运用需求的结构。他们能够将复杂的需求集合梳理得紧紧有条,为进一步分析不同需求之间的联系(作为权衡折中的依据)、识别遗漏的重要需求打下坚实基础。
Pre-architecture
阶段要求进行需求结构化,这代表着ADMEMS
方法更贴近一线架构设计的真实实践。
通过形象的“物体归类”的隐喻可以嘉盛对需求结构化工作的理解。
4.2. 用ADMEMS矩阵方法进行需求结构化
那么,需求结构化要怎么做呢?
- 决不能认为《软件需求规格说明书》就是需求的全部
- 运用
ADMEMS
矩阵方法
4.2.1. 范围:超越《软件需求规格说明书》
- 首先,需求文档常常不够全面,所有有经验的架构师都重视需求文档,但不应该“唯需求文档论”。
- 其次,需求变更经常发生,“依赖且仅依赖需求文档”不够聪明,使架构设计工作非常被动。
既然架构师必须“对需求进行理性的、有针对性的权衡、取舍、补充”,那么“作为架构设计驱动力的需求因素”和“供甲方确认的《软件需求规格说明书》”之间就必然不能“划等号”。
所以,架构师要通过需求结构化真正全面的“鸟瞰”需求大局 ,就必须超越《软件需求规格说明书》
还有一个重大意义在于,只有摆脱了对《软件需求规格说明书》的“呆板依赖”,才有可能尽早开始架构设计(参见 3.2.3. 尽早开始架构设计 )。
4.2.2. 工具:ADMEMS矩阵
矩阵,是很多著名方法的核心。
例如:制定公司层战略的方法之一是“波士顿矩阵”,“波士顿矩阵”又称为“市场增长率-相对市场份额矩阵”。
“ADMEMS矩阵”,也称为“需求层次-需求方面矩阵”。
需求层次分析和解释
- 业务级需求 :包含客户或出资者要达到的业务目标、预期投资、工期要求、以及要符合哪些标准、对哪些遗留系统进行整合等约束条件
- 用户级需求 :用户使用系统来辅助完成哪些工作?对质量有什么要求?用户群及所处的使用环境有什么特殊要求?
- 开发级需求 :开发人员需要实现什么?开发期间、维护期间有什么质量考虑?开发团队的哪些情况会反过来影响架构?
需求的三个层次,是站在“不同层次的涉众提出需求所站的立场不同的角度 ”,将需求划分为三种类型。
另外,需求还需要从不同的方面进行考虑。
例如,一个网上书店系统的功能需求可能包括“浏览书目”、“下订单”、“跟踪订单状态”、“为书籍打分”等,质量属性要求包括“互操作性”和“安全性”等,而“必须运行在Linux平台之上”属于约束性需求。
忽视质量属性和约束性需求,常常导致架构师设计最终失败 。
从“需求定义了直接目标还是间接限制”的角度,把需求划分为3中类型,这就是需求的3个方面:
- 功能需求:更多体现各级直接目标要求
- 质量属性:运行期质量 + 开发期质量
- 约束需求:业务环境因素 + 使用环境因素 + 构建环境因素 + 技术环境因素
一句话,需求是有结构的 。而且,需求的结构绝不是“List
”,而应该是“二维数组 ”。
结构化是控制复杂度的好办法。
进行需求结构化之后,会感觉“需求变少了”--其实,需求并没有变少,但复杂度却得到了控制。
另外,进行结构化之后,最大的好处是,可以比原来更轻易发现遗漏需求。
方法的运用,可以参考4.7. 大型B2C网站案例:需求结构化与分析约束影响
4.3. 为什么必须分析约束影响
风险有个烦人的特点:一旦你忘了它,它就会找上门来制造麻烦。
背鳍下面是不是一条鲨鱼?约束性需求中,是不是潜藏了风险因素?
对于架构设计而言,来自方方面面的约束性需求中潜藏着大量风险因素 。
4.4. ADMEMS方法的“约束分类理论”
分析约束影响应该怎么做?
我们先看看这些约束来自“哪些涉众”?
4类约束在ADMEMS
矩阵中的位置清楚表明:业务环节、使用环境、构建环境应分别考虑客户、用户、开发者3类涉众,而技术环境与上述3类涉众都有关系
ADMEMS矩阵参见4.2.2 用ADMEMS矩阵方法进行需求结构化-工具:ADMEMS矩阵
只有把握住涉众来源,才便于发现并归纳涵盖广泛的约束因素,也有利于针对性地进行交流,还可跟踪对约束的支持是否令涉众满意。
第一,来自客户或出资方的约束性需求
- 架构师必须充分考虑客户对上线时间的要求、预算限制,以及集成需要等非功能需求。
- 客户所处的业务领域是什么?有什么业务规划和业务限制。
- 是否需要关注相应的法律法规,专利限制?
- ......
第二,来做用户的约束性需求
- 软件将提供给何阶层用户?
- 用户的年龄段?使用偏好?
- 用户是否遍布多个国家?
- 使用期间的环境有电磁干扰、车船移动等因素吗?
- ......
第三,来自开发者和升级维护人员的约束性需求
- 如果开发团队的技术水平有限(有些软件企业甚至希望通过招聘便宜的程序员来降低成本)、磨合程度不高、分布在不同的陈那个是,会又和影响?
- 开发管理方面、源代码保密方面,是否需要涉及?
- ......
第四,也不能遗忘,业界当前技术环境本身也是约束性需求
- 技术平台、中间件、编程语言等的流行性认同度、优缺点等。
- 技术发展的趋势如何?
- ......
架构师应当直接或(通过需求分析员)间接的了解和掌握上述需求和约束,并深刻理解它们对架构的影响,只有这样才能设计出合适的软件架构。
例如,如果客户是一家小型超市,软件和硬件采购的预算内都是很有限,那么你就不宜采用依赖太多昂贵中间件的软件架构设计方案。
4.5. Big Picture:架构师应该这样理解约束
另外,还有一个重要的基础问题,太多的架构师对约束的理解都过于零散,影响了系统化思维。
一句话:约束是架构设计的上下文。
没有全局观念就不可能成为架构师,”约束是架构设计要解决的问题的上下文“是一个犀利的理解 ,揭示了”软件需求 = 功能需求 + 质量 + 约束“背后更深层层次的规律。
如果忽视了上下文对架构设计的限制,最终的架构设计就是不合理的,甚至是不可行的。
举个生活中的例子--设计大桥。建筑师必须关注以下4类约束的影响,合理规划大桥的设计方案。
- 考虑商业环境因素 :以促进两岸的经济交往为主(这会影响大桥的选址),同时也希望大桥在建设在一定程度上起到提升城市形象的作用。
- 考虑使用环境因素 :水上交通繁忙,二期常有大吨位船只通过,大桥建成投入使用期间不能对此造成影响。
- 考虑构建环境因素 :这是一条很大的河流,水深江阔,为造桥而断流几个月是绝对不可行的。
- 考虑技术环境因素 :斜拉桥因其跨度大等优点,当前广为流传,并且技术也相当成熟......
4.6. 用ADMEMS矩阵方法辅助约束分析
分析约束影响在需求结构化的基础上,充分考虑需求方及业务环节因素,用户群及使用环境因素、开发方及构建环境因素、业界当前技术环境因素等”4类约束“,并分析约束印象、识别约束背后的衍生需求。
从本质上讲,分析约束影响就是分析各个需求项之间的关系,并发现被遗漏的需求。所以将需求”化杂乱为清晰“的正交表可以作为分析约束影响的基础--即在需求项清晰定位的前提下,找到不同需求之间的关系,发现遗漏需求。
ADMEMS
矩阵方法应用法则有两个。
- 推导法则 :从上到下,从右到左。
- 查漏法则 :重点是质量属性遗漏。
4.7. 大型B2C网站案例:需求结构化与分析约束影响
像Amazon
这样大型的B2C
网站,架构的起步阶段应如何规划呢?下面看看ADMEMS
方法的“表现”。
4.7.1. 需求结构化
通过ADMEMS
矩阵(需求层次-需求方面矩阵),有助于高屋建瓴的把握复杂系统的需求大局。
先来梳理一下业务级的需求。
用户级需求,要特别注意挖掘来自“用户及使用环境”的约束,也别忘了开发方的因素。
4.7.2. 分析约束影响(推导法则应用)
接下来分析约束影响。
基于ADMEMS
矩阵应用推导法则规律十分明显:隐含需求(或遗漏需求)是通过 “从上到下” 或 “从右到左” 的脉络被发现的。考虑到公司的中远期法则(B2C
业务从图书扩展到各类商品),以及近期商业策略(投入资金2000万)的限制,必须制定“网站发展路线图”--而这对架构而言属于“开发级约束”。
接下来,我们利用类似的思维来理解不同需求之间的联系,这样你不会再觉得需求是“一盘散沙”了。
4.7.3. 分析约束影响(查漏法则应用)
另外,还要主动运用查漏法则。例如,我们发现至今对质量的重视还不够(实践一线经常出现此情况),于是开始“查漏”:方方面面的约束背后藏着哪些必须强调的质量属性要求呢?
例如,如此多的质量要求,比如要提高系统的互操作性......
4.8. 贯穿用例
4.8.1. PASS
系统背景介绍
PASS
系统的全称是:合理用药监测系统(Presription Automactic Screening System
)。通过全面部署PASS
系统可以促进医院的用药合理化、规范化、降低医院的医疗事故率,还有利于管理部门高效全面的掌握医疗一线的用药情况,及早发现问题域解决问题。
PASS
系统的主要功能:
- 医生
- 用药及时监测
- 注意事项打印
- 管理员
- 身份管理
- 用药规则数据的更新
- 管理者(如院长)
- 多种方式的信息查询
- 多张报表
- 外部系统的整合
- 药政部分的信息上报
- 用药规则数据库的自动更新
- ......
4.8.2. 需求结构化
将“功能列表”等同于“全部需求”根本不是架构师的应有做法。相反,为了全方位、多角度的把握需求,应当重视并运用“需求的结构”。
4.8.3. 分析约束影响
下面逐一分析约束因素的潜在影响。
首先是业务级需求因素的影响分析。例如,既然药品的种类繁多、用药规则的数量也很大,就应该设法避免每家医院都重复用药规则--于是决定“省级集中提供用药规则的定义和更新支持”(这其实是业务流程一级的一项需求)。
下一节:胜兵先胜而后求战,败兵先站而后求胜。 -- 孙子,《孙子兵法 . 形篇》
人们常常使用战术,而忽略了战略。战略要求从大局上把握整个架构与设计......架构错误的代价非常高。 -- Stephane Faroult, 《SQL语言艺术》
架构新手和有经验的架构师的区别之一,在于是否懂得,并能有效的进行概念架构设计。作为架构新手,尤其害怕碰到自己没有做过的系统:系统较大时,一点祭出“架构 = 模块 + 接口”的发布却不太奏效,架构新手就往往乱了阵脚。想法,有经验的架构师不会一上来就关注与如何定义“接口”,他们在大型架构设计的早期比较注重识别重大需求、特色需求、高风险需求,据此来设计概念架构。
另外,概念架构设计还是投标及售后工作的有力武器。金牌售前和普通售前的一个重要区别是,能否清晰的讲解概念架构,并借此说明 “客户关系的价值如何实现、担心的问题如何解决”。
接下来,通过两个发生在身边的故事,来一窥上述不同工作(架构设计、投标、售前)背后的幕后英雄--概念架构。