日期:2009-11-29  浏览次数:20491 次

和上一篇的理论不同,这一篇文章更注重于实际,举出了在业务建模简短需要注意的一些原则和实践,每一条都来自于实践之中,也都有理论的支持。其中的很多内容更是经过多次的失败才总结出来的。相信大家如果能够理解这些原则和实践的某些方面,至少能够避免重蹈覆辙。

原则(Principle)
1. 谁才是"上帝"
<我们说客户是上帝,是因为客户的重要性,客户占有决定性的地位。可是在软件开发中,到底是谁有决定权呢?是出资方,还是项目经历,或是程序员?
职责不清,是业务建模失败的主要原因之一。我们可以很容易的看见客户把自己的要求用几句话高度浓缩之后扔给开发人员,或是开发人员按照自己的意思开发程序。难道说,客户和开发人员之间真的是"心有灵犀",完全不用沟通的吗。
我在前文中已经提到过项目涉众和开发人员的权利和义务,我想这里还有必要再次强调。Scott W. Ambler说:
it is the role of project stakeholders to provide requirements, it is the role of developers to understand and implement them.
在我一次开发过程中,遇到过一个很有意思的涉众,他在他的需求分析中这样写:"总之,要实现那种能够想到就能做到功能。"我想,这位涉众对我们的计算机工业有着非常远大的抱负。但我不得不客气的告诉他目前实现是不太现实的。
大家听了可能会觉得好笑,但是在我自己和客户打交道的生涯中,这种客户不在少数。现实就是这样,你要怎么做?是一笑之后,弃之不顾吗?我想大多数人会这样做。因为他的要求太荒唐了嘛。可是,你有没有花时间去了解一下,他这句荒唐的话背后代表了他的什么意思呢?我觉得,软件开发人员负有教育涉众的义务,你需要引导你的涉众,让他们说出自己的心声。我在看到这位涉众的这句话后,就花了一些时间去了解,其实呢,事情很简单,他就是想要一个能够定制报表模板的功能。而在项目结束后,我和这位涉众有幸再一次的合作,这时候,他已经成为了一个出色的客户方的项目领导者了。
这个例子说明了什么呢?涉众往往都是领域专家,对自己的工作有很深的认识,可是由于对软件开发的不了解,涉众往往表达不清,甚至表达不出自己的需求。这时候,就是体现你的功力的时候了。记住,象对待上帝一样对待你的客户。
2. 耐心是首要的
明白了谁是"上帝",那就要耐心的对待上帝。学理工科的人,一般在逻辑思维上会比较好,可是对于涉众来说,可不一定是这样。我就遇到过一位做档案工作的涉众,在了解需求的时候,扯东扯西,含糊不清。明明一分钟前才否定的方法,下一分钟又提出来了。我觉得我的脾气应该是不错的,可到最后也几乎发飚。所幸,最后我终于撑了下来。我想,在经历过这件事情之后,我的耐心指数又会有一个很大的提高了吧。
我有一位同事的耐性是我所佩服的,在一个网站项目中,他负责系统分析。他整整花了三天的时间,和网站项目的负责人住在一起。最后系统分析出来之后,他的精神还不错,可是那位负责人已经快不行了。
当然,这只是个笑话,并不是去鼓励大家拼命。劳逸结合还是很重要的,身体是革命的本钱嘛。但是这告诉我们,如果缺少耐心,需求是很难成功的。例如在业务建模的讨论会上,你虽然规定了这次的会议讨论的是高阶需求,可是与会者总会时不时的争辩一些芝麻绿豆的小事儿。你怎么办?我相信这种情况是很普遍的。
耐心最后会仍会体现为沟通,只有耐心的沟通,你才能揭开需求的重重面纱。人的行为总是会受到思想的指导,如果你解不开涉众的心结,你就不可能了解他真正需要的。
我的一位项目涉众的表现很奇怪,她总是在不停的说一件事情:"她要实现报表自动生成。"她的需求讲来讲去好像总脱不出这个范围,可是我从她那里几乎听不到别的东西了。这时候,我决定放弃了,我想从她哪里可能已经没有更多的资料了。但在我了解到她的工作中报表处理占用了她大量的时间之后,我改变了想法。在我花了一些时间帮她理清了报表处理的思路之后,她还在其他方面给了我很大的帮助。
3. 参与是重要的
XP方法的一个重要实践,就是提倡"现场客户"(on-site customer)。也就是说,客户应该随时和开发人员在一起,随时提供资料和做出决策。而这个客户,也必须领域专家,而且能够有权做出决策。
这种现场客户相信国内的软件组织多半还做不到。但是一定要往这方面努力。我认为,这种现场客户有两种人:一种是项目涉众,还有一种是行业专家。其实很多软件公司都会配备一些管理咨询人员,这些人就是行业专家。有数据统计说,目前广东省软件公司中的咨询人员和开发人员的比例达到了3:1。我觉得这是好事。项目涉众往往对自己的工作中的事务性部分有很深的认识,但是很难将之提升到一个理论的水平。这时候就需要一些行业专家来帮助了。让行业专家和项目涉众共同探讨,还能够激发项目涉众的灵感,想到原来他想不到的方面。这就是"潜在需求"的开发。
另一方面,参与还意味着需要项目涉众全身心的投入到业务建模的过程中来,要能够调动他们的积极性。因此呢,太复杂的流程会阻碍涉众的参与。所以,使用一些简单的、能够为客户所接受的工件(Artifact)来进行业务建模是很有必要的。我说过前面讨论的那些"主角"啊,"用例"啊,那是理论,是给开发人员看的,让开发人员心里有个底。你给涉众看这些,他们能懂吗?等他们了解了这套机制,恐怕黄花菜都凉了吧。
素材(User Story)、特性(Feature)、CRC卡片这些都是很不错的工件,既简单,又能够满足需要。
知识点:素材和特性都表述了用户的一个简单的要求,它能够在较短的时间内完成。素材是XP方法中的工件,特性是FDD方法中的工件。CRC是class、 responsibility、collaborator的缩写,它是一张分为三个部分的卡片,分别标记了类名,类的责任,以及类之间的合作关系。非常的贴近客户,甚至可以在做游戏的过程中完成卡片的填写,能带来很强的客户参与度。
4. 拥抱变化
我想这一点会遭到开发人员点一致指责。毕竟,需求变化是开发人员最讨厌的一件事了。不错,我也讨厌。可是,就像我们常说"哭不能解决问题"一样,讨厌能解决问题吗?拒绝客户的变更要求,要求客户在需求规格说明书上签字。这些做法只能是适得其反。没有任何正面的、积极的意义。
必要的需求变更管理是重要的。因为无休止、无控制的变化必然会造成资源的极大浪费。但从另一方面说,需求变更被接受的评判标准应该是"是否合理",而不是"是否易于实现"。
需求变更要求我们的开发工作要迭代式进行,包括需求、设计、实现等阶段。这样才能将变更风险减到最小。这一点我们在讨论具体需求建模的时候会进一步讨论。
拥抱变化的更高一个层次是提前预估变化。制定一个可能的变化清单来记录可能出现的变化。最简单的例子就是一个企业在开发了进销存系统之后又希望能够开发财会系统与之相连。如果你能够预先留下伏笔,相信能够省不少力气。预估变化的另一种做法是通过使用模式。但是切记,模式的使用也不能过头。这些是题外话,如果有机会我会在其他的文章中集中讨论这方面的问题。
实践(Practice)
5. 建模会议
会议是业务建模最重要的手段。尽管会议在中国总是背负着一些骂名,但是只要组织得好,它是一种相当有效的沟通(Communication)手段。建模会议是一种大范围的会议,换句话说,所有的相关人员都应该参加会议。因为在业务建模时期,主要的目的就是建立对系统的高阶需求,这就要求众多项目涉众的共同参与,以保证需求的广泛性。所以呢,建模会议的规模是相当大的。出资方、高级经理、经理、直接用户、开发人员,各方各面的人都应该参加或是派代表参加建模会议。
如果大家有过参加大型会议的经验都知道,越是大型的会议,它的决策效率就越低。这是正常的。因为一个人的时候,不需要沟通,决策效率最高。等到两个人的时候,他们需要沟通的时间来进行决策。等到三个人的时候,这个沟通并达成一致的时间就更长。如果人数到了四个人、五个人甚至一二十个人,那么大部分的时间都会花在沟通上。更何况,人和人之间还有观念不同、利益之争。所以呢,为了保证会议的效率和效果,应该遵循一定的规则:
做好准备:如果你要开会,与会者连内容都不清楚,那你会怎么办。你必须首先花很多的时间来说明你开会的目的,是不是。要事先将会议的主题、议程连同会议通知发送给与会者,让他们先有个准备,会议开始时就能够迅速进入正题。
尽量邀请最多的人:我已经说过,如果建模会议不能够听取最广泛的意见,它就不是一个成功的会议。可是在现实中,这点往往难以做到。因为目标组织做为客户,往往都很"拽",在没有充分认识会议的重要性之前,要做到全部到场简直就是不可能。而客观上也会有出差、休假、有要事等原因做不到这一点。这里,一方面你需要向目标组织的决策者阐明利害,让他们重视。另一方面,你也需要积极主动的邀请项目涉众参与。因为邀请所有的人是不可能的,所以就尽可能的多吧。
分出与会者的级别:我很喜欢那种有一个内圈、一个外圈的会议室。因为我邀请所有人是件无法做到的事情,所以我首先要保证核心人员能够全部到场,坐在内圈,然后才是次要的人员,坐在外圈。核心人员是和你的项目息息相关的那种人。比如,财务系统,财务主管就是核心人员。要保证核心人员全员到场,至于次要人员,越全越好。