編輯推薦
- 第21屆Jolt大奬獲奬作品
- Martin Fowler作序推薦
- 軟件開發領域新經典
軟件發布是一個令人頭痛的過程,非常耗時且風險很高。本書獨特而有條理地闡述瞭以快速、高效、可靠的方式嚮用戶交付新功能的原則和技術實踐。通過實現自動化的構建、部署和測試過程,並改進開發人員、測試人員、運維人員之間的協作,交付團隊可以在幾小時(甚至幾分鍾)內發布軟件變更,而這不受項目大小和代碼復雜性的影響。
本書首先給齣瞭實現快速、可靠、低風險交付過程的基礎知識,然後介紹瞭部署流水綫,即從簽入到發布的過程中管理所有變更的一個自動化過程。書中探討瞭支撐持續交付的“交付生態圈”,內容涉及基礎設施、數據和配置的管理,以及組織治理。
作者為我們呈現瞭新的技術,包括自動化的基礎設施管理和數據遷移,以及虛擬化的使用,並分彆探討瞭各種技術中的關鍵問題和實踐,演示瞭降低風險的方法。
無論是開發人員、係統管理人員、測試人員,還是經理人員,本書都能前所未有地加速你將想法變成可發布軟件的步伐,為企業迅速可靠地增添價值。
內容簡介
本書講述如何實現更快、更可靠、低成本的自動化軟件交付,描述瞭如何通過增加反饋,並改進開發人員、測試人員、運維人員和項目經理之間的協作來達到這個目標。本書由三部分組成:部分闡述瞭持續交付背後的一些原則,以及支持這些原則的實踐;二部分是本書的核心,全麵講述瞭部署流水綫;第三部分圍繞部署流水綫的投入産齣討論瞭更多細節,包括增量開發技術、高級版本控製模式,以及基礎設施、環境和數據的管理和組織治理。
本書適閤所有開發人員、測試人員、運維人員和項目經理學習參考。
作者簡介
Jez Humble ThoughtWorks公司首席谘詢顧問,緻力於幫助企業快速、可靠地交付高質量軟件,經常在各種敏捷技術大會上發錶演講,擁有牛津大學物理學學士學位和倫敦大學民族音樂學碩士學位。2000年至今,他曾在各行業和不同技術領域擔任係統管理員、開發人員、培訓人員、谘詢師和經理人員。
David Farley 具有20多年的大型分布式係統開發經驗,是采用敏捷開發技術的先行者,曾作為技術負責人參加瞭ThoughtWorks公司許多極具挑戰性的軟件項目。目前幫助構建倫敦多項金融衍生品交易所(London Multi-Asset Exchange,LMAE)。
內頁插圖
目錄
Part I: Foundations / 基礎篇 1
Chapter 1: The Problem of Delivering Software / 軟件交付的問題 3
Introduction / 引言 3
Some Common Release Antipatterns / 一些常見的發布反模式 4
Antipattern: Deploying Software Manually / 反模式:手工部署軟件 5
Antipattern:Deploying to a Production-like Environment Only after Development Is Complete / 反模式:開發完成之後纔嚮類生産環境部署 7
Antipattern: Manual Configuration Management of Production Environments / 反模式:生産環境的手工配置管理 9
Can We Do Better? / 我們能做得更好嗎 10
How Do We Achieve Our Goal? / 如何實現目標 11
Every Change Should Trigger the Feedback Process / 每次修改都應該觸發反饋流程 13
The Feedback Must Be Received as Soon as Possible / 必須盡快接收反饋/ 14
The Delivery Team Must Receive Feedback and Then Act on It / 交付團隊必須接收反饋並作齣反應 15
Does This Process Scale? / 這個流程可以推廣嗎 16
What Are the Benefits? / 收效 17
Empowering Teams / 授權團隊 17
Reducing Errors / 減少錯誤 18
Lowering Stress / 緩解壓力 20
Deployment Flexibility / 部署的靈活性 21
Practice Makes Perfect / 多加練習,使其完美 22
The Release Candidate / 候選發布版本 22
Every Check-in Leads to a Potential Release 23
Principles of Software Delivery / 軟件交付的原則 24
Create a Repeatable,Reliable Process for Releasing Software / 為軟件的發布創建一個可重復且可靠的過程 24
Automate Almost Everything / 將幾乎所有事情自動化 25
Keep Everything in Version Control / 把所有的東西都納入版本控製 26
If It Hurts, Do It More Frequently, and Bring the Pain Forward / 提前並頻繁地做讓你感到痛苦的事 26
Build Quality In / 內建質量 27
Done Means Released / “DONE”意味著“已發布” 27
Everybody Is Responsible for the Delivery Process / 交付過程是每個成員的責任 28
Continuous Improvement / 持續改進 28
Summary / 小結 29
Chapter 2: Configuration Management / 配置管理 31
Introduction / 引言 31
Using Version Control / 使用版本控製 32
Keep Absolutely Everything in Version Control / 對所有內容進行版本控製 33
Check In Regularly to Trunk / 頻繁提交代碼到主乾 35
Use Meaningful Commit Messages / 使用意義明顯的提交注釋 37
Managing Dependencies / 依賴管理 38
Managing External Libraries / 外部庫文件管理 38
Managing Components / 組件管理 39
Managing Software Configuration / 軟件配置管理 39
Configuration and Flexibility / 配置與靈活性 40
Types of Configuration / 配置的分類 41
Managing Application Configuration / 應用程序的配置管理 43
Managing Configuration across Applications / 跨應用的配置管理 47
Principles of Managing Application Configuration / 管理配置信息的原則 47
Managing Your Environments / 環境管理 49
Tools to Manage Environments / 環境管理的工具 53
Managing the Change Process / 變更過程管理 53
Summary / 小結 54
Chapter 3: Continuous Integration / 持續集成 55
Introduction / 引言 55
Implementing Continuous Integration / 實現持續集成 56
What You Need Before You Start / 準備工作 56
A Basic Continuous Integration System / 一個基本的持續集成係統 57
Prerequisites for Continuous Integration / 持續集成的前提條件 59
Check In Regularly / 頻繁提交 59
Create a Comprehensive Automated Test Suite / 創建全麵的自動化測試套件 60
Keep the Build and Test Process Short / 保持較短的構建和測試過程 60
Managing Your Development Workspace / 管理開發工作區 62
Using Continuous Integration Software / 使用持續集成軟件 63
Basic Operation / 基本操作 63
Bells and Whistles / 鈴聲和口哨 63
Essential Practices / 必不可少的實踐 66
Don’t Check In on a Broken Build / 構建失敗之後不要提交新代碼 66
Always Run All Commit Tests Locally before Committing, or Get Your CI Server to Do It for You / 提交前在本地運行所有的提交測試,或者讓持續集成服務器完成此事 66
Wait for Commit Tests to Pass before Moving On / 等提交測試通過後再繼續工作 67
Never Go Home on a Broken Build / 迴傢之前,構建必須處於成功狀態 68
Always Be Prepared to Revert to the Previous Revision / 時刻準備著迴滾到前一個版本 69
Time-Box Fixing before Reverting / 在迴滾之前要規定一個修復時間 70
Don’t Comment Out Failing Tests / 不要將失敗的測試注釋掉 70
Take Responsibility for All Breakages That Result from Your Changes /為自己導緻的問題負責 70
Test-Driven Development / 測試驅動的開發 71
Suggested Practices / 推薦的實踐 71
Extreme Programming (XP) Development Practices / 極限編程開發實踐 71
Failing a Build for Architectural Breaches / 若違背架構原則,就讓構建失敗 72
Failing the Build for Slow Tests / 若測試運行變慢,就讓構建失敗 73
Failing the Build for Warnings and Code Style Breaches / 若有編譯警告或代碼風格問題,就讓測試失敗 73
Distributed Teams / 分布式團隊 75
The Impact on Process / 對流程的影響 75
Centralized Continuous Integration / 集中式持續集成 76
Technical Issues /技
前言/序言
《構建彈性與韌性:企業級係統進化之道》 在瞬息萬變的數字時代,軟件係統早已不再是簡單的代碼集閤,它們是驅動業務發展、連接全球用戶的核心動脈。然而,隨著係統復雜性的指數級增長,以及市場需求的快速迭代,如何確保這些關鍵係統在承受壓力、麵對變化時依然能夠穩定運行、持續交付價值,已成為擺在每一位技術領導者和工程師麵前的嚴峻挑戰。本書《構建彈性與韌性:企業級係統進化之道》並非探討特定的工具或流程,而是深入剖析企業級係統在持續進化過程中,必須掌握的一係列核心原則、設計哲學以及管理智慧,旨在幫助組織構建起真正具備彈性與韌性的軟件體係,從而在不確定性中脫穎而齣。 本書的齣發點,是對當前軟件開發與運維領域普遍存在的“僵化”與“脆弱”現象的反思。我們看到太多係統在小小的變動下便不堪重負,在突發事件麵前束手無策。這種脆弱性不僅導緻瞭高昂的修復成本,更嚴重的是,它直接影響瞭業務連續性,損害瞭用戶信任,最終阻礙瞭企業的創新步伐。因此,本書將引導讀者跳齣“短期優化”的陷阱,著眼於“長期健康”,構建一套能夠適應變化、自我修復、並能在壓力下保持高性能的係統。 第一部分:理解係統的內在生命力——從單體到微服務,再到演化式架構 我們將首先迴顧軟件架構的演進曆程,從最初的單體應用,到分布式微服務,再到當下備受關注的演化式架構。但這並非簡單的技術棧介紹,而是著重於不同架構模式背後所蘊含的“可變性”與“可維護性”的設計理念。 單體架構的局限與反思: 並非否定單體,而是深入理解其在規模化、團隊協作以及技術更新方麵的天然瓶頸。我們探討如何在設計單體時,為未來的演進埋下伏筆,例如模塊化的設計、清晰的邊界。 微服務的賦能與挑戰: 微服務帶來的獨立部署、技術異構性等優勢是顯而易見的。然而,本書將聚焦於微服務“治理”的深層問題:服務間的依賴管理、分布式事務的復雜性、以及如何避免“分布式單體”的陷阱。我們將討論如何通過閤理的劃分、契約管理和自治性,真正發揮微服務的優勢。 演化式架構的哲學: 本章將是本書的核心之一。演化式架構並非預設最終形態,而是強調係統的適應性和持續改進能力。我們不再追求一次性定義所有需求,而是建立一套能夠隨著業務發展和技術進步而“生長”的機製。這包括: 持續的反饋迴路: 如何從生産環境中獲取最真實、最有價值的信息,並將其轉化為改進的驅動力?這涉及監控、日誌、追蹤以及用戶反饋的有效整閤。 增量的改變: 如何設計係統,使其能夠輕鬆地進行增量改進,而不是大規模的重構?我們探討“低耦閤、高內聚”在實踐中的具體體現,以及如何通過“特徵開關”等機製,實現安全、可控的演進。 適應性與彈性: 係統的設計應該能夠預測並應對未知的變化。這包括如何通過解耦、抽象、以及擁抱不確定性來構建彈性。 第二部分:構建健康的係統心髒——數據、通信與狀態的管理 軟件係統的核心是數據的流動、服務的交互以及狀態的維護。本部分將深入探討如何在這幾個關鍵領域構建起堅實的基石,確保係統的健壯性。 數據治理與一緻性: 在分布式係統中,數據一緻性是一個繞不開的難題。本書將超越簡單的ACID模型,介紹CAP定理在實際應用中的權衡,以及各種分布式一緻性算法(如Paxos、Raft)的原理與適用場景。更重要的是,我們將強調“最終一緻性”的哲學,以及如何在業務邏輯層麵處理可能齣現的數據不一緻情況,從而在可用性與一緻性之間找到最佳平衡點。 領域驅動設計(DDD)與數據邊界: 如何利用DDD的思想,清晰地界定數據的所有權與邊界,減少跨服務的數據冗餘與衝突。 事件驅動架構(EDA)與異步通信: 探討如何利用事件驅動的模式,實現服務間的解耦與鬆耦閤。我們將深入分析消息隊列(MQ)的選型與使用策略,以及如何設計健壯的事件處理流程,應對消息丟失、重復消費等問題。 健壯的服務通信: 在微服務架構中,服務間的通信是係統的命脈。本書將聚焦於構建“故障轉移”與“容錯”能力的通信機製。 重試、超時與熔斷: 深入剖析這些容錯模式的設計原理、實現方式以及最佳實踐。我們將通過具體的案例,展示如何避免“雪崩效應”,將局部故障的影響控製在最小範圍內。 服務注冊與發現: 如何確保服務能夠可靠地找到彼此,並應對服務的動態變化。 API設計與契約: 強調清晰、穩定的API契約的重要性,以及如何通過版本管理、嚮後兼容性等手段,降低服務升級帶來的風險。 狀態管理的藝術: 許多係統的高可用性依賴於對狀態的有效管理。本書將探討如何在分布式環境下,可靠地維護和同步應用狀態。 分布式緩存策略: 如何設計高效、可靠的分布式緩存,減少對後端數據源的壓力。 狀態機與工作流引擎: 對於具有復雜業務流程的係統,如何通過狀態機和工作流引擎來管理和協調復雜的業務狀態,確保流程的可靠執行。 第三部分:打造自動化的生命支持係統——從構建到監控的全麵實踐 一個真正有韌性的係統,離不開強大的自動化能力,它貫穿於從代碼編寫到生産運維的每一個環節。 持續集成與交付的精髓: 本章將深入探討“持續”的真正含義,以及如何構建一個高效、可靠的CI/CD流水綫。 自動化測試的金字塔: 強調單元測試、集成測試、端到端測試的閤理分層與協同工作,以及如何通過自動化測試保障代碼質量與變更的安全性。 基礎設施即代碼(IaC): 如何將基礎設施的管理和配置自動化,實現可重復、可追溯的部署。Terraform, Ansible等工具的應用場景與實踐。 藍綠部署與金絲雀發布: 探討這些高級部署策略如何實現零停機部署,以及如何最小化新版本發布帶來的風險。 全方位的係統可觀測性: “看不見”的係統是無法被管理的。本書將詳細闡述如何構建強大的可觀測性體係。 日誌(Logging): 如何設計有效的日誌策略,收集有用的信息,並實現結構化日誌,便於查詢和分析。 指標(Metrics): 識彆關鍵的係統性能指標,並建立起有效的監控和告警機製。 追蹤(Tracing): 在分布式係統中,理解請求的完整生命周期至關重要。我們將探討分布式追蹤的實現原理和工具。 告警與響應: 如何設置有效的告警閾值,避免告警疲勞,並建立起清晰的告警響應流程。 自動化運維與自愈能力: 目標是讓係統具備一定的自我修復能力,減輕運維負擔。 自動化故障檢測與恢復: 如何利用監控數據,自動檢測常見的故障模式,並觸發預設的恢復腳本。 混沌工程(Chaos Engineering): 引入“故意製造故障”的思想,主動發現係統在異常情況下的脆弱性,從而提前加固。 彈性伸縮(Auto-scaling): 如何根據負載自動調整資源,應對流量高峰,同時避免資源浪費。 第四部分:塑造適應性文化——人的因素與組織的進化 技術是工具,而文化則是土壤。再先進的技術,也需要與之匹配的組織文化和人纔培養體係來支撐。 擁抱不確定性與持續學習: 鼓勵團隊擁抱變化,將每一次事故都視為學習的機會,並建立起持續改進的機製。 跨職能團隊與協作: 打破開發與運維之間的壁壘,建立以交付業務價值為核心的跨職能團隊。 安全左移與責任共擔: 將安全性融入到開發的早期階段,以及建立起全員參與安全防護的文化。 建立麵嚮未來的技術願景: 如何在日常工作中,平衡短期業務需求與長期技術債務的管理,為係統的可持續發展奠定基礎。 《構建彈性與韌性:企業級係統進化之道》不僅是一本技術書籍,更是一種思維方式的轉變。它將引導讀者從被動的“救火隊員”轉變為主動的“係統設計師”,從構建脆弱的係統轉變為培育具備生命力的有機體。通過理解和實踐本書提齣的原則與方法,您將能夠打造齣真正能夠應對復雜性、擁抱變化、並持續為業務創造價值的卓越軟件係統。
這本書的魅力在於它將“持續交付”這個復雜的話題,以一種非常清晰、有條理的方式展現在讀者麵前。作者並沒有迴避其中的挑戰,反而鼓勵我們積極麵對,並提供瞭切實可行的解決方案。我特彆喜歡書中關於“衡量”的章節,它強調瞭數據驅動決策的重要性。通過對部署頻率、平均恢復時間、變更失敗率等關鍵指標的跟蹤和分析,我們可以客觀地評估我們交付流程的健康狀況,並針對性地進行改進。這種量化的方法,讓我對“優化”有瞭更清晰的方嚮。 書中對於“風險管理”的論述也相當到位。它提醒我們,持續交付並非一味地追求速度,而是要在速度和穩定性之間找到一個健康的平衡點。作者通過介紹各種“緩解策略”,例如自動化測試、迴滾機製、以及分階段發布等,幫助我們有效降低瞭發布過程中可能齣現的風險。我特彆欣賞書中關於“測試金字塔”的講解,它提供瞭一種科學的測試投入模型,讓我們能夠構建齣既高效又可靠的測試體係,從而在早期階段就發現和修復問題。 此外,作者對“組織結構”和“團隊協作”的洞察也令人印象深刻。它認識到,技術工具固然重要,但支撐這一切的,是人的協作和文化的協同。書中關於“消除組織壁壘”、“鼓勵跨職能團隊”以及“建立共同的責任感”的討論,都為我們提供瞭寶貴的啓示。我感覺,作者並不是在教我們如何使用工具,而是在教我們如何構建一個能夠持續成功交付軟件的“生態係統”。這種宏觀的視角,讓這本書的價值遠超一本純粹的技術手冊。 我同樣被書中對於“技術債務”的討論所吸引。作者並沒有把技術債務描繪成洪水猛獸,而是將其視為一種可以被管理和優化的現象。通過建立一套有效的“技術債務償還機製”,我們可以讓團隊在追求新功能的同時,也能保持代碼庫的健康和可維護性。這種務實而辯證的觀點,讓我對如何平衡短期交付壓力和長期係統健康有瞭更深刻的理解。 總體而言,這是一本能夠讓你“思維升級”的書。它不僅教授瞭“做什麼”,更重要的是解釋瞭“為什麼這麼做”,以及“如何做”。它所倡導的理念和實踐,能夠幫助我們構建一個更加敏捷、更加可靠、更加可持續的軟件交付流程,最終為業務帶來更大的價值。