建模带来竞争优势。

前言

  • “唱曲的名家,唱到极快处,吐字依然干净利落”。
  • 不能站在别人的肩膀上看得更远,只是摘抄别人的观点,无意义。要有足够的积累,和深度的思考。
  • 涉众(stakeholder)往往会做而不会定义,把不同类型的涉众放在一起访谈时,只会剩下在场军衔最高那个人的意见。
  • 需求变更的时候,要注意涉众利益角度分析。
  • 项目的流程步骤:
    • 寻找老大
    • 揣摩愿景
    • 业务建模
    • 系统用例
    • 需求规约
    • 分析模型
    • 设计开发
  • 只有一个领域(核心域)的知识是系统能在市场上生存的理由。
  • 拿来主义要摒除门户之见,不关注流派和风格,着力于细节和应用。

建模与 uml

利润 = 需求 - 设计

需求:提升销售
设计:降低开发维护成本

几种弊习:

  • 从需求直接映射设计,会得到大量的重复代码。
  • 从设计出发来定义需求,会得到一堆假的“需求”。

从涉众视角对系统功能分包会得到需求包。
子系统是基于内部视角根据系统部件的耦合和内聚情况进行切割。

需求 设计
卖的视角 做的视角
具体 抽象
产品当项目做 项目当产品做
设计源于需求,高于需求

建模工作流

  • 业务建模:描述组织内部各系统如何写作,使得组织考验为其他组织提供有价值的服务。新系统不过是组织为了堆外提供更好的服务,对自己的内部重新设计而购买的一个零件。组织引进一个软件系统,和招聘一名新员工没有什么本质区别。如果通过业务建模推导新系统的需求,而不是拍脑袋得出。- 产出的工件是对系统协作关系的描述。
  • 需求:哪些是涉众在意的、不能改变的契约,哪些不是-严防“做”影响“卖”。- 产出的工件是涉众视角看到的功能。
  • 分析:提炼为了满足功能需求,系统需要封装的核心域机制。对核心域作研究,可以帮助我们达到核心域的复用。- 产出的工件是核心域机制。
  • 设计:为了满足质量需求和设计约束,核心域机制如何映射到选定平台上实现。- 产出的工件是核心域机制的实现

不要用设计映射需求。要关注核心域的核心价值。
不同工作流之间产出的工件的区别不在于形式,而在于内容。
要重视建模,要重视建模的工作流(modeling workflow)

UML 图

现代的 uml 图脱始于“三友”(three amigo)的在 rational 的标准化工作。

Uml图.xmind
Uml图

uml 里的图不必全部用到(正如没有哪本经典小说使用了所有的单词一样),大多数情况下只需要用到类图、序列图和用例图,(在某些时候,可以用活动图带图序列图)。

要达成基本共识的沟通,首先要使用统一的语言。使用潦草的草图,解释权在画图的人手里,别人看得似懂非懂,其实就是在用形式上的潦草,来代替思考上的潦草。简陋的形式是没有想好的结果,也是可以拿来为草率的思考作为开脱的借口。

即使是在数学和音乐领域,每一种符号背后都蕴含了基本共识。不要违反这种基本共识。

UML 模型不是用来跟涉众沟通的,是用来跟组织内部人员沟通的。

建模和敏捷

敏捷是一个过程家族,是一套 The New Methodology(Martin Fowler语)。

在现实实施中,建模技能不足,流程知识不够的团队在实施过程中,使用“敏捷过程”来掩盖“没有过程”的事实。

你的系统并不特别

见识少的病人总以为自己得了怪病,其实到医院让医生一看,太普通了。

软件开发到了极高境界真的是艺术,恐怕也不是大多数人目前有资格谈的。

模型的组织

建模工作流和所用的 UML 元素不是一一对应的。模型可以按照 UML 元素的种类组织,也可以按照工作流组织。

可以先按工作流组织。

