公司決定使用軟件解決特定問題奈梳,因此它收集了該系統(tǒng)的需求列表雇毫。 存在多種用于執(zhí)行需求收集的技術(shù)眠砾,這些技術(shù)通常由團隊使用的軟件開發(fā)過程定義商模。 但是至会,架構(gòu)師在設(shè)計軟件解決方案時必須考慮許多其他因素蜀肘,如圖所示吗蚌。
架構(gòu)師可以在定義域或業(yè)務(wù)需求方面進行協(xié)作科吭,但是一項主要職責(zé)是定義煞烫、發(fā)現(xiàn)和分析軟件必須執(zhí)行的與領(lǐng)域或業(yè)務(wù)不直接相關(guān)的所有事情:架構(gòu)特征损晤。
軟件架構(gòu)與編碼和設(shè)計的區(qū)別是什么?許多事情红竭,包括架構(gòu)師在定義架構(gòu)特征方面的角色尤勋,是獨立于問題域的系統(tǒng)方面的重要問題。許多組織使用各種術(shù)語(包括非功能性需求)來描述軟件的這些功能茵宪,但是我們不喜歡該術(shù)語最冰,因為它是貶義的。架構(gòu)師創(chuàng)建該術(shù)語是為了將架構(gòu)特征與功能需求區(qū)分開來稀火,但是從語言的角度來看暖哨,命名非功能性的東西會帶來負面影響:如何說服團隊充分注意“非功能性”的東西?另一個流行的術(shù)語是質(zhì)量屬性凰狞,我們不喜歡它篇裁,因為它暗示事后質(zhì)量評估而不是設(shè)計。我們更喜歡架構(gòu)特征赡若,因為它描述了對架構(gòu)以及整個系統(tǒng)的成功至關(guān)重要的關(guān)注點达布,同時又不影響其重要性。
架構(gòu)特征滿足三個條件:
- 指定非領(lǐng)域設(shè)計注意事項
- 影響設(shè)計結(jié)構(gòu)的某些方面
- 對應(yīng)用程序的成功至關(guān)重要
我們定義的這些相互聯(lián)系的部分如圖所示逾冬。
圖中所示的定義除了列出的三個修飾符外黍聂,還列出了三個組件:
指定非領(lǐng)域設(shè)計注意事項
在設(shè)計應(yīng)用程序時,要求指定了應(yīng)用程序應(yīng)執(zhí)行的操作身腻;架構(gòu)特征指定了成功的運維和設(shè)計標準产还,涉及如何實施的要求以及為何做出某些選擇。例如嘀趟,一個常見的重要架構(gòu)特征為應(yīng)用程序指定了一定的性能水平脐区,而這通常不會出現(xiàn)在需求文檔中。更相關(guān)的示例是:沒有需求文檔指出“技術(shù)債務(wù)”她按,但這是架構(gòu)師和開發(fā)人員的常見設(shè)計考慮因素炕柔。我們在“從領(lǐng)域問題中提取架構(gòu)特征”中深入討論了顯性和隱性特征之間的區(qū)別。-
影響設(shè)計結(jié)構(gòu)的某些方面
架構(gòu)師試圖在項目上描述架構(gòu)特征的主要原因與設(shè)計注意事項有關(guān):此架構(gòu)特征是否需要特殊的結(jié)構(gòu)考慮才能成功汗唱?例如丈攒,安全實際上是每個項目的關(guān)注點授霸,并且所有系統(tǒng)都必須在設(shè)計和編碼過程中采取預(yù)防措施基準。但是碘耳,當架構(gòu)師需要設(shè)計一些特殊的東西時,它會上升到架構(gòu)特征的水平辛辨。在示例系統(tǒng)中,考慮兩種圍繞付款的情況:第三方付款處理器
如果在集成點處理付款明細指攒,則該架構(gòu)不需要特殊的結(jié)構(gòu)考慮。該設(shè)計應(yīng)包含標準的安全措施允悦,例如加密和散列虑啤,但不需要特殊的結(jié)構(gòu)。應(yīng)用程序內(nèi)付款處理
如果正在設(shè)計的應(yīng)用程序必須處理付款狞山,則架構(gòu)師可以為此目的設(shè)計特定的模塊、組件或服務(wù)室埋,以從結(jié)構(gòu)上隔離關(guān)鍵的安全問題。現(xiàn)在姚淆,架構(gòu)特征對架構(gòu)和設(shè)計都有影響屡律。
當然,在很多情況下超埋,即使是這兩個標準也不足以做出此決定:在此決策過程中佳鳖,可能會出現(xiàn)過去的安全事件系吩,與第三方集成的性質(zhì)以及許多其他標準。它仍然顯示了架構(gòu)師在確定如何為某些功能進行設(shè)計時必須考慮的一些注意事項穿挨。
-
對應(yīng)用程序成功至關(guān)重要
應(yīng)用程序可以支持大量的架構(gòu)特征肴盏,但是不應(yīng)該如此。對每個架構(gòu)特征的支持增加了設(shè)計的復(fù)雜性菜皂。因此,對于架構(gòu)師來說榨崩,一項關(guān)鍵工作在于選擇最少的架構(gòu)特征,而不是選擇最大的可能性母蛛。
我們進一步將架構(gòu)特征細分為隱式和顯式架構(gòu)特征胳施。隱性需求很少出現(xiàn)在需求中,但它們對于項目成功是必不可少的舞肆。例如,可用性筷登、可靠性和安全性實際上是所有應(yīng)用程序的基礎(chǔ)哩盲,但很少在設(shè)計文檔中指定它們。架構(gòu)師必須在分析階段使用他們對問題領(lǐng)域的了解來發(fā)現(xiàn)這些架構(gòu)特征廉油。例如,高頻交易公司可能不必在每個系統(tǒng)中都指定低延遲班巩,但是該問題領(lǐng)域的架構(gòu)師知道這有多重要嘶炭。明確的架構(gòu)特征出現(xiàn)在需求文檔或其他特定說明中逊桦。
在圖中抑进,故意選擇三角形:每個定義元素都支持其他元素,而后者又支持系統(tǒng)的整體設(shè)計匿情。三角形創(chuàng)建的支點說明了以下事實户秤,即這些架構(gòu)特征經(jīng)常相互交互逮矛,從而導(dǎo)致架構(gòu)師在折衷一詞中普遍使用。
已列出架構(gòu)特征(部分)
架構(gòu)特征存在于整個軟件系統(tǒng)中须鼎,范圍從低級代碼特征(例如模塊化)到復(fù)雜的操作問題(例如可伸縮性和彈性)。盡管過去曾嘗試編成標準汞窗,但沒有真正的通用標準存在。相反仲吏,每個組織都會對這些術(shù)語創(chuàng)建自己的解釋蝌焚。此外,由于軟件生態(tài)系統(tǒng)變化如此之快许帐,因此不斷出現(xiàn)新的概念、術(shù)語成畦、度量和驗證涝开,從而為架構(gòu)特征定義提供了新的機會。
盡管數(shù)量眾多舀武、規(guī)模龐大,但架構(gòu)師通常將架構(gòu)特征分為幾大類衷旅。以下各節(jié)描述了一些示例。
運維架構(gòu)特征
運維架構(gòu)的特性涵蓋了性能柿顶、可伸縮性、彈性嘁锯、可用性和可靠性等功能。下表列出了一些運維i架構(gòu)特征蝗羊。
表——一般運維架構(gòu)特征
名詞 | 定義 |
---|---|
可用性 | 系統(tǒng)將需要可用的時間(如果是24/7仁锯,則需要采取一些措施以使系統(tǒng)在發(fā)生任何故障時能夠快速啟動并運行)。 |
連續(xù)性 | 災(zāi)難恢復(fù)能力业崖。 |
性能 | 包括壓力測試、峰值分析狞悲、所使用功能的頻率妇斤、所需容量和響應(yīng)時間的分析。性能測試有時需要自己進行站超,需要幾個月的時間才能完成。 |
可恢復(fù)性 | 業(yè)務(wù)連續(xù)性要求(例如戚炫,在發(fā)生災(zāi)難的情況下媳纬,要求系統(tǒng)多長時間重新上線?)钮惠。這將影響備份策略和對冗余硬件的需求。 |
可靠性/安全性 | 評估系統(tǒng)是否需要是故障安全的蔑赘,或者是否以影響生命的方式對任務(wù)至關(guān)重要。如果失敗缩赛,是否會花費公司大量資金? |
堅固性 | 如果互聯(lián)網(wǎng)連接中斷辩昆,斷電或硬件故障旨袒,則可以在運行時處理錯誤和邊界條件。 |
可擴展性 | 系統(tǒng)隨著用戶或請求數(shù)量的增加而執(zhí)行和運行的能力砚尽。 |
運維架構(gòu)特征與運維和DevOps關(guān)注點嚴重重疊,在許多軟件項目中形成了這些關(guān)注點的交集必孤。
結(jié)構(gòu)架構(gòu)特征
架構(gòu)師必須關(guān)注代碼結(jié)構(gòu)。 在許多情況下卓练,架構(gòu)師對代碼質(zhì)量問題負全責(zé)或共同承擔(dān)責(zé)任隘蝎,例如良好的模塊化,組件之間的受控耦合狮含,可讀代碼以及許多其他內(nèi)部質(zhì)量評估。 下表列出了一些結(jié)構(gòu)架構(gòu)特征几迄。
表——結(jié)構(gòu)架構(gòu)特征
名詞 | 定義 |
---|---|
可配置性 | 最終用戶能夠輕松地(通過可用的界面)更改軟件配置的各個方面冰评。 |
可擴展性 | 插入新功能的重要特性。 |
可安裝性 | 易于在所有必要平臺上安裝系統(tǒng)甲雅。 |
杠桿/重用 | 能夠跨多個產(chǎn)品利用通用組件的能力。 |
本土化 | 在數(shù)據(jù)字段的輸入/查詢屏幕上支持多種語言抛人;報告,多字節(jié)字符要求以及度量單位或貨幣廷臼。 |
可維護性 | 應(yīng)用更改并增強系統(tǒng)有多容易? |
可移植性 | 系統(tǒng)是否需要在多個平臺上運行荠商? (例如,前端是否需要針對Oracle和SAP DB運行掠剑? |
可支持性 | 該應(yīng)用程序需要什么級別的技術(shù)支持郊愧?調(diào)試系統(tǒng)中的錯誤需要什么級別的日志記錄和其他功能? |
可升級性 | 能夠輕松/快速地從該應(yīng)用程序/解決方案的先前版本升級到服務(wù)器和客戶端上的較新版本属铁。 |
橫切架構(gòu)特征
盡管許多架構(gòu)特征屬于易于識別的類別,但許多特征屬于不合理的分類焦蘑,但卻構(gòu)成了重要的設(shè)計約束和考慮因素。 下表說明了其中一些狡逢。
表——橫切架構(gòu)特征
名詞 | 定義 |
---|---|
輔助功能 | 訪問您的所有用戶拼卵,包括諸如色盲或聽力障礙等殘障人士奢浑。 |
可歸檔性 | 一段時間后是否需要存檔或刪除數(shù)據(jù)? (例如即寡,客戶帳戶將在三個月后刪除或標記為已過時并存檔到輔助數(shù)據(jù)庫中以備將來訪問。) |
認證方式 | 安全要求莺丑,以確保用戶是他們所說的墩蔓。 |
授權(quán)書 | 確保用戶只能訪問應(yīng)用程序中某些功能的安全性要求(按用例钢拧、子系統(tǒng)葡粒、網(wǎng)頁、業(yè)務(wù)規(guī)則卿嘲、字段級別等)夫壁。 |
法律 | 系統(tǒng)運行在哪些立法約束下(數(shù)據(jù)保護、Sarbanes Oxley盒让、GDPR等)?公司需要什么保留權(quán)邑茄?關(guān)于構(gòu)建或部署應(yīng)用程序方式的任何規(guī)定? |
隱私 | 能夠向公司內(nèi)部員工隱藏事務(wù)(加密的事務(wù)左医,因此同木,即使DBA和網(wǎng)絡(luò)架構(gòu)師也看不到它們)。 |
安全 | 數(shù)據(jù)需要在數(shù)據(jù)庫中加密嗎秕硝?加密用于內(nèi)部系統(tǒng)之間的網(wǎng)絡(luò)通信斩萌?遠程用戶訪問需要使用哪種身份驗證? |
可支持性 | 該應(yīng)用程序需要什么級別的技術(shù)支持颊郎?調(diào)試系統(tǒng)中的錯誤需要什么級別的日志記錄和其他功能姆吭? |
可用性/可實現(xiàn)性 | 用戶通過應(yīng)用程序/解決方案實現(xiàn)其目標所需的培訓(xùn)水平唁盏。可用性要求與任何其他架構(gòu)問題一樣厘擂,都必須得到認真對待。 |
任何架構(gòu)特征列表都必然是不完整的列表刽严。 任何軟件都可以基于獨特因素來發(fā)明重要的架構(gòu)特征。
此外眨补,許多先前的術(shù)語不精確且含糊不清,有時是由于細微的差別或缺乏客觀的定義撑螺。例如,互操作性和兼容性可能看起來是等效的甘晤,這在某些系統(tǒng)中是正確的。但是调鬓,它們之間存在差異,因為互操作性意味著易于與其他系統(tǒng)集成腾窝,而后者又意味著已發(fā)布的居砖,已記錄的API。另一方面循集,兼容性更關(guān)注行業(yè)和領(lǐng)域標準蔗草。另一個例子是學(xué)習(xí)能力。一個定義是用戶學(xué)習(xí)使用軟件的難易程度咒精,另一個定義是系統(tǒng)可以自動了解其環(huán)境以使用機器學(xué)習(xí)算法進行自我配置或自我優(yōu)化的級別。
許多定義重疊歇拆。例如范咨,考慮可用性和可靠性,它們幾乎在所有情況下都重疊渠啊。但是請考慮基于TCP的互聯(lián)網(wǎng)協(xié)議UDP。 UDP通過IP可用贯溅,但不可靠:數(shù)據(jù)包可能會亂序到達,接收方可能不得不再次要求丟失數(shù)據(jù)包盗迟。
沒有完整的標準列表罚缕。國際標準組織(ISO)發(fā)布了按功能組織的列表,與我們列出的許多功能重疊邮弹,但主要是建立了不完整的類別列表。以下是一些ISO定義:
性能效率
相對于已知條件下使用的資源量的性能度量盟劫。這包括時間行為(響應(yīng)的度量与纽、處理時間和/或吞吐率的度量),資源利用率(使用的資源的數(shù)量和類型)和容量(超出最大已建立限制的程度)影所。兼容性
產(chǎn)品僚碎、系統(tǒng)或組件可以在共享相同硬件或軟件環(huán)境的同時與其他產(chǎn)品、系統(tǒng)或組件交換信息和/或執(zhí)行其所需功能的程度勺阐。它包括共存(可以在與其他產(chǎn)品共享公共環(huán)境和資源的同時有效地執(zhí)行其所需的功能)和互操作性(兩個或多個系統(tǒng)可以交換和利用信息的程度)渊抽。易用性
用戶可以針對其預(yù)期目的有效、高效且令人滿意地使用該系統(tǒng)腰吟。它包括適當性可識別性(用戶可以識別軟件是否適合他們的需求)、可學(xué)習(xí)性(用戶可以輕松學(xué)習(xí)如何使用軟件)、用戶錯誤保護(防止用戶犯錯誤)和可訪問性(使軟件可用)給具有最廣泛特征和能力的人)侦镇。可靠性
系統(tǒng)在指定條件下指定時間段內(nèi)運行的程度。此特征包括以下子類別:成熟度(軟件是否滿足正常運行下的可靠性需求)壳繁、可用性(軟件可運行且可訪問)震捣、容錯(軟件是否在硬件或軟件故障的情況下仍按預(yù)期運行)和可恢復(fù)性(通過恢復(fù)任何受影響的數(shù)據(jù)并重新建立系統(tǒng)的所需狀態(tài),軟件可以從故障中恢復(fù))润樱。安全
該軟件可以保護信息和數(shù)據(jù)的程度羡棵,從而使人員或其他產(chǎn)品或系統(tǒng)擁有與其權(quán)限類型和授權(quán)級別相適應(yīng)的數(shù)據(jù)訪問程度。這一系列特征包括機密性(只有授權(quán)訪問的人才能訪問數(shù)據(jù))皂冰、完整性(軟件可防止未經(jīng)授權(quán)訪問或修改軟件或數(shù)據(jù))店展、不可否認性(可以證明已采取行動或事件)、問責(zé)制(是否可以跟蹤用戶的用戶操作)和真實性(證明用戶身份)秃流。可維護性
表示開發(fā)人員可以修改軟件以對其進行改進赂蕴,糾正或使其適應(yīng)環(huán)境和/或要求的變化的有效性和效率舶胀。此特性包括模塊化(軟件由離散組件組成的程度),可重用性(開發(fā)人員可以在多個系統(tǒng)中使用資產(chǎn)或用于構(gòu)建其他資產(chǎn)的程度)糖赔,可分析性(開發(fā)人員如何輕松地收集有關(guān)組件的具體指標)軟件),可修改性(開發(fā)人員可以在不引入缺陷或不降低現(xiàn)有產(chǎn)品質(zhì)量的情況下修改軟件的程度)和可測試性(開發(fā)人員及其他人員測試軟件的容易程度)纤控。可移植性
開發(fā)人員可以將系統(tǒng)挂捻,產(chǎn)品或組件從一種硬件船万,軟件或其他操作或使用環(huán)境轉(zhuǎn)移到另一種環(huán)境的程度。此特征包括適應(yīng)性的子特性(開發(fā)人員可以有效地并有效地使軟件適應(yīng)不同或不斷發(fā)展的硬件耿导、軟件或其他操作或使用環(huán)境)声怔、可安裝性(可以在指定的環(huán)境中安裝和/或卸載軟件)和可替換性(開發(fā)人員以其他軟件輕松替換功能)。
ISO列表中的最后一項針對軟件的功能方面舱呻,我們認為它不屬于該列表:
-
功能適用性
此特性表示在特定條件下使用時,產(chǎn)品或系統(tǒng)提供滿足規(guī)定和隱含需求的功能的程度芥驳。此特征由以下子特征組成:-
功能完整性
功能集涵蓋所有指定任務(wù)和用戶目標的程度茬高。 -
功能正確性
產(chǎn)品或系統(tǒng)以所需的精度提供正確結(jié)果的程度丽猬。 -
功能適當性
功能在多大程度上促進了特定任務(wù)和目標的完成。這些不是架構(gòu)特征由桌,而是構(gòu)建軟件的動機要求邑雅。這說明了如何思考架構(gòu)特征和問題域之間的關(guān)系淮野。
-
功能完整性
權(quán)衡與最差的架構(gòu)
由于多種原因,應(yīng)用程序只能支持我們列出的部分架構(gòu)特征队贱。首先锋恬,每個受支持的特征都需要進行設(shè)計工作嘉抓,也許還需要結(jié)構(gòu)上的支持蕾盯。其次,更大的問題在于以下事實:每個架構(gòu)特征通常會對其他特征產(chǎn)生影響鸥跟。例如枫匾,如果架構(gòu)師想要提高安全性很泊,那么幾乎可以肯定會對性能產(chǎn)生負面影響:應(yīng)用程序必須進行更多的動態(tài)加密,隱藏私密信息的間接操作以及可能降低性能的其他活動。
隱喻將有助于說明這種相互聯(lián)系。顯然燃异,飛行員經(jīng)常難以學(xué)習(xí)如何駕駛直升機仅颇,因為這需要對每只手和每只腳進行控制引颈,而改變一只手會影響另一只手粱年。因此,駕駛直升機是一項平衡的工作,它很好地描述了選擇架構(gòu)特征時的權(quán)衡過程粱快。架構(gòu)師設(shè)計支持的每種架構(gòu)特征都可能使總體設(shè)計復(fù)雜化币励。
因此仅胞,架構(gòu)師很少遇到能夠設(shè)計系統(tǒng)并使每個架構(gòu)特征最大化的情況。通常,決策歸結(jié)為幾個相互競爭的問題之間的權(quán)衡舔稀。
提示
永遠不要追求最佳架構(gòu),而要追求最差的架構(gòu)拂酣。
太多的架構(gòu)特征導(dǎo)致通用解決方案試圖解決每個業(yè)務(wù)問題,并且這些架構(gòu)很少起作用暂刘,因為設(shè)計變得笨拙。
這表明架構(gòu)師應(yīng)該努力設(shè)計架構(gòu)贵涵,使其盡可能地迭代。如果您可以更輕松地對架構(gòu)進行更改,則可以減少在第一次嘗試中發(fā)現(xiàn)確切正確內(nèi)容的壓力怀骤。敏捷軟件開發(fā)最重要的教訓(xùn)之一就是迭代的價值。這在軟件開發(fā)的各個級別(包括架構(gòu))都適用。