一线架构师实践指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第I部分 Pre-architecture阶段

第2章 Pre-architecture的故事

所谓的“开始就是结局”,要达到什么样的结局取决于什么样的开始。结局就是开始的地方。(What we call the beginning is often the end. And to make an end is to make a beginning. The end is where we start from.)

——T. S. 艾略特,《四个四重奏》

需求验证的目标是尽可能暴露问题,而不是证明无错。

——徐锋,《软件需求最佳实践》

没有风险的软件早就被开发完了。

作为架构师,首先要面对的风险就是需求。既要关注功能需求,又要平衡相互矛盾的质量属性需求,还不能遗漏各方面的约束性需求……这,已成为合格架构师必需的基本功。

下面的3个真实故事都说明了这一点。

2.1 “不就是个MIS吗”

2.1.1 故事:外籍人员管理系统

公司接单了,一个市级的外籍人员管理系统。

小周被任命为这个项目的架构师。需求分析的过程,小周也参与了。几天之后,小周就开始“轻敌”了,他在一次项目会上说了这么一句话:“这个项目不就是个MIS吗!”

接下来的工作比较顺利,项目组也算情绪高昂……

项目组的情绪急转直下,出现在项目接近尾声的一天。客户方的小崔,看着漂亮的“外籍人员信息录入”界面,弱弱地说了一句:“哦,外籍人员的信息,大部分都不是我们录入的,而是来自省局。”

这下问题大了。最棘手的问题是,项目定义的数据库Schema和省级系统的数据库Schema不一致:

若保持不一致状态,就人为造成了数据格式的不相容,这是典型的烟囱式应用的做法,为未来可能出现的更多整合要求埋下了障碍;

若参考省级系统的数据模型重新定义本系统的数据库Schema,大量代码就必须重写,项目工期必然拖延。

拼命加班……

2.1.2 探究:哪些因素构成了架构设计的约束性需求

有人说:“错”的一半是“金”,“败”的一半是“贝”。

故事中暴露的问题看似简单:太大意了,遗漏了重要的约束性需求。但试问:下次如何避免?……只有我们这样问自己,才算得上“败”中求“贝”。

请读者也想一想这个问题,笔者推荐的反思结果见于第4章“ADMEMS方法的‘约束分类理论’”一节。

2.2 “必须把虚存管理剪裁掉”

2.2.1 故事:嵌入式OS的剪裁

系统软件研究室的新任务启动了:对VxWorks操作系统进行剪裁,并开发专用硬件的驱动程序。

团队成员都挺提劲儿……

这天,总工程师要听听进展情况,亲临研究室。当小吴开始汇报对OS虚存管理的“深入理解”时,总工程师的表情有些不自然。不久,他打断了小吴,说了这么一句话:“整个系统才有多大内存可用?我们的OS占的内存越多,应用软件可用的内存就越少。所以,必须把OS的虚存管理剪裁掉,直接访问物理内存。”

举“组”震惊,却又深表折服。

2.2.2 探究:又是约束

架构设计不仅要考虑支持功能、满足质量要求,还要重视各种约束性需求。本例的“内存有限”,就是嵌入式系统设计中常见的约束。

关注约束,要趁早。

2.3 “都是C++的错,换C重写”

2.3.1 故事:放弃C++,用C重写计费系统

老郑曾经很开心。

老郑在某电信软件企业,负责计费系统的架构。最初,他非常重视系统的性能问题,因为他认为:电信领域用户群广,数据量大,所以性能的压力必然会很大。后来,他们用C++开发的计费系统上线了,用户反映不错,性能挺高的。

但现在,老郑很懊恼。

原因何在呢?原来,计费系统一直面临着功能不断改进的压力,整个团队不断致力于提高系统的可扩展性——以便于增加和修改功能。但始料未及的是:进行了一番“改进”之后,可扩展性上去了,性能下来了!

看着程序里到处都是接口和无处不在的间接,老郑产生了一个危险的念头:都是C++的错,应该用C重写计费系统!

2.3.2 探究:相互矛盾的质量属性

思考如图2-1所示的题目。

图2-1 思考题

正确答案是:B、C、D。

高性能和灵活扩展这两个质量属性之间存在矛盾关系,这就是要害。表2-1揭示了更多质量属性之间的“促进”或“矛盾”关系,我们吃惊地看到:性能和安全性,与其他许多质量属性都是矛盾的。

表2-1 质量属性关系矩阵

(“+”表示行促进列,“-”表示行影响列,“ ”表示行列两种质量属性之间影响不明显)

本书“Pre-architecture阶段篇”后续内容提供的正确做法是:

1.在架构设计之初,就全盘考虑架构设计要重点支持的关键质量目标——以老郑为例,性能和可扩展(当然还会有其他质量属性)都重要。

2.在第一时间就判断这些“关键质量”之间有没有冲突关系,并制定权衡取舍策略——仍以老郑为例,性能和可扩展性矛盾,性能的优先级更高,谨慎评审提高可扩展性的设计对性能的影响后决定是否采用。

2.4 展望“Pre-architecture阶段篇”

失败的故事,何止3个?透过这冰山一角,我们看到的是一线架构师“把握需求技能的缺失”。

软件架构师不必是需求捕获专家,也不必是编写《软件需求规格说明书》的专家;但他一定应在需求分类、需求折衷和需求变更的研究方面是专家,否则他和优秀软件架构师相比就输在了“起跑线”上。

本书后续几章是Pre-architecture阶段的内容展开部分,将讲解如何建立需求理解的大局观、如何把握需求特点、确定架构设计驱动力。