軟體設計的一些思考

2021-03-31 08:56:59 字數 2746 閱讀 7614

軟體設計的一些思考

從事軟體開發工作已經五年了,仔細想想,雖然做了不少專案,但是在軟體技術上,感覺始終還是進步甚微,一方面和公司的情況有關,一方面,我想,也是自己個人總結和思考不夠吧。

所以,慢慢的,還是有必要對自己的一些經驗做思考和總結。

為什麼只談軟體設計,不談軟體開發呢,軟體開發涉及的不僅僅是設計技術了,還包括軟體專案管理等許多內容,設計僅僅是其中的一部分,通過這些年的經驗,我還是覺得自己作為乙個技術專家的角色更加合適一些,在自己真正在管理方面成熟的時候,再談管理。

在四年前,當我通過系統分析員考試的時候,我心裡很清楚,自己離真正的系統分析員還差很遠。

遺憾的四年之後,我還是感覺,自己離真正的系統分析員,還是有相當的距離。

但是不管怎樣,軟體設計是我未來成為乙個軟體技術專家的乙個發展方向,整理分析一下,我想,會更加有利於自己未來的成長。

軟體工程中,注重設計,概要設計、詳細設計,都非常強調,所以在公司的軟體開發過程中,常常要要求有設計階段,要出設計文件。

有意思的是,在新太,軟體質量和設計文件,卻幾乎沒有實際的聯絡,我看到的現象是,有設計文件的專案,軟體質量往往很一般,不少沒有設計文件的專案,軟體質量還是很不錯的。

事實上,設計和設計文件無關,設計文件多,不代表軟體設計的好。

從軟體的角度來講,最終直接影響軟體質量的,是軟體的編碼,設計再好,編碼爛的一塌糊塗,結果還是作出個爛軟體,所以編碼質量,在任何情況下,都是優秀軟體質量的基石。

前一段時間看了一本書,叫做《程式設計珠璣》,裡面介紹的都是一些具體的問題的解決演算法,這本書對程式設計師提出了乙個重要的建議:在編寫**之前,要再多想一想,再多思考一下,有沒有更好的解決方法?

乙個愚蠢的程式設計師是蒙頭寫程式的,真正優秀的程式設計師,是應該在思考之後,再寫程式。

我搬一下書中的例子出來給大家看看:

【問題】有這樣乙個文字檔案,檔案每行記錄是乙個整數,其值從0到

1,000,000

,正常情況下資料不能重複,檔案大約有

500,000

行,現需要編寫程式讀入檔案,並輸出乙個結果檔案,結果檔案為對輸入檔案的記錄從小到大進行排序。

【約束】系統記憶體僅有

256kb

,要求能夠在

60秒內完成檔案輸出。

【分析】

(首先要說明這個例子看起來比較古老,現代計算機記憶體遠遠超過

256kb)

這個乍一看,是乙個排序問題,特殊之處就是記憶體不足,只有

256kb

,所以無法用乙個大陣列來做內部排序,只能採用外部排序的方式。

所以表面看起來解決這個問題是比較複雜了(你記得外部排序嗎?要不要翻翻資料結構的書查查?還是

google

搜尋一把?),要滿足效能要求也非常困難。

如果給予你更多的思考時間,我想很多人都可以想到以下解決方法:

乙個位元組有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.學習應該先學理念再學細節 第一點 無論是桌面應用...

軟體設計的一些感想

已經好久沒有寫部落格了,不是因為沒有學東西,而是因為學的東西不夠系統,不夠具體,沒有整理起來 外加人懶 所以不想浪費筆墨。所以一直潛水。但總會有感想的,在學習的過程中,時常會遇到一些令人驚喜的東西,令人拍案叫絕的東西,但學會之後覺得簡單或者不值一提,於是沒有當機立斷寫出一些洞見。事後用的時候倒覺得理...

一些主要的軟體設計原則

一,開閉關法則 就是對於擴充套件要開放,對於修改要關閉,什麼意思呢?就是說你的軟體架構如果功能發生了變化,你應該是想著去擴充套件原來的類,而不是去修改原來的類,因為萬一你修改了這個類,那麼又有上萬個類與這個類有著聯絡,那麼你就要去改寫上萬個類了,所以,我們應該是去主動的擴充套件某個類,而不是去修改那...