隐喻
隐喻(metaphore)是XP所有实践中最难理解的。XP程序员骨子里都是实用主义者,隐喻这个缺乏具体定义的概念让我们很不爽。的确,一些XP的支持者经常讨论如何从XP的实践中移除隐喻。然而,在某种意义上,隐喻却是XP最重要的实践之一。
想象一下智力拼图玩具。你怎么知道把各个小块拼到一起呢?显然,每一块都和其他块相邻,并且它的形状必须与相邻的块完全吻合。假如你眼神不好但是触觉灵敏,可以锲而不舍地筛选每个小块,不断调整位置,最终也能拼出整张图。
不过,还有一种比摸索形状去拼图更强大的,这就是整张拼图的图案。图案是真正的向导。它的威力大到如果图案中相邻的两块无法吻合,你就可以断定拼图厂商的产品有问题。
这就是隐喻,它是整个系统联结在一起的全景图,它是系统的愿景,它让所有独立模块的位置和形状一目了然。如果模块的形状和整个系统的隐喻不符,就可以断定这个模块是错的。
通常,隐喻是一个名称系统,名称提供了系统元素的词汇表,它有助于定义元素之间的关系。
举个例子,我做过一个系统,要求每秒60个字符把文本显示到屏幕上。在这个速率下,铺满屏幕需要花一些时间。所以,我们写了一个程序让它生成文本并填充到一个缓冲区,当缓冲区满了后,我们把程序从内存交换到磁盘上。当缓冲区一空,我们又把程序交换回内存继续运行。
我们把这个系统说成自卸卡车托运垃圾。前面的缓冲区是小型卡车,显示屏是垃圾场,我们的程序是垃圾生产者。这些名称恰如其分,也有助于我们将这个系统当成一个整体来理解。
另一个例子,我做过一个分析网络流量的系统。每隔30分钟,它就会轮询数十个网卡,从中抓取监控数据。每个网卡给我们提供一小块由几个独立变量构成的数据,我们把这些小块称为“切片”,这些切片都是原始数据需要进一步分析。分析程序需要“烹饪”这些切片,所以我们把分析程序称为“烤面包机”,把切片中的独立变量称为“面包屑”。总的来说,这个隐喻有用,也有趣。
当然,隐喻不只是一个名称系统,隐喻还是系统的形象化表达。隐喻可以指导所有开发人员选择合适的名称,为函数选择合适的位置,创建合适的新的类和方法,等等。