本書提供了關(guān)于適應(yīng)度函數(shù)、自動化架構(gòu)治理和演進式數(shù)據(jù)的技術(shù)、知識和技巧。本書分為三個部分:第一部分包括定義演進式架構(gòu)機制的章節(jié)介紹團隊如何使用技術(shù)和工具來構(gòu)建適應(yīng)度函數(shù)、部署管道以及其他管理和演進軟件項目的機制;第二部分包括圍繞耦合、復(fù)用和其他相關(guān)結(jié)構(gòu)考慮因素的架構(gòu)風(fēng)格和設(shè)計原則,以幫助讀者實現(xiàn)清晰的長期演進;第三部分探討了第一部分中介紹的工程實踐與第二部分中的結(jié)構(gòu)考慮因素的交叉點。
前言
當(dāng)我們在2017年寫作本書第1版時,演進式架構(gòu)的想法仍然有些激進。在Rebecca關(guān)于這個主題進行第一次演講后,有人指責(zé)她缺乏職業(yè)責(zé)任感,因為她提出軟件架構(gòu)可以隨著時間的推移而演進畢竟,架構(gòu)是永遠不會改變的東西。
然而,正如現(xiàn)實告訴我們的那樣,系統(tǒng)必須演進以滿足其用戶的新需求,并反映不斷變化的軟件開發(fā)生態(tài)系統(tǒng)。
第1版出版時,很少有工具可以利用我們描述的技術(shù)。幸運的是,軟件開發(fā)世界在不斷發(fā)展,逐漸有了更多的工具使構(gòu)建演進式架構(gòu)變得更容易。
本書結(jié)構(gòu)
我們改變了第1版的結(jié)構(gòu),更清晰地劃分了兩個主要主題:演進軟件系統(tǒng)的工程實踐和使之更容易的結(jié)構(gòu)方法。
在第一部分,我們將定義各種機制和工程實踐,團隊可以使用它們來實現(xiàn)演進式架構(gòu)的 目標(biāo),包括讀者需要了解的技術(shù)、工具、類別和其他信息。
軟件架構(gòu)還涉及結(jié)構(gòu)設(shè)計,某些設(shè)計決策可以使演進(和治理)更容易。我們將在第二 部分中介紹這一點,該部分還包括架構(gòu)風(fēng)格的覆蓋范圍,以及有關(guān)耦合、復(fù)用和其他相 關(guān)結(jié)構(gòu)考慮因素的設(shè)計原則。
軟件架構(gòu)中幾乎沒有任何東西是孤立存在的,演進式架構(gòu)中的許多原則和實踐在軟件開發(fā)過程中許多部分盤根錯節(jié),我們將在第三部分中進行介紹。
案例研究和 PenultimateWidgets本書中我們突出了一些案例研究。四位作者在撰寫本書時都是(有些人現(xiàn)在仍然是)顧問,我們利用我們的實際經(jīng)驗推導(dǎo)出本書中出現(xiàn)的許多案例研究。雖然不能透露特定客 戶的詳細信息,但我們希望提供一些相關(guān)示例,使主題不那么抽象。因此,我們采取了 替身公司PenultimateWidgets的想法,讓它作為所有案例研究的主角。
在寫作第2版時,我們還向同事們征集了案例研究,這更凸顯了應(yīng)用所探討的技巧的用例。在本書中,雖然每個案例研究都以 PenultimateWidgets 的用例呈現(xiàn),但它們其實都 源自真實項目。
目錄
原書第1版序
序
前言1
第一部分 機制
第1章 演進軟件架構(gòu)9
1.1 軟件演進的挑戰(zhàn)9
1.2 演進式架構(gòu)12
1.2.1 引導(dǎo)式變更12
1.2.2 增量變更13
1.2.3 多種架構(gòu)維度13
1.3 長期規(guī)劃如何應(yīng)對層出不窮的變化15
1.4 架構(gòu)構(gòu)建完成后,如何防止其隨時間推移而退化17
1.5 為何演進17
1.6 小結(jié)18
第2章 適應(yīng)度函數(shù)19
2.1 什么是適應(yīng)度函數(shù)19
2.2 適應(yīng)度函數(shù)分類23
2.2.1 按范圍分類:原子與整體23
2.2.2 按節(jié)奏分類:觸發(fā)式、持續(xù)式和時間式24
2.2.3 案例研究:觸發(fā)式還是持續(xù)式25
2.2.4 按結(jié)果分類:靜態(tài)與動態(tài)27
2.2.5 按調(diào)用方式分類:自動與手動27
2.2.6 按響應(yīng)方式分類:預(yù)設(shè)式與應(yīng)急式28
2.2.7 按覆蓋范圍分類:領(lǐng)域特定適應(yīng)度函數(shù)28
2.3 誰來寫適應(yīng)度函數(shù)29
2.4 哪里有適應(yīng)度函數(shù)測試框架29
2.5 結(jié)果與實現(xiàn)30
2.6 小結(jié)32
第3章 實現(xiàn)增量變更33
3.1 增量變更33
3.1.1 部署流水線36
3.1.2 案例研究:為PenultimateWidgets的發(fā)票服務(wù)增加適應(yīng)度函數(shù)39
3.1.3 案例研究:使用自動化構(gòu)建驗證API的一致性41
3.2 小結(jié)44
第4章 自動化架構(gòu)治理46
4.1 架構(gòu)治理之適應(yīng)度函數(shù)46
4.2 基于代碼的適應(yīng)度函數(shù)47
4.2.1 傳入/傳出耦合48
4.2.2 抽象性、不穩(wěn)定性和與主序列的距離50
4.2.3 導(dǎo)入的方向性53
4.2.4 圈復(fù)雜度和引導(dǎo)式治理54
4.3 即插即用的工具56
4.3.1 開源庫的合法性56
4.3.2 可訪問性和支持的其他架構(gòu)屬性57
4.3.3 ArchUnit57
4.3.4 代碼治理的lint工具62
4.3.5 案例研究:可用性適應(yīng)度函數(shù)62
4.3.6 案例研究:配合金絲雀發(fā)布的負載測試62
4.3.7 案例研究:移植什么63
4.3.8 已經(jīng)在使用的適應(yīng)度函數(shù)64
4.4 集成架構(gòu)65
4.4.1 微服務(wù)架構(gòu)中的通信治理65
4.4.2 案例研究:如何實現(xiàn)適應(yīng)度函數(shù)67
4.5 DevOps69
4.6 企業(yè)架構(gòu)72
4.6.1 案例研究:每天部署60次的架構(gòu)重構(gòu)74
4.6.2 保真度適應(yīng)度函數(shù)76
4.7 適應(yīng)度函數(shù)作為清單,而非棍棒76
4.8 記錄適應(yīng)度函數(shù)77
4.9 小結(jié)79
第二部分 結(jié)構(gòu)
第5章 演進式架構(gòu)拓撲83
5.1 可演進的架構(gòu)結(jié)構(gòu)83
5.1.1 共生性83
5.1.2 共生性與限界上下文的交集87
5.2 架構(gòu)量子和粒度88
5.2.1 獨立部署89
5.2.2 高功能內(nèi)聚性90
5.2.3 高靜態(tài)耦合90
5.2.4 動態(tài)量子耦合95
5.3 契約97
案例研究:微服務(wù)作為演進式架構(gòu)101
5.4 復(fù)用模式105
5.4.1 有效的復(fù)用=抽象 低變動性106
5.4.2 Sidecar和服務(wù)網(wǎng)格:正交操作的耦合107
5.4.3 數(shù)據(jù)網(wǎng)格:正交數(shù)據(jù)耦合110
5.5 小結(jié)114
第6章 演進式數(shù)據(jù)115
6.1 演進式數(shù)據(jù)庫設(shè)計115
6.1.1 演進模式115
6.1.2 共享數(shù)據(jù)庫集成117
6.2 不適當(dāng)?shù)臄?shù)據(jù)糾纏121
6.2.1 兩段式提交事務(wù)122
6.2.2 數(shù)據(jù)的歷史和質(zhì)量123
6.2.3 案例研究:演進PenultimateWidgets的路由124
6.3 從原生到適應(yīng)度函數(shù)125
6.3.1 引用完整性126
6.3.2 數(shù)據(jù)冗余127
6.3.3 替換觸發(fā)器和存儲過程129
6.3.4 案例研究:從關(guān)系型到非關(guān)系型的演進130
6.4 小結(jié)131
第三部分 影響
第7章 構(gòu)建可演進的架構(gòu)135
7.1 演進式架構(gòu)的原則135
7.1.1 最后責(zé)任時刻135
7.1.2 針對可演進性進行架構(gòu)設(shè)計和開發(fā)136
7.1.3 波斯特爾定律136
7.1.4 針對可測試性進行架構(gòu)設(shè)計137
7.1.5 康威定律137
7.2 機制137
7.2.1 步驟1:識別受演進影響的維度137
7.2.2 步驟2:為每個維度定義適應(yīng)度函數(shù)137
7.2.3 步驟3:使用部署流水線自動化適應(yīng)度函數(shù)138
7.3 綠地項目138
7.4 改造現(xiàn)有架構(gòu)138
7.4.1 適當(dāng)?shù)鸟詈虾蛢?nèi)聚138
7.4.2 商業(yè)軟件的影響140
7.5 遷移架構(gòu)141
7.5.1 遷移步驟142
7.5.2 演進模塊之間的交互144
7.6 構(gòu)建演進式架構(gòu)的指南147
7.6.1 消除不必要的變化148
7.6.2 做出可逆的決策149
7.6.3 傾向可演進而非可預(yù)測150
7.6.4 構(gòu)建防腐層150
7.6.5 構(gòu)建可犧牲的架構(gòu)152
7.6.6 緩解外部變化153
7.6.7 更新庫而不是框架155
7.6.8 版本服務(wù)內(nèi)部化156
7.6.9 案例研究:演進PenultimateWidgets的評分156
7.7 適應(yīng)度函數(shù)驅(qū)動的架構(gòu)158
7.8 小結(jié)159
第8章 演進式架構(gòu)的陷阱和反模式160
8.1 技術(shù)架構(gòu)160
8.1.1 反模式:最后10%陷阱和低代碼/無代碼160
8.1.2 案例研究:PenultimateWidgets里的復(fù)用161
8.1.3 反模式:供應(yīng)商為王162
8.1.4 陷阱:充滿漏洞的抽象163
8.1.5 陷阱:簡歷驅(qū)動開發(fā)165
8.2 增量變更166
8.2.1 反模式:不恰當(dāng)?shù)闹卫?66
8.2.2 案例研究:PenultimateWidgets中恰到好處的治理168
8.2.3 陷阱:發(fā)布速度過慢168
8.3 業(yè)務(wù)因素169
8.3.1 陷阱:產(chǎn)品定制170
8.3.2 反模式:記錄系統(tǒng)之上的報表系統(tǒng)170
8.3.3 陷阱:過于長遠的規(guī)劃171
8.4 小結(jié)172
第9章 實踐演進式架構(gòu)173
9.1 組織因素173
9.1.1 不要抗拒康威定律173
9.1.2 文化182
9.1.3 試驗文化183
9.1.4 首席財務(wù)官和預(yù)算184
9.2 業(yè)務(wù)場景185
9.2.1 假設(shè)驅(qū)動開發(fā)和數(shù)據(jù)驅(qū)動開發(fā)186
9.2.2 適應(yīng)度函數(shù)作為試驗媒介187
9.3 構(gòu)建企業(yè)級適應(yīng)度函數(shù)191
9.3.1 案例研究:零日安全漏洞192
9.3.2 在現(xiàn)有集成架構(gòu)中拆分限界上下文193
9.4 從哪里開始195
9.4.1 觸手可及的成果195
9.4.2 最高價值優(yōu)先196
9.4.3 測試196
9.4.4 基礎(chǔ)設(shè)施196
9.4.5 案例研究:PenultimateWidgets的企業(yè)級架構(gòu)197
9.5 未來狀態(tài)198
9.5.1 使用AI的適應(yīng)度函數(shù)198
9.5.2 生成式測試198
9.6 構(gòu)建演進式架構(gòu)的場合199
9.6.1 什么情況下公司應(yīng)該構(gòu)建演進式架構(gòu)199
9.6.2 什么情況下公司不需要構(gòu)建演進式架構(gòu)201
9.7 小結(jié)202