軟件設計要素初探

概述

軟件是一種特殊的做品。看不見摸不着,卻似有幽靈般的力量驅動事物運行並展現變化。軟件本質是數據採集與加工裝置,其使命是處理數據。人經過軟件與數據和生活交互。數據-模型,算法-流程,封裝-集成,現實-鏈接。html

軟件設計將需求轉化爲可見的數據結構與領域對象、算法與流程,並採用恰當的全局/局部結構進行組織和集成,符合軟件的預期質量指標。軟件設計的核心是邏輯結構的設計。數據的結構、控制流的結構、部署的結構、結構的組合與嵌套。前端

軟件設計要素主要包括:設計目標/原則/考量、領域建模、系統劃分、應用模型、架構流圖、存儲設計、模式系統、技術設施、API設計。設計要素也涉及到全局錯誤處理、破解結構性難題、總體與兼容、設計取捨、設計與重構、設計與質量、設計與細節、維護與擴展、測量技術、設計實驗。算法

本文主要對軟件設計要素作一個全景式的瞭解,做爲平常設計和開發工做的基本指引。sql


整體導引

設計目標

制定設計目標是很是重要的。團隊的人力和資源一般是有限的,而要完成的事情和指標彷佛無窮無盡,相互衝突。貪多嚼不爛。設計並非無頭無尾的紙上談兵。shell

肯定要達成的功能及相應的質量屬性,哪些是真正所指望的,可以真正解決人們的麻煩,決定要往哪一個方向使力,投入是否得到了使人欣喜的產出。 設計要考慮人性,人與人之間的溝通。 作正確的事情。編程

詳見: 「架構設計的目標與衡量」設計模式


設計原則

爲了確保軟件可以適應複雜多變的業務需求,且持續保持「柔性」, 須要確立和遵循一些設計原則。設計原則指導設計實踐和編程實現。api

詳見: 「一些軟件設計原則」

數據結構

設計考量

當拿到一個需求/重構/優化時,如何展開設計工做呢?設計方案須要考慮哪些因素呢?架構

詳見: 「設計方案考量的準則與細則」


設計要素

設計要素能夠分爲宏觀層次的要素和局部層次的要素。宏觀層次的要素影響軟件的總體設計和變動;局部層次的要素隻影響軟件的某個組成部分。

宏觀層次的要素主要包括:領域建模、系統劃分、應用模型、架構流圖、存儲設計、技術設施、API設計;局部層次的要素主要包括:模式系統、設計實踐的取捨權衡。

領域建模

領域建模是軟件設計的初始點。 反覆追溯事物的本質「是什麼」,從不一樣視角去理解事物的性質,理解事物之間的關聯,梳理事物與活動的流程與環節,抽象出實體與關聯,規則與約束。

領域建模最核心的部分是:定義自身的定位,定義基礎要素,定義完備的能力集合。

可參閱: 「軟件設計要素初探:領域建模的初步思考」

系統劃分

將整個系統劃分爲若干正交的緊密關聯的子系統,以及高內聚低耦合的小而美的模塊與微服務,理清職責、交互與邊界。劃分的基本原則是「識別、分離和組合關注點」。每一個子系統一定有其核心關注點和基礎關注點,而基礎關注點中交疊的部分,便是子系統交互定義的基礎。

可參閱:「軟件設計要素初探:組件化思想」

應用模型

應用模型涉及到數據處理的全局流程和交互方式。 我所接觸過的,主要有「請求-響應模型」、「流處理模型」、「分佈式模型」、「人機交互模型」。

可參閱:「軟件設計要素初探:應用模型」

架構流圖

架構流圖是系統組件及組件交互的動態流動圖,決定了處理數據和領域對象的全局控制結構。組件化是使用架構流圖的前提。

可參閱:「軟件設計要素初探:架構模式」


存儲設計

存儲設計是領域建模的設計細化,決定數據的結構以及領域對象的表達與存取,是軟件詳細設計的關鍵環節。存儲設計一般要考慮讀寫操做的性能、容量、併發、事務、搜索。

可參閱: 「軟件設計要素初探:存儲設計」

模式系統

模式系統,是對軟件設計與開發中常見問題的設計方案和成例總結。在不少時候,模式簡化了設計的考量,可以以更小的成本得到更好的方案。模式的組合,在技術層面構成了軟件應用的骨架。

模式在不一樣層次上,能夠分爲:設計模式、業務模式、架構模式、分析模式。

  • 設計模式是實現特定需求的接近代碼層面的設計套路,一般用於梳理和表達對象之間較爲複雜的依賴和交互關係,將錯綜複雜的容易膨脹的難以理解和擴展的條件判斷邏輯解開成一系列對象的清晰可理解的易擴展的交互結構。 參閱文章:「設計模式之基礎模式概覽」

  • 業務模式是對業務規則和流程的常見類似性、以及特定業務的數據處理能力的提煉**,是業務應用系統中的常見套路。可參閱: 「軟件設計要素初探:業務模式」


