array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 系统分析过程 - 爱码网
ego

系统分析过程

前言

拥有持续的、跨不同领域的技能、知识和经验构成了系统架构的职责。

系统的调研、分析、设计、架构、开发、部署这些活动,很大程度上是经验的总结。

系统分析过程

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参加,都是为了保证开发团队与业务专家沟通顺畅。而持续集成(CIContinuous Integration)为用户提供了实时体验的最佳实践。

分类:

技术点:

相关文章: