推荐言
计算机科学领域中有着所有学科中最为丰富多彩的语言。你走进一间安全严密、温度精确控制在 20 ℃的房间,并在里面发现了病毒(virus)、特洛伊木马(Trojanhorse)、蠕虫(worm)、臭虫(bug)、逻辑炸弹(bomb)、崩溃(crash)、论坛口水战(flame)、双绞线转换头(twisted sexchanger)、还有致命错误(fatal error)…在其他领域中,你能遇得到这些吗?
这些形象的隐喻(比喻)描述了软件领域中各种特定的现象和事物。像这样生动活泼的隐喻还能够描述更加广泛的现象。借助这些隐喻,我们能更深刻地理解软件开发的过程。
本章的主题是隐喻,隐喻对科学有什么帮助?如何通过隐喻了解”软件开发“这一活动、隐喻如何帮助软件开发?相信读了这一个章节,你就明白了隐喻的力量
本书其他章节的内容并不直接依赖在这一章中讨论的隐喻。因此,如果想直接学习实践方面的知识,你可以跳过本章不读;而如果你想更清楚地理解软件开发的过程,请读读这一章吧。
读书笔记
- 隐喻的重要性
- 重要的研发成果常常产自类比(analogy)。通过把你不太理解的东西和一些你较为理解、且十分类似的东西做比较,你可以对这些不太理解的东西产生更深刻的理解。这种使用隐喻的方法叫做“建模(modeling)”。
- 比如化学家凯库勒曾梦见一条蛇咬着自己的尾巴,醒来后他意识到类似的环状分子结构正好能够解释苯的各种特性。后来的进一步实验证实了他的这一假说 (Barbour 1966)。气体的分子运动理论则是基于一种所谓的“撞球(billiard-ball)”模型,光的波动理论则主要是在研究光和声音之间相似性的基础上发展起来的光和声音都有振幅(亮度、响度)、频率(颜色、音)和其他一些共有属性。
- 模型的威力就在于其生动性,让你能够把握整个概念。它能隐隐地暗示各种属性(properties)、关系 (relationships)以及需要补充查证的部分(additionalareas ofinquiry)。不过有时候,当隐喻的概念被过度引申时,模型会误导人们。当科学家们寻求“以太”的时候,他们就是过度地引申了模型。
- 计算机历史上的隐喻
- Bachman 曾经把天文学中托勒密到哥白尼的转变,与20世纪70年代早期计算机编程方面的变化做了比较。当1973 年 Bachman 做这个比较时,数据处理正在从“以计算机为中心(computer-centered)”的观点向“以数据库为中心(database-centered)”的观点转变。Bachman 指出,过去的数据处理是把所有数据看作流经计算机(flowing through a computer)的连续卡片流(stream ofcards)(以计算机为中心的观点),现在则转变为把焦点放到数据池 (pool of data)上,而计算机偶尔涉足其中(以数据库为中心的观点)。
- 人们常常轻视隐喻的力量。对前面的每一个例子而言,很自然地有人会说:“嗯,恰当的隐喻当然是更有用,但其他隐喻都是错的!”虽然这是一种很自然的反应,实际远非如此简单。科学发展的历史并不是一系列从“错误”的隐喻到“正确”的隐喻的转变,而是一系列从“不太合适”的隐喻到“更好”的隐喻的转变也是从不是很贴切的隐喻到更贴切的隐喻的转变,还是从在一个方面暗示人们到在另一个方面暗示人们的转变。
- 事实上,那些被更好的新模型所替代的旧模型也依然是很有用的。工程师们依旧在使用牛顿力学来解决大部分的工程问题一一虽然从理论上说,牛顿力学已经被爱斯坦的理论所取代。
- 相对于其他学科而言,软件开发还是一门很年轻的学科,它还没有成熟到拥有一套标准隐喻的程度。因此必然存在许多或相互补充、或相互抵触的隐喻。某些隐喻相对好一些,而另一些则比较糟糕。你对隐喻有多理解,也就决定了你对软件开发有多理解。
- 如何使用软件中的隐喻
- 首先,与其说一个软件隐喻像是一张路线图,还不如说它是一盏探照灯。它不会告诉你到哪里去寻找答案,而仅是告诉你该如何去寻找答案。隐喻的作用更像启示(heuristic,启发、试探法),而不是算法(algorithm)。
- 那么该如何使用软件中的隐喻呢?应该用它来提高你对编程问题和编程过程的洞察力;用它来帮助你思考编程过程中的活动,想象出更好的做事情的方法。你不可能看到一行代码并说它违反了本章所描述的某个隐喻。但随着时间的流逝人们会发现,相对于不善运用隐喻的人来说,那些使用隐喻来照亮自己的软件开发过程的人,他对于编程的理解会更好,并且能够更快地写出更好的代码。
- 对于软件开发而言的隐喻
- 软件开发即写作
- 软件开发即栽培
- 软件开发即系统生长
- 软件开发即建造
- 这四个隐喻都代表了软件开发的性质,但是前三种还是不够恰当。第四种比喻主要体现了软件开发存在诸多阶段、软件开发在中更大的规模和更高的复杂度会带来更多的结论、自己编写能够获取的代码是没有意义的(自己从头建造家具是没有意义的)、不同的软件项目能从不同的开发方法中获益、结构修改比边缘修改花费高、更大的项目意味着需要更高级别的规划
- 按房屋建筑所作的这一隐喻,可以向许多其他方向引申一一这也是隐喻这方法如此强有力的一个原因。有很多常见的软件开发术语都是从建筑这一隐喻中衍生出来的:软件架构(建筑学,architecture)、支撑性测试代码(脚手架scaffolding)、构建(建设,construction)、基础类(foundation classes)以及分离代码(tearing code apart)。你可能还听说过更多这一类的词语。
- 能有效地开发高质量软件的人们,在长年累月中积累了大量的技术、技巧和诀窍。技术并不是规矩(rule),它只是分析工具 (analytical tools)。好的工匠知道完成某项工作要用哪样工具,也知道该怎样正确地使用。程序员也该这样。编程方面的知识学得越多,你脑中的工具箱中就会有更多的分析工具,也会知道该在何时用这些工具,以及怎样正确地使用它们。
我的复述
本章的主题是隐喻,介绍了隐喻在科学上的帮助,介绍隐喻对于软件开发的重要性,介绍了软件开发中的四个隐喻。
什么是隐喻
隐喻即是类比,比喻,科学常用隐喻来帮助我们了解一些复杂概念,气体的分子碰撞模型、光的波动理论(同声音比较)。
计算机历史上也有过隐喻,曾经我们把所有数据看作流经计算机(flowing through a computer)的连续卡片流(stream ofcards)(以计算机为中心的观点),现在则转变为把焦点放到数据池 (pool of data)上,而计算机偶尔涉足其中(以数据库为中心的观点)。
对于软件开发的隐喻
- 软件开发即写作
- 软件开发即栽培
- 软件开发即系统生长
- 软件开发即建造
- 这四个隐喻都代表了软件开发的性质,但是前三种还是不够恰当。第四种比喻主要体现了软件开发存在诸多阶段、软件开发在中更大的规模和更高的复杂度会带来更多的结论、自己编写能够获取的代码是没有意义的(自己从头建造家具是没有意义的)、不同的软件项目能从不同的开发方法中获益、结构修改比边缘修改花费高、更大的项目意味着需要更高级别的规划
隐喻如何帮助软件开发/ 隐喻的力量
- 用它来帮助你思考编程过程中的活动,想象出更好的做事情的方法。你不可能看到一行代码并说它违反了本章所描述的某个隐喻。但随着时间的流逝人们会发现,相对于不善运用隐喻的人来说,那些使用隐喻来照亮自己的软件开发过程的人,他对于编程的理解会更好,并且能够更快地写出更好的代码。
- 能有效地开发高质量软件的人们,在长年累月中积累了大量的技术、技巧和诀窍。技术并不是规矩(rule),它只是分析工具 (analytical tools)。好的工匠知道完成某项工作要用哪样工具,也知道该怎样正确地使用。程序员也该这样。编程方面的知识学得越多,你脑中的工具箱中就会有更多的分析工具,也会知道该在何时用这些工具,以及怎样正确地使用它们。