一个在心头萦绕了多年的问题,今天终于找到了答案:开发软件像什么?就像是煲汤。 曾经以为开发软件像炒菜:准备材料和调料,了解一下客户的口味,配料、下锅、上菜,完活。因此,也就曾经一度用炒菜的心态来认识软件和编写软件。渐渐地,发现了错误。菜是上桌了,可是食客并不满意,频繁发出这样的抱怨:“你放盐了吗?”,“盐放太多了吧”,“这牛肉怎么这么硬啊”…如此这般。其实自己也吃过别人炒出来的软件,也是这样的感受。后来,由于工作和个人需要,不断地自己给自己炒软件吃,就越发认识到问题的所在了。原来这好的软件并非是炒出来的,而是煲出来的。 软件的确是可以炒的,但是好的软件不是。当你亲自下厨给自己享用的时候,就会非常深切地体验到这一点。你不断地加工、品尝,不断地发现不满,然后反复地调整调料和配料的用量、比例,反复地改进你的工艺,然后再不断地品尝。如此周而复始,直到最后你终于觉得这汤够美味了或者不小心糊锅了。 软件就是这样。你不可能一蹴而就,马不停蹄搞出一个可以称之为好的软件,你需要一个煲的过程。当你第一次认为软件已经写完的时候,其实才是煲的开始。你去吃饭的路上,或是在林间散步的时候,极有可能突然意识到你的设计存在一个缺陷,可能是一个bug,也可能是一个臃肿不堪的结构,或者是一个不可理喻的接口,凡此种种。就这样,你的软件一直在你的头脑中徘徊,那些架构、算法、数据结构等等。你几乎每天都会发现至少一个令你有动手修改冲动的缺陷。如果不改掉,你就会觉得那软件很别扭,始终是心里放不下的一个事儿。这就是煲的过程。在这个过程中,那些蹩脚的、臃肿的、不自然不合理的地方被你一一发现,一一剔除和修正,你的软件因此而变得越发简洁、自然、合理、顺畅、高效。你有时甚至会纳闷,“为什么我第一遍作的时候会这样考虑?”,“我怎么会选择这么别扭的结构?”。 这就是煲,它不能一蹴而就,它必须需要一个过程,真的就像是煲汤,让汤和食物充分加热,二者之间充分的融合。这个过程是当你深陷于开发的兴奋和疲劳时无法完成的,你必须适当地中断、离开开发现场,让你的软件在你的心中回味而不是思考。对了,“回味”是煲的关键。在煲的时候,你从细节中脱离出来,上升到全局的视角或者是平移到旁观的视角来认识你的软件。这个时候,那些蹩脚的、混乱的地方就无法逃过你的法眼了。好的软件就是这样,在一个漫长的循环中煲出来的。Joel大侠写过一篇文章叫做“Good Software Takes Ten Years”,意思是说好的软件需要花费十年的时间来打造,他举了Lotus Notes作为例子。我想,应该刚好和我的体验异曲同工吧。别被10年这个数字吓倒。不是每个人都有机会去制作像Notes这样巨大的软件,但你一样有机会去作好的软件。所以,你不需要花费10年来煲,也许只需要2个月。:) 对于像Lotus Notes这样的巨型软件,仅仅靠煲已经不够了,还必须用酿,就像是酿造美酒或陈醋一样,长时间的发酵。在这样的发酵中,开发者持续的改进,并且和客户持续的互动,软件就得到了持续的升华和改进,最终成为陈年的佳酿。