福尔摩斯式的推理和软件构造

隐喻(Metaphor)的力量是强大的,在计算机的世界里面,我们已经习惯使用各种各样真实世界的事情来和软件开发中的概念进行比对。

比如,软件构造过程的建筑隐喻,植物生长隐喻。Meyer的契约式设计(Design by Contract)使用客户与供应商之间的合同、契约来比喻软件系统中类的使用与实现之间的关系,从而验证类的正确性在于类的实现需要满足契约,系统的正确性在于类的使用同时也满足契约,而契约是从类的规格说明所推导而出的。

下面是对软件构造过程的一个隐喻,把软件开发过程中的需求、业务分析,系统分析,系统设计,实现和测试等比喻作福尔摩斯式的推理过程。

下面是福尔摩斯小说“跳舞的小人”中的一段:

福尔摩斯一声不响地坐了好几个钟头了。他弯着瘦长的身子,埋头盯住他面前的一只化学试管,试管里正煮着一种特别恶臭的化合物。他脑袋垂在胸前的样子,从我这里望去,就象一只瘦长的怪鸟,全身披着深灰的羽毛,头上的冠毛却是黑的。     他忽然说:“华生,原来你不打算在南非投资了,是不是?”     我吃了一惊。虽然我已习惯了福尔摩斯的各种奇特本领,但他这样突然道破我的心事,仍令我无法解释。     “你怎么会知道?"我问他。     他在圆凳上转过身来,手里拿着那支冒气的试管。从他深陷的眼睛里,微微露出想笑出来的样子。     “现在,华生,你承认你是吃惊了,"他说。     “我是吃惊了。”     “我应该叫你把这句话写下来,签上你的名字。”     “为什么?”     “因为过了五分钟,你又会说这太简单了。”     “我一定不说。”     “你要知道,我亲爱的华生,"他把试管放回架子上去,开始用教授对他班上的学生讲课的口气往下说,“作出一串推理来,并且使每个推理取决于它前面的那个推理而本身又简单明了,实际上这并不难。然后,只要把中间的推理统统去掉,对你的听众仅仅宣布起点和结论,就可以得到惊人的、也可能是虚夸的效果。所以,我看了你左手的虎口,就觉得有把握说你没有打算把你那一小笔资本投到金矿中去,这真的不难推断出来。”     “我看不出有什么关系。”     “似乎没有,但是我可以马上告诉你这一密切的关系。这一根非常简单的链条中缺少的环节是:第一,昨晚你从俱乐部回来,你左手虎口上有白粉;第二,只有在打台球的时候,为了稳定球杆,你才在虎口上抹白粉;第三,没有瑟斯顿作伴,你从不打台球;第四,你在四个星期以前告诉过我,瑟斯顿有购买某项南非产业的特权,再有一个月就到期了,他很想你跟他共同使用;第五,你的支票簿锁在我的抽屉里,你一直没跟我要过钥匙;第六,你不打算把钱投资在南非。”     “这太简单了!"我叫起来了。     “正是这样!"他有点不高兴地说,"每个问题,一旦给你解释过,就变得很简单。这里有个还不明白的问题。你看看怎样能解释它,我的朋友。"他把一张纸条扔在桌上,又开始做他的分析。

推理过程从基本事实出发,通过每一步简单的推导,最后得出结论,像下图:

用上面的推理过程来比喻软件开发,我们从客户的需求(基本事实)出发,通过各种各样的分析和推理,设计出各式各样的中间的抽象模型,比如业务模型,用例模型,分析模型,设计模型等(推理事实),最后通过编码实现构造出最终的系统(结论)。

那么测试呢,软件开发需要对各种抽象模型做概念验证,对最终的系统做功能测试。与之相对应,在推理过程中,我们也需要搜集证据对我们的推理事实和结论进行验证。

最后在推理中,我们抽掉中间的推理过程,只保留起点和结论就能营造出夸张的戏剧性的效果。而在软件开发中,如果中间的分析设计过程没有记录,各种抽象模型没有保留,只有初始的客户需求和最后的系统,一样也能营造出类似惊异的效果,变成维护者的噩梦 ^_^

你可能感兴趣的:(福尔摩斯式的推理和软件构造)