隐喻的重要性。重要的研发成果往往产自类比,将一些你不太理解的东西和一些你较为理解或者较为熟悉的东西进行比较,就可以对不太理解的东西产生更加深刻的理解。这种使用隐喻的方法叫做“建模”。例如化学家凯库勒曾梦见一条蛇咬住了自己的尾巴,他醒来后意识到类似的环状分子结构正好能解释苯的各种特性。(其实这里就是程序员的思维修炼中介绍的右脑思维,可见其重要性。)
隐喻是一种启示而非算法,它更为随意一点。这里结合第五章软件设计构建,当设计一个软件时,首先在解析问题的基础上需要对软件进行一个设计,一个大型的项目所需要进行的设计往往更为精细,但并不是所有无关重要的细节都要考虑。在设计中,启示类似于黑夜中的探照灯,你只能摸索着前进,渐渐的去解决问题。第五章中描述设计是一个“险恶的”问题,只有通过解决问题或部分解决问题才能被明确的问题。本书举例是,一个大桥设计问题,期初考虑了大桥十分足够结实以承受设计负荷,当桥因为大风带来的协同波使之崩坏之后,又明确了桥类建造还需要考虑空气动力学等等问题。设计是一个毫无章法的过程。但是算法不一样,它给你的是明确的步骤,按照步骤一定能够达到一个明确的目标,是可预测性,确定性的。但是在软件构建中,没有任何一个种模型能够完美适用于所有的问题。
对于问题,隐喻能使其具有变得概念化。但是隐喻也分好坏,不同的隐喻可能产生截然不同的结果。如果将软件编程进行隐喻,是会将其概念化为房屋建造,培养牡蛎(生长),还是书写邮件?
如果概念化为书写邮件,那么就类似于一种启示构建法,往往是一边写一边想,最后落笔也就完成了。但是这种构建方法并不适用,当前的较大型的软件开发几乎都不是一个人独立的工作,合作进行,同时这种方法的无法更改性,在你寄出这封信的时候就已经不可更改了。
那么培养牡蛎的生长方法呢?像牡蛎孕育珍珠一样的一点一点的完成孕育。这在现在也比较适用的一个模型。“增量”“迭代”“自适应”以及“演进”等等词语都类似于这种方法,以增量的方式进行设计,编译测试都是目前一直到最强力的软件开发概念。在以构建一个基础骨架的方法上慢慢的去完善它。增量式开发的优势在于没有对最终结果进行过多的承诺。
建造房屋则与增量式开发是想通的,重点是对整体和局部都构建,比如需要在哪一块地皮上进行建造,建造风格,哪里需要窗户和门,是否带花园等等。但这时候你还不知道要用什么样的砖块,什么材质的门,在初步构建上来思索细节,在第五章中也有介绍,将其称为在高层次上查看细节。这时候你不需要去考虑太过低层次的细节。如果去考虑这个门是由什么纤维分子,那些金属原子组成的,反而是没有必要且浪费时间的。
但这只是对于编程的一个隐喻一个构建,并不是对设计的一个描述。两者之间是由区别的。
这一章的重点是讲述隐喻——“建模”,问题概念化的重要性,并举例对编程过程进行了隐喻。
文章参考《Code Complete》