用隐喻来更充分地理解软件开发——代码大全读书笔记【摘录】

         编程最大的挑战就是将问题概念化。

相对于其他学科而言,软件开发还是一门很年轻的学科,它还没有成熟到拥有一套标准隐喻的程度。因此必然存在许多或相互补充、或相互抵触的隐喻。某些隐喻相对好一些,而另一些则比较糟糕。你对隐喻有多理解,也就决定了你对软件开发有多理解。 

与其说一个软件隐喻像是一张路线图,还不如说它是一盏探照灯。它不会告诉你到哪里去寻找答案,而仅是告诉你该如何去寻找答案。隐喻的作用更像启示(heuristic,启发、试探法),而不是算法(algorithm)。

那么该如何使用软件中的隐喻呢?应该用它来提高你对编程问题和编程过程的洞察力;用它来帮助你思考编程过程中的活动,想象出更好的做事情的方法。你不可能看到一行代码并说它违反了本章所描述的某个隐喻。但随着时间的流逝,人们会发现,相对于不善运用隐喻的人来说,那些使用隐喻来照亮自己的软件开发过程的人,他对于编程的理解会更好,并且能够更快地写出更好的代码。

 

各种隐喻:

    软件中的书法:写作代码

关于软件开发的最原始的隐喻是从“写作(writing)代码”这个说法发展出来的,这一隐喻暗示着开发一个程序就像写一封有缘由的信一样——坐下来,拿出文房四宝,从头写到尾就完了。这时不需要正规地做计划,你想到什么东西把它写出来就是了。

对于个人规模的工作乃至小型的项目来说,这种写信的隐喻已经足够了,然而对于其他场合而言,这个隐喻还远远不够——它没有完整、充分地刻画软件开发工作。书写通常只是个人的活动,而一个软件项目多半会涉及承担许多不同职责的很多人。在你写完一封信之后,你只要把它塞进信封然后寄出去就完了,你再也不能修改它——从任何程度和目的上看,这件事情都已经结束了。而软件的修改没那么难,也很难说有真正完全结束的时候。典型的软件系统在其首次发布之后的工作量,可能达到整个工作量的90%,典型情况下也有三分之二之多(Pigoski 1997)。对写作而言,最重要的是其原创性。但是对于软件构建来说,“努力创造真正的原创成果”的开发效率,往往低于专注于重用(reuse)以往项目的一些设计思想、代码以及测试用例(test case)的开发效率。总之,写作这一隐喻所暗示的软件开发过程太过简单、太过呆板了。

 

    软件的耕作法:培植系统

相对于前面那个呆板的用写作所做的隐喻,一些软件开发人员则认为应当将创造软件想象成类似播种和耕作的情形。你一次设计系统的一小部分、写出一段代码、做一点测试,并将成果一点点添加到整个系统中。通过这种小步前进,你可以把每次可能遇到的麻烦减到最小。

软件耕作这一隐喻的弱点在于它暗示了人们将无法对开发软件的过程和方式进行任何直接的控制。你在春天播下代码的种子,然后按照农历节气向土地佬儿许几个愿,你将会在秋天收获到丰盛的代码。

 

    软件的牡蛎养殖观点:系统生长

    这里并不是说要你学会如何从水流中夹带的沉积物中提炼出代码来,而是说你需要学会如何一次为软件系统增加一个小部分。跟“生长”密切相关的另一些词语有:“增量的(incremental)”、“迭代的(iterative)”、“自适应的(adaptive)”以及“演进的(evolutionary)”。以增量方式进行设计、编译和测试,都是目前已知的最强有力的软件开发概念。

    作为一个隐喻而言,增量式开发的优势在于未做过度的承诺。比起耕作那个隐喻来,对它作不恰当地引申要更困难一些。牡蛎孕育珍珠的图景也很好地刻画了增量式开发(或说生长)的情形。

 

    软件构建:建造软件

与“写作(writing)”软件或者“培育(growing)”软件而言,“建造(building)”软件的图景就更加有用了。它和软件生长的概念是相通的,且提供了更详细的指引。建造软件这一说法暗示了软件开发中存在着诸多阶段,如计划、准备及执行等,根据所建造软件的不同,这些阶段的种类和程度可能会发生变化。进一步研究这一隐喻时,你还会发现许多其他方面的相似之处。

按房屋建筑所作的这一隐喻,可以向许多其他方向引申——这也是隐喻这一方法如此强有力的一个原因。有很多常见的软件开发术语都是从建筑这一隐喻中衍生出来的:软件架构(建筑学,architecture)、支撑性测试代码(脚手架,scaffolding)、构建(建设,construction)、基础类(foundation classes)以及分离代码(tearing code apart)。你可能还听说过更多这一类的词语。

 

 
应用软件技术:智慧工具箱 

能有效地开发高质量软件的人们,在长年累月中积累了大量的技术、技巧和诀窍。技术并不是规矩(rule),它只是分析工具(analytical tools)。好的工匠知道完成某项工作要用哪样工具,也知道该怎样正确地使用。程序员也该这样。编程方面的知识学得越多,你脑中的工具箱中就会有更多的分析工具,也会知道该在何时用这些工具,以及怎样正确地使用它们。

 

组合各个隐喻

因为隐喻是一种启发式方法而不是算法,因此它们彼此并不排斥。你可以同时使用生长(accretion)和建筑(construction)这两个隐喻。

要点

         隐喻是启示而不是算法。因此它们往往有一点随意(sloopy)。

         隐喻把软件开发过程与其他你熟系的活动联系在一起,帮助你更好地理解。

         有些隐喻比其他一些隐喻更贴切。

         通过把软件的构建过程比作是房屋的建设过程,我们可以发现,仔细的准备是必要的,而大型项目和小型项目之间也是有差异的。

         通过把软件开发中的实践比作是智慧工具箱中的工具,我们又发现,每位程序员都有许多工具,但并不存在任何一个能适用于所有工作的工具,因地制宜地选择正确工具是成为能有效编程的程序员的关键。

         不同的隐喻彼此并不排斥,应当使用对你最有益处的某种隐喻组合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值