遺留系統(tǒng)重建實(shí)戰(zhàn)
定 價(jià):55 元
- 作者:[英]克里斯·伯查爾(Chris Birchall)
- 出版時(shí)間:2017/9/1
- ISBN:9787115465856
- 出 版 社:人民郵電出版社
- 中圖法分類:TP311.5
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:1
- 開本:16開
正如本書作者所言,大多數(shù)開發(fā)人員的主要時(shí)間都是花費(fèi)在與現(xiàn)有的軟件打交道上,而不是編寫全新的應(yīng)用程序。相信開發(fā)人員或多或少都遇到過與遺留系統(tǒng)相關(guān)的問題或者困惑,本書致力于幫開發(fā)人員回答這些問題,更重要的是,幫開發(fā)人員避免把自己當(dāng)前開發(fā)的系統(tǒng)變成別人將來(lái)要面臨的遺留問題。
本書篇幅不長(zhǎng),但涵蓋的內(nèi)容很廣,例證豐富,有大量的示例代碼(主要使用Java或C#編寫),深入淺出地介紹了工作在遺留系統(tǒng)中會(huì)遇到的各種問題及應(yīng)對(duì)方法。書中不僅包含技術(shù)性的內(nèi)容如何選擇構(gòu)建項(xiàng)目的工具,如何自動(dòng)化構(gòu)建基礎(chǔ)設(shè)施,如何決定并進(jìn)行重構(gòu)或重寫等,也包含非技術(shù)性的內(nèi)容應(yīng)該建設(shè)什么樣的團(tuán)隊(duì)文化,如何引入代碼評(píng)審等活動(dòng),如何進(jìn)行團(tuán)隊(duì)知識(shí)的傳播、改進(jìn)溝通方式等。
作為開發(fā)人員,你可能會(huì)從另一個(gè)團(tuán)隊(duì)接手一個(gè)項(xiàng)目,而且該項(xiàng)目是基于現(xiàn)有代碼庫(kù)的,擁有很多設(shè)計(jì)模式、使用假設(shè)、基礎(chǔ)設(shè)施和工具。幸運(yùn)的是,有一些方法可以為遺留項(xiàng)目注入新的活力,這樣你就可以維護(hù)、改進(jìn)和擴(kuò)展它們,而不必顧及它們的局限性。
這是一本以經(jīng)驗(yàn)為主導(dǎo)的指南,能使遺留軟件項(xiàng)目脫胎換骨。它涵蓋了重構(gòu)、質(zhì)量度量學(xué)、工具鏈和工作流、持續(xù)集成、基礎(chǔ)設(shè)施自動(dòng)化以及組織文化等內(nèi)容。在技術(shù)層面,讀者將學(xué)習(xí)如何給代碼模塊化引進(jìn)依賴注入,如何定量地衡量軟件質(zhì)量,以及如何實(shí)現(xiàn)基礎(chǔ)設(shè)施的自動(dòng)化。在策略層面,讀者將能學(xué)到的實(shí)踐有:軟件是應(yīng)該重寫還是應(yīng)該重構(gòu),團(tuán)隊(duì)的組織架構(gòu)應(yīng)該是什么樣的,以及如何讓管理層意識(shí)到軟件質(zhì)量的重要性。本書的核心議題包括解析和模塊化棘手的代碼結(jié)構(gòu)、集成和自動(dòng)化測(cè)試、替換過時(shí)的構(gòu)建系統(tǒng),以及用Vagrant和Ansible 之類的工具實(shí)現(xiàn)基礎(chǔ)設(shè)施自動(dòng)化。
本書主要內(nèi)容
● 重構(gòu)遺留代碼庫(kù)。
● 持續(xù)審查和持續(xù)集成。
● 遺留基礎(chǔ)設(shè)施的自動(dòng)化。
● 給老代碼加新測(cè)試。
● 單體應(yīng)用的模塊化。
本書面向的讀者對(duì)象是熟悉面向?qū)ο笳Z(yǔ)言(如Java 或C#)的開發(fā)人員和團(tuán)隊(duì)領(lǐng)導(dǎo)。
作者簡(jiǎn)介
Chris Birchall 是倫敦《衛(wèi)報(bào)》的高-級(jí)開發(fā)工程師,致力于為網(wǎng)站提供支持的后臺(tái)服務(wù)。此前,他做過很多不同的項(xiàng)目,包括日本zui大的醫(yī)療門戶網(wǎng)站、高性能日志管理軟件、自然語(yǔ)言分析工具和許多移動(dòng)網(wǎng)站。他擁有劍橋大學(xué)計(jì)算機(jī)科學(xué)專業(yè)的學(xué)士學(xué)位。
譯者簡(jiǎn)介
張喻,ThoughtWorks咨詢師,熱愛技術(shù),熱衷編程。目前主要從事后端API的開發(fā)、部署、維護(hù)等相關(guān)工作,在整潔代碼、敏捷實(shí)踐和軟件開發(fā)高效團(tuán)隊(duì)方面有豐富的理論和實(shí)踐經(jīng)驗(yàn)。
張耀丹,ThoughtWorks咨詢師,曾長(zhǎng)期參與大型遺留系統(tǒng)的開發(fā)與改進(jìn),在Java服務(wù)器端技術(shù)、大型系統(tǒng)架構(gòu)演進(jìn)、微服務(wù)轉(zhuǎn)型、DevOps和云計(jì)算方面有豐富的經(jīng)驗(yàn)。
禚嫻靜,ThoughtWorks咨詢師,樂于知識(shí)分享與傳播。擁有多年企業(yè)和互聯(lián)網(wǎng)應(yīng)用的開發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn),專注于敏捷實(shí)踐、軟件架構(gòu)和持續(xù)交付領(lǐng)域,在.NET技術(shù)棧和微服務(wù)架構(gòu)演化等方面有豐富的積累。
目錄
第一部分 開始
第1章 了解遺留項(xiàng)目中的挑戰(zhàn) 3
1.1 遺留項(xiàng)目的定義 3
1.1.1 遺留項(xiàng)目的特征 4
1.1.2 規(guī)則的例外 5
1.2 遺留代碼 6
1.2.1 沒有測(cè)試和無(wú)法測(cè)試的代碼 6
1.2.2 不靈活的代碼 8
1.2.3 被技術(shù)債務(wù)拖累的代碼 8
1.3 遺留基礎(chǔ)設(shè)施 9
1.3.1 開發(fā)環(huán)境 10
1.3.2 過時(shí)的依賴 10
1.3.3 異構(gòu)環(huán)境 11
1.4 遺留文化 12
1.4.1 害怕變化 12
1.4.2 知識(shí)倉(cāng)庫(kù) 13
1.5 小結(jié) 14
第2章 找到起點(diǎn) 15
2.1 克服恐懼和沮喪 15
2.1.1 恐懼 16
2.1.2 沮喪 18
2.2 收集軟件的有用數(shù)據(jù) 19
2.2.1 bug和編碼標(biāo)準(zhǔn)違例 20
2.2.2 性能 20
2.2.3 錯(cuò)誤計(jì)數(shù) 23
2.2.4 對(duì)常見的任務(wù)計(jì)時(shí) 23
2.2.5 常用文件 24
2.2.6 度量可度量的一切 25
2.3 用FindBugs、PMD和Checkstyle審查代碼庫(kù) 25
2.3.1 在IDE中運(yùn)行FindBugs 26
2.3.2 處理誤報(bào) 29
2.3.3 PMD和Checkstyle 32
2.4 用Jenkins進(jìn)行持續(xù)審查 34
2.4.1 持續(xù)集成和持續(xù)審查 34
2.4.2 安裝和設(shè)置Jenkins 35
2.4.3 用Jenkins構(gòu)建和審查代碼 36
2.4.4 還能用Jenkins做些什么 37
2.4.5 SonarQube 39
2.5 小結(jié) 39
第二部分 通過重構(gòu)改善代碼庫(kù)
第3章 準(zhǔn)備重構(gòu) 43
3.1 達(dá)成團(tuán)隊(duì)共識(shí) 44
3.1.1 傳統(tǒng)主義者 44
3.1.2 反傳統(tǒng)主義者 46
3.1.3 一切都在于溝通 47
3.2 獲得組織的批準(zhǔn) 48
3.2.1 使它變得正式 48
3.2.2 備用計(jì)劃:神秘的20%計(jì)劃 49
3.3 選擇重構(gòu)目標(biāo) 50
3.4 決策時(shí)間:重構(gòu)還是重寫 51
3.4.1 不應(yīng)該重寫的情況 52
3.4.2 從頭重寫的好處 55
3.4.3 重寫的必要條件 56
3.4.4 第三種方式:增量重寫 57
3.5 小結(jié) 58
第4章 重構(gòu) 59
4.1 有紀(jì)律的重構(gòu) 59
4.1.1 避免麥克白的悲劇 59
4.1.2 把重構(gòu)和其他的工作分開 60
4.1.3 依靠IDE 61
4.1.4 依靠版本控制系統(tǒng) 64
4.1.5 Mikado方法 65
4.2 常見的遺留代碼的特征和重構(gòu) 66
4.2.1 陳舊代碼 66
4.2.2 有毒的測(cè)試 68
4.2.3 過多的null 70
4.2.4 不必要的可變狀態(tài) 73
4.2.5 錯(cuò)綜復(fù)雜的業(yè)務(wù)邏輯 74
4.2.6 視圖層中的復(fù)雜性 79
4.3 測(cè)試遺留代碼 83
4.3.1 測(cè)試不可測(cè)試的代碼 83
4.3.2 沒有單元測(cè)試的回歸測(cè)試 86
4.3.3 讓用戶為你工作 88
4.4 小結(jié) 89
第5章 重搭架構(gòu) 90
5.1 什么是重搭架構(gòu) 90
5.2 將單體應(yīng)用程序分解為模塊 92
5.2.1 案例研究日志管理應(yīng)用程序 92
5.2.2 定義模塊和接口 94
5.2.3 構(gòu)建腳本和依賴管理 95
5.2.4 分拆模塊 96
5.2.5 引入Guice 97
5.2.6 Gradle來(lái)了 98
5.2.7 結(jié)論 98
5.3 將Web應(yīng)用程序分發(fā)到服務(wù) 99
5.3.1 再看一下Orinoco.com 99
5.3.2 選擇一個(gè)架構(gòu) 100
5.3.3 繼續(xù)采用單體架構(gòu) 101
5.3.4 前后端分離 103
5.3.5 面向服務(wù)架構(gòu) 106
5.3.6 微服務(wù) 108
5.3.7 Orinoco.com應(yīng)該做什么 109
5.4 小結(jié) 109
第6章 大規(guī)模重寫 111
6.1 決定項(xiàng)目范圍 112
6.1.1 項(xiàng)目目標(biāo)是什么 112
6.1.2 記錄項(xiàng)目范圍 113
6.2 從過去學(xué)習(xí) 114
6.3 如何處理數(shù)據(jù)庫(kù) 115
6.3.1 共享現(xiàn)有數(shù)據(jù)庫(kù) 116
6.3.2 創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù) 119
6.3.3 應(yīng)用程序間通信 124
6.4 小結(jié) 125
第三部分 重構(gòu)之外改善項(xiàng)目工作流程與基礎(chǔ)設(shè)施
第7章 開發(fā)環(huán)境的自動(dòng)化 129
7.1 工作的第一天 129
7.1.1 搭建用戶活動(dòng)儀表盤開發(fā)環(huán)境 130
7.1.2 出了什么問題 132
7.2 一個(gè)好的README文件的價(jià)值 134
7.3 用Vagrant和Ansible對(duì)開發(fā)環(huán)境進(jìn)行自動(dòng)化 135
7.3.1 Vagrant介紹 135
7.3.2 為用戶活動(dòng)儀表盤項(xiàng)目搭建Vagrant 136
7.3.3 用Ansible進(jìn)行自動(dòng)配置 137
7.3.4 添加更多的角色 139
7.3.5 移除對(duì)外部數(shù)據(jù)庫(kù)的依賴 141
7.3.6 工作的第一天再來(lái)一次 142
7.4 小結(jié) 143
第8章 將自動(dòng)化擴(kuò)展到測(cè)試環(huán)境、預(yù)生產(chǎn)環(huán)境以及生產(chǎn)環(huán)境 144
8.1 自動(dòng)化基礎(chǔ)設(shè)施的好處 145
8.1.1 保證環(huán)境一致性 145
8.1.2 易于更新軟件 145
8.1.3 易于搭建新環(huán)境 145
8.1.4 支持追蹤配置更改 146
8.2 將自動(dòng)化擴(kuò)展到其他環(huán)境 146
8.2.1 重構(gòu)Ansible腳本以處理多種環(huán)境 146
8.2.2 為Ansible角色和playbook搭建庫(kù) 150
8.2.3 讓Jenkins負(fù)責(zé) 152
8.2.4 常見問題 154
8.3 移到云上 155
8.3.1 不可變基礎(chǔ)設(shè)施 156
8.3.2 DevOps 156
8.4 小結(jié) 157
第9章 對(duì)遺留軟件的開發(fā)、構(gòu)建以及部署過程進(jìn)行現(xiàn)代化 158
9.1 開發(fā)、構(gòu)建以及部署遺留軟件的困難 158
9.1.1 缺乏自動(dòng)化 158
9.1.2 過時(shí)的工具 160
9.2 更新工具鏈 160
9.3 用Jenkins實(shí)現(xiàn)持續(xù)集成與自動(dòng)化 163
9.4 自動(dòng)發(fā)布和部署 165
9.5 小結(jié) 172
第10章 停止編寫遺留代碼 173
10.1 源代碼并不是項(xiàng)目的全部 173
10.2 信息不能是自由的 174
10.2.1 文檔 174
10.2.2 促進(jìn)溝通 175
10.3 工作是做不完的 176
10.3.1 定期進(jìn)行代碼評(píng)審 176
10.3.2 修復(fù)一扇窗戶 176
10.4 自動(dòng)化一切 177
10.5 小型為佳 178
10.6 小結(jié) 180