系統設計的好壞在根本上決定了軟體系統的優劣。可以說「差的系統設計必定產生差的軟體系統」,但是不能保證「好的系統設計必定產生好的軟體系統」。因為在設計之前有需求開發工作,在設計之後還有編碼,測試和維護工作,無論哪個環節出了差錯,都會把好事搞砸了。
據說上帝把所有的女士都設計成天使,可是天使們在下凡的時候,有些人雙腳先著地,有些人臉先著地。上帝的這一疏忽讓很多女士傷透了心。所以我們在開發軟體的時候,一定要吸取這個教訓。
一.合適性
系統設計的源頭是需求,這是由商業目標決定的。高水平的設計師高就高在「設計出恰好滿足客戶需求的軟體,並且使開發方和客戶方」獲取最大的利益,而不是不惜代價設計出最先進的軟體。
評估體系結構好不好的第乙個指標就是「合適性」,即體系結構是否符合適合於軟體的「功能性需求」和「非功能性需求」。人們一般不會在需求文件中指定軟體的體系結構,需求與體系結構之間並沒有一一對應的關係,甚至沒有明顯的對應關係。所以設計師可以充分發揮主觀能動性,根據需求的特徵,通過推理和歸納的方法設計出合適的體系結構。經驗不豐富的設計師往往把注意力集中在「功能性需求」而疏忽了「非功能性需求」,殊不知後者恰恰是最能體現設計水平的地方。
比如設計住宅。住宅的最基本的功能性需求是「吃喝拉撒睡」,全世界人民「吃喝拉撒睡」的方式都是差不多的。住宅的非功能性需求主要是讓人住得舒服。住宅的種類非常多,如茅草屋、窯洞、筒子樓、酒店、別墅等等。窯洞的體系結構與別墅的有天壤之別,你能說後者一定比前者好嗎?不能,因為沒有可比度。
如果一名建築師受**委託給廣大的中國陝北農民設計住宅,他應當設計更好的窯洞而非別墅。理由很簡單,因為廣大的陝北農民住不起別墅,而那裡的條件特別適合於建窯洞。窯洞對於當地的農民而言是非常實用而且成本低廉的住宅。
對於軟體系統而言,能夠滿足需求的設計方案可能有很多種,究竟該選擇哪一種呢?這時候商業目標是決策依據,即選擇能夠為開發方和客戶方帶來最大利益的那個方案。大部分開發人員天生有使用新技術的傾向,而這種傾向對開發商業產品而言可能是不利的,切記切記!
二.結構穩定性
體系結構是系統設計的第一要素,詳細設計階段的工作如使用者介面設計,資料庫設計,模組設計,資料結構設計等等,都是在體系結構確定之後開展的,而程式設計和測試是最後面的工作。如果體系結構經常變動,那麼建築在體系結構之上的使用者介面、資料庫、模組、資料結構等也跟著經常變動,用「樹倒猢猻散」來比喻很恰當,這將導致專案發生混亂。
當前中國有幾句流行的至理名言:「穩定壓倒一切」、「發展才是硬道理」。發展的前提條件是穩定,社會如此,開發軟體產品也是如此。
所以體系結構一旦設計完成,應當在一定的時間內保持穩定不變,只有這樣才能使後續工作順利開展。
前面講了,體系結構是依據需求而設計的。如果需求變更了,很有可能導致體系結構發生變更,那麼「保持結構穩定」豈不是成了空想?
高水平的設計師應當能夠分析需求文件,判斷出哪些需求是穩定不變的,哪些需求是可能變動的。於是根據那些穩定不變的需求設計體系結構,而根據那些可變的需求設計軟體的「可擴充套件性」。
三.可擴充套件性
可擴充套件性是指軟體擴充套件新功能的容易程度。可擴充套件越好,表示軟體適應「變化」的能力越強。由於軟體是「軟」的,那是否所有的軟體必須設計能擴充套件新功能呢?這要視軟體的規模和複雜性而定。
如果軟體規模很小,問題很簡單,那麼擴充套件功能的確比較容易。要是軟體的**只有100行,這時就無所謂「可擴充套件性」了,你想怎麼擴充套件都可以。如果軟體規模很大,問題很複雜,倘若軟體的可擴充套件性不好,那麼該軟體就像用卡片造成的房子,抽出或者塞進去一張卡片都有可能使房子倒塌。
是否任何軟體在設計的時候都要考慮可擴充套件性呢?不見得,如果確信某個軟體在它淘汰之前永遠都不會變更(如一次性產品),那麼在設計階段就沒必要考慮可擴充套件性,這樣省事省力。
可擴充套件性越來越重要,社會的商業越來越發達,需求變化就越快。需求變化必將導致修改(或擴充套件)軟體的功能,如果軟體的擴充套件性比較差的話,那麼修改(或擴充套件)功能的代價會很高。
現代軟體產品通常採用「增量開發模式」開發商不斷地推出軟體產品的新版本,從而不斷地獲取增值利潤。如果軟體的可擴充套件性比較差的話,每次開發新版本的代價就會很高。雖然開發商抓住了商機,但卻由於設計水平差而導致沒有賺取多少利潤,真是要活活氣死。體系結構的穩定性是根據那些穩定不變的需求而設計的,體系結構的可擴充套件性則是依據那些可變的需求而設計的。從字面上看,穩定性和可擴充套件性似乎有點矛盾。兩者之間存在辯證的關係:如果系統不可擴充套件的話,那麼就沒有發展前途,所以不能只關心穩定性而忽視可擴充套件性;而軟體系統「可擴充套件」的前提條件是「保持結構穩定」,否則軟體難以按計畫開發出來,穩定性是使系統能夠持續發展的基礎。所以穩當性和擴充套件性都是體系結構設計的要素。
人們對物質有喜新厭舊的天性,你可以經常改變房子的裝潢和擺設,但不能每次都去拆牆,挖地基。在軟體開發過程中,變化是司空見慣的事情。如果每次變化都導致體系結構發生大的變化,那簡直就是「傷筋動骨」,這樣的體系結構無疑是敗筆之作。
分層開發是一種重要的體系結構,有著良好的可擴充套件性,而且在擴充或修改功能時,基本不會破壞原有結構的穩定性。可以參看我的分層開發思想與小籠包
一文。四.可復用性
復用就是指「重複利用已經存在的東西」。復用不是人類懶惰的表現,而是智慧型的表現。因為人類總是在繼承了前人的成果,不斷加以利用、改進或創新後才會進步。
復用有利於提高產品的質量、提高生產效率和降低成本。由經驗可知,通常在乙個新系統中,大部分的內容是成熟的,只有小部分內容是創新的。一般地,可以相信成熟的東西總是比較可靠的(即具有高質量),而大量成熟的工作可以通過復用來快速實現(即具有高生產效率)。勤勞並且聰明的人們應該把大部分的時間用在小比例的創新工作上,而把小部分的時間用在大比例的成熟工作中,這樣才能把工作做的又快又好。
企業成功地開發了某個軟體產品之後,如果下個新產品能夠復用上個產品的體系結構的話,那麼新產品的系統設計的成本和風險將大大降低。
可復用性是設計出來的,而不是偶然碰到的。要使體系結構具有良好的可復用性,設計師應當分析應用域的共性問題,然後設計出一種通用的體系結構模式,這樣的體系結構才可以被復用。
系統設計的一些原則
系統設計的好壞在根本上決定了軟體系統的優劣。可以說 差的系統設計必定產生差的軟體系統 但是不能保證 好的系統設計必定產生好的軟體系統 因為在設計之前有需求開發工作,在設計之後還有編碼,測試和維護工作,無論哪個環節出了差錯,都會把好事搞砸了。據說上帝把所有的女士都設計成天使,可是天使們在下凡的時候,有...
系統設計的一些原則
系統設計的好壞在根本上決定了軟體系統的優劣。可以說 差的系統設計必定產生差的軟體系統 但是不能保證 好的系統設計必定產生好的軟體系統 因為在設計之前有需求開發工作,在設計之後還有編碼,測試和維護工作,無論哪個環節出了差錯,都會把好事搞砸了。據說上帝把所有的女士都設計成天使,可是天使們在下凡的時候,有...
一些設計上的原則
1.如果類不可變,就設為final 方法入參引用不可變也設為final。防止後續 誤改。2.設計時,能夠方便擴充套件而不用修核心 如,設計乙個遠端呼叫框架,這時可以通過 鏈來實現擴充套件功能。專案中有乙個job定時器業務,服務端負責生成job定時任務。客戶端會有機子負責接收執行。伺服器和客戶端通過h...