發(fā)現(xiàn)并修復(fù)五種架構(gòu)技術(shù)債務(wù)
開(kāi)發(fā)人員、架構(gòu)師和應(yīng)用程序團(tuán)隊(duì)不斷追逐技術(shù)債務(wù)。不管是好是壞,這是一個(gè)令人煩惱的問(wèn)題,經(jīng)常被踢到路上,直到為時(shí)已晚,應(yīng)用程序開(kāi)發(fā)放緩,新功能延期,測(cè)試周期增加,成本上升。在最公開(kāi)的情況下,應(yīng)用程序會(huì)完全崩潰——就像我們最近在西南航空公司、Twitter、FAA 和其他從未公開(kāi)過(guò)的網(wǎng)站上看到的那樣——但你知道你是誰(shuí)。技術(shù)債務(wù)從源代碼的味道中呈現(xiàn)出多種形式從安全風(fēng)險(xiǎn)到更嚴(yán)重的架構(gòu)技術(shù)債務(wù)問(wèn)題。存在用于掃描源代碼質(zhì)量和安全性的優(yōu)秀工具,但由于缺乏可觀察性、工具和最佳實(shí)踐,跟蹤、基線化和檢測(cè)架構(gòu)漂移一直很困難。
架構(gòu)技術(shù)債務(wù)到底是什么,我為什么要關(guān)心?如果您是負(fù)責(zé)維護(hù)和擴(kuò)展舊的 Java 或 .NET 單體的架構(gòu)師或開(kāi)發(fā)人員,您可能已經(jīng)非常熟悉這個(gè)問(wèn)題。單體應(yīng)用程序?qū)嶋H上是由其架構(gòu)(單體)模式定義的,它帶有密集的依賴(lài)關(guān)系、長(zhǎng)依賴(lài)鏈,本質(zhì)上是一個(gè)大泥球,對(duì)于任何試圖理解和跟蹤的架構(gòu)師來(lái)說(shuō)都是不透明的。這就是架構(gòu)技術(shù)債務(wù)的本質(zhì):類(lèi)糾纏、深度依賴(lài)、死代碼、長(zhǎng)依賴(lài)鏈、密集拓?fù)湟约叭狈νㄓ么a庫(kù),它們困擾著單體、舊應(yīng)用程序,甚至最近的微服務(wù)已經(jīng)開(kāi)始類(lèi)似于巨石本身。
架構(gòu)可觀察性
到目前為止,軟件架構(gòu)師缺乏從他們的角度理解、跟蹤和管理技術(shù)債務(wù)的可觀察性和工具。架構(gòu)債務(wù)不是源代碼質(zhì)量或圈復(fù)雜度,盡管這些是需要跟蹤和管理的關(guān)鍵技術(shù)債務(wù)元素。問(wèn)題的切入要深得多,因?yàn)檫@些結(jié)構(gòu)性問(wèn)題直接影響產(chǎn)品質(zhì)量、功能交付提前期和測(cè)試時(shí)間。學(xué)術(shù)研究強(qiáng)調(diào)了分析依賴(lài)關(guān)系如何為返工、重構(gòu)和應(yīng)用程序現(xiàn)代化的復(fù)雜性提供主要預(yù)測(cè)指標(biāo)。
架構(gòu)可觀察性照亮了應(yīng)用程序黑匣子和泥球應(yīng)用程序,使不透明變得透明,因此架構(gòu)師可以左移進(jìn)入正在進(jìn)行的軟件開(kāi)發(fā)生命周期。這使他們能夠在結(jié)構(gòu)異常爆發(fā)為更大的問(wèn)題之前,以迭代、連續(xù)的方式管理、監(jiān)控和修復(fù)結(jié)構(gòu)異常。可觀察的架構(gòu)從工具開(kāi)始,首先建立基線、設(shè)置閾值并檢查架構(gòu)漂移以主動(dòng)檢測(cè)關(guān)鍵異常。
需要追蹤的五種關(guān)鍵建筑債務(wù)形式
克服架構(gòu)債務(wù)是一項(xiàng)挑戰(zhàn),但任何時(shí)候開(kāi)始都不晚。在過(guò)去十年中,許多單體應(yīng)用已經(jīng)被提升并轉(zhuǎn)移到云端,這應(yīng)該是您的首要目標(biāo)。有五個(gè)關(guān)鍵因素需要分析、跟蹤和制定修復(fù)計(jì)劃。
- 死代碼:最難找到的死代碼是駐留在應(yīng)用程序和公共庫(kù)中的可訪問(wèn)遺留代碼,這些代碼已過(guò)時(shí)或不再被任何當(dāng)前用戶(hù)流訪問(wèn)。它通常被認(rèn)為是“僵尸代碼”,因?yàn)樗鼭摲陉幱爸?,沒(méi)有開(kāi)發(fā)人員真正愿意接觸它。找到它需要結(jié)合動(dòng)態(tài)和靜態(tài)分析來(lái)確定代碼是否存在但從未在生產(chǎn)中訪問(wèn)過(guò)。死代碼不同于“無(wú)法訪問(wèn)的代碼”,因?yàn)榇a實(shí)際上在技術(shù)上是可以訪問(wèn)的,但實(shí)際上不再使用。死代碼會(huì)隨著時(shí)間的推移而發(fā)展和傳播,使重構(gòu)和現(xiàn)代化工作變得膨脹和復(fù)雜化。
- 服務(wù)蠕變:通過(guò)手動(dòng)或自動(dòng)方式設(shè)置基線服務(wù)拓?fù)洹V饤l列出應(yīng)用程序中的核心業(yè)務(wù)服務(wù)和公共服務(wù),最好是在整個(gè)團(tuán)隊(duì)可以跟蹤的共享位置。定期審核應(yīng)用程序結(jié)構(gòu)以查看是否添加或刪除了新服務(wù),以及是否出于適當(dāng)?shù)臉I(yè)務(wù)或技術(shù)原因。
- 公共類(lèi):準(zhǔn)備重構(gòu)或重新架構(gòu)項(xiàng)目的關(guān)鍵方面之一是確定公共類(lèi),這些公共類(lèi)應(yīng)包含充當(dāng)共享公共庫(kù)的核心平臺(tái)服務(wù)。這一關(guān)鍵的現(xiàn)代化最佳實(shí)踐將減少重復(fù)代碼和依賴(lài)性,將通用服務(wù)集中在一個(gè)地方。定期觀察應(yīng)用程序以檢查應(yīng)添加到公共庫(kù)中的新公共類(lèi),以防止進(jìn)一步積累技術(shù)債務(wù)。
- 服務(wù)排他性:一旦您從整體中提取了一個(gè)或多個(gè)微服務(wù),為這些服務(wù)的排他性設(shè)定基線并尋找架構(gòu)漂移將及早標(biāo)記未來(lái)的技術(shù)債務(wù)。測(cè)量和基線服務(wù)排他性以確定服務(wù)的獨(dú)立類(lèi)和資源的百分比,以在引入擴(kuò)展架構(gòu)技術(shù)債務(wù)的新依賴(lài)項(xiàng)時(shí)發(fā)出警報(bào)。
- 高負(fù)債類(lèi)別:某些類(lèi)別比其他類(lèi)別承擔(dān)更多的技術(shù)債務(wù)。根據(jù)依賴(lài)項(xiàng)、依賴(lài)項(xiàng)和大小分析和設(shè)置“高債務(wù)”類(lèi)分?jǐn)?shù),以確定重構(gòu)的最佳候選者,這將對(duì)減少技術(shù)債務(wù)產(chǎn)生最大影響。
使用自動(dòng)化工具的主動(dòng)架構(gòu)監(jiān)督將使架構(gòu)師能夠通過(guò)設(shè)置觀察、分析和設(shè)置配置基線測(cè)量和閾值的時(shí)間表來(lái)應(yīng)對(duì)這些類(lèi)型的變化。
架構(gòu)漂移管理
持續(xù)的現(xiàn)代化要求架構(gòu)師不僅在應(yīng)用程序的初始設(shè)計(jì)或需要重新架構(gòu)或重構(gòu)時(shí),而且在其應(yīng)用程序的整個(gè)生命周期中都扮演更積極的角色。架構(gòu)漂移管理為架構(gòu)師提供了他們所需的可觀察性和工具,以保持其架構(gòu)的領(lǐng)先地位,隨著時(shí)間的推移實(shí)現(xiàn)現(xiàn)代化,并避免下一次技術(shù)債務(wù)災(zāi)難。