大道至简——软件工程实践者的思想 第4章 流于形式的沟通

>>>  讀書—連接古今充實信仰  >>> 簡體     傳統

      第4章 流于形式的沟通
 
    “足下求速化之术,不于其人,乃以访愈,是所谓借听于聋,求道于盲。”
 
                           ——唐韩愈《答陈生书》
 
1. 客户不会用 C,难道就会用 UML 吗?
 
    我们总是要先接触客户的,是的,如果不这样,我们将无法确知要做什么。
 
    作为开发人员,可能更希望客户能学习或者精通 C语言,这样客户就知道开发人员正在做什么,以及有多么地勤劳。或者,这样的客户还能以 C 语言的方式告诉开发人员他们究竟想要什么。
 
    然而要求客户学习 C 语言明显是自杀式的行为。在客户(的代表)学会用 C 语言来向开发人员描述他们的需求之前,可能他就已经被老板开掉了。因此没有客户会笨到愿意用 C 语言来描述他们的需求。
 
    C 语言是程序员与计算机交流的语言,而不是他与客户交流的语言。程序员面对的是计算机,但计算机不是客户。
 
    因此在前面所提到的 R 模型中,开发人员最好不要直接面对客户。项目经理有这样的一种优势:他可以不用了解 C 语言,也可以用一种非 C 的语言来与客户交流(比如说汉语)。
 
    ——或者你更愿意开发人员尽早地进入状态,那么你可以让开发人员以需求调研的身份出现在客户面前。但是,请注意这个人员的角色将变成“需求调研”,如果他不能适应这种转变,那就别让他去。——那会是灾难的开始。
 
    要深入项目的需求阶段的项目经理或者调研人员,被
 
要求深谙项目所涉的业务。但这往往我们所做不到的,因
 
为我们是软件公司,而不是做这些(客户的)业务的公司。
 
这时惯常的做法是聘请行业咨询公司(或者个人)来介入
 
需求阶段,协助了解和分析需求。
 
    他们总是很喜欢把事情搞得很复杂,所以他们会说这
 
一切的过程有个专用名词,“En...这叫需求建模”他们很
 
专业地说。
 
 
    现在你应该发现了差距。比如我们的项目经理,以及
 
那个被调来充当调研角色的程序员,他们就不会什么“需
 
求建模”。
 
 
    接下来咨询公司会与我们的客户一起做业务建模,然
 
后再做业务到需求的映射,再抽取需求并完成需求建模。
 
他们做业务建模的时候,可能使用一些客户业务范畴内的
 
符号和标识;而在做需求建模时,则需要使用一些软件行业中(的设计和分析人员)习惯的符号和标识。
 
     这些符号和标识也有个专用名称,“En...这个叫模型
 
语言(ML)。”他们无时无刻不在向你展现他们的专业(这已
 
经是他们还存在的唯一原因了)。
 
     如果他们更加专业,他们会告诉你他们用的是 UML。
 
向你介绍这个名词的时候,他们的眼镜或者眼睛里通常将
 
大放异彩。
 
     UML是模型世界里的世界语①。
 
 
     到现在为止,你应该看到,咨询公司除了把问题搞得
 
更加复杂之外,他们仍然需要面对最直接的问题:与客户
 
如何交流?
 
     他们的解决之道是模型语言。
 
 
     有什么差别吗?
 
     程序员不能要求客户会 C Language,难道需求分析师
 
们就能要求客户会 Modeling Language 吗?!
 
 
 
