隐喻

隐喻的重要性

我之前认为事物的逻辑性,只有对错之分,但是读完这一节带给我许多新的思考,咱们一起来品读。

重要概念的产生往往通过类比产生,比如将分子类比为保龄球一样的小球;光和声音的传播类比等等。这些类比有好有坏,但没有绝对的对错之分,其实看待任何事物不能只是狭隘地区分对错,而应该从多个角度深入地去看。

模型之所以容易被接受,是因为它生动形象,我们从认知上来讲最容易接受图像信息,就是因为直观,生动形象。模型有好有坏,而且对于同一事物的不同角度也能分出不同的模型,也能有不同的理解。

比如一个悬在铁链上来回晃动的大石头。在 Galileo 之前,Aristotelian 看到它时想到的是重物必然要从高处落下来停在低处,他认为石头是在克服阻力下落,而当 Galileo 看到同一现象时,他认为自己看到了一个单摆,他认为石头是在不断地重复同一运动。

1973年的图灵奖颁奖演说中,Charles Bachman 叙述了从地心说向日心说转移的过程。Bachman 把天文学中从地心说向日心说的转变,与 70 年代前期在计算机编程中的变化作了个对比。在当时,数据处理正从以计算机为中心向以数据库为中心进行转变。Bachman 指出,在旧的处理模式中,数据被当成是一个连续流过计算机的卡片流(以计算机为中心);而在新的模式中,数据好比是一个水池,而计算机则偶尔涉足其中(以数据库为中心)。

旧理论一旦被抛弃就很难再捡起来,具有讽刺意味的是,旧理论的相信者认为新理论荒唐可笑,就像我们今天看旧理论一样。

当然我们不能一味地评判对错,科学史并不是由一系列从“错误”模型到“正确”模型开关组成的,而是逐渐由“坏”模型变为“较好”的模型,从包含面较窄到包含面较宽,从覆盖领域较少到覆盖领域较多。

事实上很多被替代的旧理论还在发挥作用,像数学理论、基础力学等。

在软件科学中,拥有的是大量相互矛盾的模型,对于模型的理解决定了对于软件开发的理解。

使用软件隐喻

隐喻对于软件的作用更像是灯塔,给人以启发性的思考。

公式是一套规则,你的所有行动必须在公式的限定下进行,而启发往往与运气相关,更具有趣味性和未知性。公式与启发的区别是微妙的,他们之间的主要区别是:公式直接指令,而启发会告诉你如何找到这些指令,至少你知道去哪里寻找。

编程中最富于挑战性的问题便是将问题概念化,编程中许多错误往往都是概念性错误,因为每个程序在概念上都是独特的,所以创立一套可以指导每一个问题的规则是非常困难,甚至是不可能的。这样,从总体上知道该如何解决问题,便几乎和知道某一特定问题的答案一样重要了。

你是怎样使用软件隐喻的呢?应该用它来帮助你获得关于编程过程的内在理解,利用它们来帮助你考虑编程活动,想象解决问题的更好办法。

常用的软件隐喻

Writing Code(写代码)

开发软件最原始的隐喻出自“写代码”一词。这个写的隐喻说明开发一个程序就像随便写封信,你准备好纸、笔和墨水,坐下从头写到尾就算完成了。这不需要任何正式计划,你只是把你要说的都写出来。

Jon Beitle 说,你应该准备好一杯白兰地,一支上等雪茄,与你喜欢的猎狗一同坐在火边,像一个优秀小说家一样享受一次“自由编程”。

在一些小问题中,写代码隐喻可以充分描述他们,但是随着软件的发展,开发一个主要系统的投资已经相当于建一幢十层办公楼或造一艘远洋客轮的费用了。这种写代码隐喻已经不适用了。

Growing a System(软件播种)

与刻板的写隐喻相反,一些软件开发者认为你应该把创建软件当作播种或培植庄稼。你设计一小部分,编码一小部分,测试一小部分,然后在某个时候把它加到系统上,通过小步走,你减小了每次可能遇到的错误。

但是软件种植隐喻的弱点是你对于软件开发失去了直接控制。你在春天播种代码,最后在秋天收获一大堆代码。所以不合适

System Accretion(系统积累)

有时候,人们在谈论种植软件而事实上他们指的是软件积累。这两个隐喻是密切联系的,但是软件积累更深刻一些。“积累”这个词,含有通过外加或吸收,缓慢生长的意思,就像河蚌逐渐分泌酸钙形成珍珠一样。在地质学上,水中悬浮物逐渐沉积形成陆地的过程也与此相似。

