Tag Archives: 代码大全

软件中的隐喻(Metaphors)

  引子:老妈从深圳带来的《代码大全》,一直没看,不喜欢太厚的书(更喜欢作者早期的《Software Project Survival Guide》小册子,微软开发三部曲还是我大一第一学期花5块钱从地摊上淘来的)。今晚又犯病睡不着,索性听着音乐,找出来翻。的确把软件开发的事情都说完了。看到“隐喻”这一章有所感,上来敲点东西。

    

  隐喻(Metaphors)是XP编程的12个实践里很重要的一个,但是一直不像双人编程(Pair Programming)、重构(Refactoring)和持续集成(Continuous Integration)那么广为人知。

  其实这个概念是软件开发里最常见的现象和思维方式。《代码大全》里这样举例:

  计算机科学领域中有着所有学科中最为丰富多彩的语言。你走进一间安全严密、温度精确控制在20℃的房间,并在里面发现了virus(病毒)、Trojan horse(木马)、worm(蠕虫)、bug(臭虫)、bomb(逻辑炸弹)、crash(崩溃)、flame(口水战)、twisted sex changer(双绞线转换头)、fatal error(致命错误)……在其他领域里,你能遇得到这些吗?

  软件是一种看不见摸不着的抽象产品。因此我们不得不大量借用实体世界里的概念进行类比。例如在软件工程领域,随处可见各种建筑学的隐喻:architecture、scaffolding、construction;另一种常见的隐喻,是把软件项目当作生命体:incremental、iterative、adaptive和evolutionary。

  我们组内其实也在使用自己的隐喻体系。比如用“发车”和“跳”来形容pFind引擎的两种不同的搜索流程。

  其实,区分老手还是菜鸟很重要的标准,就是看他了解多少“行业黑话”。最初我在组内汇报到处写“bug”和“crash”这些词时,BOSS H很紧张、困惑,甚至有些愤怒。后来他就习惯了,明白这是工程开发中令人不快、但不可缺少的主题:某种意义下,编程的主要内容就是在有限成本条件下,尽可能有效地大量试错(胡思乱想:似乎创业也同样)。

  XP之所以强调重视隐喻,就是希望项目内建立统一清晰的概念词汇表。当提到某个词汇,在所有人脑子里都代表同样的逻辑概念。很多青涩的项目经理以为这种统一是理所当然的,他们错了。大量误会都源于鸡同鸭讲。

  对于我们生物信息这样的交叉学科,隐喻更是特别重要。生化学者和程序员简直就像不同的星球上的文明,需要很长时间才能彻底理解对方的意思。一个真实的例子:关于buffer这个词,在程序员世界里是一块预先申请好的内存区域,而对于生化领域来说,这表示做实验的缓冲溶液,我是在前线陪着生物学家杀老鼠做实验,花了三天时间才弄明白他嘴里的buffer不是我心里的buffer。有时不同的词汇又代表相同的意思,例如,生物学家喜欢说“高通量”,经过一段时间以后,我才能确认这就是计算机领域的“高吞吐”的绝对同义词。

  类似的,从事金融软件开发的哥们嘴里充斥着“期货”、“杠杆”、“抵押”、“融资融券”这种神秘密码。

  为了交流和思考,你必须把面对的专业领域里的术语迷宫搞清楚。对于传统行业,这种事也许只需要经历一次。对程序员来说,每个软件项目都是全新的思想历险,所以你要随时准备更新自己的隐喻词典。

  很多生物专业出身的学者学习能力都很强。他们要完成自己的研究,就必须对截然不同的众多领域都有所了解:从培养植物动物微生物,到临床小分子药物代谢,到遗传学和环境学,到化学试剂和各种分子式,到物理和精密机械领域的各种泵、质谱、磁场、超导题的原理,最后到Perl语言写软件处理大量信息……这就导致他们视野很宽,思维方式很全面。最关键的是,人不可能天生就是通才,出色的生物学者大多都善于跨领域交流和学习

  BTW 1:前面BLOG提过,程序员大都很着迷电影Matrix。因为这部电影把软件领域的隐喻反过来又映射到实体世界。电影名字本身就是一个很精彩的隐喻,Matrix在数学领域是“矩阵”的意思,在虚拟现实领域大量应用矩阵运算,比如《精品飞车》里的光影效果;而Matrix的另外一个意思是子宫,暗示电影里所有的人类都被放在那个黏糊糊的囊里养殖起来,以为自己生活在21世纪的地球,其实被接入了一个巨大的在线游戏,终其一生处在一个梦境,而Architect,那个机器,那个高等存在,控制着我们,随时以上帝的形象改变我们的命运,甚至kill掉我们的process(进程)。

  BTW 2:如果一个人开始仅仅守着自己的一亩三分地,不敢尝试未知领域,没勇气让Metaphors和外界进行碰撞的那一天,大概也就是他衰老的开始吧。