本書提供了關(guān)于適應(yīng)度函數(shù)、自動(dòng)化架構(gòu)治理和演進(jìn)式數(shù)據(jù)的技術(shù)、知識(shí)和技巧。本書分為三個(gè)部分:第一部分包括定義演進(jìn)式架構(gòu)機(jī)制的章節(jié)介紹團(tuán)隊(duì)如何使用技術(shù)和工具來構(gòu)建適應(yīng)度函數(shù)、部署管道以及其他管理和演進(jìn)軟件項(xiàng)目的機(jī)制;第二部分包括圍繞耦合、復(fù)用和其他相關(guān)結(jié)構(gòu)考慮因素的架構(gòu)風(fēng)格和設(shè)計(jì)原則,以幫助讀者實(shí)現(xiàn)清晰的長(zhǎng)期演進(jìn);第三部分探討了第一部分中介紹的工程實(shí)踐與第二部分中的結(jié)構(gòu)考慮因素的交叉點(diǎn)。
隨著新工具、框架、技術(shù)和范式不斷涌現(xiàn),軟件開發(fā)生態(tài)系統(tǒng)也在不斷變化。僅在過去五年中,軟件開發(fā)核心工程實(shí)踐的不斷進(jìn)步就促使業(yè)界認(rèn)識(shí)到架構(gòu)本身必須如何發(fā)展才能滿足不斷變化的用戶需求。本書通過現(xiàn)實(shí)世界的案例研究闡明了軟件開發(fā)和架構(gòu)設(shè)計(jì)日益增長(zhǎng)的演進(jìn)需求,提供了關(guān)于適應(yīng)度函數(shù)、自動(dòng)化架構(gòu)治理等方面的新技術(shù)、知識(shí)和技巧,詳盡闡述了演進(jìn)式架構(gòu)的工程實(shí)踐和使之更容易的結(jié)構(gòu)方法。
前言
當(dāng)我們?cè)?017年寫作本書第1版時(shí),演進(jìn)式架構(gòu)的想法仍然有些激進(jìn)。在Rebecca關(guān)于這個(gè)主題進(jìn)行第一次演講后,有人指責(zé)她缺乏職業(yè)責(zé)任感,因?yàn)樗岢鲕浖軜?gòu)可以隨著時(shí)間的推移而演進(jìn)畢竟,架構(gòu)是永遠(yuǎn)不會(huì)改變的東西。
然而,正如現(xiàn)實(shí)告訴我們的那樣,系統(tǒng)必須演進(jìn)以滿足其用戶的新需求,并反映不斷變化的軟件開發(fā)生態(tài)系統(tǒng)。
第1版出版時(shí),很少有工具可以利用我們描述的技術(shù)。幸運(yùn)的是,軟件開發(fā)世界在不斷發(fā)展,逐漸有了更多的工具使構(gòu)建演進(jìn)式架構(gòu)變得更容易。
本書結(jié)構(gòu)
我們改變了第1版的結(jié)構(gòu),更清晰地劃分了兩個(gè)主要主題:演進(jìn)軟件系統(tǒng)的工程實(shí)踐和使之更容易的結(jié)構(gòu)方法。
在第一部分,我們將定義各種機(jī)制和工程實(shí)踐,團(tuán)隊(duì)可以使用它們來實(shí)現(xiàn)演進(jìn)式架構(gòu)的 目標(biāo),包括讀者需要了解的技術(shù)、工具、類別和其他信息。
軟件架構(gòu)還涉及結(jié)構(gòu)設(shè)計(jì),某些設(shè)計(jì)決策可以使演進(jìn)(和治理)更容易。我們將在第二 部分中介紹這一點(diǎn),該部分還包括架構(gòu)風(fēng)格的覆蓋范圍,以及有關(guān)耦合、復(fù)用和其他相 關(guān)結(jié)構(gòu)考慮因素的設(shè)計(jì)原則。
軟件架構(gòu)中幾乎沒有任何東西是孤立存在的,演進(jìn)式架構(gòu)中的許多原則和實(shí)踐在軟件開發(fā)過程中許多部分盤根錯(cuò)節(jié),我們將在第三部分中進(jìn)行介紹。
案例研究和 PenultimateWidgets本書中我們突出了一些案例研究。四位作者在撰寫本書時(shí)都是(有些人現(xiàn)在仍然是)顧問,我們利用我們的實(shí)際經(jīng)驗(yàn)推導(dǎo)出本書中出現(xiàn)的許多案例研究。雖然不能透露特定客 戶的詳細(xì)信息,但我們希望提供一些相關(guān)示例,使主題不那么抽象。因此,我們采取了 替身公司PenultimateWidgets的想法,讓它作為所有案例研究的主角。
在寫作第2版時(shí),我們還向同事們征集了案例研究,這更凸顯了應(yīng)用所探討的技巧的用例。在本書中,雖然每個(gè)案例研究都以 PenultimateWidgets 的用例呈現(xiàn),但它們其實(shí)都 源自真實(shí)項(xiàng)目。
目錄
原書第1版序
序
前言1
第一部分 機(jī)制
第1章 演進(jìn)軟件架構(gòu)9
1.1 軟件演進(jìn)的挑戰(zhàn)9
1.2 演進(jìn)式架構(gòu)12
1.2.1 引導(dǎo)式變更12
1.2.2 增量變更13
1.2.3 多種架構(gòu)維度13
1.3 長(zhǎng)期規(guī)劃如何應(yīng)對(duì)層出不窮的變化15
1.4 架構(gòu)構(gòu)建完成后,如何防止其隨時(shí)間推移而退化17
1.5 為何演進(jìn)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ù)式和時(shí)間式24
2.2.3 案例研究:觸發(fā)式還是持續(xù)式25
2.2.4 按結(jié)果分類:靜態(tài)與動(dòng)態(tài)27
2.2.5 按調(diào)用方式分類:自動(dòng)與手動(dòng)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ù)測(cè)試框架29
2.5 結(jié)果與實(shí)現(xiàn)30
2.6 小結(jié)32
第3章 實(shí)現(xiàn)增量變更33
3.1 增量變更33
3.1.1 部署流水線36
3.1.2 案例研究:為PenultimateWidgets的發(fā)票服務(wù)增加適應(yīng)度函數(shù)39
3.1.3 案例研究:使用自動(dòng)化構(gòu)建驗(yàn)證API的一致性41
3.2 小結(jié)44
第4章 自動(dòng)化架構(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ā)布的負(fù)載測(cè)試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 案例研究:如何實(shí)現(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章 演進(jìn)式架構(gòu)拓?fù)?3
5.1 可演進(jìn)的架構(gòu)結(jié)構(gòu)83
5.1.1 共生性83
5.1.2 共生性與限界上下文的交集87
5.2 架構(gòu)量子和粒度88
5.2.1 獨(dú)立部署89
5.2.2 高功能內(nèi)聚性90
5.2.3 高靜態(tài)耦合90
5.2.4 動(dòng)態(tài)量子耦合95
5.3 契約97
案例研究:微服務(wù)作為演進(jìn)式架構(gòu)101
5.4 復(fù)用模式105
5.4.1 有效的復(fù)用=抽象 低變動(dòng)性106
5.4.2 Sidecar和服務(wù)網(wǎng)格:正交操作的耦合107
5.4.3 數(shù)據(jù)網(wǎng)格:正交數(shù)據(jù)耦合110
5.5 小結(jié)114
第6章 演進(jìn)式數(shù)據(jù)115
6.1 演進(jìn)式數(shù)據(jù)庫設(shè)計(jì)115
6.1.1 演進(jìn)模式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 案例研究:演進(jìn)PenultimateWidgets的路由124
6.3 從原生到適應(yīng)度函數(shù)125
6.3.1 引用完整性126
6.3.2 數(shù)據(jù)冗余127
6.3.3 替換觸發(fā)器和存儲(chǔ)過程129
6.3.4 案例研究:從關(guān)系型到非關(guān)系型的演進(jìn)130
6.4 小結(jié)131
第三部分 影響
第7章 構(gòu)建可演進(jìn)的架構(gòu)135
7.1 演進(jìn)式架構(gòu)的原則135
7.1.1 最后責(zé)任時(shí)刻135
7.1.2 針對(duì)可演進(jìn)性進(jìn)行架構(gòu)設(shè)計(jì)和開發(fā)136
7.1.3 波斯特爾定律136
7.1.4 針對(duì)可測(cè)試性進(jìn)行架構(gòu)設(shè)計(jì)137
7.1.5 康威定律137
7.2 機(jī)制137
7.2.1 步驟1:識(shí)別受演進(jìn)影響的維度137
7.2.2 步驟2:為每個(gè)維度定義適應(yīng)度函數(shù)137
7.2.3 步驟3:使用部署流水線自動(dòng)化適應(yīng)度函數(shù)138
7.3 綠地項(xiàng)目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 演進(jìn)模塊之間的交互144
7.6 構(gòu)建演進(jìn)式架構(gòu)的指南147
7.6.1 消除不必要的變化148
7.6.2 做出可逆的決策149
7.6.3 傾向可演進(jìn)而非可預(yù)測(cè)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 案例研究:演進(jìn)PenultimateWidgets的評(píng)分156
7.7 適應(yīng)度函數(shù)驅(qū)動(dòng)的架構(gòu)158
7.8 小結(jié)159
第8章 演進(jìn)式架構(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 陷阱:簡(jiǎn)歷驅(qū)動(dòng)開發(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)之上的報(bào)表系統(tǒng)170
8.3.3 陷阱:過于長(zhǎng)遠(yuǎn)的規(guī)劃171
8.4 小結(jié)172
第9章 實(shí)踐演進(jìn)式架構(gòu)173
9.1 組織因素173
9.1.1 不要抗拒康威定律173
9.1.2 文化182
9.1.3 試驗(yàn)文化183
9.1.4 首席財(cái)務(wù)官和預(yù)算184
9.2 業(yè)務(wù)場(chǎng)景185
9.2.1 假設(shè)驅(qū)動(dòng)開發(fā)和數(shù)據(jù)驅(qū)動(dòng)開發(fā)186
9.2.2 適應(yīng)度函數(shù)作為試驗(yàn)媒介187
9.3 構(gòu)建企業(yè)級(jí)適應(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 最高價(jià)值優(yōu)先196
9.4.3 測(cè)試196
9.4.4 基礎(chǔ)設(shè)施196
9.4.5 案例研究:PenultimateWidgets的企業(yè)級(jí)架構(gòu)197
9.5 未來狀態(tài)198
9.5.1 使用AI的適應(yīng)度函數(shù)198
9.5.2 生成式測(cè)試198
9.6 構(gòu)建演進(jìn)式架構(gòu)的場(chǎng)合199
9.6.1 什么情況下公司應(yīng)該構(gòu)建演進(jìn)式架構(gòu)199
9.6.2 什么情況下公司不需要構(gòu)建演進(jìn)式架構(gòu)201
9.7 小結(jié)202