有人說編程序是一門藝術,也有人說做軟件項目是一個工程,那么軟件到底是屬于藝術還是工程呢?其實更專業點的說法應該是問,軟件產業到底屬于技術密集型還是勞動密集型?我認為,有的軟件項目具有勞動密集型的特點,但更多的項目是屬于技術密集型。
先來看工程,工程的第一個特點是可預見性。也就是說,在工程還沒有開始以前,已經在人們心目中有了一個具體的形象和 標準,工程的目標則是去實現這個已經被設計好的東西。我們知道建筑施是工隊典型的勞動密集型產業,施工隊按照設計好的圖紙施工(用戶是房產商),按照制訂好的標準驗收,這個標準可以定得非常細致,每堵墻,每道梁,每扇窗都可以細微到毫米。而技術密集型的特點則是不可預見性,比如達芬奇在畫蒙娜麗莎以前,絕對沒有人告訴他眼睛應該畫多大,頭發應該畫多長。
軟件粗看起來很類似做房子,前期用戶提需求,建立軟件規格標準,然后可以根據軟件規格來做。但很少有軟件項目最后做出來的樣子是完全和當初寫的規格說明書上一模一樣的。大多數用戶在開發過程中或使用過程中會新提出很多更改的要求,甚至把軟件改得面目全非。這是 軟件工程學很不愿意面對的一種事實,因為工程學的理論基礎是目標的可清晰預見性,而在工程中發生不可預見的變化成本非常巨大。因此傳統的軟件工程倡導前期做大量細致的需求和分析工作,企圖減少中途發生變化的可能。