做一张桌子看起来十分的简单。任何人都可以做,不是吗?找个大块的四方形木板,四个等长的木头柱子,四个钉子和一个锤子。把四个柱子钉到四方板的四个角上,你就做成了一个桌子。当当当!
现在来让一个真正的木匠为你打造一张桌子。首先他要花时间跟你讨论桌子的用途和功能——用在室内还是室外,厨房还是餐厅,主要用来展示还是使用,它需要能够承受多大的负载。然后他需要确定使用什么样的材料——软木还是硬木,用木板还是三合板还是铁轨枕木。然后他会研究桌子的风格——桌边的截面设计,桌腿底座设计,桌腿是按在中央还是四角。这最后,他才去动手做这张桌子,他花大量的时间去斜截,凿眼,契合所有的连接点,安装撑条,使用高质量的粘胶,木钉,螺钉,他要检查表面平整,打磨它,着色,封蜡,抛光——打造出一张能够引以为豪的桌子。看起来是一大堆的事情要做,不是吗?它只是一张桌子,不是吗?
两种做桌子的方法存在着很多不同之处,你看出来了没有?
只用了四个钉子的桌子看起来很毛糙,它不稳,因为桌腿不牢固,桌脚不平,顶多能用一个星期,它的一个腿就会扭断,根本承受不起一个盐罐子的重量。木匠的桌子看起来更好,好用而且美观,它很牢固,不摇晃,桌腿经过矫正,直的,很平,没有棱角,能用很久,你完全可以放心的在它上面摆上一顿丰盛的晚餐跟一群客人享用。你更想要哪个?
当人们谈论起软件,大多数人想像的工作量很像第一张桌子的建造过程。只需要创建一个数据库,填上一些数据,画出一些界面,这就完了,你就得到了一个软件产品。我无论如何都想不出人们这样的一种认识是怎么产生的。也许是人们用惯了Excel——“我可以用Excel做这些,所以编程应该很简单”。什么?
开发软件不容易。需要做很多的工作。非常像那个木匠做桌子的方式。作为设计师和程序员,我们需要理解业务、用户用例,以及产品功能。我们需要讨论和理解谁将要用它,它有什么功能,它如何和其它软件集成,它要用在什么地方,数据量如何,等等,等等。我们然后才去花大量的时间搭建架构,确保它能承受用户和数据负载压力,要能够升级和扩展,要能处理大数据量情况(例如单表负载)。我们然后需要更多的时间写出有质量的、可读的、可维护的代码,测试每个组件,确保它们正确、快捷的运行,改正bug,清除瓶颈(在数据库表模型上使用正确的结构和关联)。我们还要使用更多的时间来把这些组件组合到一起,确保每个接口都正确的调用,确保错误都被捕捉到,确保界面设计可用,简单,美观(桌子的切截,钻孔,契合,打磨,着色,抛光)。最终,我们交付客户一个完整的可信赖的产品,一个符合需求的产品,一个我们和你们都引以为豪的产品。
我相信,木匠很少会遇到像程序员需要面对的那样让人抓狂的事。也许他的客户也会抱怨做这个桌子花了太长的时间,或造价太高。也许他的客户并没有说桌子的用途或应该是个什么样,然后大声的抱怨它跟他从未说出的期望的样子不一致。也许他们的客户会瞪着他说做这样的桌子只需要几块木板和几个小时,木匠做桌子已经有几千年的历史了,这种桌子能有什么不同。也许他们的客户会说这很简单,所以应该很快,很便宜,魔术般的做出来,我猜测他们是这样想的。
我们的客户完全也是这样。而且几乎每次都这样。从没例外过,最初给我们新需求时说“这只需要你花几个小时的时间…”,或“你可以这样做…这样更简单”,或“你只需要简单的把它改成…”。什么?
对软件产品增加新功能可不像多钉一颗钉子或多加一个柱子。我们需要理解新功能的形式和功用,创建它,测试它,写文档,确保新增加的功能不会影响现有的系统。如果我们不这样做,软件就会做出错,到处是bug,不能正确的运行,给用户来带来大量的问题。有很多软件项目都是这样,任何用过这种有问题的软件的人都不会信任它,甚至不愿意使用它。就像那个摇晃的桌子。
如果你需要一个新功能,尽管提,但你要做好准备跟我们的木匠——程序员们认真仔细的讨论它。我们会用正确的方案开发你要的应用,保证让它正确的运行,一直正确的运行。你到我们这里来是想要有质量、可信赖的软件,就像是你要从木匠那得到一个有质量的桌子。
千万不要告诉我们这样多简单,多容易——除非你自己做过。如果你真的认为能既迅速又简单的做出来,你自己试试。干吧,拼装出一个摇晃的桌子。
如果你希望得到一个好的产品,你要理解明白开发需要时间和技能,有很多你根本想象不到的问题在里面,工匠们也是人,是有感情的,一个好的产品是一个永远让人快乐的事,值得我们付出努力和耐心,这样,它将成为我们所有人能引以为豪的东西。