作者Jack W. Reeves發表What is Software Design?這篇文章於1992年,13年後作者又寫了另一篇文章回顧當時的觀點。全文可以在這個網址下載。這篇文章引起的迴響很大,有堅決反對的意見,也有很多人受它啟蒙而用全新的角度看整個軟體開發的行為。我個人是屬於後者。這些觀點在1992年就提出,非常具有前瞻性,和後來的Extreme Programming的主張互相呼應,間接預言了將程式碼視為文件、自動測試、重構、Simple Design等觀念。
這篇文章探討的,是什麼叫做軟體設計。台灣大多數的軟體公司,將程式設計師視為一種機械性的勞力密集工作,只需要資淺,受過簡單訓練的新手就可以擔任。程式設計師的工作,是將系統設計師(SD)開出來的規格實做出來。還在這個模型下,引進工業工程的大量生產的管理辦法,稱為"軟體工程"。具我所知台灣最大的幾家軟體整合的公司都是走這樣的類比思維。
作者很仔細地觀察比較工業開發生產行為和軟體開發行為,發現一些相似處被忽略了,但是不相似的部份又硬被做類比。我非常推薦所有軟體人都讀這篇充滿智慧的文章。底下簡單條列一些本文的重點。如果您不介意先知道結果會破壞閱讀的樂趣,請往下讀︰
1. 一般認為程式師是勞力密集的組合工人。他們的工作是遵照設計文件的指示進行製造(設計文件是由較有才能的設計師所做出來的),製造的成品是原始碼。對於這點,作者提出了不同的觀點
- 和其他工程類型相類比,軟體的設計文件指的是程式師寫的原始碼。寫程式的過程是設計師的複雜心智活動。而生產製造是編譯器(compiler)的工作。編譯器根據設計文件(原始碼)建造出成品(執行檔)。
- 當你設計完一個橋樑,要用設計成本的十倍來建造那座橋樑;而和一般工程不同的是,軟體的製造是編譯,編譯成本幾乎是零。
- 在其他的工程領域,設計常常會被建造的成本限制住,而不被鼓勵做得太複雜。軟體設計活動的其中一項特色是高複雜度。主要原因是因為製造成本超低:幾乎是免費。假想軟體每項設計都牽涉到開模具,訂購材料與零件,調整生產線,今天的軟體就不會做成那麼複雜。
- 由於製造時間很短(compile一次的時間),所以設計(包含coding)活動幾乎佔滿軟體開發過程的全部。不像其他工程,設計跟製造各佔相當比重的時間。
- 設計的過程有很多種形式,畫各種圖表、在白板前腦力激盪,或著對著天花板發呆地思考,製作雛型等。但是要進行到寫成程式碼經過驗證,設計的工作才算完成。
- 即使資深的高階設計的人員也要親自參與programming。
- 橋樑、飛機由於建造成本高,設計結果需要做出模型做各種實驗來驗證,如電腦模擬、風洞測試等等,不斷改進與修正。
- 但是軟體開發有建造成本超便宜的特性,可以不用對設計本身作太多驗證,而直接做出產品(編譯出執行檔),對成品驗證就夠了。如果有好的靈感或想法,最好即早用程式碼來驗證。
- 由於寫程式是設計的行為,除錯應該和一般的工程的風洞實驗及電腦數值模擬後改良設計一樣,應視為設計的過程。不適用生產線的品管方法。
- 用程式語言作為表達設計概念的工具,的確有其不足之處。例如表達高階架構的概念。
- 所幸隨著程式語言的演進,C++、Java等現代的語言也適合於表達高階的概念。
- 用程式語言表達設計概念,另一個不足之處是domain knowledge難以在程式碼中表達。為了補足程式碼作為設計文件的不足,其他輔助文件是有幫助的。但是不能取代最主要的設計文件:程式碼。
- 現實世界中,高階與低階的設計不可能全然切開。
- 低階設計發現的問題有可能需要高階設計徹底的改變作為配合。
- 所以所有的設計一定要到程式碼的等級才算完成。
沒有留言:
張貼留言