另外一个与积累密切相联的词是增量。增量设计、构造、测试是软件开发的最强有力工具之一。“增量”一词在设计者心目中还远未达到“结构化”或“面向对象设计”等的地位,所以迄今为止也没有一本关于这方面的论述,这实在是令人遗憾的,因为这种书中所收集的技术将具有极大的潜力。

在增量开发中,你首先设计系统可以运行的最简单版本。不需要输入输出,只需要成为一个坚实的骨架结构,以便承受在其之上的系统。就像河蚌刚开始产生珍珠的核——一粒沙子。

当你搭好骨架后,逐渐地往上添加肌肉和皮肤。你把每一个伪子程序变成真正的子程序。

增量隐喻的力量在于:作为一个隐喻,它并没有过分作出许诺,它不像耕种隐喻那样容易被错误延伸。河蚌育珍珠的联想对理解增量发展法或积累法有很大帮助。

Building Software(创建软件)

“建造”一词的想象比“写”或者“种植’软件的想象更为贴切,它与“增量”软件的想法是基本一致的。建造隐喻暗示了许多诸如计划、准备、执行等工作阶段。如果你仔细研究这个隐喻,你还会发现它还暗示着其它许多东西。

建造不同的事物所需的集合是完全不同的,如建造沙滩上的一个小土堆和建造一个摩天大楼。

较大的规模和复杂性往往意味着可以产生较大的成果。在修房子的时候,材料可能比较贵,但更大的花费是劳动力。拆掉一面墙并把它移到六英尺之外是很昂贵的,但并不是因为你浪费了许多钉子,而是因为你需要付出劳动。你应该尽可能精心设计,以避免那些本可避免的错误,以降低成本。在开发软件过程中,材料更便宜,然而劳动力成本却更高。改变一个报告的格式,可能与移走一幢房子里的墙壁一样昂贵,因为二者成本的主要部分都是劳动力。

这两个活动之间还有什么类似之处呢?在建房子中,你不会去建造那些你可以现成买来的东西,比如洗衣机、烘干机,电冰箱、吸尘器等,除非你是个机械迷。同时,你也会去购买已经做好的地毯、门、窗和浴室用品,而不是自己动手建。如果你正在建造一个软件,你也会这样做。你会推广使用高级语言的特点,而不是去编写操作系统一级的代码。你也会利用已经存在的显示控制和数据库处理系统,利用已经通过的子程序。如果样样都自己动手是很不明智的。

如果你在盖办公楼时工作做得不好,那么在楼内办公的人便可能面临危险。同样,如果你在创建医药、航空电子、空中交通管制、加工控制等软件时工作做得不好,后果也可能是灾难性的。危及别人生命是劣质软件的最可怕后果,但并不是它的唯一危害。如果公司的股东们因为你编写了错误软件而赔钱,那也是令人遗憾的。无论如何,无辜的人们没有义务为你的工作失误而付出代价。

这两者之间的相似还可以推广到其它方面,这就是为什么建筑物创建隐喻是如此强有力的原因。许多常用的软件词汇来源于建筑学,如:软件体系结构、搭结构架、构造、分割代码、插入子程序等等。

The Intellectual Toolbox(智能工具箱)

在过去的十几年中,优秀的软件开发人员们积累了几十条关于开发软件的技术和技巧,有些像咒语般灵验,这些技术不是规则,它们是分析工具。一个优秀的工匠知道用什么样的工具干哪一样工作,而且知道该如何使用它们。程序员也是如此,关于编程你理解得越深入,你的工具箱里的工具也就越多,何时何地该如何运用它们的知识也就越多。

把方法和技巧当作工具是很有益处的,因为这样可以使我们对其有一个正确的态度。不要把最新的“面向对象设计技术”当作上帝赐予的法宝,它不过是一件在某些场合下有用,而在某些场合下又无用的技术。

在软件开发中,常常会有人告诉你用一种方法来代替另外一种方法。这实在不幸,如果你仅仅采用一种方法,那你就会把整个世界都当成那个工具的作用对象。你会失去用更适合的方法解决问题的机会。工具箱隐喻有助于我们保留一切方法、技巧、技术等,并在适当的时候使用它们。

Combing Metaphors(复合隐喻)

隐喻从本质上来说就是一种启发性思维,各种隐喻之间有相互联系的地方,这就需要你的想象力,去找到合适的隐喻。

总结

  • 生动形象去联系事物之间的关系
  • 要找到好的隐喻
  • 要充分理解创建软件和智能工具箱隐喻
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值