系统分析过程
前言
拥有持续的、跨不同领域的技能、知识和经验构成了系统架构的职责。
系统的调研、分析、设计、架构、开发、部署这些活动,很大程度上是经验的总结。
系统分析过程
1、与涉众(Stakeholder)交流,记录他们的问题域。问题域以FDD模板(Feature-Driven Development)的形式记录。这一步是调研的开始,交流有许多技巧,也有一些规范化的模式,请参考《大象UML》。
2、画出泳道活动图(Partition Activity Diagram),并与领域专家共同核对流程。如果需要流程重组或改造,请重新与涉众交谈。领域专家就是业务专家,熟悉全面业务的人。领域专家必须参与到项目团队中,能够随时与系统分析师保持面对面沟通。
3、整理问题域,找出关键词(Key Word),配合涉众,画出业务用例(Use Case)。系统分析过程是业务用例驱动的,业务用例把用户需求抽象化、规范化。
4、根据业务用例,以四色原型(Four-Color Archetypes)模式设计领域模型。领域模型比业务用例更进一步接近软件模型。
5、最后做健壮性分析,根据制品(问题域、业务用例、活动图和领域模型)画出GUI原型,然后找用户沟通,对GUI原型进行修正,然后反过来再修改制品。GUI原型很重要,它保障了系统分析的健壮性,让业务调研不是空中楼阁。
不要纠缠于细节
以上每一步都不要太过追究细节。与涉众交谈,不要谈及工作的每一个步骤,而是大体了解工作内容和目标即可。任何与计算机相关的话题一律避免,因为我们是在讨论“做什么”,而不是“如何实现它”。如何实现的问题留待开发阶段再解决。想一口气调研出所有的业务,然后一成不变地进行系统设计,这是典型的瀑布模式,经验表明瀑布模型不适合项目开发,已被迭代模式取代了。
但是,不追究细节,并不是工作粗糙潦草,而是要循序渐进、反复迭代,不要指望在开发前事无巨细地设计出软件的各个方面。系统调研和分析是一个循序渐进、反复迭代的过程,它贯穿了软件开发的各个阶段。
况且很多时候,涉众也并非能完全表达出自己的问题域;遇到流程重组和改造的时候,领域专家往往也朝秦暮楚,业务需求一日数变。
领域模型的价值
领域模型(Domain Model)是从编程角度出发,分析和提炼业务问题,得到的一种抽象描述的结果。领域模型并不固定于某种编程语言或图表,但大多数情况下我们使用UML的类图来表达,因为UML是应用最广泛的建模语言。
领域模型也不需要精细,只要标记上关键属性和方法的名称即可,模型之间的关系也不必详细揣摩,不要在两个类之间是泛化关系还是组合关系而浪费时间,不要以类设计的要求来建立领域模型(不要有数据类型、接口、返回值等编程领域元素)。
为什么我一再强调不要细节和精细?因为项目最难把握的环节不是编码和系统设计,而是对业务的准确理解。我们并非领域专家,所以需要借助领域专家的知识来核对、完善我们的模型。但领域专家不是编程人员,如果模型太精细就必然需要专业的表达方式,领域专家是看不懂计算机专业的表达方式的,那么我们期望的共同研讨也就无从谈起。
我们上面整理出来的制品(问题域、职能图、业务用例、领域模型、GUI原型)都是非常简单的文字和图表,经验表明,领域专家很容易就能理解。
简而言之,领域模型让我们把问题域转化为软件模型的过程中,起到了里程碑的作用:领域模型向上可以平滑转为业务用例,向下可以映射为类(class)。
GUI原型的意义
我们上面提到,涉众也并非能完全表达出自己的问题域。信息在传递过程是一定会失真的,传递的步骤越多、业务越复杂、表达越不清晰,那么失真越严重。
那么如何能够保障我们的调研是正确的呢?根据经验,我们发现越抽象的东西越容易理解偏差,而实实在在的把一个软件运行起来之后,用户往往就能立即指出其中的谬误,因此我们采用了GUI原型来把抽象映射为现实。
GUI原型以能够大体展示核心业务功能和操作流程为主(甚至仅仅能够按照既定的方式DEMO才能不出错),不要功能完备,也不要丰富的人机交互。GUI原型的目的是向用户展示系统的模样,因为非计算机行业的用户无法在脑中想像出软件模样,但有一个简单的GUID模型之后,就能够意识到这些功能和操作是否就是他们想要的。
在做GUI原型的过程中,需要和领域专家不断沟通,不断修正业务用例和活动图,持续丰富领域模型。
尾记
从问题域到领域模型,系统分析师在跨越现实与虚拟之间的鸿沟,如何保证能够顺利跨越此鸿沟,是项目成功的基石。
但是我们要注意,GUI原型与软件的最终交付还是有差距,GUI只是以最小的代价实现了最大程度上的接近软件的最终形态,但其中仍然存在谬误。消除谬误的最佳方法就是与业务专家保持沟通顺畅和用户及时体验。XP强调与领域专家坐在一起工作,进行面对面交流、Scrum强调Sprint会议必须有Product Owner参加,都是为了保证开发团队与业务专家沟通顺畅。而持续集成(CI,Continuous Integration)为用户提供了实时体验的最佳实践。