卡尔维诺在哈佛大学的文学讲座(即诺顿论坛,是为纪念美国著名学者诺顿开设的,每年邀请世界文化名人作讲座,艾略特、博尔赫斯也曾获邀参加诺顿讲座)被他的妻子编成了一本独立的书《美国讲稿》。这本书展现了卡尔维诺的文学精神,体现了他的文学态度和气质。不过,我在阅读该书时,却发现了一些与编程有关的内容。
1、文学中的重构
达芬奇在《大西洋草图》中记述了他幻想中海怪的形象,进行了前后三次重构。最初的描述是:
啊,人们多次在波浪翻滚的广阔海洋之中看到你,看到你那长满鬃毛的黑色背脊,你像一座大山,傲慢地徐徐前进!
然后,他试图使海怪的行动生动些,加了个动词“翻转”:
啊,人们多次在波浪翻滚的广阔海洋之中看到你,看到你在海水中傲慢地徐徐翻转身躯,看见你那长满鬃毛的黑色背脊。你像一座大山屹立在海浪之上!
然而,他觉得“翻转”这个词削弱了他想留给人们的那种雄伟与庄严的印象,于是选择了“分开”这个动词,并改变了句子结构,使句子变得更紧凑,更有节奏。
啊,人们多次在波浪翻滚的广阔海洋中看到你!你像一座山屹立在海浪之上。你傲慢地徐徐前进,用那长满鬃毛的黑色背脊把海水分成两半!
在文学创作中,重构其实会经常发生,这源于作家对文学作品高质量追求的精益求精,他们常常通过修改句式,修辞手法或改变词语来改善文字,使之体现恰如其分的美。编码艺术同样如此,即使是代码的结构,以及变量、方法和类的命名,排版样式,只要给予足够的重视,锤炼这方面的技能,坚持重构,就能改善编码质量。
2、封装与接口
卡尔维诺在“精确”一章中引述了哲学家们对语言和外部世界关系的思考:
使用语言是对事物的不断追求,不是渐渐接近事物的本质而是接近事物那无休止的变化,接近事物那多种多样的、无穷无尽的表面。正如霍夫曼·斯塔尔所说:“深层应该掩盖起来。掩盖在哪里?掩盖在表层下面。” 维特根斯坦走得更远,他说:“凡被掩盖的东西,我们都没有兴趣。”
在软件开发中,我们常常运用封装来隐藏内部的实现细节。它带来的好处是使得调用变得简单,重用成为可能,很好地隔离了内部实现的变化。当然,文学更善于挖掘内部的玄奥,却常常使用抽象的语言描述出一种晦涩,试图掩盖这种玄奥,以此追求一种寻找“高山流水”知音般心灵激荡的玄妙与浃肌沦髓。
文学也尝试用变化去处理变化,这似乎矛盾,却恰好是文学艺术让人着迷的地方。软件又何尝不是如此。卡尔维诺看到了两种变与不变的模式:
最近我偶然读到生物形成过程的模式:“一边是晶体(象征表面结构稳定而规则),一边是火焰(虽然它的内部在不停地激荡,但外部形式不变)。”……火焰与晶体这两种形象代表了生物学上的两种选择。
皮亚杰观点的哲学蕴含是“从噪音到有序”,即火焰;乔姆斯基观点的哲学蕴含是“自我编制系统”,即晶体。
这仿佛让我洞悉了面向对象设计的玄机。火焰代表了接口,无论如何变化,其外部形式总是不变。接口的引入使得软件设计可以从混沌(即皮亚杰所说的“噪音”)走向有序。至于晶体,则是遵循了信息专家模式的对象,因为它封装了数据以及操作该数据的行为,使得它具有了自我判断的意识。它的表面结构仍然是稳定的,却有一套自我约束的规则。晶体看起来是宁静的,而火焰却如此的灵活。融合晶体与火焰的系统,是否代表了对变化的封装,以及对不变概念的抽象呢?
3、纠缠的细节
薄伽丘在一篇故事中(《十日谈》第六天第一个故事)谈到讲故事的艺术,正好回顾了这种感觉。
“奥丽达太太,要是你不讨厌的话,我想讲一个世界上最大的故事给你听,叫你听得津津有味,就像骑了一匹马一样,忘了路途的遥远。”
“啊,再好没有了,先生,”那位太太说,“请你快给我讲一个故事吧。”
于是绅士开始讲故事给她听。故事倒很精彩,可惜他讲故事的本领,只抵得上他使用他身边那把佩剑的工夫,实在太不高明,时常把一句话颠来倒去的说了又说,甚至说上六七遍,过了一会,忽然又倒过头来说道:“哎呀,我说错啦!”对于故事中的人名地名常常纠缠不清,张冠李戴,弄得别人莫名奇妙。他那说话的声气又跟故事里的人物、情景一点都配不上,真是听得奥丽达太太头晕目眩,冷汗一身,只觉得大祸临头,连命都快要保不住了。到最后,她忍无可忍,又看见那位绅士正愈说愈糊涂,已经迷了路,失了方向,只是在那儿团团打转,再也跑不出来了,就和悦地对他说:“先生,你那匹马跑得太野,请你还是让我下了马吧。”
在软件设计过程中,最要紧的是思路要清晰,既不能迷失在需求分析中,也不能迷失在复杂的实现细节中。最好能够结合实际的场景,列出我们要达到的目标,需要完成的任务,有序地进行分析和设计。编写代码时,切忌功能之间互相纠缠,虽然体现了对象的协作,但由于职责分配混乱,使得对象之间的协作变得无规律可循,颠三倒四,最后让人忍无可忍,也只能翻身下马了。