程序員必讀之軟件架構-筆記

架構的驅動力(影響最終軟件架構的重要事情

包括下面這些:數據庫

  • 功能需求:需求驅動架構。無論怎麼捕捉和記錄需求(好比,用戶故事、用例、需求規格書、驗收測試等),你都要大概知道你在構建什麼。緩存

  • 質量屬性:非功能需求(好比,性能、可擴展性、安全等)一般是技術方面的,也很難改造。理論上,這些都須要體如今初始的設計中,忽視這些屬性會致使軟件系統要麼作得不夠,要麼作得太過。安全

  • 約束:約束廣泛存在於現實世界,包括批准的技術清單、規定的集成標準、目標部署環境、團隊規模等。再說一次,不考慮這些會致使你交付的軟件系統與環境不匹配,增長沒必要要的摩擦。服務器

  • 原則:是在試圖爲軟件提供一致性和清晰度時你想要採用的東西。從設計的角度來看,這包括你的分解策略(好比,層、組件和微服務的對比)、關注點分離、架構模式等。明確概述一套初始的原則相當重要,這樣構建軟件的團隊纔會朝着同一方向出發。網絡

C4理論

軟件系統由多個容器構成,容器又由多個組件構成,組件由一個或多個類實現。大多數軟件系統均可以用這種簡單的邏輯結構單元的層級關係來建模。架構

  • 類:對咱們大多數人來講,在一個面向對象的世界裏,類是軟件系統的最小結構單元。併發

  • 組件:組件能夠想象成一個或多個類組成的邏輯羣組。好比,其餘組件可使用審計組件或認證服務,來肯定對特定資源的請求是否放行。組件一般由多個類在更高層次的約束下組合而成。微服務

  • 容器:容器是指一個在其內部能夠執行組件或駐留數據的東西。它能夠是從網絡或應用服務器直到富客戶端應用或數據庫的任何東西。做爲整個系統的一部分,容器一般是可執行文件,但未必是各自獨立的流程。好比,我把每一個Java EE網絡應用或.NET網站都看做一個獨立的容器,無論它們是否運行在同一個物理服務器流程中。從容器的角度理解一個軟件系統的關鍵在於,任何容器間的通訊可能都須要一個遠程接口,好比SOAP網絡服務、RESTful接口、Java RMI、Microsoft WCF、報文,等等。性能

  • 系統:系統是最高的抽象層次,表明了可以提供價值的東西。一個系統由多個獨立的容器構成,例如金融風險管理系統、網絡網銀行系統、網站等。學習

非功能性需求

非功能性需求一般被看做是「能力」,主要跟服務質量有關。按理說,比非功能性需求更好的說法是「系統特徵」或「質量屬性」,但不太經常使用。下面大體列出了常見的質量屬性。

1. 性能

性能就是一個東西有多快,一般指響應時間或延遲。

  • 響應時間:從發出請求到收到響應所用的時間,好比用戶點擊網頁中的超連接或桌面應用程序中的按鈕。

  • 延遲:消息從A點到B點,經過你的系統所用的時間。就算構建的不是「高性能」軟件系統,性能也可應用於Web應用程序、桌面應用程序、面向服務架構、消息系統等幾乎全部你要構建的軟件系統。若是用戶說你的軟件「太慢」,你就明白爲何有一些性能的概念很重要。

2. 可伸縮性

可伸縮性基本上就是軟件處理更多用戶、請求、數據、消息等的能力。可伸縮性和併發機制密不可分,所以能在相同的時間內處理更多的東西(好比每秒的請求)。

3. 可用性

可用性是軟件對服務請求的可操做和可見程度。你常會看到用「9」來衡量或指代可用性,如99.99%(「四個9」)或99.999%(「五個9」)。這些數字指的是正常運行時間的百分比。硬幣的另外一面是能夠容忍的停機時間。99.9%(「三個9」)的正常運行時間意味着留給計劃維護、升級和意外故障的時間天天只有1分多鐘。

4. 安全性

安全性涵蓋了從認證和受權到數據在運輸和儲存中的機密性的全部事情。和性能同樣,安全性頗有可能在必定程度上對你很重要。對於部署到互聯網的Web應用程序,安全性應該被視爲最基礎的東西。開放Web應用程序安全項目(OWASP,Open Web Application Security Project)是學習安全性的一個很好的出發點。

5. 災難恢復

若是失去一個運行了你的軟件的硬盤、服務器或數據中心,會發生什麼?災難恢復處理的就是這些。若是你的軟件系統相當重要,就會常常聽到人們談論業務連續性過程,也就是發生災難事件時,應該作什麼才能保持持續運行的狀態。

6. 可訪問性

可訪問性一般是指像W3C的可訪問性標準這樣的東西,指的是如何讓視覺障礙之類的殘疾人也能使用你的軟件。

7. 監測

有些組織對於應該如何監測軟件系統才能確保它們正常運行和知足服務請求,有特定的需求。這可能包括將軟件與平臺特定的監測功能(好比Java平臺的JMX)集成,或發生故障時向集中監測儀表發送警報(好比經過SNMP)。

8. 管理

監測一般提供一個軟件系統的只讀視圖,有時會有運行時管理需求。例如,有必要的話,暴露一些功能,使得操做人員可以修改系統運行時的拓撲結構或配置元素,刷新只讀緩存等。

9. 審計

人們每每須要一個引發軟件系統中數據或行爲變化的事件的日誌(即審計日誌),特別是涉及錢的時候。一般這些日誌須要捕獲與變更由誰作出、何時作出以及爲何作出相關的信息。變更自己(即變更先後的值)每每也須要記錄。

10. 靈活性

靈活性是一個有點濫用和含混的術語,指的是軟件執行多個任務,或以不一樣方式執行單個任務的「靈活性」。一個很好的靈活性需求的例子是非技術人員修改軟件內部使用的業務規則的能力。

11. 可擴展性

可擴展性也是濫用和模糊的,但它指的是擴展軟件使其能夠作一些如今還不能作的事的能力,也許是經過使用插件和API。一些市面上的產品(如微軟Dynamics CRM)容許非技術用戶擴展存儲的數據和改變其餘用戶與數據交互的方式。

12. 可維護性

可維護性每每被認爲是一個需求,但這究竟是什麼意思?做爲軟件開發者,咱們一般會努力打造「可維護」的軟件,但值得咱們思考的是,代碼庫之後將由誰來維護。可維護性很難量化,因此我寧願思考咱們能夠遵循的架構和開發原則,由於這些是編寫可維護的代碼的驅動力。

13. 法律法規

有些行業受到當地法律或監管機構的嚴格管理,致使了與數據保留或審計日誌等相關的額外需求。舉個例子,大多數金融機構(投資銀行、零售銀行、信託公司等)爲了保持在市場中的運做能力,必須遵照一些規則(如反洗錢)。

14. 國際化(i18n)

不少軟件系統,特別是部署在互聯網上的,再也不以單一的語言交付。國際化是指以多種語言交付軟件中用戶可見元素的能力。這看似簡單,當你試圖將其加入已有軟件時,纔會意識到有些語言是從右向左書寫的。

15. 本地化(l10n)

和國際化相關的是本地化,是指以符合最終用戶文化習俗的方式展示數字、貨幣、日期等內容。有時候,國際化和本地化也統稱爲「全球化」。

相關文章
相關標籤/搜索