有人说编程序是一门艺术,也有人说做软件项目是一个工程,那么软件到底是属于艺术还是工程呢?其实更专业点的说法应该是问,软件产业到底属于技术密集型还是劳动密集型?我认为,有的软件项目具有劳动密集型的特点,但更多的项目是属于技术密集型。
先来看工程,工程的第一个特点是可预见性。也就是说,在工程还没有开始以前,已经在人们心目中有了一个具体的形象和 标准,工程的目标则是去实现这个已经被设计好的东西。我们知道建筑施是工队典型的劳动密集型产业,施工队按照设计好的图纸施工(用户是房产商),按照制订好的标准验收,这个标准可以定得非常细致,每堵墙,每道梁,每扇窗都可以细微到毫米。而技术密集型的特点则是不可预见性,比如达芬奇在画蒙娜丽莎以前,绝对没有人告诉他眼睛应该画多大,头发应该画多长。
软件粗看起来很类似做房子,前期用户提需求,建立软件规格标准,然后可以根据软件规格来做。但很少有软件项目最后做出来的样子是完全和当初写的规格说明书上一模一样的。大多数用户在开发过程中或使用过程中会新提出很多更改的要求,甚至把软件改得面目全非。这是 软件工程学很不愿意面对的一种事实,因为工程学的理论基础是目标的可清晰预见性,而在工程中发生不可预见的变化成本非常巨大。因此传统的软件工程倡导前期做大量细致的需求和分析工作,企图减少中途发生变化的可能。