軟體設計師普遍存在著兩個很大的茫點:系統是單一、系統是自己開發的。
例如,進(訂購)、銷(銷貨、出貨)、存(庫存)系統,一般小型的套件(Package)產品都是此三者視為是單一、完整的進銷存系統。所以,當我們在世貿軟體展所看到各家軟體廠商所看的進銷存系統,業務人員所推銷給客戶、以及於其它同類型產品的比較就會偏重在系統的外觀面:系統所提供功能的多寡、完整性與使用者的圖形介面(GUI)。
又如,請假簽核系統,Designer 當一接到要開發這樣的系統時,大部分一開始會先從客戶 “要什麼” ,再據此開發出系統所該提供的功能與服務,然後,以功能需求為導向,”硬寫” 出來電子簽核的處理邏輯。卻很少去思考與分辨,到底,開發的是人事系統,還是簽核系統,又或者,就叫做請假簽核系統?
我常會在課堂上問學員,當你是主機板開發廠商時,你會不會 “打開” CPU 研究內部的結構呢?絕大部分的學員回答說不會。那麼,既然不會,從設計主機板的角度來看時,就會關注在 “如何” 與 CPU 所提供的 “接口(Interface)” 溝通;又,換一個角度,當你是設計 CPU 的開發廠商時,需不需要 “打開” CPU 呢?答案是理所當然,你必須專注在 CPU 的內部結構設計。同時,站在 CPU 設計者的角度,我只要提供 “接口” 供主機板來用,而根本不需要分析主機板的結構。事實上,CPU 設計者,並無法假設會使用 CPU 的就非得是主機板,可能是 PS2 or XBox,都有機會來使用 CPU。
這些是顯而易見的道理,從以上的例子,可以看出,兩個非常重要的設計哲理會被應用在軟體設計領域:一為介面(Interface);一為封裝(Encapsulation)。
“有所為” 即在於,知道什麼是該作的。瞭解你自己的角色,或者知道你現在是用什麼角度在看待系統的設計。當我是華碩主機板設計師時,我會研究 CPU 的規格,知道該如何與之溝通,但卻不會打開,事實上也無從知道,CPU 的內部結構。不需要打開,就會 “封裝” CPU,因為封裝,所以只能透過 “接口” 溝通 ; “有所不為” ,就表示,因為 “封裝” 了 CPU,所以,我沒有必須去分析 CPU 的內部結構,CPU 對我就是 “黑箱(Black Box)”。
回到 “請假電子簽核系統”,應用上述主機板與CPU的例子,若是看成:
請假系統 = 主機板 ; 簽核系統 = CPU
那麼,若你是開發請假系統,你又何必 “打開” 簽核系統來分析與設計內部的結構呢? 反之,若我是開發 “簽核系統”,我可不能假設只有 “請假系統” 會來使用簽核功能而與之 “綁在一起”,也有可能,公文處理、採購等系統也會使用簽核功能吧?
明確瞭解你現在的角色與看待系統設計的角度時,就可以很理性地分辨出 “有所為” 與 “有所不為”。
有所為時,我會 “打開” 有所為之處,關注的是結構分析與設計;有所不為時,我會將之視為是 “黑盒子”,只關注在如何透過該黑盒子所提供的 “接口” 與之溝通。
大格局的軟體設計架構師(Architect),會花很多的時間來觀察與分辨 “有所為” 與 “有所不為”。 “有所不為” 越多,越能顯示其本領。而不會是 “什麼都是自己來,一切都是自己做的”。
P.S.
“主機板” 與 “CPU” 是相對關係,主機板會整合許多的元件(Component,或稱之為組件),包括 CPU;那麼,當站在 CPU 設計者角度時,其實,CPU 也可以視為是 “主機板”,因為,CPU 同樣也必須整合許多組件,包括,暫存器、控制與邏輯運算單元等。
網路串聯遊戲,怎能少你一個呢?
詳情請趕快到我家版面看首頁mini BBS留言版
Hello smart and nick:
昨晚與一位大陸網友 msn 聊天時,突然有感而發,為什麼學習軟體設計是從 java, c++ 等 programming language 學起才會踏實?
我向那位網友說明,學習軟體設計會是從生活面的觀察與其它領域的知識應用。
淺顯易懂好明瞭
感謝分享,這種觀念,讓小弟又對系統開發的定義,又有不同的見解了。