这是以前写的一篇文章,当时就没有写完,一直保留在我自己的机器上,现在打算贴出来见人,也好激励我把它写完。
一、消除隐喻
1、隐喻
软件开发这件事情,出现得很晚。距今只有几十年的时间,关于它的定义,我们可以简单地说:“就是把软件做出来。” 这基本上等于什么都没有说。而软件开发究竟是怎么回事,大家也没有搞明白,于是隐喻就派上用场了。当你要向一个完全没有概念的朋友,解释什么是软件开发的时候,你无法向解释建筑工程那样把他带到现场去看——案件开发的现场,你的朋友会以为软件开发就是一群人坐在电脑前面打键盘——你只能打比方:它就像是造一幢楼,有基础,有结构,有可以使用的房间,在这之前必须要设计,最后一样要通过验收,最终用户就能够住进去——哦,不,是可以使用软件的各种功能。
这样,你用上了一个隐喻:软件开发就像建筑工程,或许极可以称之为软件工程。还有其它一些隐喻:比如手工作坊与软件工艺。我们不会说建筑工程就像什么什么,它们都有自己鲜明的特点,不需要通过像什么什么来解释。但是软件开发,还是太年轻,也缺乏鲜明的特征,只能借助隐喻,我们才能向人们解释它。在这条路上,很多人都已经走得太远,隐喻不但被用来向外行解释什么是软件开发,居然被用来说服自己人,软件开发就应该像那个比喻的对象一样,具有类似的规范、过程、特征以及方法论。但是,比喻只能是比喻。软件开发的方法论,只应该从软件开发的本质推导出来,而不是从一些隐喻里抄袭过来。
这样,你用上了一个隐喻:软件开发就像建筑工程,或许极可以称之为软件工程。还有其它一些隐喻:比如手工作坊与软件工艺。我们不会说建筑工程就像什么什么,它们都有自己鲜明的特点,不需要通过像什么什么来解释。但是软件开发,还是太年轻,也缺乏鲜明的特征,只能借助隐喻,我们才能向人们解释它。在这条路上,很多人都已经走得太远,隐喻不但被用来向外行解释什么是软件开发,居然被用来说服自己人,软件开发就应该像那个比喻的对象一样,具有类似的规范、过程、特征以及方法论。但是,比喻只能是比喻。软件开发的方法论,只应该从软件开发的本质推导出来,而不是从一些隐喻里抄袭过来。
2、另一个隐喻
佛教有一种说法:“佛法不过是一条渡船,过河之后,你就不再需要它了。”寻求软件开发的本质,也许还是需要隐喻的帮助,只是这些船能不能把你带到彼岸,要仔细辨别。
设想这样一个场景:在公安局的一个办公室里,你的对面坐着一个目击证人,而你是一个犯罪肖像画家。这个证人在讲述他还记得的罪犯特征,你一边提问,一边在纸上沙沙的画着。一开始的提问与回答总是很概要性的。“圆脸”“不,很瘦的长脸”;“戴眼镜?”“是的”。在纸上出现了大致的轮廓之后,对话变得比较琐碎,“眼睛再小一点?”“鼻子比这个大一些。”渐渐的,证人的话越来越少,而且不断地端详着纸上的那个人,而你还在做一些细小的修正。突然,证人激动地大叫起来:“就是他!就是这个人……”于是,你的任务完成了!
这个过程像不像软件开发呢?有人也许会说,嗯,软件开发就是这样的。不!其实软件开发,并不是这样的,它应该是这样的……
你的朋友,晚上到你家来了。“我昨天晚上做了一个梦,梦见了我这辈子见过的最美的女孩,你帮我把她画出来吧。”“她的脸是……”在一段又一段如梦如幻的描述之后,你开始画起来,过程与前面有点类似,但是,似乎你的朋友没有停下来的迹象,他不断的要求你改进,希望这个她能够更加完美。终于,他放弃了:“就这样吧,虽然不是她,但是已经很像了。”你长吁了一口气,但是,你的朋友疯了,他恳求你把这个女孩变成一个活人,能跑能跳,能够跟他交流,而且还能够爱上他。没想到,其实你不是人,而是上帝,而且你大发慈悲,竟然真的满足了他的要求。终于,他满意地回去了。但是,几天之后,他又来了,他居然因为还不够满足,又来了!“上帝,”他恳求道,“你能不能够帮我把她改一下,当我……”随后的日子里,他不断地找到你,要求你再完善完善他的女人。直到有一天,你发了一道闪电,劈死了这个贪得无厌的家伙。
不不,最后这一幕没有出现,因为根据软件开发及维护合同,你不能劈死你的客户!(我敢打赌,是个程序员,就想过这么干。)如果这个合同签得不够好,他真的有可能向你提任何要求。
设想这样一个场景:在公安局的一个办公室里,你的对面坐着一个目击证人,而你是一个犯罪肖像画家。这个证人在讲述他还记得的罪犯特征,你一边提问,一边在纸上沙沙的画着。一开始的提问与回答总是很概要性的。“圆脸”“不,很瘦的长脸”;“戴眼镜?”“是的”。在纸上出现了大致的轮廓之后,对话变得比较琐碎,“眼睛再小一点?”“鼻子比这个大一些。”渐渐的,证人的话越来越少,而且不断地端详着纸上的那个人,而你还在做一些细小的修正。突然,证人激动地大叫起来:“就是他!就是这个人……”于是,你的任务完成了!
这个过程像不像软件开发呢?有人也许会说,嗯,软件开发就是这样的。不!其实软件开发,并不是这样的,它应该是这样的……
你的朋友,晚上到你家来了。“我昨天晚上做了一个梦,梦见了我这辈子见过的最美的女孩,你帮我把她画出来吧。”“她的脸是……”在一段又一段如梦如幻的描述之后,你开始画起来,过程与前面有点类似,但是,似乎你的朋友没有停下来的迹象,他不断的要求你改进,希望这个她能够更加完美。终于,他放弃了:“就这样吧,虽然不是她,但是已经很像了。”你长吁了一口气,但是,你的朋友疯了,他恳求你把这个女孩变成一个活人,能跑能跳,能够跟他交流,而且还能够爱上他。没想到,其实你不是人,而是上帝,而且你大发慈悲,竟然真的满足了他的要求。终于,他满意地回去了。但是,几天之后,他又来了,他居然因为还不够满足,又来了!“上帝,”他恳求道,“你能不能够帮我把她改一下,当我……”随后的日子里,他不断地找到你,要求你再完善完善他的女人。直到有一天,你发了一道闪电,劈死了这个贪得无厌的家伙。
不不,最后这一幕没有出现,因为根据软件开发及维护合同,你不能劈死你的客户!(我敢打赌,是个程序员,就想过这么干。)如果这个合同签得不够好,他真的有可能向你提任何要求。
3、消除隐喻
这个隐喻怎么样?这是对软件开发过程的一个好的描述吗?不,它还不够好,而且我们不可能通过修正完善这个隐喻,来得到一个对软件开发的准确的描述。事实上,所有的隐喻都不够好,都会扭曲软件开发过程的真相,都会使我们对软件开发的过程产生误解。
为什么会这样呢?为什么一个挺像软件开发的隐喻会最终误导我们呢?原因在于一个隐喻是一个完整的场景,这个场景中有很多相互交织的“概念要素”。当这些要素有很多在软件开发中出现时,我们就会认为这个隐喻很贴切,而当一个隐喻越是贴切时,这个隐喻中的其他一些在软件开发中不存在的要素,或者与软件开发相矛盾的要素,就会打扰我们的分析,干扰我们的判断。使得我们不再思考软件开发本身,而是将思考建立在某个隐喻的场景中。这样思考得到的结果,肯定存在着误导的可能。再由于不同的隐喻互不相容——你无法想象一群工匠去建设现代化的高楼大厦,他们最多只能造些平房——因此,建立在各种隐喻基础上的软件开发,至今没有找到适合自己的方法论,倒是不同的隐喻之间互相打得火热。
为什么会这样呢?为什么一个挺像软件开发的隐喻会最终误导我们呢?原因在于一个隐喻是一个完整的场景,这个场景中有很多相互交织的“概念要素”。当这些要素有很多在软件开发中出现时,我们就会认为这个隐喻很贴切,而当一个隐喻越是贴切时,这个隐喻中的其他一些在软件开发中不存在的要素,或者与软件开发相矛盾的要素,就会打扰我们的分析,干扰我们的判断。使得我们不再思考软件开发本身,而是将思考建立在某个隐喻的场景中。这样思考得到的结果,肯定存在着误导的可能。再由于不同的隐喻互不相容——你无法想象一群工匠去建设现代化的高楼大厦,他们最多只能造些平房——因此,建立在各种隐喻基础上的软件开发,至今没有找到适合自己的方法论,倒是不同的隐喻之间互相打得火热。
(未完待续)