什麼是軟件設計

什麼是軟件設計?就筆者的觀點來看:軟件設計是採用編程或腳本語言優雅地表達並解決現實需求的一門科學和藝術。「優雅地表達」想傳遞的意思是,所設計出來的軟件應當能容易被人理解、方便擴展和維護。從這必定義能夠看出軟件設計首先是一門科學,是一門解決用戶需求的軟件科學。既然是科學,不可避免的要掌握相關的科學知識,好比數據結構、計算機組成原理、編程語言等等,而這些內容也正是大學計算機相關專業所傳授的知識。科學知識或許更加容易被量化,拿數據結構爲例,一種算法比另外一種算法是否更優能夠從算法的時間冗餘度和空間冗餘度進行衡量。

除了科學的部分,軟件設計還涉及藝術的範疇。既然是一門藝術,那就必定存在欣賞的問題,也就意味並非每一個從業人員都能欣賞這種藝術,而只有達到了必定的層次且造成了本身的思想後才能欣賞它。因爲設計中藝術的非直觀性,形成其在現實中不容易被量化,所以難以造成相應的評估準則,進而形成在軟件行業容易被忽視。試想一想,大學課程有多少內容是在教咱們將軟件設計看成藝術進行欣賞並追求?

好的軟件設計能相對方便(甚至是很方便)地實現新的需求問題。需求分析是告訴咱們「作什麼」,其顯然很是的重要,而設計更多地涉及「怎麼作更好」。既然對於設計的好壞不能徹底經過量化的方式進行衡量,那如何去評價一個軟件設計的好壞呢?或者在進行軟件設計時,如何去思考以作出一個好的設計呢?這能夠經過對一些軟件設計原則的把握來作到。設計原則可能有不少,但並非每個項目都要同時知足全部的設計原則,另外,不一樣的項目其特性有可能使得有些設計原則並不適用。另外,設計原則也不是一成不變的,可能因項目的特色又能夠抽取出另外的設計原則。筆者將在後續的文章中闡述平常工做中所遵照的軟件設計原則。

軟件設計是一個不斷提煉和抽象的過程。說它是一個提煉的過程,是由於在設計之初會想到不少須要考慮的因素,這些因素在設計工做沒有深刻以前,並不能發現它們有些是重疊的,或者有些根本就不須要考慮。隨着設計的深刻,會從衆多的因素中獲得其中的關鍵因素並將這些因素付之於實踐。設計也是一個抽象過程,須要從衆多的表象中找到它們的共性,經過表達共性從而最終描述每一個個性,而不該當侷限於直接去描述每個個性。設計的深刻過程並不僅是一味地思考,除非設計者之前有過相似的設計經驗,不然設計過程一般須要進行必定的代碼編寫工做,以輔助思考,這一點對於開發軟件架構師(系統架構師不包括在內)也應當是同樣的。

軟件設計是一個創造模型的過程。經過對需求的理解和抽象,好的設計將最終構造出一個模型,並且這個模型與現實世界的某樣東西多是相相似的。這個模型除了實現了用戶的需求,還向他人展現了她本身是「什麼模樣」以及可能會如何行事。打個比方,若是有人發明了一種新的交通工具,他如何最爲有效地表達這一新的交通工具究竟是什麼樣的呢?是直接拿一張圖紙給他人並說「你看看圖紙就知道了」好呢?仍是打一個你們都耳熟能詳的比方好呢?顯然,後者更好。若是他說「這個新的交通工具與如今的轎車很像,只不過…」,如此一來,聽衆立刻就會想,這個新的交通工具備四個輪子、也有方向盤等等。顯然,後者能很快地讓聽衆利用其生活經驗快速的接收信息,而好的軟件設計也應當作到這一點。軟件設計時的模型創造過程,其實就是賦予軟件代碼「生命」的過程,由此看來一個好的設計應當是 「有生命的」。

軟件設計是一個作選擇的過程。人有時沒有選擇反而輕鬆。一個剛畢業的大學生若是隻拿到了一個offer,他可能沒有選擇單位的煩惱,不論單位好壞都去報道就是了。可是,若是他拿了兩個offer,選擇的煩惱也就有了 —— 是去A單位好呢?仍是B單位好?不幸的是,軟件的設計過程每每存在大量的選擇。是用空間換時間好呢?仍是用時間換空間好?是如今考慮可擴展性呢?仍是未來?等等。所以,絕不誇張地說,設計是「痛苦」的,除非設計主題很簡單或直接了當。有苦固然也就有樂,在設計沒有最終定下來時,須要痛苦地思考和選擇,每每是一個以爲這個也不行、那個也很差的過程。可是,一旦設計最終定稿,會發現「這就是我想要的設計」,隨之而來的是三百六十度的大轉變,以爲這個也應當就是這樣,那個也應當是這樣,其結果是設計者能從中體會到一種美,並從中收穫樂趣。

軟件設計是一個在有限理性範圍內追求完美的過程。有限理性很是重要,設計者須要在各類條件容許的狀況下作出合理的設計選擇。另外,促使設計者用心並「痛苦地」進行設計的動力是設計者追求完美的品德。能夠說,若是沒有這種追求,就很難得到一個好的軟件設計。
算法

相關文章
相關標籤/搜索