本書首先通過系統化的介紹和比較,從整體上講解了代碼管理工具和系統的歷史和發展。其次分別從小型團隊、中大型團隊、分布式大團隊、基于微服務的團隊及開源團隊的角度總結了代碼管理的核心技術及實踐經驗,其中包括不同類型的團隊對代碼管理工具和系統的選擇,以及代碼管理的流程、策略和技巧,還有一些代碼管理工具和系統的難點、痛點等,包括如何選擇分支策略、如何管理多產品線的代碼、代碼備份策略,以及如何在大型團隊中將代碼從Subversion遷移到Git等。本書可幫助讀者在現實中從團隊的大小及代碼管理模式是集中式還是分布式、開源還是閉源等各個角度去了解和思考代碼管理的核心技術和實踐經驗,從而幫助團隊建立起一套高效的代碼管理系統、策略和流程。本書的讀者對象主要是每天都需要使用代碼管理工具的程序員、代碼管理工具和系統的管理人員,以及團隊的技術領導人員。
本書系統地總結了代碼管理工具和優秀實踐,便于開發人員隨時查閱和參考
書中介紹了很多從一線項目實踐中總結出來的優秀實踐
作者對代碼管理的方法論、工具及未來都有深刻的認知
在一切XX as Code的風潮下,代碼管理等同于高效的工程化開發
本書是每一名寫代碼、使用代碼或管理代碼的人員值得擁有的經典書籍
前 言
我從2004年開始直到現在都在從事軟件開發工作,經歷了沒有代碼版本管理、代碼集中式管理,以及現在的分布式代碼管理,在這一過程中,我深刻體會到代碼管理在軟件開發中的重要性。近幾年,隨著軟件開發規模越來越大,開發團隊的規模也隨之擴大,出現了越來越多的分布式團隊,工程效率問題也越來越突出,比如QCon在2016年首次舉辦了工程效率提升專題。由此可見工程效率已經成為現代軟件業中一個無法讓人忽視的問題。
在工程效率這個范疇里,代碼管理占據了舉足輕重的地位,因為代碼是開發人員每天工作的主要對象和內容,如果不能有效地管理,必然會影響開發人員的工作效率。隨著團隊規模的擴大,代碼管理對團隊工程效率的影響也越來越大。而高效的代碼管理就像一根紐帶,把所有程序員有效地串聯起來,讓程序員可以更高效地協同開發、編寫代碼,完成軟件的開發工作。我們在咨詢工作中遇到的很多客戶都對使用代碼版本管理有各種問題和困惑。出于以上原因,我們覺得有必要基于經驗寫一本代碼管理實踐相關的圖書。鑒于時間有限,在本書中我們只選擇了自己認為核心的技術及實踐。
本書首先通過系統化的介紹和比較,讓讀者從整體上系統地了解代碼管理工具的歷史和發展。然后分別從小型團隊、中大型團隊、分布式大團隊、基于微服務的團隊及開源團隊的角度,總結了代碼管理的核心技術及實踐,其中包括不同類型的團隊對代碼管理工具的選擇、代碼管理的流程、策略和技巧,以及一些代碼管理工具和系統的難點和痛點等,可幫助讀者在現實中從團隊規模的大小、集中式還是分布式、開源還是閉源等角度去了解和思考代碼管理的實踐經驗。
全書共分3部分,其中第1部分主要系統化地介紹了代碼管理的歷史和分類,列舉并簡單比較了業界常用的各種代碼管理工具和系統,以及遷移工具等基礎知識,以幫助讀者更好地選擇代碼管理工具。主要以集中式代碼管理工具Subversion為主,并以一個虛擬小團隊的工作流程介紹小團隊的代碼管理實踐,最后總結了我們經歷過的傳統中大型團隊的代碼管理的核心技術及實踐。第2部分以介紹當前流行的分布式代碼工具Git為主,結合大型軟件項目和分布式開發團隊介紹了當前流行的分布式軟件開發中代碼管理的核心技術及實踐。第3部分主要介紹了正在興起的微服架構下的代碼管理實踐,以及一種越來越重要的軟件開發模式:開源模式下的各種代碼管理核心技術及實踐。
閱讀提示:本書不是介紹代碼管理工具的專業書籍,所以不會對書中提到的代碼管理工具或系統進行全面性和系統性的介紹,所以讀者需要對書中提到的代碼管理工具或系統全面和深入地進行學習,并閱讀與其對應的專業書籍,比如Subversion的Version Control with Subversion、Git的Pro Git等。如果讀者來自一個大型團隊,則可以略過第2章的獨立小團隊的內容,在剩下的章節中找到有用的知識點。如果讀者來自一個小型團隊,那么可以將第3、4、5章作為興趣閱讀,但是在嘗試里面的一些核心技術和實踐之前一定要認真思考,因為它們很可能并不適應讀者現在的團隊環境和規模。它們更像是一把雙刃劍,所以不妨將這些內容作為未來團隊擴張之前的知識儲備。
書中難免存在一些錯誤和不妥之處,敬請諒解并歡迎指出,我們將及時修改并發表在勘誤中,謝謝。
劉冉
2017年10月12號寫于成都
劉冉,資深軟件質量咨詢師,超過13年軟件開發和測試工作經驗。熟悉自動化測試系統開發、以及敏捷中的QA,對于軟件測試以及SCM和CI有深入的理解。現在關注于軟件測試全自動化和敏捷中的QA,以及如何幫助大型團隊有效的管理代碼和CI,其中包括如何通過有效的代碼分支管理,有效的代碼提交以及CD來保證和改進軟件質量。覃宇,高級軟件咨詢師,10 余年移動應用開發經驗,Android 技術專家, Git 資深用戶和狂熱愛好者,主干開發堅定擁護者和實踐者,曾幫助多個客戶團隊改進代碼管理、依賴管理、分支策略、持續集成等技術實踐。肖然,精益敏捷專家,在過去15年的從業經歷中,先后從事過算法復雜度研究,工業軟件開發,全球項目管理,大型企業轉型等工作。把軟件開發始終作為自己的愛好,在各大企業和社區宣揚精益和敏捷的開發思想,踐行高響應力的開發實踐。
目 錄
第1部分 基礎與傳統
第1章 代碼版本管理工具與系統2
1.1 引言2
1.2 代碼版本管理工具的歷史3
1.2.1 第1代:本地代碼管理3
1.2.2 第2代:中心服務器代碼管理3
1.2.3 第3代:分布式代碼管理4
1.3 常用的代碼管理工具5
1.3.1 Perforce5
1.3.2 Subversion6
1.3.3 Git6
1.3.4 Mercurial7
1.3.5 Microsoft GVFS (Git Virtual File System)7
1.4 常用的代碼管理系統8
1.4.1 Virtual SVN Server9
1.4.2 GitLab Server9
1.4.3 Gerrit Server10
1.5 從Subversion遷移到Git的常用工具和方法11
1.5.1 SubGit11
1.5.2 git-svn12
1.5.3 手動12
1.6 常用云端代碼管理系統13
1.6.1 Sourceforge和Google Code13
1.6.2 GitHub14
1.6.3 GitLab和Bitbucket14
1.6.4 Coding、碼云、阿里云Code15
第2章 獨立小型團隊17
2.1 啟程:團隊與項目17
2.2 痛點與需求18
2.2.1 如何選擇和搭建Subversion Server18
2.2.2 定制代碼庫結構20
2.2.3 分支策略22
2.2.4 日常工作模式24
2.2.5 備份策略26
2.3 阿里云Code27
2.3.1 將內網Subversion遷移到阿里云Code28
2.3.2 權限管理31
2.3.3 日常工作模式32
2.3.4 備份方案33
2.4 小團隊代碼管理的經典模型34
第3章 傳統中大型團隊36
3.1 傳統大型團隊的特點36
3.2 獨立大型團隊在代碼管理上的痛點與需求38
3.3 大型團隊代碼管理案例39
3.3.1 代碼模塊依賴管理41
3.3.2 建立相關運作機制44
3.3.3 建立原子提交的紀律46
3.3.4 建立持續集成守護機制47
3.3.5 大型團隊代碼管理小結51
3.4 大型團隊的代碼服務器遷移51
第2部分 當前與流行
第4章 分布式中大型團隊58
4.1 分布式中大型團隊的特點58
4.2 分布式中大型團隊在代碼管理上的痛點與需求59
4.2.1 離線代碼管理60
4.2.2 在線代碼審查61
4.2.3 對代碼進行分布式權限管理66
4.2.4 對代碼進行分布式提交和集成73
4.3 代碼倉庫拆分與集成74
4.3.1 優化單代碼倉庫77
4.3.2 代碼倉庫的拆分87
4.3.3 代碼倉庫的集成91
4.3.4 小結122
4.4 分支策略123
4.4.1 主干開發分支策略124
4.4.2 應對并行開發132
4.4.3 定制分支策略147
4.5 代碼庫熱備份150
4.5.1 服務器端熱備份方案150
4.5.2 客戶端熱備份方案151
4.6 案例:Android定制化系統開發151
4.6.1 項目背景151
4.6.2 項目及其代碼管理介紹152
4.6.3 分支策略155
4.7 多產品線157
4.7.1 多產品線介紹158
4.7.2 多產品線開發的困境158
4.7.3 多產品線解決方案158
4.8 超大型分布式團隊166
第3部分 發展與未來
第5章 云時代微服務大型分布式團隊172
5.1 云時代和微服務架構172
5.2 Everything as Code(一切即代碼)173
5.3 代碼管理團隊自治175
5.3.1 圍繞團隊的代碼庫管理177
5.3.2 圍繞服務的代碼庫管理177
5.4 微服務架構下的代碼管理挑戰179
5.5 微服務代碼管理實例180
第6章 開源項目與開源社區184
6.1 開源軟件184
6.1.1 開源軟件的特點185
6.1.2 開源軟件和社區185
6.1.3 開源軟件和商業186
6.1.4 開源軟件的代碼管理186
6.2 開源社區中的開源項目187
6.2.1 簡介187
6.2.2 代碼管理模型187
6.2.3 典型的大型分布式開源項目189
6.3 企業中的開源項目193
6.3.1 簡介193
6.3.2 代碼管理模型193
6.4 GitHub中的開源項目實踐195
6.4.1 分支管理195
6.4.2 分庫管理197
6.4.3 把公開代碼庫轉換成私有代碼庫203
6.4.4 GitHub的分支與復刻205
參考文獻207
名詞解釋209