与其说一个软件隐喻像是一张路线图,还不如说它是一盏探照灯。它不会告诉你到哪里去寻找答案,而仅是告诉你该如何去寻找答案。隐喻的作用更像启示(heuristic,启发、试探法),而不是算法(algorithm)。
算法是一套定义明确的指令,使你能完成某个特定的任务。算法是可预测的(predictable)、确定性的(deterministic)、不易变化的(not subject to chance)。一个告诉你如何从A点到达B点的算法,不会让你绕路,不会让你额外地经过D、E、F等地方,更不会让你停下来闻闻玫瑰花或喝杯咖啡。
而启发式方法(试探法)是一种帮你寻求答案的技术,但它给出的答案是具有偶然性的(subject to chance),因为启发式方法仅仅告诉你该如何去找,而没有告诉你要找什么。它并不告诉你该如何直接从A点到达B点,它甚至可能连A点和B点在哪里都不知道。实际上,启发式方法是穿着小丑儿外套的算法:它的结果不太好预测,也更有趣,但不会给你什么30天无效退款的保证。
驾驶汽车到达某人的家,写成算法是这样的:沿167号高速公路往南行至Puyallup;从South Hill Mall出口出来后往山上开4.5英里;在一个杂物店旁边的红绿灯路口右转,接着在第一个路口左转;从左边褐色大房子的车道进去,就是North Cedar路714号。
用启发式方法来描述则可能是这样:找出上一次我们寄给你的信,照着信上面的寄出地址开车到这个镇;到了之后你问一下我们的房子在哪里。这里每个人都认识我们——肯定有人会很愿意帮助你的;如果你找不到人,那就找个公共电话亭给我们打电话,我们会出来接你。
算法和启发式方法之间的差别很微妙,两个术语的意思也有一些重叠。就本书的目的而言,它们之间的差别就在于其距离最终解决办法的间接程度:算法直接给你解决问题的指导,而启发式方法则告诉你该如何发现这些指导信息,或者至少到哪里去寻找它们。
如果有一些能明确指导你该如何解决编程问题的信息,编程当然会更容易,结果也更易预见。但编程这门学科还没那么先进,或许永远也不可能那么先进。对于编程来说,最大的挑战还是将问题概念化(conceptualizing),编程中的很多错误都是概念性的错误。正因为每一个问题在概念上都是独特的,所以要找到一套能解决所有问题的一通百通的指导规则是很难的、甚至是不太可能的。如此看来,能一般性地知道大致如何解决问题,至少也和知道如何解决特定问题一样有价值了。
那么该如何使用软件中的隐喻呢?应该用它来提高你对编程问题和编程过程的洞察力;用它来帮助你思考编程过程中的活动,想象出更好的做事情的方法。你不可能看到一行代码并说它违反了本章所描述的某个隐喻。但随着时间的流逝,人们会发现,相对于不善运用隐喻的人来说,那些使用隐喻来照亮自己的软件开发过程的人,他对于编程的理解会更好,并且能够更快地写出更好的代码。