技術設施

技術設施是實現特定類軟件應用的適用某種編程語言和平臺的一整套技術機制。技術設施是軟件系統的通用子域。

如下是我所接觸過的Java系技術設施:

  • Java系技術棧基石是:Java + JVM ; JavaWeb技術棧基礎是:Http + Servlet【必知必會】

  • 簡單JavaWeb應用後臺:Struts + Spring + Hibernate + JSP + Velocity 【深情回顧】

  • Java服務工程後臺:Spring + ibatis + Mysql + Cache + Message + Restful(or Dubbo) + [ Git ] + ZK【工程套路】

  • 海量業務數據管理:Cluster + ES + Hbase + Storm 【大數據技能拓展】

  • 測試工程:Python + Groovy + CI + CodeReview 【質量控制】

  • 運維:Python + Shell + Ngnix + Docker(or VM) 【DevOp能力】

  • 前端技術棧基礎: Html+Javascript+CSS+Ajax + Reactor; 基礎庫:jQuery + Bootstrap + Highchart 。因爲我已再也不寫前端,對前端蓬勃發展的技術體系不甚瞭解,這裏再也不多述了。

技術選型便是根據項目實情選擇或簡單或複雜的技術棧。技術選型一般更多考慮實現目標的非功能質量屬性。性能、初期成本和發佈時間、團隊技術組成、產品複雜度、可定製性、可擴展性、可維護性是經常要考慮的重要因素。

技術選型也可適當引進正在起步發展的技術。起步發展的技術雖然不夠成熟,對線上服務的穩定形成潛在的威脅,卻可抓住機遇領先一步,提高生產效率。可先在內部應用或探索性項目中試點,而後逐步推廣到線上應用。因噎廢食是不可取的。Anyway, 再先進的技術棧都會很快過期,什麼纔是真正值得掌握的呢?


API設計

API 是軟件應用向外部提供自身服務的一種形態和公開接口。就像一我的的着裝打扮、舉止言行、形象狀態,是其內在的某種體現。優雅的API是清晰簡潔的,就像少女的肌膚同樣柔滑。

怎樣合適地公開服務,是須要精思熟慮的。「通用訂單搜索的API設計得失錄」「從新設計導出API」 梳理了我在作API設計實踐的一些心得與檢討。

實際權衡

軟件設計的實際過程當中,還須要權衡更多因素,才能作出最終設計決策。

「軟件設計要素初探:軟件設計的一些子主題」 討論了一些設計的實際問題: 錯誤處理、結構性難題、總體與兼容、設計取捨、設計與重構、設計與質量、設計與細節、維護與擴展、測量技術。

要素組合


實現好設計

好設計

好的設計天然、清晰而容易理解;容易擴展和修改而影響局部化;豐富而不復雜不單調。能夠將好的設計與好的繪畫或建築進行對比。好的繪畫和建築,有的簡潔而內涵深意,有的豐富而不失清麗。好的設計不矯揉造做,亦不過分追求,知足必需而添加適當的色彩。

設計實驗

物理學家爲了探索和發現天然規律會設計物理實驗,思想家爲了論證某個問題會設計思想實驗,工程師爲了驗證明現的可靠性會設計工程實驗,而設計者爲了提高設計能力和驗證設計的可行性,也須要大量的設計實驗。針對每一個設計知識點,設計一些實驗,或者在項目實戰中使用和體會。重要的是從實驗中快速積累大量經驗。

可作的設計實驗有:

  • 代碼層次:在業餘項目中研習設計模式, 在正式項目中使用和體會設計模式; 重構代碼,更加天然而容易理解和擴展; 識別和分離關注點,組件化邏輯;抽取和積累經常使用業務模式的實現。

  • 設計層次:繪製設計圖增進總體理解;識別和解除設計束縛;提煉關注點,定義合適接口; 多視角設計判斷活動;從細節中發現設計。

  • 存儲層次: 關係型存儲設計;大數據存儲設計; 學習底層存儲結構的原理與實現。

  • 領域層次: 抽象事物、活動與關聯;在破解結構難題中建立新的技術機制實現。

  • 測量層次: 測量軟件的響應時間、吞吐量和穩定性,觀察佔用資源。

  • 經驗層次: 學習優秀源代碼和系統;積累設計模式、業務模式與架構模式。

  • 質量層次: 爲設計制定質量指標,並使設計方案符合質量指標要求。


小結

不管是領域模型、系統組件、架構模式、存儲設計仍是業務模式、設計模式,都是一種結構抽象。結構模式或大或小,都是軟件結構的構件。軟件設計,便是發現和運用結構模式,解決現實中的各類業務問題。

綜合而言,軟件設計主要是由兩部分組成:相對穩定而可演進的領域模型,若干結構模式所組合而成的可重構優化的應用控制結構。

參考文獻

相關文章
相關標籤/搜索