軟體設計的一些思考
從事軟體開發工作已經五年了,仔細想想,雖然做了不少專案,但是在軟體技術上,感覺始終還是進步甚微,一方面和公司的情況有關,一方面,我想,也是自己個人總結和思考不夠吧。
所以,慢慢的,還是有必要對自己的一些經驗做思考和總結。
為什麼只談軟體設計,不談軟體開發呢,軟體開發涉及的不僅僅是設計技術了,還包括軟體專案管理等許多內容,設計僅僅是其中的一部分,通過這些年的經驗,我還是覺得自己作為乙個技術專家的角色更加合適一些,在自己真正在管理方面成熟的時候,再談管理。
在四年前,當我通過系統分析員考試的時候,我心裡很清楚,自己離真正的系統分析員還差很遠。
遺憾的四年之後,我還是感覺,自己離真正的系統分析員,還是有相當的距離。
但是不管怎樣,軟體設計是我未來成為乙個軟體技術專家的乙個發展方向,整理分析一下,我想,會更加有利於自己未來的成長。
軟體工程中,注重設計,概要設計、詳細設計,都非常強調,所以在公司的軟體開發過程中,常常要要求有設計階段,要出設計文件。
有意思的是,在新太,軟體質量和設計文件,卻幾乎沒有實際的聯絡,我看到的現象是,有設計文件的專案,軟體質量往往很一般,不少沒有設計文件的專案,軟體質量還是很不錯的。
事實上,設計和設計文件無關,設計文件多,不代表軟體設計的好。
從軟體的角度來講,最終直接影響軟體質量的,是軟體的編碼,設計再好,編碼爛的一塌糊塗,結果還是作出個爛軟體,所以編碼質量,在任何情況下,都是優秀軟體質量的基石。
前一段時間看了一本書,叫做《程式設計珠璣》,裡面介紹的都是一些具體的問題的解決演算法,這本書對程式設計師提出了乙個重要的建議:在編寫**之前,要再多想一想,再多思考一下,有沒有更好的解決方法?
乙個愚蠢的程式設計師是蒙頭寫程式的,真正優秀的程式設計師,是應該在思考之後,再寫程式。
我搬一下書中的例子出來給大家看看:
【問題】有這樣乙個文字檔案,檔案每行記錄是乙個整數,其值從0到
1,000,000
,正常情況下資料不能重複,檔案大約有
500,000
行,現需要編寫程式讀入檔案,並輸出乙個結果檔案,結果檔案為對輸入檔案的記錄從小到大進行排序。
【約束】系統記憶體僅有
256kb
,要求能夠在
60秒內完成檔案輸出。
【分析】
(首先要說明這個例子看起來比較古老,現代計算機記憶體遠遠超過
256kb)
這個乍一看,是乙個排序問題,特殊之處就是記憶體不足,只有
256kb
,所以無法用乙個大陣列來做內部排序,只能採用外部排序的方式。
所以表面看起來解決這個問題是比較複雜了(你記得外部排序嗎?要不要翻翻資料結構的書查查?還是
搜尋一把?),要滿足效能要求也非常困難。
如果給予你更多的思考時間,我想很多人都可以想到以下解決方法:
乙個位元組有8個
bit,既然檔案的資料不能重複,那我們可以用乙個巨大的陣列標誌位,來標誌每乙個數是否在檔案中出現過。
256kb
的記憶體,那可以表示
256×
1024
×8=2,048,000
,足以表示0到
1,000,000
的數。(事實上即便記憶體不足,或者需要表示更大的數字,也可以把標誌陣列存放到外部檔案中)
這樣程式就非常簡單了,從檔案順序讀入記錄,然後設定陣列中相應的位元位,全部讀完畢後,掃瞄一遍標誌位陣列,如果標誌位為
true
,則輸入數字到結果檔案中。
very ******
,效能最高,而且很美。
如果我是乙個程式設計師,開始用外部排序解決了這個問題,然後再想到後面的方法,我一定會極度鬱悶。
所以如果想要不鬱悶,就是一定要記住,在編寫**之前,做更多的思考!
如果要再進一步深究為什麼要思考,這個就涉及到軟體開發的一些本質理念問題,比如說,你是否希望構建乙個好的軟體系統?你是否希望成為乙個出色的軟體開發人員?如果你希望做到這一切,你就需要思考。
設計,就是思考的過程之一。
我認為軟體開發,應該有三個層次:體系結構、設計和編碼。
體系結構從某種角度來講,超出了軟體產品範圍,是從軟體產品的整個應用解決方案角度來描述軟體產品的,是非常高層次的軟體結構。最重要的是,軟體體系結構要將公司戰略、商業目標結合到軟體產品中,以系統的、戰略的眼光去考慮整個軟體系統的設計。如,是採用小型機還是
pc伺服器?是採用
db2還是
oracle
?是採用
win2000
還是linux
?所有軟體模組是自行開發還是考慮採用部分第三方軟體?
最近張總在設計下一代的平台,其中有乙個選擇,是選擇
nas伺服器來做檔案伺服器,取代現在的
pc伺服器+磁碟陣列做檔案伺服器的方式,作為乙個軟體開發人員,從軟體來看,採用什麼檔案伺服器,是沒有任何影響的,但是從系統角度來看,檔案伺服器能否承受高速資料的吞吐量,則很可能成為系統能否穩定執行,能否應對突發事故的關鍵。
再比如軟體系統的選擇,是選擇
win2000
,還是linux
。win2000
簡單易用,對工程安裝人員和系統維護人員要求比較低,
linux
則複雜一些,如何在兩者之間權衡選擇呢?由於新太的系統和硬體關係非常緊密,硬體驅動和作業系統的相關則非常大,由於
win2000
的病毒問題嚴重、漏洞太多,必須不斷打補丁,而打補丁後,對硬體驅動又產生了許多影響,問題非常之多,因此,下一代平台必須採用
linux
或者unix
,是從公司產品整體的穩定性和健壯性考慮的。
關於軟體設計分層的一些思考
從大學開始走程式設計師這條路近四年了。之前的三年大多是在學習基礎知識 也不甚紮實。真正覺得進步比較快的是最近一年,主要原因有兩個,一是實習了,二是在做畢業設計,其實歸根結底來說,是參與真正專案的開發了就知道要學什麼要做什麼了。1.個人對分層的認識 2.學習應該先學理念再學細節 第一點 無論是桌面應用...
軟體設計的一些感想
已經好久沒有寫部落格了,不是因為沒有學東西,而是因為學的東西不夠系統,不夠具體,沒有整理起來 外加人懶 所以不想浪費筆墨。所以一直潛水。但總會有感想的,在學習的過程中,時常會遇到一些令人驚喜的東西,令人拍案叫絕的東西,但學會之後覺得簡單或者不值一提,於是沒有當機立斷寫出一些洞見。事後用的時候倒覺得理...
一些主要的軟體設計原則
一,開閉關法則 就是對於擴充套件要開放,對於修改要關閉,什麼意思呢?就是說你的軟體架構如果功能發生了變化,你應該是想著去擴充套件原來的類,而不是去修改原來的類,因為萬一你修改了這個類,那麼又有上萬個類與這個類有著聯絡,那麼你就要去改寫上萬個類了,所以,我們應該是去主動的擴充套件某個類,而不是去修改那...