編輯推薦
√ 本書系統地總結了代碼管理工具和優秀實踐,便於開發人員隨時查閱和參考
√ 書中介紹了很多從一線項目實踐中總結出來的優秀實踐
√ 作者對代碼管理的方法論、工具及未來都有深刻的認知
√ 在一切“XX as Code”的風潮下,代碼管理等同於高效的工程化開發
√ 本書是每一名寫代碼、使用代碼或管理代碼的人員值得擁有的經典書籍
內容提要
《代碼管理核心技術及實踐》首先通過系統化的介紹和比較,從整體上講解了代碼管理工具和系統的歷史和發展。其次分別從小型團隊、中大型團隊、分散式大團隊、基於微服務的團隊及開源團隊的角度總結了代碼管理的核心技術及實踐經驗,其中包括不同類型的團隊對代碼管理工具和系統的選擇,以及代碼管理的流程、策略和技巧,還有一些代碼管理工具和系統的難點、痛點等,包括如何選擇分支策略、如何管理多產品線的代碼、代碼備份策略,以及如何在大型團隊中將代碼從Subversion遷移到Git等。《代碼管理核心技術及實踐》可幫助讀者在現實中從團隊的大小及代碼管理模式是集中式還是分散式、開源還是閉源等各個角度去了解和思考代碼管理的核心技術和實踐經驗,從而幫助團隊建立起一套高效的代碼管理系統、策略和流程。
《代碼管理核心技術及實踐》的讀者對象主要是每天都需要使用代碼管理工具的程式設計師、代碼管理工具和系統的管理人員,以及團隊的技術領導人員。
目錄
第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 Perforce 5
1.3.2 Subversion 6
1.3.3 Git 6
1.3.4 Mercurial 7
1.3.5 Microsoft GVFS (Git Virtual File System) 7
1.4 常用的代碼管理系統 8
1.4.1 Virtual SVN Server 9
1.4.2 GitLab Server 9
1.4.3 Gerrit Server 10
1.5 從Subversion遷移到Git的常用工具和方法 11
1.5.1 SubGit 11
1.5.2 git-svn 12
1.5.3 手動 12
1.6 常用雲端代碼管理系統 13
1.6.1 Sourceforge和Google Code 13
1.6.2 GitHub 14
1.6.3 GitLab和Bitbucket 14
1.6.4 Coding、碼雲、阿里雲Code 15
第2章 獨立小型團隊 17
2.1 啟程:團隊與項目 17
2.2 痛點與需求 18
2.2.1 如何選擇和搭建Subversion Server 18
2.2.2 定製代碼庫結構 20
2.2.3 分支策略 22
2.2.4 日常工作模式 24
2.2.5 備份策略 26
2.3 阿里雲Code 27
2.3.1 將區域網路Subversion遷移到阿里雲Code 28
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
精彩節摘
4.4.3 定製分支策略
前面列出了一些需要運用分支或者其他代替分支的手段來解決的並行開發的問題,但每個產品都有它自己的特色,肯定會出現意料之外的特殊情況。團隊可以按照自己的需要來設計屬於自己的恰當的分支策略,包括分支定義、工作流程、紀律及工具腳本。分支策略要遵循以下原則。
(1)儘可能避免長期存在的分支。如果出現了需要並行的情況,則請一定先克制自己想要創建分支的衝動,先想一想能不能使用其他方法來解決。抽象分支、特性開關都是解決這個問題的手段。
(2)分支需要經常正確合併。無論是本地分支還是復刻倉庫中的分支,分支從哪裡分裂就要最終合併回哪裡(或者刪除),避免在無上下游關係的分支之間合併。下游分支要經常從上游分支更新代碼,而下游分支也要及時合併回上游分支。
(3)每次提交都需要進行審查和驗證。任何作為發布候選版本的分支上的每一次提交都要進行代碼審查和流水線驗證,通過7步提交法來保證提交的質量,也要提供足夠的持續集成基礎設施。
(4)使用倉庫復刻來引導團隊間的協作。使用復刻倉庫來隔離不同部門或團隊的協作,保證核心組件倉庫提交的質量,同時允許部門、團隊及個人有獨立倉庫進行創新並鼓勵貢獻。
如果團隊使用的是Git,則該團隊一定聽說過GitFlow的分支策略,也許會採用這種流行的分支策略。GitFlow是基於Git的強大分支能力所構建的一套軟體開發工作流,最早由Vincent Driessen在2010年提出 。它把分支的使用發揮到了“極致”,使用了特性(feature)分支、發布(release)分支、修正(hotfix)分支、主幹(master)分支及開發(develop)分支來處理不同的並行任務。這些分支又分為永久存在的兩個主要分支:master分支和develop分支,以及除這兩個分支外臨時存在的支持分支,它們用於不同目的的任務。Vincent最早繪製的這份大圖描述了這些分支之間的關係。
GitFlow雖然流行但備受爭議,它有一些忽略了持續集成原則的地方。
(1)採用了長期獨立存在的特性分支,也沒有強調特性分支應該頻繁地與master分支進行集成。
(2)長期存在的master分支沒有實際的意義,這個分支保存的發布版本使用tag就足夠了。
(3)hotfix分支的修改要合併到多個分支,容易遺漏(特別是遺漏與release分支的合併)。
(4)如果沒有支持流水線即代碼(Pipeline as Code)的持續集成基礎設施,則每個分支都需要配置和維護流水線,工作量大。
如果團隊已經採用了GitFlow的分支策略,則可以思考一下上述問題,做出調整。還有其他一些分支策略供參考,比如GitHub的GitHub Flow(和主幹開發幾乎一樣)和GitLab的GitLab Flow,在決定採用這些分支策略之前,需要使用這些原則檢驗一下,量體裁衣。
在筆者經歷過的項目中,有不少企業看到了第三代碼管理軟體的優勢(成本低、靈活度高),紛紛從傳統的第一代和第二代代碼管理軟體遷移過來。但是,由於思維定式和使用習慣的桎梏,在遷移的過程中只注重形式,並沒有從根本上轉變管理的思路。前面提到的層疊分支策略就是筆者曾經遇到的一個案例。該團隊把代碼管理工具由RTC切換成了SVN,但依然把SVN的分支當作RTC中的流來使用。而產品需求依然是按月排期的項目形式,這樣就造成了多個月度的版本並行的狀態,合併也沒有制定規範,每次合併代碼都是一次巨大的挑戰。儘管第三代代碼管理軟體的功能十分強大,配置也很靈活,要模擬陳舊的分支策略並不是什麼難事,但這種使用方式十分彆扭,沒有帶來好處,反而打擊了團隊的積極性。
隨著軟體工程的發展,越來越多的開發工作變成代碼並且代碼可以越來越快地變成交付的軟體產品。代碼管理再也不是一個軟體問題,它涉及了軟體開發過程中的各個方面。老舊的代碼管理軟體跟不上時代進步且需要升級時,代碼管理的實踐也需要升級換代,在升級的過程中要考慮全面。
(1)基礎設施和軟體升級。即選擇什麼樣的軟體可以減少運維成本,提供足夠的可擴展性,團隊成員也容易掌握。
(2)產品架構改造。即採用什麼樣的軟體架構進行模組化重構,可以在複雜度不斷攀升時把模組進行分倉庫管理。
(3)依賴管理。即選擇合適的依賴管理機制,制定版本號規則,搭建合適的製品庫。
(4)分支策略。即團隊使用哪種分支策略提高回響力和並行能力。
(5)團隊協作。即代碼倉庫的許可權如何設定能不阻礙協作,又能鼓勵創新。
作者簡介
劉冉,資深軟體質量諮詢師,擁有超過13年的軟體開發和測試工作經驗,熟悉自動化測試系統開發及敏捷中的QA,深入理解軟體測試及SCM、CI。現在關注軟體測試全自動化和敏捷中的QA,以及如何幫助大型團隊有效地管理代碼和CI,其中包括如何通過有效的代碼分支管理、代碼提交及CD保證和改進軟體的質量。
肖然,精益敏捷專家,在過去15年的從業經歷中,先後從事了算法複雜度研究、工業軟體開發、全球項目管理,以及大型企業轉型等工作。始終把軟體開發作為自己的愛好,在各大企業和社區宣揚精益和敏捷的開發思想,踐行有高回響力的開發理念。
覃宇,高級軟體諮詢師,擁有超過10年的移動套用開發經驗,為Android技術專家、Git資深用戶和狂熱愛好者、“主幹開發”的堅定擁護者和實踐者,曾幫助多個客戶團隊改進代碼管理、依賴管理、分支策略、持續集成等技術實踐。
媒體評論
很多人對代碼管理的概念仍然停留在版本化階段,也許會對不斷推陳出新的工具和功能感到新奇,但受限於變革的阻力,只能掩藏對高效開發的衝動,回到骨感的現實。殊不知,代碼管理在現代軟體開發中早已不再是版本化的代名詞,它的實現與代碼架構、產品線開發、團隊組織結構、持續交付部署、問題跟蹤都有著千絲萬縷的聯繫。在一切“XX as Code”的風潮下,代碼管理等同於高效的工程化開發。本書填補了市面上代碼管理系統化相關書籍的空白,重要的不是工具本身,而是如何根據團隊和產品的需求和現狀,做出優秀的代碼管理實踐。
——ThoughtWorks洞見主編 張凱峰
以我的理解,代碼管理本質上是對寫代碼的人的一種管理形式。類比控制論,人的編碼行為的可能性空間是無限的,而代碼的目標範圍是明確的。為了實現目標,我們需要通過工具將人的編碼行為縮小到可控的範圍內,我們可以從中看到工具本身和如何使用工具的重要性。感謝作者系統性地總結了代碼管理工具和優秀實踐,便於開發人員隨時查閱和參考,值得作為團隊的常備書。
——迅達雲成副總裁 崔康
代碼管理是軟體研發管理中的基礎管理過程,這一過程是否規範、高效或優雅,直接折射出一個團隊乃至一個組織的管理成熟度。作者在本書中從代碼管理相關的工具、技術、管理策略出發,延伸到與代碼管理息息相關的代碼架構、依賴管理、持續集成、微服務等技術管理實踐,由淺入深、娓娓道來。本書是每一名寫代碼、使用代碼或管理代碼的人員值得擁有的經典書籍。
——工行軟體開發中心持續集成平台負責人 吳利華
版本控制系統是在任何嚴肅的工程中都必須用到的,就像水和空氣一樣重要。特別是在涉及多人協同、跨地域協作等內容的場景中,版本控制系統更是對項目的開發效率和代碼安全起著決定性的支持作用。
本書介紹了版本控制系統的歷史淵源及對常見的版本控制系統的使用,並根據不同的團隊大小介紹不同的版本控制策略。難能可貴的是,書中介紹了很多從一線項目實踐中總結出來的優秀實踐,比如分支策略、持續集成的配合使用、大型分散式團隊的協作等。除了理論知識,書中還提供了很多實際案例,讀者可以通過對這些案例的學習,將這些原則套用到自己的工程中,以便讓版本控制系統更有效地幫助團隊。
——ThoughtWorks資深技術專家、技術作家
《JavaScript核心概念及實踐》《輕量級Web套用開發》等書作者 邱俊濤
代碼管理對於銀行的一支核心隊伍來說是非常重要的。一個系統有幾十年的歷史,經歷了無數版本,有上千人的開發團隊及多個國家的不同版本,所有這些都是一個複雜而龐大的工程。其中,代碼管理對於工具、方法論及實踐檢驗,都起著核心和基石的作用。作者對代碼管理的方法論、工具及未來都有深刻的認知。整本書由淺入深地講述了相關的概念,給出了相應的例子,很多個案都切中要害,值得有經驗的從業人員認真閱讀。
——某跨國銀行軟體開發中心測試經理
前言
序言
我從2004年開始直到現在都在從事軟體開發工作,經歷了沒有代碼版本管理、代碼集中式管理,以及現在的分散式代碼管理,在這一過程中,我深刻體會到代碼管理在軟體開發中的重要性。近幾年,隨著軟體開發規模越來越大,開發團隊的規模也隨之擴大,出現了越來越多的分散式團隊,工程效率問題也越來越突出,比如QCon在2016年首次舉辦了“工程效率提升”專題。由此可見工程效率已經成為現代軟體業中一個無法讓人忽視的問題。
在工程效率這個範疇里,代碼管理占據了舉足輕重的地位,因為代碼是開發人員每天工作的主要對象和內容,如果不能有效地管理,必然會影響開發人員的工作效率。隨著團隊規模的擴大,代碼管理對團隊工程效率的影響也越來越大。而高效的代碼管理就像一根紐帶,把所有程式設計師有效地串聯起來,讓程式設計師可以更高效地協同開發、編寫代碼,完成軟體的開發工作。我們在諮詢工作中遇到的很多客戶都對使用代碼版本管理有各種問題和困惑。出於以上原因,我們覺得有必要基於經驗寫一本代碼管理實踐相關的圖書。鑒於時間有限,在本書中我們只選擇了自己認為核心的技術及實踐。
本書首先通過系統化的介紹和比較,讓讀者從整體上系統地了解代碼管理工具的歷史和發展。然後分別從小型團隊、中大型團隊、分散式大團隊、基於微服務的團隊及開源團隊的角度,總結了代碼管理的核心技術及實踐,其中包括不同類型的團隊對代碼管理工具的選擇、代碼管理的流程、策略和技巧,以及一些代碼管理工具和系統的難點和痛點等,可幫助讀者在現實中從團隊規模的大小、集中式還是分散式、開源還是閉源等角度去了解和思考代碼管理的實踐經驗。
全書共分3部分,其中第1部分主要系統化地介紹了代碼管理的歷史和分類,列舉並簡單比較了業界常用的各種代碼管理工具和系統,以及遷移工具等基礎知識,以幫助讀者更好地選擇代碼管理工具。主要以集中式代碼管理工具Subversion為主,並以一個虛擬小團隊的工作流程介紹小團隊的代碼管理實踐,最後總結了我們經歷過的傳統中大型團隊的代碼管理的核心技術及實踐。第2部分以介紹當前流行的分散式代碼工具Git為主,結合大型軟體項目和分散式開發團隊介紹了當前流行的分散式軟體開發中代碼管理的核心技術及實踐。第3部分主要介紹了正在興起的微服架構下的代碼管理實踐,以及一種越來越重要的軟體開發模式:開源模式下的各種代碼管理核心技術及實踐。
閱讀提示:本書不是介紹代碼管理工具的專業書籍,所以不會對書中提到的代碼管理工具或系統進行全面性和系統性的介紹,所以讀者需要對書中提到的代碼管理工具或系統全面和深入地進行學習,並閱讀與其對應的專業書籍,比如Subversion的Version Control with Subversion、Git的Pro Git等。如果讀者來自一個大型團隊,則可以略過第2章的獨立小團隊的內容,在剩下的章節中找到有用的知識點。如果讀者來自一個小型團隊,那么可以將第3、4、5章作為興趣閱讀,但是在嘗試裡面的一些核心技術和實踐之前一定要認真思考,因為它們很可能並不適應讀者現在的團隊環境和規模。它們更像是一把雙刃劍,所以不妨將這些內容作為未來團隊擴張之前的知識儲備。
書中難免存在一些錯誤和不妥之處,敬請諒解並歡迎指出,我們將及時修改並發表在勘誤中,謝謝。
劉冉
2017年10月12號寫於成都