软件开发的本质

多年来,我一直在思考一个问题:软件是科学还是艺术?直到有一天,一个新鲜的词汇进入了我的视野,它就是软件工艺。那一刻,我才意识到,其实我一直思索的问题应该是软件是工程还是艺术,而软件工艺给了我答案:软件是工艺,是工程和艺术的结合。我知道我将工艺解释为工程和艺术有所牵强,且容我暂时这么称呼它。这是我第一次看到这种提法时的第一感受。

多年来,我一直困惑于一个问题:如果工程化的方法能够生产出标准化的产品来,那么为什么具有相同功能的软件在不同的人手中写出的代码却完全不同呢?Fowler说软件是思想的产品,所以我相信软件更接近于艺术,而每一次软件开发的过程都是一个艺术创造的过程。然而说软件是艺术又过于牵强,即使是一个懂Java的程序员,你让他去看一段汇编程序,他也未必能从中得到丝毫的美感。而工艺这个词,则极恰当地说明了软件开发的本质。

软件开发的高科技外表和软件工程思想的提出,让我们很容易地忽略了一个事实,那就是软件是一个绝对的手工产品。我相信,即使到了人工智能高度发达的未来,就算所有的产品都可以自动生产出来,软件也必然是纯粹的手工产品,否则从逻辑上就说不通。一个汽车制造工人可能在未来完全由机械取代,但软件开发工作却永远不可能被机械取代,因为软件是思想的产品,而机械不可能代替人类思考。

至此我更加坚信,程序员在软件开发过程中起着决定性作用。好的设计固然重要,但它决不可能保证软件开发的绝对质量。也许有人会说,好的设计已经被许多系统证明了是有效的,就像设计模式一样,会在许多系统中复用。但这样已经被证实了有效的模式,迟早有一天会被机械代替,而不需要程序员去完成。复制一段代码几乎没有任何成本,程序员要做的永远是机械无法完成的工作。

程序员的正式名称应该是软件工程师。工程师的主要职责是设计而不是构建。你什么时候见过一个建筑工程师亲自去磊砖?Jack Reeves在其22年前的著名论文《什么是软件设计》中就已经提出,源代码是软件设计,而软件的构建由编译器完成。这就是软件不同于建筑的地方,它的构建几乎没有成本。软件工程师编写代码的过程就是对软件设计的过程,因此需要具备良好的素质。

软件不同于其它工程的另一个重要区别就是软件的修改相对来说更为容易,成本更低,这也是为什么重构相对于软件的影响要远大于其它工程。

关于软件开发的思考,还在继续。。。。。。

猜你喜欢

转载自weatry.iteye.com/blog/2124625