福尔摩斯式的推理和软件构造
隐喻(Metaphor)的力量是强大的,在计算机的世界里面,我们已经习惯使用各种各样真实世界的事情来和软件开发中的概念进行比对。
比如,软件构造过程的建筑隐喻,植物生长隐喻。Meyer的契约式设计(Design by Contract)使用客户与供应商之间的合同、契约来比喻软件系统中类的使用与实现之间的关系,从而验证类的正确性在于类的实现需要满足契约,系统的正确性在于类的使用同时也满足契约,而契约是从类的规格说明所推导而出的。
下面是对软件构造过程的一个隐喻,把软件开发过程中的需求、业务分析,系统分析,系统设计,实现和测试等比喻作福尔摩斯式的推理过程。
下面是福尔摩斯小说“跳舞的小人”中的一段:
福尔摩斯一声不响地坐了好几个钟头了。他弯着瘦长的身子,埋头盯住他面前的一只化学试管,试管里正煮着一种特别恶臭的化合物。他脑袋垂在胸前的样子,从我这里望去,就象一只瘦长的怪鸟,全身披着深灰的羽毛,头上的冠毛却是黑的。 他忽然说:“华生,原来你不打算在南非投资了,是不是?” 我吃了一惊。虽然我已习惯了福尔摩斯的各种奇特本领,但他这样突然道破我的心事,仍令我无法解释。 “你怎么会知道?"我问他。 他在圆凳上转过身来,手里拿着那支冒气的试管。从他深陷的眼睛里,微微露出想笑出来的样子。 “现在,华生,你承认你是吃惊了,"他说。 “我是吃惊了。” “我应该叫你把这句话写下来,签上你的名字。” “为什么?” “因为过了五分钟,你又会说这太简单了。” “我一定不说。” “你要知道,我亲爱的华生,"他把试管放回架子上去,开始用教授对他班上的学生讲课的口气往下说,“作出一串推理来,并且使每个推理取决于它前面的那个推理而本身又简单明了,实际上这并不难。然后,只要把中间的推理统统去掉,对你的听众仅仅宣布起点和结论,就可以得到惊人的、也可能是虚夸的效果。所以,我看了你左手的虎口,就觉得有把握说你没有打算把你那一小笔资本投到金矿中去,这真的不难推断出来。” “我看不出有什么关系。” “似乎没有,但是我可以马上告诉你这一密切的关系。这一根非常简单的链条中缺少的环节是:第一,昨晚你从俱乐部回来,你左手虎口上有白粉;第二,只有在打台球的时候,为了稳定球杆,你才在虎口上抹白粉;第三,没有瑟斯顿作伴,你从不打台球;第四,你在四个星期以前告诉过我,瑟斯顿有购买某项南非产业的特权,再有一个月就到期了,他很想你跟他共同使用;第五,你的支票簿锁在我的抽屉里,你一直没跟我要过钥匙;第六,你不打算把钱投资在南非。” “这太简单了!"我叫起来了。 “正是这样!"他有点不高兴地说,"每个问题,一旦给你解释过,就变得很简单。这里有个还不明白的问题。你看看怎样能解释它,我的朋友。"他把一张纸条扔在桌上,又开始做他的分析。
推理过程从基本事实出发,通过每一步简单的推导,最后得出结论,像下图:
用上面的推理过程来比喻软件开发,我们从客户的需求(基本事实)出发,通过各种各样的分析和推理,设计出各式各样的中间的抽象模型,比如业务模型,用例模型,分析模型,设计模型等(推理事实),最后通过编码实现构造出最终的系统(结论)。
那么测试呢,软件开发需要对各种抽象模型做概念验证,对最终的系统做功能测试。与之相对应,在推理过程中,我们也需要搜集证据对我们的推理事实和结论进行验证。
最后在推理中,我们抽掉中间的推理过程,只保留起点和结论就能营造出夸张的戏剧性的效果。而在软件开发中,如果中间的分析设计过程没有记录,各种抽象模型没有保留,只有初始的客户需求和最后的系统,一样也能营造出类似惊异的效果,变成维护者的噩梦 ^_^
福尔摩斯式的推理和软件构造相关推荐
- 软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结...
健壮性与正确性 健壮性与正确性是不同的--一个倾向于使程序尽可能保持运行,即使遇到错误,一个倾向于使程序尽可能正确,不在意保持运行 异常 异常分为两种--checked exception与unche ...
- 2020春季学期哈工大软件构造学习心得二
前言 上一章主要讲了软件构造的结果形态以及如何是一个"好"的软件 这一章主要学习软件开发遵循着一个什么样的过程 - 软件生命周期与配置管理 From 0 to 1,from 1 t ...
- (软件构造)2022哈工大软件构造 lab2内容以及心得
2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 艾浩林 学号 120L021917 班号 2003006 电子邮件 2017869860@qq.com 手机号码 1 ...
- 可逆计算:下一代软件构造理论
可逆计算:下一代软件构造理论 众所周知,计算机科学得以存在的基石是两个基本理论:图灵于1936年提出的图灵机理论和丘奇同年早期发表的Lambda演算理论.这两个理论奠定了所谓通用计算(Universa ...
- 面向对象软件构造(第2版)-第7章 静态结构: 类 (下)
7.9 PUTTING EVERYTHING TOGETHER 7.9 组合一切 The previous discussions have introduced the basic mechanis ...
- 【软件构造】第二章 软件构建的过程和工具(2)
二.软件构造的编程.系统.工具 [广义软件构造的过程] 1. 编程 (1)开发语言:Java.C.C++.Python等 ·IDE:集成开发环境 - 方便编写代码和管理文件 - 能够编译.构建 - 结 ...
- 软件构造 第一章第二节 软件开发的质量属性
软件构造 第一章第二节 软件开发的质量属性 1.软件系统质量指标 External quality factors affect users 外部质量因素影响用户 Internal quality ...
- 软件构造学习笔记-第九周、第十周
因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...
- 软件构造学习笔记-第八周
本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...
最新文章
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
- ArrayList原理分析(重点在于扩容)
- easypoi导出word表格_java如何导出word和wps文档
- LLBLGen update table with join
- 全球及中国特斯拉产业销量预测及投资机遇调研报告2021-2027年
- python之请求报文对比(假定最多二维字典)
- debconf-set-selections mysql_docker 静默安装mysql
- android界面初始化设计,界面数据初始化及各个按钮功能的实现
- 链路层到网络层的数据传递
- 1000行代码入门python-Python基础知识和工作环境
- 屏幕触摸事件监听,判断上下左右的操作行为,判断方法缩小的操作行为
- 网易云linux版本下载
- Sketch(一)——介绍、安装
- 坐标系的另一种表达形式,EPSG是什么?
- egret php交互,JavaScript_Egret引擎开发指南之视觉编程,显示对象和显示列表 
“显示 - phpStudy...
- win7系统dhcp服务器设置方法,win7设定固定ip和同时支持dhcp的方法
- 云计算的特点,主要有哪些?
- 2016年安全好用微信开通检测软件
- 仙剑4 linux,仙剑奇侠传98柔情版 for Linux——SDLPAL打包
- 基于AutoJs抖音极速版辅助App