UML 组织的模式如下:

  • 业务建模
    • 愿景
    • 业务用例
    • 业务对象
  • 需求
    • 系统用例
  • 分析
    • 实体类
    • 控制类
    • 用例实现
    • 边界类
  • 设计
    • 表示层
    • 领域层
    • 应用层
    • 基础设施层

另一种组织的方式是用试图来做 group。

业务建模之愿景

不要在错误的方向上努力,做得越多,错得越多。

没有愿景的支持,所有的口号就是空话。

业务建模之业务用例图

开发人员有时会有意无意把自己的系统想得太重要,是一种致命的自负。

开发团队经常发些需求“容易变化”,问题的根源之一是需求来路不正。没有把系统当做一个零件放在组织中来看,靠拍脑袋得出需求,导致得出的系统需求是错的。“需求剧烈变化”只是假象,真正的需求没有变过,只是一开始得到的需求是假的。

业务执行者(Business Actor)

以某组织为研究对象,在组织之外和组织交互的其他组织(人群或机构)就是该组织的执行者。因为研究对象是一个组织,所以叫业务执行者。

业务工人(Business Worker)和业务实体

组织内的人称为业务工人(Business Worker)。

业务工人可以被其他业务工人替换,也可以被业务实体替换(Business Entity)。业务实体是组织中的非人智能系统。

责任转移的思想对识别带引入系统的需求很有帮助。开发人员说,“我在开发一个新系统”,其实说的就是“我在开发的一个新的业务实体,取代现有业务工人或业务实体的一些责任”。

举个例子,我们要先画出业务序列图,然后把业务序列图中业务工人对业务实体的操作,映射为系统用例里的动宾结构。而业务用例图里没有业务工人和业务实体,只有业务执行者。
业务用例图和系统用例图的划分边界在组织边界。

这背后的深刻思想是:类通过协作实现用例。组织的业务工人(actor 为 business worker)和业务实体写作完成业务用例,系统的类(主要的角色为 系统、其他 use case)协作完成系统用例。

其他解释:《业务用例与系统用例》

  • 业务用例:业务部门或组织为其外部客户或内部特定人员(业务主角)提供有价值的服务(业务用例);

  • 系统用例:用户(角色)使用系统时,进行的一次比较完整的交互,并得到了有价值的结果;

  • 功能用例:功能是站在系统内部的静态概念,没有考虑什么人在什么时候如何使用

识别业务执行者

识别业务执行者时,抽象级别应该一致。例如,描述系统之间的抽象,部门应该对部门,而不是部门的员工对部门。

识别业务用例

业务用例指业务执行者希望通过和所研究组织交互获得的价值。业务流程是业务用例的实现。这样的思路对改进业务流程提供的帮助是:先归纳出组织对外提供什么价值,在思考如何更好地优化组织内部流程来实现这些价值。

业务用例是组织的价值,不会因为某个人脑系统或电脑系统的存在而消失而改变。所以“这个系统的业务用例是什么”这样的说法是错误的。

不能把业务用例的某个流程也当做业务用例,应该做顶层抽象,作为业务用例。

不要把组织内部的业务工人对业务实体的操作当做业务用例,因为它们不是组织的价值。

阿布思考法

另一种角度的以终为始。

先想象一个资源不受限时的完美系统,然后用有限的技术资源来山寨(粗劣模仿)这个系统。-本方法出自《Why Not?:How to Use Everyday Ingenuity to Solve Problems Big and Small》

需求之系统用例图

系统边界是责任的边界。

系统用例的定义:系统能够为执行者提供的、涉众可以接受的价值。与业务用例相比,研究对象从组织变成了系统。

系统用例是业务工人和业务实体之间的用例。

用例图不应该出现交叉,不同 actor
使用同一用例,可能意味着用例应该拆分。

需求启发

  • 和涉众沟通应该采用视图,而不是模型-介质要产生变化。
  • 和涉众沟通应该聚焦涉众利益,而不是需求。