2. 项目文档真的可以用甲骨文来写
 
 
     独 孤 木 (http://www.javaworld.com.tw/) 曾 经 在 一 篇
 
《UML, OOAD and RUP》中讨论到 UML 实际应用中的问
 
题。其中的两个问题是:
 
 
① 现实的情况未必如此。但UML这个名词起码显示了它本源性的 
期望:Unified Modeling Language(统一模型语言)。
 
 
        “大部分的使用者,以及客户的信息人员,其实
 
        并没有足够的能力,来确认这些文件(User Case) 
        的正确性与完整性。”
 
        “除了客户不了解 UML,OOAD 跟 RUP 以外, 
        另外一个更糟糕的现象就是 project team 里面 
        的人也不懂。”
 
 
    这实在是很有趣的事。
 
    看来在一些情况下,在项目中使用 UML 只是完全不
 
懂的老板,以及什么都懂的博士的主意,而真实的场景中
 
去做事的那些客户与项目成员,其实是未见得就能用好
 
UML 的。
 
 
    仅以 UML 的 User Case 来说,由“用例图”和“用
 
例规约”组成。规约跟我们写的需求说明书差不多,不过
 
更加细节罢了,而且还有一套相应的方法论来阐述如果去
 
实作。图则很简单,就是几个图形符号来描述系统边界和
 
角色关系。
 
    显然甲骨文也能描述范围与关系。例如甲骨文中的
 
“家”这个字,就是上有房子下有猪①,这个边界就定义
 
得很好;在古文中,“三”通常是泛指,跟UML图中的线
 
条上标注的那个“*”是同义的,而甲骨文中“众”这个
 
① 至于是“内有猪”还是“下有猪”的问题,不是我们要争论的。 
有些考古学家根据甲骨文的象形来认为古人与家猪是杂居的,但 
我想那时的猪可能还比较野性,因此这种可能性还是小些。
 
字,就是日字下立有三个人,也就是在同一个日头下做事
 
的很多人即为“众”,这个关系也描述得很确切。
 
 
     所以只要你运用得法,甲骨文一样可以用来画用例图
 
和写用例规约。同样的,只要约定一套“语法”,你同样
 
可以用甲骨文来做活动图、类图、构件图……以及这些图
 
相关的规约。相比来说,古巴比伦人使用的楔形文字“象
 
形性”差一些,因此我不建议用它来画用例图。
 
     既然甲骨文可以用来做为一种模型语言(同时它也是
 
一种文字和口头的语言),那么,如果你的项目中面对的
 
对象是商周文化的考古学家,以及你的项目组都由精通这
 
种语言的成员构成,这时你就可以用甲骨文来做项目文
 
档,以及画各种模型图例。
 
 
     你要明白,要让考古学家看懂用例图,难度远大于看
 
懂甲骨文。与其要求他们学一种语言,不如使用他们那个
 
世界的通用语(当然,前提你的项目组也懂得这种语言)。
 
 
     在韩愈的《答陈生书》中,他因自己不会“速化之术”,
 
所以说陈生是“求道于盲”。然而他用了一个不恰当的比
 
喻:要知道盲人并非不知道路如何走,只是他不能象常人
 
一样描述他所知道的路。因此“问道于盲”是没有错误的,
 
真正错误的是你睁着眼睛问。
 
     我们需要在正常人与盲人之间建立一种沟通的方式,
 
既然盲人不能睁开眼睛,那么你就闭上眼睛好了。
 
 
 
                                               -48- 
 
                                              『大道至简』
 
    UML 图在一些客户眼里无异于盲人的世界,如果需
 
要向他们做需求调研,你只能使用一种这些客户能够理解
 
和接受的方式,例如表格、流程图以及……更深入的交谈。
 
    你要确认你的沟通方式是否有效,而不是去追求这种
 
方式是不是 UML,以及用 UML 表达得是否正确。——客
 
户是因为他认为你理解了他们的需求,而在“需求确认书”
 
上签字,而不是因为你的 UML 画得是否精准。
 
 
    现在来思考:为什么非要让客户看UML图呢?如果 
有能够满足“极限编程(XP)”所要求的“现场客户①”,那
 
当然可以不画用例图;相反,如果客户雇了一个专家组来
 
评审需求,那么你就老老实实地画用例图好了。
 
    需要留意的是,专家组还要一种方式与客户沟通,这
 
有可能不是 UML。——当然,客户愿意增加沟通成本,
 
那是他们的事。
 
 
    一旦源头确定,你就可以接下来约定在项目组中要使
 
用的沟通方式。愚公——这个伟大的项目经理——所使用
 
的“聚室而谋曰”,就是很好的沟通方式。当然,如果客
 
户精通 UML,那么我想愚公采用的项目沟通方式将会是
 
“聚室而论 UML”。我想一定会这样,因为愚公是很懂得
 
沟通的、伟大的项目经理。
 
 
① 这是极限编程的特征之一,指的是要求客户可以在程序员开发 
的第一现场,随时可以向程序员确认完成功能的有效性,以及修 
正需求或者先前的需求描述。
 
3. 最简沟通
 
 
     在 D 项目中,我向我的项目组员提出在需求阶段与
 
客户的沟通计划。这个计划只有三条:
 
          在一个月中,只能跟客户作三次联系;
 
          三次联系中,最多只能有一次面谈的机会;
 
          一个月后,提交全部的需求调研报告、需求分析
 
          和关于该项目的远景规划。
 
 
     D 项目并不大,所以从主观上来讲,客户(代表)并不
 
会为这个项目投入太多的精力。重要的是,我们在前期交
 
涉中已经发现:这个客户代表为大量其它的项目和工作所
 
困扰,他不会有时间来处理我们的问题。因此,减少沟通
 
和保障沟通质量的问题就显得非常突出。
 
     在大多数的项目中,这样的问题都是存在的。真正能
 
满足极限编程(XP)所提出的“现场客户”的情形并不经常
 
出现。即使能将程序员送到客户现场中去,沟通问题仍然
 
是不可避免的。
 
     因此在 D 项目中我提出了“最简沟通”。
 
 
     我们开始在网络上查看相关的软件系统的特征以抽
 
取客户所关注的内容;了解该客户的公司、经营理念、组
 
织结构形式以及工作模式;了解同类公司的成功经验和优
 
秀的管理模式,以及客户的竞争对手在做什么和在关心什
 
么……
 
     最后,我们开始综合以下两个方面的因素:
 
 
        客户在公司层面的外在表现、内部机制和运营管
 
        理手段。
 
        客户在项目中既已明确的需求和可能发生的需
 
        求,以及客户围绕其公司行为(和方向)所提出的 
        需求。
 
    这样我们就了解了客户项目中所有会产生需求的信
 
息点。
 
    我们开始设计提问,每一个提问涵盖尽可能多的信息
 
点,尽可能的具有发散性以便形成更多的推论和假设。
 
    我们把这些做成项目概要用 mail 提交给客户,并在
 
第二天电话回访他。他以口头的形式回复了这封 mail,这
 
让我们尽可能地得到了项目在方向上修正。
 
 
    我们确定了项目的实际目标,以及远期的方向。接下
 
来就是设计需求条目。
 
    客户已经先期提供了一些关于项目的文档、报表和工
 
作数据。因此基于这些数据的需求分析,将是下一个沟通
 
前所进行的最坚苦的工作。项目组员被要求:
 
        分析用户的每一个表格,以构建基础数据库;
 
        分析每一条数据的含义以确定它的上下限,以及
 
        数据间的相关性;
 
        从工作文档中去了解客户的组织机构及其相互
 
        关系,同时确定了每一类使用该系统的角色;
 
        从报表中去了解客户关注的数据信息,以及被他
 
        们所忽略掉的数据信息。
 
    我们从数百条的需求条目中,整理出系统结构和模
 
块,需求条目被映射到各个模块。我们很快画出了模块间
 
的相互关系图,并通过这个图分析了数据交叉关系,设计
 
了相应的数据索引并增加了一些新的关系性数据。
 
     我们对用户角色、原始数据和系统结构进行了梳理之
 
后,我们花了很短的时间实现了第一个系统模型。当然,
 
很多的功能项目,我们都只是简单 show a dialog。但我们
 
优化了每一个操作流程,以保证不同的用户(角色)在使用
 
时都尽可能流畅。
 
 
     这一次的沟通我们使用了面对面的模式。我们很庆幸
 
的得到了与这个系统的每一类用户(角色)接触的机会,而
 
正好我们有一个模型,我们便让他们来操作并提出意见。
 
这一次我们终于有了一份详尽的的调研报告。
 
 
     接下来的分析设计是顺理成章的事。我们在一个月后
 
完成了这个项目的需求分析报告,以及在这个分析上的一
 
些框架型的设计。还有,一个被用户所接受的原始模型。
 
     ——尽管,第三次的沟通中还发现了一些问题。但我
 
们终于有了一个好的开端。
 
 
     应该清楚的是,保障每一次沟通的有效性都是最重要
 
的事。沟通不是打电话或者请客户吃饭那么简单的事。你
 
得到的每一次沟通机会,都是向客户了解更深层次的需求
 
的机会,因此最好在见到客户之前,你就已经设计了所有
 
的问题和提问方式。
 
     吃饭并不是有效的沟通。大多数时候,那将以酒醉收场。
 
4. 为不存在的角色留下沟通的渠道
 
 
    大多数人不会知道,我们中国的“五千年文明史”实
 
际上仅有三千年“有史可查”。
 
    司 马 迁 在 史 记 中 写 道 :“ 维 三 代 尚 矣 , 年 纪 不 可
 
考,……于是略推,作三代世表”。也就是说,他在写史
 
记时“(夏商周)三代”的年代已经不可考了,因此只能做
 
“世表”;而其后十二诸候国的年代才可考证,因而有“(十
 
二诸侯)年表”。
 
    世表和年表的准确性和可靠性有明显的差异,因此我
 
国古代编年史能追溯到的上限,就成了《史记·十二诸侯
 
年表》中记载的西周共和元年,亦即公元前 841 年。
 
    司马迁无法做夏商周三代的年表是因为其年代不可
 
考,这是因为自黄帝以来的许多文献材料部分虽有年数,
 
但比较模糊且不一致,所以他只能弃而不用。
 
     现在国家在“夏商周断代工程”中再次推算和考证编
 
年史,这些相关资料也同样只做参考,实际采用的方法是
 
更有可信度的金文(记载)、历史学、天文学、碳-14 测年
 
等。
 
     资料的缺失、及其有效性的缺乏,给中国编年史撰写
 
带来了莫大的困难。
 
 
     项目的中断和中止,与历史产生断层的内因是一致
 
的。——我发现很多的项目(尤其是产品计划)在负责人员
 
离开后,就自然而然地死掉了。我把这一切的原因归咎于
 
“没有 history”。
 
 
     在先人写“谱牒”(简、册)时想必是没有考虑过后人
 
要读的,或者更为远古的先人可能根本没想过要留下他们
 
的生活和部落记录,再加上有象秦始皇这样的人在前面放
 
火烧东西,所以司马迁拿不到夏商周三代的确切史料,也
 
是情理之中的事了。
 
     ——远古的先人不知道司马迁这一号角色的存在,司
 
马迁也没有办法跟古人约定一下要留点记录给他写《史
 
记》。
 
 
     我 们 做 项 目 的 时 候 , 如 果 也 不 留 下 历 史 记 录
 
(History),那么以后别人来看这个项目,也会是两眼一抹
 
黑,要么就象司马迁一样“存而不论”,项目便就此中止;
 
要么就象“夏商周断代工程”一样,花大量的人力物力来
 
攻关。
 
    维护旧项目比做新项目更难,许多人深有同感。然而
 
这些“有同感”的人又何曾想过,自己在做“新项目”的
 
时候,要为“项目维护”这种还不存在的角色,留下一个
 
沟道、对话的渠道呢?
 
 
    我把项目的 History 作为跟这种“不存在的角色”沟
 
通的一种方式。History 的丰富和准确为项目的后继开发、
 
维护提供了可能。
 
 
    历史记录(History)与注释(Comment)不是一回事。代
 
码中的注释是为阅读代码而留备的,而 History 是为整个
 
项目而记录的。一些参考的记录内容有:
 
        需求阶段:与谁联系,联系方式、过程、结果以
 
        及由此引发的需求或变更;
 
        设计阶段:如何进行设计、最初的构架、各个阶
 
        段的框架变化、因需求变更导致项目结构上的变
 
        化(有助于了解构架的可扩充性); 
        开发阶段:每一种技术选型的过程、每一种开发
 
        技巧的细节和相关文档、摘引的每一段代码、算
 
        法、开发包、组件库的出处和评测;程序单元的
 
        测试框架;每一个设计和构架变更所导致的影
 
        响;
 
        测试阶段:还记得测试用例和测试报告吗?那是
 
        最好的 history 之一。
 
 
     当然,另一件最重要的事,是记得在每一笔记录后写
 
下时间和你的名字。你的每一笔记录都是打算留给一些根
 
本不了解这个项目的人看的,之所以要记下你的名字,是
 
便于那些人能够再找到你并溯源到问题的源头。——当
 
然,这得赶在你和古人一样“与天地共存”之前。
 
 
     我们知道,大多数的工具都有历史记录的功能。在开
 
发工具和测试工具中尤为突出。此外,版本管理工具也留
 
下了每个阶段的印迹。然而,我不建议过于信任它们①,
 
如果不明确要求项目组员写下详细的History,那么他们可
 
能在每一次版本签入时都只写下两个字的备注:“完成”。
 
 
 
5. 流于形式的沟通
 
 
     在很多的时候,我所听到的沟通,都是一种形式。例
 
如与客户吃饭或者打回访电话。
 
     其实沟通是具有目的性的,如果在没有明确目的的情
 
况下与客户沟通,那将是浪费客户和自己的时间。这种目
 
的,可以是了解项目的讯息、挖掘潜在的项目……最末了,
 
才是交流感情。
 
     然而大多数的情况下,它仅仅被看着交流感情。这便成了形式。且往往是客户所讨厌的一种形式。
 
① 大多数的软件公司已经意识到版本管理的重要性。然而项目各个阶段的文档、代码及其它输入输出都是具有版本问题的。单一的版本管理软件并不能胜任这些。因此我仍旧采用相对原始的、编写History这样的方法,来弥补ClearCase、SourceSafe、CVS等这些软件的不足。
 
 
    沟通问题不仅仅存在与客户交流之中。还存在于与项
 
目的各个角色之间。项目的分析报告为设计人员所看不
 
懂,设计人员的方案为开发人员所看不懂,而开发的结果
 
以为测试人员所看不通。等等都是沟通问题。
 
    UML 的确是解决沟通问题的最佳手段之一。然而如
 
果项目一开始就不能用它,那么强求的结果必然是痛苦
 
的。——要让 UML 在一个没有经过相关培训的团队及其
 
各个角色之间用起来,几乎是不可能的事。即使用得起来,
 
也存在经验问题。千万不要指望仅仅一个项目,就能让你
 
的组员深刻的理解 UML 的思想。
 
    也不要指望在每个项目中都能用它,如果你的客户能
 
理解并支持使用 UML,那以这个项目就会有一个良好的
 
UML 使用环境。否则,开发环节中资料的不一致性,将
 
会使得项目难以收场。
 
    使用与不使用 UML,其根本的问题在于沟通方式的选择。只要是行之有效的、能在各个项目角色间通用的,就是好的沟通方式。
 
 
    在每一次回顾项目时都应该注意:流于形式的沟通,可能是使得你的项目被不断推翻和不断延迟的最直接原因。

周爱民(Aimingoo) 2013-08-24 22:23:02

[新一篇] 大道至簡——軟件工程實踐者的思想 第3章 團隊缺乏的不只是管理

[舊一篇] 大道至簡——軟件工程實踐者的思想 第5章 失敗的過程也是過程
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表