在資訊安全的世界裡,有一個諷刺的現實:只要你沒有被入侵,就無法證明你的系統有多安全。這就是資安工程的特性—無法證明一個系統是絕對安全的。

資安團隊經常面臨的是一份看似吃力不討好的工作。與SRE(網站可靠性工程)團隊相比,資安團隊往往不被認為能為公司帶來同等價值,主要因為資安工作的成果往往難以量化。我們的工作成效是「沒有發生的事情」,而這正是最難被察覺的價值。

儘管如此,現代資安團隊擁有許多優秀工具與技術:

  • 維護作業系統、虛擬機器和容器的更新狀態
  • 安裝安全修補程式
  • 掃描公司網路和IP以偵測未經諮詢就上線的軟體
  • 鼓勵開發者更新其相依套件
  • 在程式碼發布前進行模糊測試(fuzzing)
  • 確保許可權沒有被過度授予

如果資安團隊做得好,通常不會有人注意到—這正是最令人沮喪的地方。

讓資安工程師生活更輕鬆的方法

什麼能讓生產環境的資安工程師工作更輕鬆呢?給予資安團隊與SRE同等的重視與空間。具體來說:

  1. 從專案初期就讓資安團隊參與
  2. 盡早溝通基礎設施的變更
  3. 在決策過程中納入資安團隊
  4. 不要在某處執行你已經忘記的舊作業系統虛擬機器
  5. 及時合併那些Dependabot的提取請求
  6. 信任資安團隊的建議

本質上,是讓資安成為組織的一部分,將其整合到日常工作和決策中。這對組織有明顯的好處—被駭的系統可能會停機並造成大量的停機時間,這絕對不是可靠的系統。所以下次當資安團隊帶著看似過度偏執的建議來找你時,請記住,我們關心的是保護客戶安全和確保一切執行順暢。

不要讓資安成為事後的想法。請記住:以你希望那個產品團隊對待你的方式來對待你的資安團隊。

技術領域中最被濫用的詞:「複雜」

軟體工程師和系統工程師都使用「複雜」一詞作為特定的專業術語,但他們賦予這個詞的含義卻截然不同。理解這種差異至關重要,因為軟體工程師和系統工程師(SRE、生產工程師、系統管理員、DevOps實踐者等)是互相重疊與協作的群體。我們需要了解在任何時候使用的是哪種含義,才能清晰地溝通。

軟體工程師眼中的複雜性

複雜性長期以來一直是軟體工程師的敵人。Fred Brooks在經典論文《沒有銀彈》中將軟體的複雜性分為兩部分:本質複雜性和偶然複雜性。

  • 本質複雜性:與指定問題及其解決方案相關
  • 偶然複雜性:與實作細節相關

技術營運工作的絕大部分都是關於處理偶然複雜性。

但這並沒有告訴我們軟體工程師眼中的複雜性究竟是什麼。從根本上說,複雜性是使軟體難以完全理解和正確推理的因素。Moseley和Marks的論文《走出焦油坑》討論了複雜性的幾個來源:

  • 狀態(State):最大與最難處理的複雜性來源。狀態影響程式的控制流,但軟體可能處於的潛在狀態數量隨變數量呈指數增長。
  • 程式碼量:純粹的程式碼量也是複雜性的主要來源。
  • 視覺不可檢查性:與複雜的物理結構不同,程式無法直觀地進行視覺檢查,必須從源程式碼構建程式的心智模型。

系統工程師眼中的複雜性

系統工程師對複雜性的理解來自系統理論,與軟體工程師截然不同。複雜系統具有特定特徵:

  • 多個互動部分
  • 系統狀態(某種形式的記憶)
  • 反饋迴路
  • 表現出新興現象
  • 具有非線性關係(一部分的小變化可能導致整體系統行為的巨大偏差)
  • 傾向於發生級聯故障或惡性迴圈

複雜系統的行為無法可靠預測。

所有計算系統本質上都是複雜系統。即使系統執行在單一實體機器上,你仍然在處理多個軟體部分的互動,每個部分本身可能就是一個複雜系統,執行在複雜的硬體上。每個執行中的程式可能有多個控制執行緒、狀態、與作業系統和其他程式的互動—即使不是明確的互動,也會透過分享資源產生影響。

兩種複雜性的差異與共同點

系統理論中的複雜性定義常被系統管理員、SRE和DevOps實踐者使用。另一方面,軟體工程師主要考慮的是程式碼結構、模組間的互動和程式碼函式庫相互依賴關係。

  • 軟體工程師的主要關注點:在不引入錯誤的情況下做出正確更改的難度
  • 系統工程師的主要關注點:已佈署軟體在生產環境中的穩定性

這就是為什麼,當你要求軟體工程師將簡化作為工作職責的一部分時,他們會:

  • 尋找機會分離關注點
  • 減少程式碼函式庫耦合
  • 重構為眾所周知的設計模式
  • 建立模組之間更明確的互動
  • 移除未使用的程式碼

當你要求系統工程師做同樣的事情時,他們往往會:

  • 尋找控制系統行為極端情況的方法(使用負載脫落和斷路器等)
  • 使系統元素更加統一

這兩種複雜性雖然截然不同,但有一個主要的共同點:軟體複雜性和系統複雜性都使理解和預測行為的任務變得不可能。

我能給團隊的最佳建議

如果我只能給出一個建議,那就是:整合你的團隊。

就是這樣。一起工作,多交流。

過去十年(或更久)關於軟體開發和交付的一個重要教訓是:更多的溝通和更少的孤島是關鍵。這確實都是關於資訊流的。SRE團隊也適用同樣的原則。切割出另一個特殊團隊只會創造新的孤島,而他們的工作和影響力無法觸及最需要它的人。

分離SRE團隊的問題

將SRE團隊與他們支援的開發團隊分離—有時透過建立卓越中心(Center of Excellence)—最終會導致比解決更多的問題。分離SRE和開發團隊會導致:

精英主義

加入特殊俱樂部感覺很好,但透過孤立專業知識,你只會創造瓶頸並限制他人完成工作的能力。這可能導致兩種不良結果:

  • 所有人都來找你處理一切事情(學習性無助)
  • 由於流程太困難而不找你處理任何事情

這兩種情況都不理想,因為它們使你脫離重要的高優先順序工作。

知識限制

當一個中央集權的小組擁有並囤積所有知識時,分享變得更困難,指導更難進行,最佳實踐更難擴充套件。

與工作分離

SRE與支援的團隊之間的巨大鴻溝,可能感覺像是有人在指導應該如何做事,但中間缺少了翻譯層。如果你從不與開發團隊一起工作,很難真正瞭解他們的工作。開發團隊也可能難以理解不斷反彈回來的可靠性和擴充套件性問題;他們的環境在根本上表現不同。

贊助問題

辦公室政治可能並不總是令人愉快,但這是一個重要的考慮點:SRE通常是由高管驅動和贊助的,這使得卓越中心結構成為一個有風險的舉措。如果你的贊助者離開公司或不再看到你工作的價值,你可能會失去強有力的連線。

玄貓認為,團隊整合是現代技術組織中平衡安全性與可靠性的關鍵。當安全團隊、SRE和開發團隊緊密協作時,不僅可以更早發現潛在問題,還能共同構建更加健壯的系統。最重要的是,這種整合可以打破「複雜性」的不同理解所帶來的溝通障礙,讓所有工程師都能從同一個視角理解並解決系統面臨的挑戰。

SRE 與開發團隊:打破隔閡的最佳實踐

對於任何組織來說,SRE (Site Reliability Engineering) 團隊與開發團隊之間的隔閡都是一個危險訊號。這種分離對你的團隊、組織和使用者都沒有好處。當這兩個團隊作為獨立的孤島運作時,往往會導致溝通障礙、目標不一致,以及最終影響產品可靠性和開發速度。

整合 SRE 與開發的有效模式

在尋找最適合的整合方式時,玄貓發現嵌入式模型特別有效。這種模式包括:

  1. SRE 嵌入開發團隊:將 SRE 工程師直接嵌入到開發團隊中,使他們能夠從專案初期就參與設計與開發討論。

  2. 定期交流機制:建立固定的會議節奏,讓團隊分享工作進展、最佳實踐和整個組織中出現的模式。

  3. 實踐社群建立:透過這種鬆散結構(有時被稱為實踐社群,Community of Practice),你可以獲得兩全其美的效果:分享社群的優勢,同時避免了孤島帶來的成本。

然而,現實中並不總是有足夠的 SRE 工程師可以嵌入到每個開發團隊中——這通常只是一個美好的願景。針對這種情況,一些組織採取了以下解決方案:

  • SRE 輪調變:讓 SRE 工程師在不同的開發團隊之間進行輪調。
  • 開發者 SRE 體驗:讓開發人員輪流進入 SRE 團隊工作一段時間。

透過這種合作方式,SRE 可以幫助任何規模的組織專注於使用者視角,優先處理正確的工作,並採用系統化的方法來提高可靠性和可用性。而這一切的核心是有效的溝通與協作。

建立支援性檔案:SLO 實施的根本

在實施 SLO (Service Level Objectives) 的過程中,不要低估檔案的力量。檔案不僅能夠支援你和你的團隊,還能確保整個組織對 SLO 有一致的理解。

SLO 的建立可以分為三個階段:定義 SLO、收集 SLI (Service Level Indicators),以及後續使用 SLO。在這個過程中,以下檔案將成為你的強大支援:

一頁戰略檔案

這將是你在初始階段最重要的檔案。它應該簡明扼要地回答:

  • 你想要透過 SLO 實作什麼?
  • 為什麼要實施 SLO?
  • 如何實施?

這份檔案應該足夠簡短,讓任何人都能在不到 10 分鐘內閱讀完畢。當有人問「這個計劃是關於什麼」時,這將是你分享的第一份檔案。

確保這份檔案清晰地闡述了為什麼你的組織需要 SLO,實施 SLO 將帶來哪些好處,以及 SLO 如何改善使用者服務可靠性並幫助工程團隊。最重要的是,確保這份檔案得到了長官層的審核和全力支援。

SLO 高階定義(兩頁)

接下來,你需要一份更詳細(但仍然簡短)的檔案,解釋 SLO 的概念,提供良好 SLO 的例子,並告訴讀者如何開始。目標是讓工程師容易理解 SLO 的概念,並激發他們的興趣,而不是讓他們感到被要求閱讀一整本關於 SLO 的書。

常見問題解答 (FAQ)

收集一份預期問題清單,並將它們編製成 FAQ 檔案。初期可能包括以下問題:

  • 如果我的使用者是另一個服務,我還需要關注 SLO 嗎?
  • 如果我的服務依賴項沒有 SLO,該怎麼辦?
  • 一個服務應該有多少 SLO?多少 SLI?

逐步定義 SLO 的

你需要一份檔案,逐步解釋組織中的任何人如何定義 SLO(SLO 建立過程的第一階段)。在這裡不要談論儀表和指標收集,而是專注於高層次的流程。你可能想要分享一個 SLO 定義範本,供團隊使用。

SLI 收集的儀表化

作為前一份檔案的後續,這份檔案將提供有關如何儀表化服務以收集 SLI(第二階段)的逐步指導和範例。在這裡,你可以非常具體地檢視組織使用的監控平台,並為不同類別的服務提供 SLI 儀表化的範例。

例如:

  • 如何收集延遲資料並將指標轉換為 SLI,使用百分位數?
  • 如何儀表化管道服務以收集 SLI?

提供盡可能多的例子和現成可用的程式碼片段,使工程師能夠輕鬆進行監控儀表化。

實際案例

如果你已經為任何服務(或在研究過程中開發的範例服務)實施了 SLO,請將詳細資訊寫成案例檔案,為 SLO 早期採用者提供具體的實施範例。

最後,別忘了定義所有檔案的存放位置(例如,與程式碼倉函式庫的 wiki),並確保它們易於發現和導航。工程組織中最常見的錯誤是沒有花時間建立結構良好與易於發現的技術檔案,以及沒有要求檔案經過與程式碼相同的品質審查過程。

獲得 SLO 支援的操作順序

作為推動團隊、組織或公司採用 SLI、SLO 和錯誤預算的人,你需要進行大量的說服工作。對某些人來說,SLO 的基本論點可能與他們為自己和團隊設定的目標相抵觸。其他人可能希望將功能開發速度置於可靠性工作之前,還有人可能懷疑公司是否成熟或優秀到足以採用這些原則和技術。

重要的是要認識到,採用根據 SLO 的方法的好處並不會對每個人都顯而易見,你需要耐心地進行解釋。讓我們制定一個讓所有人參與的計劃。與工程中的大多數事情一樣,操作順序非常重要。

根據經驗,玄貓建議按照以下順序獲得支援:

1. 工程和維運團隊

你的第一步是讓工程和維運團隊都支援 SLO。這應該相對直接,因為 SLI、SLO 和錯誤預算為每個團隊都提供了實際的好處。他們對 SLO 原則的共同意對於讓其他團隊加入至關重要。注意,我說的是原則。實施細節(錯誤預算策略、SLO 目標等)將在後續協商。

2. 產品團隊

你的下一站可能是產品經理(或者編寫產品需求檔案的人)。你對他們提出的關鍵論點是,這種方法將隨著時間的推移為他們提供更好的功能開發速度。他們會想知道工程和維運是否支援,這就是為什麼他們在第二步的原因。

3. 長官層

一旦工程、維運和產品團隊都支援了,是時候與高層長官交流了。這種變化的好處(更快的發布速度、對使用者經驗的早期洞察、更好的工作環境等)是顯而易見的,但他們希望知道這三個主要團隊是否一致同意。

4. 法務部門

你的下一站是法務團隊。如果你已經完成了步驟 1-3,你不太可能在這裡遇到太多阻力。他們會關心(理所當然地)這種變化對公共 SLA(服務水平協定)意味著什麼。

回答是:如果他們目前沒有處理大量的 SLA 違規,那麼這些變更幾乎不會有影響,甚至可能是採用更具競爭力的 SLA 的機會;如果他們處理的違規比預期多,那麼這個數字將會下降。

5. 品質保證 (QA) 團隊

這是你的最後一站。這是對這些變化最為擔憂的團隊。這次對話的重要部分是讓團隊專注於他們帶來的技能,而不是他們加入的組織。沒有人會失去工作——恰相反。你不是真的來說服 QA 團隊,而是(溫和地)通知他們公司正在轉向 SLO,並且長官層、工程、產品和維運都同意這是正確的做法。

當然,你還需要與其他團隊交談,如銷售、行銷、客戶支援等,但上述五個團隊是獲得組織內 SLO 支援的關鍵。

SLO 實施:從理論到實踐的關鍵考量

在實施 SLO 的過程中,玄貓觀察到幾個關鍵因素會影響成功率:

明確的使用者視角

SLO 的核心是從使用者的角度來衡量服務可靠性。在定義 SLO 時,首先要問的問題是:「這項指標對使用者經驗有何影響?」如果無法建立這種連線,那麼該指標可能不是好的 SLI 候選項。

從簡單開始,逐步擴充套件

玄貓在幫助多家企業實施 SLO 時發現,從一兩個關鍵服務開始,建立成功案例後再擴充套件到其他服務是最有效的策略。這種漸進式方法允許團隊學習並調整過程,同時建立組織信心。

工具支援與自動化

手動追蹤 SLI 和計算 SLO 合規性是不可持續的。投資於適當的工具和自動化,使團隊能夠輕鬆監控 SLO 並在潛在問題出現時得到警示。

錯誤預算政策

定義 SLO 只是第一步。制定明確的錯誤預算政策——當預算耗盡時團隊將採取什麼行動——同樣重要。這些政策應該在平靜時期制定,而不是在危機中倉促決定。

持續改進迴圈

SLO 不是「設定後遺忘」的指標。建立定期審查流程,根據使用者反饋、業務需求變化和技術進步來調整 SLO。

建立 SRE 與開發協作的文化基礎

技術解決方案只是實作 SRE 與開發團隊成功協作的一部分。同樣重要的是建立支援這種協作的文化基礎:

共同責任文化

服務可靠性應該是所有人的責任,而不僅是 SRE 團隊的職責。開發團隊需要理解並接受他們在可靠性方面的角色,同時 SRE 需要認識到他們在支援功能開發中的作用。

透明的決策和溝通

當涉及到可靠性與功能開發之間的權衡時,決策過程應該是透明的,並根據資料和共同的目標。這種透明度有助於建立信任並減少團隊之間的摩擦。

持續學習環境

鼓勵團隊從故障中學習,而不是尋找責任人。故障後分析應該專注於系統改進,而不是個人責任。這種方法促進了開放的溝通和持續改進。

分享知識和技能

SRE 和開發團隊應該相互學習。開發人員可以從 SRE 那裡學習系統思維和可靠性實踐,而 SRE 可以從開發人員那裡學習新技術和業務邏輯。這種知識分享增

英雄與英雄文化的重要區別

在技術組織中,我們常會聽到「英雄」這個詞。在危機時刻挺身而出解決問題的工程師確實值得稱讚,但當組織開始形成「英雄文化」時,問題就出現了。作為一名長期參與SRE工作的技術人員,我觀察到這種文化差異對團隊健康度的巨大影響。

真正的英雄與危險的英雄文化

英雄是在危機時刻自然形成的,他們執行非凡任務來挽救局面。然而,英雄文化則是鼓勵災難發生,以便迫使人們成為英雄。這種微妙但關鍵的區別常被忽視。

回想一下,SRE團隊何時會收到廣泛讚譽?通常是在夜間事件中,某人犧牲睡眠時間挽救了系統。這類別事件往往會獲得工程內外同事的讚賞。雖然我們必須認可事件應對者的英勇行為,但當這種讚揚變成對這種工作方式的美化時,情況就變得危險了。

真正的英雄在需要時會挺身而出,但他們不會希望自己或他人陷入那些可怕的情況。而在英雄文化中的SRE則會將組織推向「維運 vs 開發」的思維模式,這恰是站點可靠性工程本應避免的。

英雄文化的負面影響

英雄文化帶來的最大問題是,開發人員不再與SRE共同分擔對服務的責任。他們開始思考:「為什麼要擔心發布更可靠的選項,反正有SRE值班來拯救一切?」

這種文化還會阻礙預防性工作。如果工作只在解決緊急情況時才被認可,人們自然會傾向於專注處理緊急事件!這就是所謂的「垃圾火災驅動開發」:當某些東西急需修復但不夠緊急,而上層的支援只有在它變成「垃圾火災」(即成為事件)後才會出現。

動機來源的關鍵區別

在健康的環境中,英雄的動機是內部驅動的—人們希望在非常時期做好工作。而在英雄文化中,動機來自外部—人們只有在被迫執行非凡工作以維持系統執行時才會得到獎勵。

當問題只能由少數幾個人解決,而這些人感到積極關注只發生在他們是拯救局面的關鍵時,諷刺的是,他們成為了潛在的故障點,同時環境也轉化為沉重的值班負擔。持續的救火工作必然導致職業倦怠。

如何從英雄文化轉向健康的英雄表彰

要從英雄文化轉向正確表彰英雄,我們需要找到新的方式來認可工作。這之所以困難,部分原因是很難量化「沒有發生的事情」。我們必須做出預測。

斯多亞學派的「負面視覺化」練習,即想像生活中發生更糟糕事件的版本,如失業,以意識到對當前狀況的感激之情。在SRE中,「事前驗屍」(預先思考專案可能失敗的原因)是一種受推崇的工具。讓我們在專案發布後也使用它,來慶祝那些沒有發生的事情和背後的功臣。

同樣,我們必須提醒開發人員,他們可以做什麼來防止或減輕這些情況的危害。這也應該成為團隊長官投入資源解決技術債的觸發點。這是讓所有人參與團隊努力,為共同責任創造更好環境的完美時機。

開發人想加入的值班輪替制度

在許多組織中,值班被視為一種必要的痛苦,但在Monzo銀行,值班輪替制度竟然有候補名單!這種情況在行業中非常罕見。我曾參與過多個SRE團隊的建設,發現以人為中心的值班設計確實能帶來顯著不同。

以人為本的值班理念

值班人員首先是人類。這正是值班如此強大的原因;當安全系統、彈性架構和自動化修復停止工作時,沒有機器能夠接近人類對複雜系統中新型故障的反應和適應能力。但與機器不同,人類無法承受24/7的執行或持續100%的CPU使用率。職業倦怠對團隊成員、公司和個人都有害。有效的值班同時也必須是人道的值班。

激勵機制:金錢與成長並重

首先,我們需要激勵人員。許多值班人員完全沒有額外報酬,而為值班責任、壓力和對正常生活的幹擾提供補償是公平的。除了金錢激勵,人們也被技術進步和學習更多關於系統運作的機會所激勵。我們透過在發展和職業晉升框架中納入值班行為來鼓勵和獎勵這一點。

減輕值班痛點

減少被呼叫的頻率是顯而易見的起點。雖然我們永遠無法實際達到100%的可靠性(否則根本不需要值班!),但我們可以透過自動化和精心設計的監控來減少噪音警示和故障。

我們將每次呼叫視為特殊情況;如果不需要採取行動,我們會調整閾值,甚至刪除警示。在我的經驗中,這種對警示品質的關注是建立健康值班文化的關鍵。

值班入職:從影子開始

良好的值班體驗從加入輪替的那一刻開始。常見的做法是將新人直接扔進深水區,並期望他們獨自處理問題。這種「火的考驗」並非成為優秀值班人員的先決條件。

在一個健康的值班文化中,每位新加入的值班人員會在幾個月內跟隨更有經驗的工程師學習,這樣他們可以在期望較低的情況下練習事件回應並獲得背景知識,同時有知識淵博與自信的指導。

持續改進的重要性

強大的值班文化不會一夜之間形成,而是來自持續努力和頻繁迭代。最佳的改進想法來源是值班人員自己。定期回顧並思考如何改進值班是關鍵。有時候,僅提供一個發洩的論壇就很好,但最有用的改進和想法往往來自協作反思。

賦予人們代理權和改善事物的機會是賦能值班人員並提高他們福祉的強大方式。我發現,當團隊成員感到他們能夠影響值班流程時,他們的滿意度和參與度會顯著提高。

人為因素研究:改善值班疲勞

值班疲勞是SRE團隊面臨的常見問題,但對於什麼構成「噪音」值班,每個團隊都有自己的警示閾值。業界普遍假設警示越多意味著情況越糟,這讓我思考:頁面數量是否與值班滿意度相關?

研究方法與發現

為了找出答案,我觀察了一個約200名工程師的組織,他們被分成10到20人的團隊,混合了有經驗和初級工程師。工程師們對他們的值班輪替進行了評分。

結果顯示,收到的警示數量與值班滿意度之間並無直接相關。一些接收大量警示的團隊報告了高滿意度,而一些警示較少的團隊則報告了較低滿意度。這打破了「警示越少越好」的常見假設。

關鍵影響因素

進一步分析發現,以下因素對值班滿意度有顯著影響:

  1. 團隊文化與支援:在強調協作和互助的團隊中,即使警示較多,值班滿意度也較高。

  2. 警示品質:「有用」的警示(那些指示真正需要人為干預的問題)比噪音警示(假陽性或不需要立即行動的警示)更能被接受。

  3. 值班準備度:充分的培訓和檔案可以顯著提高工程師處理警示的信心,從而提高滿意度。

  4. 輪替頻率與持續時間:較短但更頻繁的值班輪替通常比長期但不頻繁的輪替更受歡迎。

  5. 團隊期望與透明度:清晰溝通的期望和透明的流程有助於減少值班壓力。

實用改進策略

根據這些發現,我總結了幾個改善值班體驗的實用策略:

  1. 建立明確的升級路徑:確保值班工程師知道何時以及如何尋求幫助。

  2. **投資於知識函式庫:建立和維護高品質的檔案,包括常見問題解決方案和決策樹。

  3. 促進團隊學習:鼓勵事件後回顧和知識分享,使整個團隊從每次值班經歷中學習。

  4. 最佳化警示品質:定期審查警示以減少噪音,確保每個警示都提供明確的行動路徑。

  5. 建立支援文化:培養一種團隊成員互相支援的文化,而不是責備或孤立值班人員。

我發現,當團隊專注於這些領域而不僅是減少警示總數時,值班滿意度會顯著提高。事實上,一些接收較多警示但擁有強大支援系統的團隊報告了更高的值班滿意度,這表明團隊文化可能比原始警示數量更重要。

建立健康SRE文化的綜合方法

結合前面討論的所有元素,我認為建立健康的SRE文化需要一種綜合方法。這不僅關乎技術系統,更關乎人和流程。

平衡技術與人文關懷

健康的SRE文化在技術卓越和人文關懷之間取得平衡。系統可靠性固然重要,但維護這些系統的人員的健康同樣重要。這意味著設計考慮到人類限制的系統和流程。

從預防性工作中獲得成就感

我們需要創造一種文化,使工程師能從預防性工作中獲得與緊急回應同等甚至更高的成就感。這可能包括:

  • 慶祝成功的預防措施和「無事件」時期
  • 將預防性工作納入績效評估和晉升標準
  • 為預防性工作建立可見的指標和儀錶板

培養共同責任感

SRE不應該是唯一對系統可靠性負責的團隊。開發團隊、產品管理和業務長官都應該理解並重視可靠性。這種共同責任感可以透過以下方式培養:

  • 跨職能團隊參與事件回應和回顧
  • 分享可靠性目標和錯誤預算
  • 促進開發和SRE之間的輪調和知識交流

持續學習與適應

最後,健康的SRE文化植根於持續學習和適應的理念。這包括:

  • 從事件中學習而不指責
  • 實驗新的工具和方法
  • 定期回顧並調整流程
  • 鼓勵好奇心和創新

在我的經驗中,這種綜合方法不僅提高了系統可靠性,還創造了一個工程師可以茁壯成長並長期貢獻的環境。這不僅對個人有益,對組織也同樣有利。

隨著系統變得更加複雜與關鍵,我們越來越依賴人類在自動化失敗時介入。建立快樂、健康的值班輪替是一種超能力,透過花時間和精力激勵人員、減少痛點、提供指導並快速迭代,你也可以獲得這種能力。

警示體驗的真相:超越數字的團隊文化

當我開始研究值班警示對工程師滿意度的影響時,最初假設很簡單:警示數量越少,值班體驗越好。然而,資料分析結果讓我大吃一驚。警示數量與值班滿意度之間竟然沒有直接關聯。這個發現促使我深入研究那些警示頻繁但滿意度仍然高的團隊,希望理解背後的原因。

經過一系列的團隊觀察,我發現人為因素與團隊文化在塑造工程師值班體驗中扮演著決定性角色。值班疲勞的本質與警示數量無關,而是取決於工程師是否擁有改變現狀的能力與自主權。一個工程師可能只收到兩條警示,卻因為無力改變系統而感到沮喪;另一個可能處理二十條警示,卻因為能夠主導系統改進而感到充實。

高滿意度團隊的共同特徵

在對高滿意度團隊的深入觀察中,我發現這些團隊的工程師普遍擁有較高自主權,能夠在關鍵領域推動系統變革。他們建立了分享想法和慶祝成就的文化習慣,形成正向回饋迴圈,促進問責制和協作機會,同時避免工作重複。

讓我們來看這些高滿意度團隊所採用的工程實踐:

技術素養與實戰經驗

技術素養和實戰經驗是提升值班滿意度的兩大關鍵因素。成功的團隊通常建立了高效的新成員入職流程,並持續投資於培訓和檔案更新。

當我觀察一個特別成功的團隊時,發現他們為每位新加入的工程師安排了為期兩週的系統培訓,包括模擬故障演練和解決方案討論。這種實戰訓練大幅降低了值班人員面對未知問題時的焦慮感。

溝通與協作的倍增效應

良好的溝通和協作對團隊效率產生倍增效果。高滿意度團隊通常每週舉行多次會議,有90%的團隊成員和經理參與。經理積極貢獻但不主導討論,這有助於建立自下而上的文化並獲得上層支援。

在這些會議中,工程師們會審視事件趨勢、系統性問題、檔案改進和自動化等議題。所有後續工作都會記錄並指派負責人。團隊還會舉行專門的會議進行詳細的事件回顧,遵循「五個為什麼」的流程。

無責備文化是所有討論的關鍵元素,重點放在平台和流程而非個人身上。工程師們感到安全,能夠自由分享他們的意見。

問責與成就的文化

為了建立問責和所有權文化,同時也為了慶祝成就,團隊會定期舉行工程審查和演示會議,可能有預定的議程或開放式討論。這兩種會議類別,結構化和非結構化的,建立了不同的團隊協作動態。

任何阻礙和優先順序變更都會及時溝通和討論。玄貓觀察到,這種透明的溝通方式對於減輕值班壓力至關重要,因為它讓每個團隊成員都能瞭解全域,而不僅是當前值班的工程師。

有效的回饋機制

成功的團隊建立了有效的回饋機制,確保每個人的聲音都被聽到,並持續測量值班滿意度。值班工程師在值班結束後會立即填寫調查問卷,包括對短期和中期改進建議的詳細反饋。調查結果會定期審查並採取行動。

在我參與的一個團隊中,每月會有一次專門的「值班體驗改進」會議,團隊會一起分析過去一個月的所有值班反饋,並確定下個月的改進重點。這種結構化的改進流程讓工程師們感到他們的意見真正被重視。

團隊同理心

最後,高滿意度的團隊展現了高度的同理心,積極尋找機會相互支援。例如,一些團隊會實施「影子值班」制度,讓資深工程師在新人值班期間提供非正式支援,既不會讓新人感到被監視,又能在需要時提供幫助。

最佳化值班體驗:平均回床時間(MTTBTB)

當我們談論值班體驗時,一個關鍵指標是「平均回床時間」(Mean Time to Back to Bed, MTTBTB)。這個半開玩笑的術語背後,是一個嚴肅的問題:如何減少深夜警示對工程師健康和效率的影響。

夜間警示的現實挑戰

想像一下:半夜,你的警示應用發出刺耳的聲音將你從睡夢中驚醒,緊接著是電話和訊息的確認—沒人願意錯過警示!

在突然醒來的狀態下做任何事情都不理想—思緒混亂,皮質醇水平飆升,甚至腎上腺素飆高—更不用說在壓力下除錯複雜系統了。然而,這就是許多人值班的現實,因為很少有組織能夠為所有團隊投資全球跟隨太陽的輪班制度,但卻需要執行24/7可用的系統。

隨著時間推移,頻繁的非工作時間警示會成為壓力源並最終導致倦怠。人力成本不容忽視。解決方案的一部分是修復警示的根本原因,但我們必須承認,某些警示仍然會發生。知道這一點,我們如何最好地支援值班人員並減輕持有呼叫器的精神和身體負擔?

減輕認知負荷的策略

首先,要問:“如果你剛被吵醒,這是否有意義?“即使最有經驗、最專業的值班人員在睡眠被中斷後也無法全力工作。我們必須積極降低事件回應的認知負荷—無論是透過檢查清單、操作手冊、指令碼和工具,還是儀錶板—仔細考慮所提供的資訊是否有足夠的連貫的背景與環境以有效,但又不至於造成資訊過載。

考慮到使用者在進入情況時幾乎沒有初始連貫的背景與環境。將文字牆(或註解)分解成單句、簡單的要點可能看起來有些過頭,但當仍然睡意朦朧時,這樣處理起來容易得多。清楚標記任何棘手、危險或不可逆的步驟也大有幫助。如果需要升級,提供明確的升級路徑,包括聯絡詳情和升級閾值。

最佳化回床時間

其次,要問:“這能讓你更快地回到床上(並留在那裡)嗎?“這將注意力集中在緩解和結束標準上。在夜間,完整全面的修復絕不應該是目標;相反,重點應該是緩解到足以讓整個團隊第二天用更清醒的頭腦來檢視。

明確設定何時認為問題已得到緩解(但不一定完全修復)的期望,並給予人們在認為安全的情況下結束事件的許可,這有助於減少值班人員透過盯著儀錶板來"照看"系統的傾向。提醒值班人員,熬夜沒有意義—如果系統再次出問題,他們無論如何都會再次收到警示。

日間實踐的重要性

將這些要素結合起來的是在白天時間進行練習的概念;最糟糕的首次嘗試時間是在夜間事件期間。如果不提前檢查並盡可能消除粗糙邊緣,我們就是在虧待值班人員(和我們自己)。就像我們定期測試滅火器和煙霧報警器一樣,我們也應該測試我們的工具和流程。

夜間被呼叫很糟糕,但在不久的將來似乎不會消失,特別是考慮到我們可以用小團隊快速構建的系統規模和複雜性。讓人們思考人性化方面可以幫助他們產生共鳴,並利用自己的經驗。額外的好處是:如果它在凌晨3點對半睡半醒的人有效,對完全清醒的人可能會更有效。

預防與緩解級聯故障

想像一堆積積多米諾骨牌倒塌的場景,每一塊都推倒下一塊,直到所有骨牌都倒下。當理論上鬆散耦合的系統實際上存在我們不知道的緊密連線時,就可能發生級聯故障。

在生產系統中,當過載的區域失敗時,其流量會轉移到健康的鄰近區域,這些區域隨後也會過載並失敗。如果不加以控制,級聯故障可能迅速擴充套件,導致系統在幾分鐘內全球性故障。這類別故障是GCP(Google Cloud Platform)甚至電網大規模公共故障的罪魁禍首。

級聯故障的觸發因素

有多種方式可能觸發級聯故障:

  1. 流量突然激增,使系統中的某個元件過載
  2. 看似無害的程式碼或設定變更導致效能下降,從而減少容量,即使總體流量沒有增加也可能成為原因

當級聯故障發生時,多種過載症狀同時出現,使其難以在擴散到全球故障前及時除錯和緩解。首要目標應該是打破連鎖反應。前線緩解措施可能各不相同,但這裡有一些核心措施可以應用。

建立更健康的值班文化

從我的研究和觀察中,清楚地看到警示數量並不總是衡量值班體驗的好指標。這個數字比對它的態度更不重要。信任、所有權、問責、有效溝通和協作的文化對於建立成功的團隊至關重要。它為改進流程和技術奠定了基礎,進而帶來更好的值班體驗和服務可靠性。

建立健康的值班文化需要團隊和組織的共同努力。當我與不同的團隊合作時,發現最成功的組織通常會定期回顧他們的值班實踐,並願意根據團隊成員的反饋進行調整。這種持續改進的心態對於維持高水平的值班滿意度和系統可靠性至關重要。

最後,值得記住的是,技術系統是由人設計、構建和維護的。關注人的因素—自主權、賦能、同理心和協作—往往比單純關注技術指標更能提升值班體驗和整體系統可靠性。透過建立支援這些人為因素的文化,團隊可以在減少警示數量的同時,也確保那些不可避免的警示不會導致團隊倦怠和不滿。

值班不僅關乎技術能力,更關乎團隊如何相互支援、相互學習、一起成長。在這個過程中,我們不僅建立了更可靠的系統,也培養了更健康、更有彈性的工程文化。

從緩解到預防:應對雪崩式失效的全方位策略

當系統發生雪崩式失效時,快速識別並回復導致區域過載的變更是還原正常的第一步。針對已經受影響的區域進行流量限制,可以幫助它們還原並防止完全不可用的情況發生。然而,在實際操作中,即使擁有經驗豐富的工程師團隊和現成的緩解方案,要在不對使用者造成嚴重影響的前提下完全緩解雪崩式失效,依然是一項艱鉅的挑戰。

系統設計最佳化:預防勝於治療

我發現,構建彈性系統的更有效策略是透過最佳化系統設計來預防問題發生。在發布的金絲雀階段進行效能和迴歸測試,可以在全球推廣前及早發現效能退化問題,例如記憶體洩漏等可能導致容量短缺的問題。

在處理過多個大型系統的設計時,我總結了幾個關鍵的預防策略:

更人工智慧的負載限流機制

當任務達到其容量上限時,更好的負載限流可以透過拒絕或降級回應來提高區域抵抗過載的能力。實際操作中,建議採取以下步驟:

  1. 對區域進行負載測試,以確定負載平衡器層級的理想利用率目標,避免單個任務過載
  2. 設定合理的任務級負載平衡演算法(如加權輪詢),盡可能保持任務負載平衡

在我參與設計的一個高流量系統中,我們實施了自適應負載限流,使系統在面對突發流量時能夠人工智慧降級。這比固定的限流閾值要靈活得多,因為它能夠根據當前系統資源情況動態調整接受的請求量。

區域間的強隔離

區域間的強隔離可以確保區域性故障不會全球擴散。在這種設定中,每個區域的冗餘必須單獨維護,因為相鄰區域不再能夠互相補償容量。這種方法成本較高,但提供了最強的隔離保證。

// 實作區域隔離的簡化範例程式碼
type RegionalService struct {
    region string
    resourcePool *ResourcePool
    circuitBreaker *CircuitBreaker
}

func NewRegionalService(region string, capacity int) *RegionalService {
    return &RegionalService{
        region: region,
        resourcePool: NewResourcePool(capacity),
        circuitBreaker: NewCircuitBreaker(
            0.5,   // 錯誤閾值
            1000,  // 最小請求數
            30,    // 重置時間(秒)
        ),
    }
}

func (rs *RegionalService) HandleRequest(request *Request) (*Response, error) {
    // 檢查斷路器狀態
    if !rs.circuitBreaker.AllowRequest() {
        return nil, ErrCircuitOpen
    }
    
    // 嘗試取得資源
    resource, err := rs.resourcePool.Acquire(100 * time.Millisecond)
    if err != nil {
        // 資源池已滿,拒絕請求
        return nil, ErrNoCapacity
    }
    defer rs.resourcePool.Release(resource)
    
    // 處理請求...
    response, err := processRequest(request)
    
    // 記錄結果到斷路器
    if err != nil {
        rs.circuitBreaker.RecordFailure()
    } else {
        rs.circuitBreaker.RecordSuccess()
    }
    
    return response, err
}

玄貓為你解密:

這段程式碼展示瞭如何實作區域隔離的核心邏輯。RegionalService代表一個區域性服務,包含三個關鍵元素:區域標識、資源池和斷路器。

資源池(ResourcePool)限制了同時處理的請求數量,當系統負載達到預設閾值時,新的請求會被拒絕,而不是繼續累積並可能導致系統當機。這是防止級聯失效的第一道防線。

斷路器(CircuitBreaker)則監控失敗率,當錯誤率超過閾值(這裡設為50%),它會「跳閘」並拒絕所有新請求,直到系統有還原跡象。這種機制可以讓系統在過載時有喘息的機會。

HandleRequest方法中,我們首先檢查斷路器狀態,然後嘗試從資源池取得資源,設定了100毫秒的超時間。如果無法取得資源,則立即拒絕請求,防止請求堆積積。請求處理完成後,會記錄結果到斷路器,以便動態調整系統狀態。

這種設計確保了區域間的強隔離 - 一個區域的問題不會蔓延到其他區域,因為每個區域有自己獨立的資源池和斷路器。

技術之外:人為因素的重要性

系統設計之外,我們不能忽視人為因素的重要性。想象一下這樣的場景:週五下午,大家都準備結束一週的工作了。值班工程師的呼叫器響了。她嘆了口氣,拿出筆記型電腦檢視情況。很快,整個團隊都在忙著應用緩解措施,因為錯誤率飆升。回復和流量限制以快速與不安全的方式佈署,同時表示全球過載的呼叫器警示不斷響起。客戶支援的工單如潮水般湧入。不久,主管和副執行長紛打來電話,要求知道緩解時間。

這不幸是雪崩式失效發生時的典型情況。即使應用了多種緩解措施,也可能需要數十分鐘才能完全停止過載。除了處於風險中的系統外,還有在壓力下嘗試處理情況的人員。即使系統還原,對人員的影響可能仍然存在。這就是為什麼預防勝於治療;避免影響客戶的故障的唯一方法是構建對雪崩式失效具有彈性的系統。

值班健康:你可能忽略的關鍵指標

在一個週六的下午,我的手機傳來了一陣悲傷的聲音。我負責值班的服務又一次請求注意。這是我為新團隊值班的第一週結束,而我已經收到至少50次呼叫。我眼睛模糊,焦慮不安。當我確認警示時,我強烈地想把手機扔向附近的磚牆。相反,我深吸一口氣,滾動檢視警示詳情,同時再次啟動我的筆記型電腦。

值班健康監控的重要性

我們為服務健康定義SLI、SLO和SLA。我們測量可用性和可靠性,進行專注於客戶影響的事後分析,並為服務實施健康檢查以快速偵測失敗。作為一個行業,我們很快就能知道我們的服務是否健康,但我們忽視了執行成功服務的一個關鍵組成部分:值班人員是否同樣健康。

他們能夠整夜睡眠嗎?他們在非工作時間被呼叫的頻率如何?值班的工作是否適合理的工作週?幸運的是,我們可以使用監控服務健康的工具和最佳實踐來監控這個其他關鍵組成部分。

值班健康的衡量指標

要了解服務健康,我們定義SLI;對於衡量值班健康,我們需要類別似的指標:

  1. 每週警示數量
  2. 每週警示的嚴重性
  3. 非工作時間警示的數量
  4. 警示解決情況:是噪音還是可操作的?

在我之前的團隊中,我引入了一個值班健康儀錶板,追蹤這些指標。幾個月後,我們清楚地看到,某些服務的警示模式導致了工程師的疲勞和效率下降。透過量化這些資料,我們能夠向管理階層證明改進監控系統的必要性。

監控指標並解決問題

值班健康指標應定期審查。我建議每週進行,作為常規值班審查或交接過程的一部分。就像處理服務健康指標一樣,檢視值班健康指標的週對週趨勢,以檢測出現的模式。利用這個每週審查來提出以下問題:

  • 這是否是一個異常忙碌的一週?
  • 每週警示數量是否一直穩步增加?
  • 警示是可操作的還是主要是噪音?

這段時間也應該用來安排後續專案。如果警示是噪音,應該調整或消除。如果警示大多是可操作的,是否有可以自動化的重複任務?

# 值班健康指標監控範例程式碼
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

def analyze_oncall_health(alerts_data, start_date, end_date):
    """分析值班健康指標並生成報告"""
    # 篩選日期範圍內的警示
    filtered_alerts = alerts_data[(alerts_data['timestamp'] >= start_date) & 
                                 (alerts_data['timestamp'] <= end_date)]
    
    # 計算每日警示數量
    daily_alerts = filtered_alerts.groupby(filtered_alerts['timestamp'].dt.date).size()
    
    # 計算非工作時間警示
    business_hours = lambda x: 9 <= x.hour < 18 and x.weekday() < 5
    after_hours = filtered_alerts[~filtered_alerts['timestamp'].apply(business_hours)]
    daily_after_hours = after_hours.groupby(after_hours['timestamp'].dt.date).size()
    
    # 計算可操作警示 vs 噪音
    actionable = filtered_alerts[filtered_alerts['actionable'] == True].shape[0]
    noise = filtered_alerts[filtered_alerts['actionable'] == False].shape[0]
    
    # 計算平均解決時間
    avg_resolution_time = filtered_alerts['resolution_time'].mean()
    
    # 生成報告
    report = {
        'total_alerts': len(filtered_alerts),
        'daily_average': len(filtered_alerts) / (end_date - start_date).days,
        'after_hours_percentage': len(after_hours) / len(filtered_alerts) * 100 if len(filtered_alerts) > 0 else 0,
        'actionable_percentage': actionable / len(filtered_alerts) * 100 if len(filtered_alerts) > 0 else 0,
        'noise_percentage': noise / len(filtered_alerts) * 100 if len(filtered_alerts) > 0 else 0,
        'avg_resolution_minutes': avg_resolution_time.total_seconds() / 60 if avg_resolution_time else 0
    }
    
    # 繪製趨勢圖
    plt.figure(figsize=(12, 6))
    daily_alerts.plot(label='總警示')
    daily_after_hours.plot(label='非工作時間警示')
    plt.title('值班警示趨勢')
    plt.xlabel('日期')
    plt.ylabel('警示數量')
    plt.legend()
    plt.tight_layout()
    plt.savefig('oncall_health_trend.png')
    
    return report

玄貓為你解密:

這段Python程式碼展示瞭如何分析值班健康指標並生成報告。函式analyze_oncall_health接受警示資料和日期範圍作為輸入,然後進行多維度分析。

首先,程式碼篩選出指定日期範圍內的警示資料。然後計算每日警示總數,作為基礎指標。接著使用一個lambda函式定義「工作時間」(週一到週五的上午9點到下午6點),並據此識別非工作時間的警示。

程式碼還區分了「可操作」(actionable)警示與「噪音」(noise)警示,這是評估警示品質的重要指標。高比例的噪音警示通常意味著監控系統需要調整。平均解決時間則反映了值班工程師處理警示的效率。

報告包含了多個關鍵指標:總警示數、日平均警示數、非工作時間警示百分比、可操作警示百分比、噪音警示百分比,以及平均解決時間(分鐘)。

最後,程式碼生成一個視覺化趨勢圖,展示總警示和非工作時間警示的日趨勢,這有助於識別週期性模式

將值班健康度提升為核心指標

在管理技術團隊時,我們常關注服務水平協定(SLA)的達成率,但卻忽略了一個關鍵因素:值班健康度。長期以來,值班常被視為工程師的「額外負擔」,而非核心工作的一部分。這種思維模式不僅對團隊健康有害,也會間接影響系統的可靠性。

將值班指標納入可用性報告

大多數技術團隊已經在追蹤並向長官層報告SLA達成情況。然而,少有團隊將值班健康度指標納入這些報告中。玄貓建議你開始在可用性報告中加入以下指標:

  • 每週警示次數
  • 非工作時間處理事件的時間比例
  • 值班輪替平衡度
  • 解決事件的平均時間

這些指標不僅能幫助長官層瞭解團隊的實際負擔,還能為改善值班體驗提供具體資料支援。

將值班健康度納入OKR

若你的團隊使用OKR等規劃工具,應將SLA目標和值班健康度指標一同納入。我推薦設立一個圍繞服務可用性的高層次目標,其中的關鍵結果可以包括:

  • SLA達成率
  • 請求成功率
  • 系統延遲指標
  • 每週警示次數

將值班健康度與服務可用性並列為關鍵目標,能夠幫助團隊認識到這兩者的密切關係,並將精力投入到改善值班體驗上。

將值班視為核心功能

在規劃過程中考慮值班時間

許多團隊在規劃衝刺或季度目標時,傾向於將所有時間分配給產品功能開發,而忽略了值班所需的時間。這種做法導致值班被視為「額外工作」,而非團隊核心職責。

玄貓建議在規劃過程中明確將值班時間納入考量。假設值班工程師要麼在積極處理事件,要麼在利用時間改善值班體驗(如果是安靜的一週)。具體做法可以是:

# 衝刺規劃中的值班時間計算範例
def calculate_sprint_capacity(team_size, days_in_sprint, oncall_rotation):
    # 每個工程師每天的有效工作小時
    hours_per_day = 6
    
    # 計算值班工程師數量
    oncall_engineers = days_in_sprint / oncall_rotation
    
    # 值班工程師的可用時間減少50%
    regular_capacity = (team_size - oncall_engineers) * days_in_sprint * hours_per_day
    oncall_capacity = oncall_engineers * days_in_sprint * hours_per_day * 0.5
    
    return regular_capacity + oncall_capacity

玄貓為你解密:

這段程式碼展示瞭如何在衝刺規劃中計算團隊實際可用的工作時間。它考慮了值班工程師的時間會減少約50%的事實。這種計算方式可以幫助團隊更現實地規劃工作量,避免過度承諾。關鍵在於我們假設值班工程師只有一半的時間可以投入到常規開發工作中,另一半時間需要處理警示或改善值班相關流程。

建立值班任務追蹤

將值班工作視為功能開發的一部分,可以像建立產品任務一樣建立值班相關任務。這些任務可以包括:

  1. 處理生產事件
  2. 更新監控儀錶板
  3. 改進警示規則
  4. 編寫或更新事件處理手冊
  5. 分析重複警示的根本原因

在每日站會和衝刺規劃中,這些任務應與產品功能任務一同被討論和追蹤。這種做法能讓長官層明確看到團隊在值班方面的投入,並將其視為可以規劃和預算的工作,而非團隊必須吸收以保持進度的中斷。

將值班納入季度規劃

如果你的團隊進行更大範圍的季度或半年度規劃,請將值班作為一個「功能」納入其中,並為其分配時間。通常,這應該是規劃週期中每週一名開發人員的時間。在向長官層展示規劃過程時,強調這項投入的重要性。

監測流失率:值班健康的最後預警

最後,幫助你的長官層理解持續不良的值班體驗將導致人才流失。然而,流失率是值班健康狀況的滯後指標,使用這一指標應被視為最後手段,因為此時情況已經相當嚴峻。

當我與一個經歷高流失率的團隊合作時,發現他們每週平均接到超過20次警示,與大部分發生在夜間。透過將這些資料與離職面談結果相結合,長官層終於理解了問題的嚴重性,並投入資源改善值班體驗。

SRE作為外交官:橋接團隊與實踐

不同團隊的SRE實踐差異

雖然有共同的主線,但沒有兩個組織以完全相同的方式實施站點可靠性工程(SRE)實踐。這一事實在首次推出SRE功能時很少被認識到,更不用說被承認,尤其是在團隊傳統上完全自主運作與相互獨立的組織中。

在團隊從服務開發一直到持續營運需求都擁有完全所有權的組織中,團隊特定實踐的發展既常見又必要。這種完全所有權模式在系統生命週期的早期階段推動業務目標方面運作良好,但當成熟的團隊需要採用分享的可靠性實踐和工具時,它最終會悄然轉變為未解決的技術債務。

標準化的挑戰

由工程長官支援的成熟驅動無疑會包括嘗試灌輸標準化,這是因為他們已經確定團隊間流程和工具的異質性是實作SRE採用所承諾的卓越營運的增量進步的障礙。儘管表面上有益,但由於這些變化對團隊的工作方式和方法產生影響,團隊很難接受。只要功能需求持續出現,營運改進通常會處於次要地位。彌合長官意圖與團隊內實際影響之間的這一差距需要以嵌入這些團隊的SRE形式的變革推動者。

前線佈署的SRE:外交官角色

那些視自己為自給自足的團隊並不總是有動力與要求改變其運作方式的傳統外部SRE功能合作——即使這些變化會顯著改善情況。無論原因如何,在這些團隊之間建立橋樑首先要求我們建立信任。促進這種信任建立的一種方法是採取非傳統方法,將SRE直接嵌入這些團隊,類別似於在外國領土上建立大使館以改善與其他國家的關係。

這些SRE充當外交官,在尋求在相當規模的工程組織內成功採用SRE實踐的利益相關者需求的十字路口工作。他們透過收集跨團隊的關注點、約束和條件來解決問題,以便找出所有團隊長期受益的前進路徑。他們平衡主機團隊的即時營運需求與整個工程組織的長期卓越營運目標。他們是必須代表主機團隊謹慎啟動和促進跨團隊和與工程長官的戰略協定的工作者。

我將這些外交官稱為「前線佈署的SRE」或fdSRE。實施SRE需要工程師、營運人員和長官層之間的緊密合作,透過人際交往往技巧和外交手腕來促進。fdSRE處於尋求在相當規模的工程組織中成功採用SRE實踐的利益相關者需求的十字路口。

打破模式,建立信任

隨著SRE實踐繼續在我們的行業中被採用,工程團隊很快意識到,已發布的最佳實踐由於多種原因並不總是完全適合他們的組織。你的團隊的SRE看起來如何將需要一些創造力和打破現成模型中規定的模式的意願。當你需要信任和聯盟建立來推動SRE在你組織內的採用時,給外交一個機會。

前線佈署的SRE:特質與職責

嵌入式SRE模型

SRE團隊通常獨立於任何其他團隊,並在更廣泛的工程組織內以自己的目標和授權運作。然而,嵌入式模型是另一種不常被談論但在尋求SRE採用或投資持續營運卓越性時可能有效的方法。前面我討論了作為嵌入式模型體現的fdSRE(前線佈署的SRE)的需求。

優秀fdSRE的核心特質

與SRE一樣,fdSRE是一位能力強但具有營運思維的軟體工程師。當他們設計軟體時,會考慮它在生產環境中如何執行、在負載下如何表現、設定將如何、安全和/或合規將如何、重新啟動時如何還原一致狀態以及如何被觀察。

fdSRE承擔更多所有權。作為嵌入在另一個團隊中的工程師,他們關心主機團隊的健康,也關心與之有虛線報告關係的SRE組織的更廣泛使命。在團隊擁有整個技術堆積積疊的完全所有權模型中,解決影響所有人的高階問題的推動力可能不足。fdSRE必須學會建立關係並產生信任,以識別他們可以帶回上游的可解決問題。當fdSRE彼此分享他們的共同痛點時,他們可以建立最有影響力的解決方案並在整個組織中充當管道。

變革催化劑與同理心

fdSRE具有同理心。與任何加入新團隊的人一樣,fdSRE和主機團隊可能需要時間來融合。團隊可能不知道fdSRE是否與他們一致,但隨著時間的推移,當他們共同解決問題時,信任差距有機會縮小。fdSRE必須理解這一點,並給予主機團隊成員空間和時間來適應他們的存在。

fdSRE是變革的催化劑,但知道不是每個人都準備好接受變革。他們激發對變革的渴望,並給人們空間、時間和資料,讓他們想成為解決方案的一部分。為此,他們與團隊和個人會面,瞭解他們的工作方式並建立真誠的關係。他們從信任的角度出發,而不是從權威的角度出發。

開發健康值班文化的實用策略

根據上述理論與實踐,玄貓整理了一些實用策略,幫助團隊改善值班健康度:

1. 建立明確的值班預期

開發一份值班工程師責任檔案,明確說明:

# 值班責任清單範例
responsibilities:
  - 在15分鐘內回應關鍵警示
  - 按照手冊處理常見問題
  - 記錄所有處理的事件
  - 在輪值結束時提交值班報告
  - 識別可改進的地方並建立任務

escalation:
  - 首先嘗試解決問題30分鐘
  - 如無進展,聯絡工作者或長官
  - 重大事件立即通知團隊負責人

玄貓為你解密:

這個YAML格式的設定檔案展示了一個結構化的值班責任清單。它明確定義了值班工程師需要做什麼(如在15分鐘內回應警示)以及何時需要升級問題(如嘗試30分鐘後無進展)。將這些預期明確檔案化,可以減少值班時的不確定性和壓力,也為新加入團隊的成員提供了清晰的指導。

2.

SRE的多重身份:從知識傳遞到團隊協作

在現代技術組織中,全方位嵌入式SRE(fully dedicated SRE,簡稱fdSRE)扮演著遠超過技術守門員的角色。這種角色定位不僅是監控系統和處理警示,而是在團隊中承擔多重身份,從而促進整個組織的可靠性文化建設。

教育者與導師角色

fdSRE首先是位教育者和導師。在大多數情況下,宿主團隊成員很難擁有與SRE相同水準的營運專業知識。一位能夠有效傳遞知識的SRE對團隊來說極具價值,能激發團隊成員發展營運思維。事實上,教育和培養其他工程師是fdSRE職責的核心部分。

這種教育角色不僅是技術知識的傳遞,更重要的是培養一種思考方式—面對複雜系統問題時的解決思路、壓力下的決策能力,以及對系統行為的深度理解。玄貓在多次與大型科技公司合作中發現,那些最成功的SRE往往也是最善於分享知識的人。

外交官與協調者角色

fdSRE同時是一名外交官。這個角色有著無法替代的人際導向。優秀的SRE理解每個團隊最終都希望對組織產生積極影響,而有時必須透過巧妙的談判而非強制命令來達成權衡和妥協。

這種外交工作可能表現為:

  • 提供資料支援決策而非單純發表意見
  • 主動瞭解各方的痛點和困難
  • 理解並運用能促進決策的各種溝通通路

當組織採用fdSRE方法時,需要準備在工程師團隊之間以及與工程長官層之間進行深度協作,共同推動各方安全地建立和維護可擴充套件與可靠的軟體系統。這種努力雖有挑戰,但絕對值得。

測試你的災難計劃:不要等到災難發生

系統總會失敗,這是不可避免的現實。系統可靠性工程作為一門專業學科,專注於預測和減輕這些失敗。我們構建可觀測、可內省和可還原的系統,限制故障的影響範圍。簡言之,我們為失敗而設計。

備用計劃的隱形風險

故障規劃通常包括備用計劃、程式碼中的替代路徑,以及當常規機制失敗時使用的系統或流程。例如:

  • 客戶端可能重試失敗的請求,希望下次能連線到更健康的副本
  • 主從選舉系統可能將長官權從無回應的伺服器轉移走
  • 人工干預,如呼叫值班人員或採取應對措施

我們的常規路徑因為持續使用而經常得到驗證,我們知道它們有效,並在它們失敗時立即察覺。許多備用計劃也被頻繁使用,因此我們能及時發現問題。但那些不常用的路徑呢?如果我們只在緊急情況下使用它們,可能直到真正需要時才發現它們不起作用。

災難還原站點的經典問題

這個問題的極端例子是行業中的經典案例:緩慢腐爛的災難還原站點。團隊預見主站點可能發生大規模故障,於是在另一個區域或資料中心建立系統副本。他們設定佈署管道推播到兩個區域,設定資料複製,然後認為大功告成——直到災難真正來臨,需要啟用容錯移轉區域。

此時,凌晨三點,所有人手忙腳亂,團隊發現了:

  • 硬編碼指向舊區域的DNS名稱
  • 被遺忘的密碼
  • 被註解掉的複製策略
  • 太"臨時"而未複製到DR(災難還原)站點的修復——而這些修復現在已成為關鍵基礎設施

主動測試備用計劃

我們需要在還能修復時發現這些問題。這意味著必須測試備用計劃。部分測試可以是模擬演練:

  • 許多組織進行「災難演習日」,練習應對典型災難場景
  • 團隊可以透過本地「不幸輪盤」演習測試自己的回應能力
  • 詳細角色扮演可能的故障,讓團隊必須查詢真實的日誌、圖表、設定,甚至同事的電話號碼

災難角色扮演幫助我們發現計劃中不起作用或我們不完全理解的部分。這些演練同時建立肌肉記憶並減少恐慌。就像建築物火災演習訓練我們冷靜地走到集合區域一樣。

將備用計劃納入常規操作

模擬災難很有幫助,但如果能將備用計劃納入正常操作中會更好。第一次有意識地切換到災難還原站點、繞過快取,或用防火牆隔離服務的一個副本來測試冗餘性時,可能會相當嚇人。你可能會破壞某些東西。但最好的時機是在你正在監視系統並能快速回復的時候。每次操作後,這個過程都會變得更加容易。

與所有可靠性相關事務一樣,測試備用計劃的優先順序應與其對業務的重要性成正比:

  • 如果失敗的最壞結果僅是某些團隊需要額外工作,那麼這可能是可接受的風險
  • 如果備用計劃是唯一阻止業務終結的防線,則應非常認真對待

災難計劃只有在有效時才能保護你。識別你的備用計劃並嘗試它們。確保它們在你需要時能夠正常工作。

SRE培訓的重要性:應用SRE原則於培訓本身

在站點可靠性工程領域,學習內容極為豐富。無論你是渴望成為SRE還是正在熟悉新服務,都可能感到資訊量如同消防水管般湧來。你需要了解複雜生產系統的來龍去脈、事件管理最佳實踐等。

培訓的首要目標:建立信心

對於成人學習者,尤其是團隊新成員,傳授技術知識並非培訓相關考量的首位。相反,建立信心和克服冒名頂替綜合症才是最重要的。培訓不僅是建立信心的過程,也是推動或延續所需組織文化的方式。培訓是對組織和人員的投資。

ASSBAT學習目標

那麼,從何處開始呢?有一個關鍵縮寫詞:ASSBAT,代表"a student should be able to”(學生應該能夠)。ASSBAT是專注於你希望推動和觀察的行為的學習目標。

“理解$foo服務"是一個不良的ASSBAT。更好的ASSBAT可能包括:

  • 使用$tool識別作業使用了多少記憶體
  • 解讀$monitoring_tool中的圖表以識別$foo服務的健康狀態
  • 在五分鐘內使用$drain_tool將流量從叢集移走

透過使用這類別ASSBAT,你可以觀察和衡量培訓如何應用於日常工作。從ASSBAT開始,就為自己配備了優秀培訓策略的雛形,而非僅依靠希望。

將SRE原則應用於培訓計劃

SRE的基本原則可以應用於培訓計劃本身。讓我們回顧原始SRE書籍中概述的服務可靠性層次結構,並將其元素適應到培訓環境中:

  1. 監控培訓計劃表現:透過出席率跟蹤和調查反饋
  2. 定義培訓SLO:為培訓計劃定義服務水平目標並進行溝通
  3. 解決監控發現的問題:如果學生對某些問題的評分為負面,這需要調查和跟進
  4. 編寫事後分析報告:當出現問題時,無責任地從失敗中學習
  5. 測試新內容:透過試點課程測試新內容和計劃

對於測試教學課程(試點),應明確告知學生你正在測試新內容,並請他們提供反饋。這種方法不僅改善培訓計劃,也體現了SRE文化中持續改進的核心理念。

整合SRE多重角色與有效培訓

將SRE的多重角色與有效的培訓策略結合,組織可以建立真正的韌性文化。SRE作為教育者和外交官的角色,與培訓計劃中應用SRE原則的方法相輔相成,共同形成一個自我強化的迴圈。

當SRE有效地傳授知識時,團隊成員學會瞭如何思考可靠性問題;當培訓計劃應用SRE原則時,培訓本身變得更可靠、更有效。同樣地,測試災難計劃的實踐既是教育過程的一部分,也是建立系統韌性的必要手段。

在玄貓看來,真正成功的SRE實踐不僅關注技術工具和流程,更是關於建立一種思維方式和文化,讓整個組織都能夠思考可靠性、預見問題並有效應對失敗。透過理解SRE的多重角色、積極測試災難計劃,並將SRE原則應用於培訓,組織可以建立真正有效的系統韌性,即使在最嚴峻的挑戰面前也能保持運作。

技術系統總會失敗,但透過教育、協作和持續測試,我們可以確保當失敗發生時,我們已經做好了充分準備。正如一位資深SRE曾告訴玄貓的:「最好的災難應對計劃不是那個最複雜的,而是那個你的團隊能夠在凌晨三點半睡眼惺忪時正確執行的計劃。」這就是為什麼培訓、角色扮演和實際測試如此重要。

透過自動化消除重複勞動

在任何規模的技術組織中,人力資源永遠是最寶貴也最有限的。要讓SRE計畫發揮最大效益,關鍵在於找出並消除重複性勞動(toil)的機會。只有當我們積極尋求自動化的可能性,才能真正釋放團隊的潛力,讓SRE課程設計和計畫本身達到預期目標。

許多公司仍採用「丟進水裡看會不會遊」的訓練策略。這種做法不僅效果不彰,更是對人才的浪費。經過精心設計的SRE訓練計畫其實觸手可及,它能確保團隊成員獲得成功所需的工具和知識,同時將SRE原則應用於訓練計畫本身,推動持續改進的文化。

玄貓認為,自動化不僅是技術層面的改進,更是思維模式的轉變。當我們將重複性工作自動化後,工程師能夠將注意力集中在更具創造性和策略性的任務上,這才是真正的規模化運作。

一致性的力量:Monzo的制服化策略

每個組織都想快速行動,因此瞭解可能導致減速的因素至關重要。在SRE領域,這些減速因素通常來自於變更時的摩擦、操作領域的複雜性或選擇的自由度過高。在英國銀行Monzo,「制服化」(uniformity)成為保持高速發展的關鍵—制服化帶來一致性,一致性促使專注,而專注讓Monzo成為英國成長最快的銀行。

從小團隊到規模化的轉變

和所有新創企業一樣,Monzo最初只有一小群工程師負責公司所有技術,從底層基礎設施到服務客戶請求的微服務。面對白紙一張和有限的團隊規模,他們需要將精力集中在最重要的事情上—建立一家銀行。標準化方法的分層讓他們在解決實際客戶問題時變得越來越有效率。每次迭代不必從零開始,而是能將精力集中在真正能帶來差異的10%上。

這並非扼殺選擇自由或對創新施加不必要的限制,而是提供一套預設方法,這套方法效果好到難以找到理由採用其他方式。當工程師能在幾分鐘內建立一個具備處理程式、指標、日誌、訊號處理和除錯端點的服務並佈署到生產環境中,從零開始的成本就難以被證明合理。

制服化的實際效益

制服化不應被視為絕對。對一家公司來說統一的東西,對另一家可能是過度繁複。即使是具有多元系統和應用程式組合的長期運作組織,仍可定義趨向一致性的方法。當你看到現狀時,可能認為已無法挽回,但嘗試在現有系統周圍畫一個邊界,再畫一個更小的邊界定義下一步的方向。

如果你的組織中流通著六種程式語言,而其中一個子集滿足了大多數工程師的需求,那麼制服化就意味著為所有未來開發標準化這個子集。在玄貓的經驗中,任何公司只要有明確的原則和選擇限制,都可以朝著更統一、更簡單操作的系統發展。

當所有人都在共同框架下工作時,制服化成為力量倍增器。任何人在分享元件上的努力都會對組織中的每位工程師產生積極影響。如果我們修復函式庫錯誤,每個人都受益。如果修復需要重新佈署大量服務,而這些服務都以相同方式佈署,我們也能輕鬆完成。

在統一的環境中,營運活動也變得更容易。服務之間的區別主要在其業務邏輯,當每位工程師都瞭解所有服務的共同元件和通訊模式時,支援自己的服務和直接互動的服務就變得更為容易。

系統日益複雜;共同元件的一致性意味著認知負擔減輕、執行速度更快,並能專注於對業務最重要的事項。對Monzo來說,最初源於必要性和不成文慣例的做法,演變成為工程師們切實奉行的原則和實踐:一個共同平台、一種程式語言、一個框架支援1600個微服務、一個佈署流程,以及一種監控方法。

量化系統團隊的使用者價值

在Stripe的工作經驗中,玄貓曾遇到這樣的情況:業務穩定增長,但支援產品的系統團隊人員設定停滯與超負荷,其增加人手的論點卻不夠有力。長官層不理解系統團隊需要更多人員。在他們看來,業務在增長,值得投資的是需要構建新功能的產品團隊、需要吸引新使用者的銷售團隊以及幫助開發者與API整合的現場工程團隊。

系統團隊缺乏以使用者和利益相關者語言表達的能力。無法編織出同時涉及終端使用者和他們依賴的基礎系統的故事。

從使用者出發的價值論證

面對這種情況,正確的方法不是從自身需求出發,而是從終端使用者開始。透過收集使用者增長資料,我們可以展示基礎設施投資與業務增長之間的內在關聯。

從這個角度,我們能夠講述一個故事:使用者業務的增長帶來API呼叫量的增加,進而對基礎設施產生相應的負擔。與其僅表明我們比以前更頻繁地擴充套件伺服器,不如量化有多少增加的規模是由Stripe增長最快的使用者所需求的,並利用這一論點為可靠性投資提供依據。

我們還能向他人證明系統團隊所承擔的不成比例的手動重複勞動:我們被呼叫的頻率更高,使用者需求增長,呼叫器打斷的工作時間更長。最重要的是,我們展示這些中斷平均而言直接源於某些使用者的意外增長,而解決這些問題將符合業務健康的最大利益。

跳出技術語言的限制

僅說「我們人手不足,所以給我們更多人」是不夠的。同樣,說「我們這季度處理了更多的交易資料,所以給我們更多錢」也不足夠。在組織內爭取更多資金、更多人員、更多伺服器和更多資源的論點往往是一個零和遊戲。

最終,幫助我們提出有力投資論點的是向長官層證明他們最關心的因素變化如何滲透到系統團隊。玄貓發現,這似乎是基礎設施行業面臨的普遍挑戰。產品團隊有完善的流程來全面瞭解使用者,不僅是給使用者他們想要的,而是瞭解使用者的特點:使用案例、顧慮和限制。

在系統工程中,我們還沒有建立類別似的以使用者為中心的正規化。我們不知道如何為此徵才,不知道如何教導,也不完全瞭解其價值。我們的缺陷在於只為我們營運的服務的直接消費者最佳化,並迅速將他們的其他問題歸類別為超出我們的範圍。

這在某種程度上是有機發生的;我們自然比產品團隊與終端使用者相隔更多層,但這仍然值得糾正。我們需要學會擺脫系統技術細節的束縛,更加關注終端使用者的體驗和價值。

建立技術組織效能的整合視角

綜觀這些經驗,玄貓認為高效的技術組織需要三個關鍵元素的整合:自動化消除重複勞動、制服化提高一致性,以及將系統價值與使用者需求連結。這三個元素互相強化,形成一個良性迴圈。

自動化讓我們能夠以最少的人力資源處理更多工作。制服化減少了認知負擔,讓工程師能夠專注於真正帶來差異的業務邏輯。而將系統團隊的價值與使用者需求連結,則確保了我們的工作得到組織的認可和支援。

在實施這些策略時,關鍵是保持平衡。過度的制服化可能扼殺創新,而過度強呼叫戶價值又可能導致短視。技術長官者需要不斷調整這些元素,根據組織的發展階段和業務需求找到最佳平衡點。

技術組織的真正效能來自於這種整合視角:既關注技術卓越,又不忘終端使用者;既追求標準化效率,又保留創新空間;既消除重複勞動,又培養人才成長。當這些元素協調一致時,技術組織才能真正成為業務增長的強大引擎。

在當今競爭激烈的技術環境中,找到這種平衡並非易事,但它是區分卓越團隊與平庸團隊的關鍵因素。透過持續反思和調整,任何技術組織都能逐步實作這種整合視角,提升整體效能。

技術組織的最終目標不僅是支援業務,更是推動業務創新與增長。只有當我們超越技術細節,關注更廣泛的業務和使用者價值時,才能真正實作這一目標。這是玄貓在多年技術長官經驗中得出的核心洞見,也是未來技術組織成功的關鍵所在。

工程部落格:技術團隊的秘密武器

每一位我認識的工程經理都希望招募到最優秀的人才,但許多人卻忽略了手中最強大的工具之一:一個優質的工程部落格。

頂尖開發者散佈在全球各地,有些人可能熟悉你公司的工作,而另一些人則尚未發現。一個技術含量高的工程部落格能夠將公司的影響力擴充套件到比一般技術會議參與者多出數倍的受眾,特別是當你的文章在Hacker News等平台上獲得關注時。

部落格如何影響人才決策

根據玄貓在技術招募領域的觀察,候選人往往會根據公司工程部落格的品質來評估和決定是否接受offer。這點我從多位資深SRE和長官層那裡反覆聽到,它已成為招募流程中的關鍵因素。事實上,這也是玄貓加入現在團隊時,主管對我說的第一件事。

文化是候選人考量的最重要因素之一,要成功招募頂尖人才,工程文化的展示應該成為你講述公司故事的必要部分。一個活躍與受人尊敬的工程部落格會讓你對候選人更具吸引力。這有點像約會——SRE們希望先在Google上調查你,而優質的部落格能夠留下有效的第一印象。

內容為王:避免空洞的宣傳

不要讓你的部落格充斥著華而不實的內容。部落格實際上是分享工作內容的絕佳場所,應該盡可能地充實質內容。面臨相同問題的同行可以借鑑你的解決方案,或者如果你分享的是尚未解決的問題,同行可能會在看到文章後主動聯絡你。

對於使用開放原始碼工具的SRE來說,這些連結和討論至關重要。當我們在開放原始碼解決方案上協作時,互相幫助是常態。這些文章透過提高問題意識,啟動了至關重要的對話。

故事的力量

講故事能為呆板、模糊的職位名稱注入生命力,為求職者提供清晰度和興奮感,而不是讓他們對照行業標準猜測這個職位意味著什麼。透過工程部落格,候選人可以看到技術堆積積疊及其使用方式,以及團隊在專案過程中所做選擇和權衡的深入分析。

簡而言之,工程部落格能為候選人提供在面試過程中無法獲得的洞察,幫助他們瞭解在你公司工作的真實情況。

有意識地建設部落格

這需要有意識的行動。如果你希望高品質的部落格文章會在工程師已經有足夠工作量的情況下自然產生,那你可能會失望。當有專門的個人或團隊專注於幫助創造這些引人入勝、專業與可推廣的故事時,效果會更強。

部落格文章是協作學習的成果。無論有多少年經驗,寫作都需要研究。你看到芭蕾舞者優雅流暢的動作,但你看不到背後血淋的腳趾——這就是寫作的本質。

然而,這些努力是值得的。透過寫作和編輯過程,每個人都能在分享、討論和重新評估想法的反饋迴圈中學到更多關於主題的知識。工程部落格不僅對招募有益,它還是強大學習型組織的關鍵組成部分。

絕不允許外部程式碼在你的環境中執行

玄貓曾經負責一個機器安裝服務。使用者提交新作業系統請求後,機器會啟動到RAM磁碟中,設定磁碟並下載作業系統。客戶希望能夠調整所有磁碟設定,僅選擇檔案系統類別是不夠的。

作為SRE,我們喜歡聰明的技術解決方案;它們能在不增加太多工作量的情況下提供額外功能。但有些類別的技術解決方案是反模式,短期收益與長期痛苦相比微不足道。

聰明的技術方案變成長期負擔

我們曾認為允許客戶提供在作業系統安裝前執行的shell指令碼是個聰明的做法。這些指令碼可以建立分割槽、RAID陣列和檔案系統。只要指令碼終止後掛載了根檔案系統,機器就能獲得作業系統。

幾年後,問題開始顯現。數百個shell指令碼積累下來,有些已不再使用。其他的是從早已離職的機器所有者那裡複製的指令碼分支,一個指令碼中發現的錯誤並沒有回移到原始指令碼中。由於客戶指令碼中的錯誤,2%的機器設定嘗試失敗!這影響了我們的服務指標,給客戶留下了我們提供糟糕服務的印象——他們的感受不無道理。

失敗的多種原因

失敗有多種原因:有些驅動器不支援所有hdparm命令;對裝置大小做了錯誤假設;一些損壞的SSD會默丟棄寫入,讀回分割槽表時只會得到零;驅動器和RAID設定可能以千萬種方式失敗;一些指令碼長達1800行——沒有單元測試。

我們不經意間建立了一個系統,依賴於數百個使用者能夠在不可靠、不斷變化的硬體環境中編寫防禦性shell指令碼。我們不合理的樂觀換來的是持續不斷的難以除錯的問題。我們聰明的技術解決方案最終證明並不那麼聰明。

解決方案:將使用者程式碼移出團隊環境

唯一的解決方案是將使用者程式碼從我們團隊的環境中移除。我們建立了一個系統,使用經過驗證的使用者提供的JSON來描述磁碟佈局應該是什麼樣子。我們向客戶承諾,我們將按照他們的要求設定磁碟,並在我們的程式碼導致問題時承擔責任。

反向工程350個shell指令碼,找出它們的意圖,確保我們的磁碟佈局工具支援數百個平台上的數十個使用案例,然後將所有人遷移到新設定上,這是一個痛苦的過程。但完成後,我們的設定可靠性一夜之間從98%提高到99.8%。

另一個聰明的技術解決方案引發的問題

在每週數萬台伺服器中,99.8%的可靠性仍意味著大量失敗。調查發現另一個聰明的技術解決方案導致了間歇性問題。當客戶交給我們機器時,我們首先確保機器已排空流量和資料。為此,我們執行一個排空指令碼。

猜誰編寫了這些指令碼?同樣是我們的客戶。當然,如果他們的指令碼當機或掛起,看起來就像是我們花了很長時間重新安裝機器。

吸取的教訓

幸運的是,我們知道如何解決!將使用者程式碼從我們團隊的環境中移出。讓客戶在請求我們重新安裝機器之前排空機器。拒絕接受未排空的機器。這看似是細微的語義差異,但從SLA角度來看,如果我們受制於不屬於我們的程式碼,就無法提供有意義的SLA。

玄貓在此總結了幾點關鍵教訓:

  • 絕不允許客戶提供程式碼;堅持使用經過驗證的設定!
  • 絕不為包含其他團隊程式碼的服務提供SLA!
  • 絕不為包含不可靠依賴項的服務提供SLA!
  • 你不能放棄深入理解客戶如何使用你的服務的責任
  • 捍衛你的服務和團隊的良好客戶服務聲譽!

角色互換:SRE與產品團隊

歷史上,SRE團隊與產品和功能團隊之間存在的緊張關係,類別似於維運和開發團隊之間的隔閡。前者希望首先最佳化可靠性,而後者希望快速交付,這導致變更——而變更往往導致系統故障。

打破對立關係

我們不需要維持這種對立關係。如果我們能在產品和SRE團隊之間建立同理心,不僅會導致更健康的關係,還會為所有人創造更強大的雙贏局面。

怎樣才能實作這一點?重要的是兩個團隊的工程師都能站在對方的角度,理解並做出正確的權衡。當產品工程師不以可靠性為核心思維時,他們會將不公平的負擔轉移到SRE身上,這可能導致不愉快,最壞的情況下甚至導致團隊成員倦怠。當SRE不採用產品工程師的視角時,他們可能無法理解來自高管和利益相關者的壓力,雙方都錯過了擴充套件知識的機會。

理想的解決方案

理想的情況是每個功能團隊負責執行自己的服務,而不是SRE在半夜被呼叫。然而,這並不總是可能的。值班很困難,即使做得好,也可能具有破壞性和消耗性。如果缺乏同理心或關懷,可能會產生災難性後果。

工程師不能也不應該被強制值班。有些人不希望在半夜被叫醒,並且有很好的理由,例如患有慢性疾病或有照顧責任。如果人們對值班感到不滿,這個系統就無法運作。

在玄貓看來,這種情況下最好的解決方案是透過相互瞭解建立同理心。產品團隊需要理解可靠性的重要性,而SRE團隊則需要理解產品開發的壓力和優先事項。只有透過這種相互理解,才能在速度和穩定性之間找到適當的平衡點。

工程部落格在這方面也能發揮重要作用,它不僅是對外展示公司技術實力的視窗,也是內部不同團隊分享知識、建立共識的平台。透過記錄和分享各自的挑戰和解決方案,產品團隊和SRE團隊可以更好地理解彼此的工作,從而建立更緊密的協作關係。

在建立這種文化的過程中,長官者的角色至關重要。他們需要鼓勵跨團隊合作,重視可靠性與創新同等重要,並為團隊成員提供足夠的學習和成長空間。只有這樣,才能真正開發一個既能快速交付又能保持高可靠性的技術組織。

技術組織的成功不僅取決於其產品的品質,還取決於其營運的效率和可靠性。透過建立強大的工程文化、最佳化技術實踐和促進跨團隊協作,組織才能在激烈的市場競爭中脫穎而出,吸引並留住最優秀的人才。

在這個過程中,工程部落格作為展示技術實力、分享知識和吸引人才的平台,其重要性不容忽視。一個精心維護的工程部落格不僅能幫助公司建立技術品牌,還能促進內部學習和知識分享,成為建設學習型組織的關鍵工具。

同時,我們必須謹記技術決策的長期影響,避免為了短期便利而採用可能帶來長期問題的解決方案。在系統設計中保持警惕,特別是涉及到執行外部程式碼時,這一點尤為重要。

最後,建立SRE與產品團隊之間的相互理解和尊重,是確保組織既能快速創新又能維持高可靠性的關鍵。只有當這兩個團隊能夠站在彼此的角度思考問題,才能真正找到

跨團隊輪調:打破工程師與SRE之間的藩籬

在許多技術組織中,工程團隊與SRE團隊常被視為兩個獨立運作的單位,各自有著不同的目標和工作模式。然而,這種分隔可能導致理解差異和協作障礙。我觀察到,當這兩個團隊之間建立更深層次的連結時,整體產品品質和團隊效率都會顯著提升。

輪調機制的價值與實施

一個有效的解決方案是建立定期的跨團隊輪調機制。讓工程師定期在另一個團隊中工作一段時間(例如兩個季度)能帶來顯著好處。實施時需注意:

  • 輪調時間長短應根據組織特性調整,找到最適合團隊的平衡點
  • 輪調應是雙向的,讓SRE團隊成員也能體驗功能開發工作
  • 在輪調期間,要確保明確的學習目標和責任定義

這種交叉輪調實踐能顯著改善團隊之間的理解與協作。當工程師理解SRE面臨的挑戰,以及SRE瞭解產品團隊的工作方式後,雙方在日常決策和權衡取捨時會更加全面。

跨職能學習的技術成長價值

輪調制度不僅能改善團隊協作,還能大幅拓展工程師的技能範圍。SRE工作與日常功能開發有顯著差異:

# 功能工程師思維模式
def feature_development_mindset():
    identify_customer_needs()
    design_solution()
    implement_features()
    validate_with_users()

# SRE思維模式
def sre_mindset():
    ensure_system_reliability()
    monitor_performance_metrics()
    automate_operational_tasks()
    prepare_for_failure_scenarios()

玄貓為你解密:

這段程式碼雖然簡化了實際工作流程,但清楚展示了兩種角色的思維差異。功能工程師通常從客戶需求出發,專注於新功能實作;而SRE則從系統可靠性出發,關注監控、自動化和故障預防。這種思維差異正是跨團隊輪調能帶來的視角擴充套件價值所在。

透過輪調,SRE團隊成員能直接觸客戶需求,理解產品決策背後的商業考量。同時,產品工程師能深入瞭解他們的程式碼如何在生產環境中執行,進而寫出更穩定、更易於維護的程式碼。

反向康威定律:以產品塑造組織結構

微服務與單體應用的組織結構考量

在技術架構選擇上,微服務還是單體應用的決定也應受組織溝通模式影響:

  graph TD
    C[C]
    A[組織溝通結構] --> B[產品架構決策]
    B --> C{評估溝通模式}
    C --> D[介面穩定\n變更少\n溝通清晰]
    C --> E[頻繁協商\n高度交流\n介面變動大]
    D --> F[傾向微服務架構]
    E --> G[傾向單體應用]

當元件之間的介面設計良好、穩健與不經常變化時,微服務架構可能更為適合。相反,如果團隊需要大量時間來確定彼此之間最新的正確通訊方式,與聊天頻率很高,單體架構可能更適合。關鍵在於找到適合你組織溝通模式的架構,兩者並無絕對的對錯之分。

遠端團隊的結構化挑戰與文化塑造

COVID-19的出現迫使許多組織重新思考協作方式。理解不同類別團隊的特性與挑戰至關重要:

三種團隊模式的特點與挑戰

  1. 本地團隊:大多數工程師和管理者位於同一辦公室

    • 優勢:面對面溝通,即時協作
    • 挑戰:辦公空間限制,通勤時間成本
  2. 分散團隊:由2個或更多地理位置不同的本地團隊組成

    • 優勢:時區覆寫廣,文化多樣性
    • 挑戰:跨地域協調,文化差異管理
  3. 遠端團隊:大多數工程師和可能的管理者分佈在不同位置

    • 優勢:人才無地域限制,工作環境彈性
    • 挑戰:溝通效率,歸屬感建立

遠端團隊面臨的結構性挑戰主要集中在溝通和自主性方面。遠端工程師需要更大的自主權來應對相對隔離的工作環境,自行做出更多決策,並將這些決策傳達給同事。

遠端團隊文化建設關鍵

建立和管理遠端團隊需要與建立本地團隊相同的設計和流程,但現在你還必須更加深思熟慮地考慮你要促進的文化。當團隊成員大多相距甚遠時,出錯的可能性更大,但請耐心對待這個過程,因為這項投資是值得的。

玄貓認為,成功的遠端團隊文化建設應注重:

  1. 明確的溝通協定和頻率
  2. 清晰的決策權與責任界定
  3. 強大的檔案文化與知識分享
  4. 有意識的社交連結建立
  5. 結果導向的績效評估機制

效能預算:提升使用者經驗品質的協作機制

SRE團隊通常依賴錯誤預算等概念來管理組織變更,無論是確定發布是否可以進行,還是確定改進方向。錯誤預算與可用性相關,但我們需要知道的不僅是系統是否可用,還有可用性的品質。

效能預算的重要性

如果不考慮品質,那麼就只能看到部分圖景。而定義品質的一個最重要方式就是透過效能。當載入時間過長或手機上的效能比筆電慢時,使用者經驗會顯著惡化。

// 效能問題對使用者行為的影響範例
function demonstratePerformanceImpact() {
  const slowLoadTime = 5000; // 毫秒
  const fastLoadTime = 1000; // 毫秒
  
  // 慢載入頁面的使用者行為
  if (pageLoadTime > slowLoadTime) {
    increaseBounceProbability(40);
    decreaseConversionRate(20);
    reducePagesPerSession(30);
  }
  
  // 快載入頁面的使用者行為
  if (pageLoadTime < fastLoadTime) {
    increaseUserEngagement(15);
    improveConversionRate(10);
    increaseSalesRevenue(8);
  }
}

玄貓為你解密:

這段程式碼展示了頁面載入速度對使用者行為的潛在影響。當頁面載入時間超過5秒時,跳出率可能增加40%,轉換率下降20%,每次工作階段的頁面瀏覽量減少30%。相反,載入時間低於1秒時,使用者參與度提高15%,轉換率提升10%,銷售收入增加8%。這些數字雖然是範例,但反映了眾多研究所證實的真實趨勢:效能直接影響業務成果。

研究表明,載入更快的頁面會帶來更高的收入、更多的使用者參與度和更低的跳出率。載入緩慢的頁面也可能是問題的早期指標,在等待故障發生之前發現效能問題可以提前預防更嚴重的後果。

建立有效的效能預算

正如可以建立錯誤預算一樣,我們也可以為效能建立預算。效能預算是一個明確定義的效能指標限制,用於指導設計和開發。你可以為不同的指標設定多個預算,特別有價值的指標包括:

  • 總頁面大小
  • 最大檔案大小
  • 回應時間閾值
  • HTTP請求數量

與匯集組織不同部門來考慮SLO(以及錯誤預算)類別似,你也可以為效能預算做同樣的事情,從多種角度獲得寶貴的見解。

跨職能協作制定效能預算

效能預算的制定應該是一個協作過程,而不應該由單一團隊承擔:

  graph LR
    A[設計團隊] --> E[效能預算]
    B[行銷團隊] --> E
    C[維運團隊] --> E
    D[工程團隊] --> E
    E --> F[指導設計決策]
    E --> G[指導開發決策]
    E --> H[指導發布決策]

找出組織中關心終端使用者經驗的人,與他們一起制定效能預算。效能預算的制定應該包括設計、行銷、維運和工程等利益相關者的參與,這是一項真正的協作努力。

效能預算反映了持續變化的業務目標,同時允許風險和實驗。儘管需要靈活性,但團隊必須同意不超過當前定義的預算。如果所有團隊從一開始就同意效能預算,那麼每個功能和設計決策都將根據這些指導方針進行檢查。任何可能影響效能的決策都應該與預算進行比對。效能預算在提議網站變更時提供了另一層問責制。

從使用者視角思考:可用性與效能的統一

我們必須始終從客戶的角度思考。客戶關心網站是否正常執行嗎?是的。客戶關心網站是否無錯誤載入嗎?是的。客戶關心網站是否快速載入嗎?是的。如果客戶關心,你也應該關心。

如果網站是可用的,但使用者因為載入時間過長而放棄網站,這對業務不利。歸根結底,我們不能只關注系統是否執行,還要關注它執行的品質如何。

在玄貓多年的技術經驗中,我發現最成功的技術組織往往是那些能夠打破團隊隔閡、建立跨職能協作機制,並始終從使用者視角思考的組織。透過團隊輪調、有意識的組織結構設計和分享的效能目標,技術團隊可以顯著提升產品品質和使用者滿意度。

建立這種協作文化並非一蹴而就,它需要持續的投入和調整。然而,當工程師能夠跨越職能界限,理解產品的各個方面時,他們會成為更全面的技術工作者,能夠做出更明智的決策,最終開發更優質的產品。

這種整合視角不僅提升了技術品質,也增強了團隊成員的職業發展和滿足感。當工程師能夠看到自己工作對整體產品和使用者經驗的貢獻時,他們的工作動力和創新意願也會顯著提升。

SRE團隊的長遠視野:為何路線圖是系統可靠性的關鍵

在SRE(Site Reliability Engineering)的日常工作中,我們經常面臨著艾森豪威爾矩陣中最具挑戰性的象限:重要但不緊急的工作。這些工作雖然不會立即引發警示或造成系統當機,卻能在長期內為系統可靠性帶來根本性的改善。然而,這類別工作也最容易被無限期地推遲,使團隊陷入永無止境的應急模式中。

作為一名經歷過多次系統架構演進的SRE工作者,玄貓深刻理解路線圖對團隊發展的重要性。路線圖不僅是一份檔案,更是團隊共同願景的具體表現,是跳脫日常緊急事務、實作長期技術價值的關鍵工具。

SRE團隊為何需要路線圖

你是否曾經遇過這些情況?

  • 一個問題系統不斷產生維運負擔或造成停機,但從未被重新設計
  • 團隊成員對長期技術方向存在分歧,或者只有一個人在推動戰略
  • 團隊似乎沒有任何超過當前季度的計畫

這些都是典型的「需要路線圖」的組織警訊。

路線圖是團隊未來兩年內希望完成的高層次戰略工作描述。玄貓認為,每個SRE團隊都應該擁有路線圖,因為它能幫助團隊超越即時反應,思考真正重要的工作。作為具有維運責任的工程團隊,我們的工作自然包含許多緊急與被動的任務:撲滅火災或回應其他團隊的請求。部分工作處理即時需求是正常與必要的,但僅在艾森豪威爾矩陣的「緊急」一側運作的團隊,其成就必然受限。路線圖正是避免這個陷阱的最佳方式。

從短期修復到長期解決:路線圖的現實價值

許多我們面臨的問題無法透過增量方式解決,因為它們需要跨季度的工程投資。持續處於滅火模式的團隊容易陷入區域性最優解,使用短期修復來維持系統執行,卻永遠無法進行更大規模的改變來消除根本問題。

跳出區域性最優解的思維陷阱

以一個實際例子說明:一個團隊可能花費數年時間改進單一區域服務的還原和重啟流程。相反,他們本可以投資於重新設計該系統,使其成為能夠承受資料中心故障的多區域服務。第二種方法可以永久消除壓力源、資料丟失風險和停機時間,但這項工程可能需要一年才能完成。這正是隻有透過路線圖才能實作的專案類別。

在我的職業生涯中,玄貓見過太多團隊在日復一日的緊急修復中耗盡精力,卻從未有機會實施那些能徹底解決問題的架構改進。路線圖提供了這個機會,讓團隊能夠在日常維運之外,規劃並執行真正具有戰略意義的工作。

路線圖的實質意義

路線圖設定了團隊長期應該做什麼、為什麼這些目標重要,以及這些目標的相對優先順序。路線圖不是未來數季的OKR(目標與關鍵結果)清單,也不是對外部的承諾(沒有任何路線圖能在與現實接觸後完全保持不變)。相反,它表達的是意圖。當向利益相關者解釋為什麼有時必須降低緊急但不那麼重要的工作的優先順序時,路線圖尤其寶貴。

開發有效路線圖的實用

如果你準備嘗試制定路線圖,請記住:每個進行戰略工程工作的團隊都有路線圖,但它們往往只存在於某人的腦海中。將它寫下來要好得多。撰寫和就路線圖檔案達成一致的過程能創造更好的團隊一致性。

路線圖的制定流程

在玄貓參與的多個SRE團隊中,我發現最有效的路線圖制定流程通常包括這些步驟:

  1. 團隊負責人可以起草檔案,但整個團隊都應該有機會在採納前提供意見
  2. 收集所有成員對當前系統痛點的看法
  3. 識別需要長期解決的結構性問題
  4. 評估不同解決方案的技術可行性和投資回報
  5. 根據團隊規模和能力,確定合理的時間框架
  6. 達成共識並形成書面檔案

路線圖的維護與更新

路線圖是活的檔案,需要每年左右更新一次。如果更新頻率低於此,你可能沒有在戰略目標上取得進展。如果更新頻率明顯高於每年一次,你的路線圖可能過於專注於短期。

在實際應用中,玄貓發現季度回顧是檢視路線圖進展的好時機,而年度回顧則是重新評估和調整長期方向的適當時機。這種頻率能夠平衡穩定性與適應性,確保路線圖既不會變成僵化的檔案,也不會因頻繁變更而失去指導意義。

SRE的未來:從消耗型工作到戰略型工作

重新思考「50%原則」

傳統SRE模型認為SRE應該將不超過50%的時間用於維運工作。隨著時間推移,這個規則從「至少50%編碼」演變為「最多50%維運」。老實說,這是合理的。作為一個行業,我們經常過度強調(和過度面試)編碼能力。將「50%編碼」演變為「50%有計劃的專案工作以改善服務」是一種成熟的做法。這仍然可能意味著編碼,但也可能意味著連線現成的解決方案、增加冗餘或撰寫檔案。

從維運到消耗性工作的轉變

然而,隨著時間推移,這條規則從「不超過50%的維運工作」轉變為「不超過50%的消耗性工作(toil)」。這種轉變值得我們深思。Google的SRE書籍將消耗性工作定義為「與執行生產服務相關的工作,通常是手動的、重複的、可自動化的、戰術性的、缺乏持久價值的,並且隨著服務增長而線性擴充套件」。

在玄貓看來,50%的維運工作聽起來是合理的生活選擇,但50%的消耗性工作則不然。當我們告訴其他團隊SRE可以花費一半時間做重複性、可自動化、戰術性的工作時,我們正在低估SRE技能的價值。

消耗性工作的新視角

以下是一個可能有爭議的觀點:玄貓認為SRE不應該比任何其他工程學科做更多的消耗性工作。短暫應對危機、解決火災是可以的,就像我們可能要求任何軟體工程團隊衝刺以度過艱難時期一樣。但這不應該是典型情況。可靠性工作者團隊永遠不應該成為無法在沒有重複人工操作的情況下維持執行的系統的臨時解決方案。

減少消耗性工作需要成為工程團隊的共同目標,而不僅是SRE的熱門話題。可靠性和可維運性不能是事後考慮的事項。

安全關鍵系統的啟示:SRE的未來方向

SCS(安全關鍵系統)是指故障或失靈可能導致人員死亡或嚴重傷害、裝置或財產損失或嚴重損壞以及環境危害的系統。儘管風險如此之高,SCS通常充斥著複雜的軟體,增加了有害行為的可能性。因此,這些系統受到嚴格的監管框架約束,要求使用嚴謹的開發技術來減輕不良行為。

科技界普遍認為這些技術不必要地嚴格和複雜,僅保留給最關鍵的安全系統。不幸的是,這意味著SCS社群開發的大量豐富的指導和方法很少被用於「普通」系統的開發中。

玄貓認為,隨著技術系統對社會的重要性不斷增加,SRE領域可以從安全關鍵系統的實踐中學習許多寶貴經驗,將這些嚴謹的方法適當地應用於我們的日常工作中,從而提升系統的整體可靠性和安全性。

結語:重要但不緊急的藝術

正如艾森豪威爾所說:「重要的事情很少緊急,緊急的事情很少重要。」不要因為SRE面臨的日常幹擾而過於專注於短期問題,以至於忽視了規劃和執行那些將對組織產生最大影響的長期專案。

作為SRE工作者,玄貓深信路線圖是我們平衡短期需求與長期價值的重要工具。透過建立清晰的路線圖,我們不僅能夠更有效地分配資源,更能夠引導團隊朝著真正重要的方向前進,最終實作系統的長期可靠性和可持續性。在日益複雜的技術環境中,這種戰略性思考不再是奢侈品,而是必需品。

安全標準與系統可靠性工程的交匯

在現代技術環境中,安全關鍵系統(SCS)與系統可靠性工程(SRE)的界限正逐漸模糊。這種融合不僅體現在技術應用上,更反映在方法論與標準的共通性上。作為一名專注於高用性系統的工程師,我發現這兩個領域的相互借鑒正變得日益重要。

安全標準的多維應用

安全關鍵系統在開發技術的嚴謹性和適用性方面有著各種不同的要求,而這些要求往往與SRE領域的系統平行。以廣泛採用的IEC 61508標準為例,它提供了一套完整的方法論,涵蓋如何應用、設計、佈署和維護安全相關系統。

乍看之下,這個標準似乎只適用於安全關鍵系統,但深入分析會發現,它所強調的原則與系統工程中使用的系統可靠性原則高度一致,包括:

  • 可用性 (Availability)
  • 可靠性 (Reliability)
  • 安全性 (Safety)
  • 完整性 (Integrity)
  • 可維護性 (Maintainability)

安全完整性等級與可用性

IEC 61508中每種開發方法的應用主要取決於系統所需的嚴謹程度,這由安全完整性等級(SIL)定義。SIL是衡量安全功能在需要時可能無法回應的允許機率的指標。

對SRE專業人員來說,安全可用性(安全完整性系統執行任務的可用性)的概念應該相當熟悉。它以百分比(%)表示,與我們常說的"五個九"高用性要求同義。這種相似性不是巧合,而是反映了兩個領域在核心目標上的一致性。

IEC 61508等標準因此提供了豐富的技術函式庫用者可以運用這些技術來達到目標SIL或可用性水平,包括:

  • 需求可追溯性
  • 形式化方法
  • 靜態分析
  • 故障檢測
  • 複雜度量
  • 模組化設計
  • 防禦性程式設計
  • MC/DC (修改條件/決策覆寫)
  • 流程模擬
  • 雪崩/壓力測試
  • 以及許多其他技術

值得注意的是,並非所有技術都適用於或需要應用於所有系統,標準中也沒有針對不同需求區分技術的優先順序。將這些技術適應到SRE實踐中的關鍵在於能夠根據每個獨特的軟體系統來解釋標準的要求。然而,安全標準很少提供這樣的指導,可能需要專業知識來充分確定何時以及如何佈署特定的開發方法。

目標導向保證案例的未來

為解決上述挑戰,“目標導向保證案例的未來"中提出的技術(現已被國際原子能機構採納)旨在分類別不同開發方法如何證明關鍵系統宣告(如安全性和可靠性)的角色。

隨著SRE的相關性不斷擴充套件到我們日常依賴的系統,SRE的要求越來越與安全關鍵系統一致。考慮一下安全關鍵物聯網,例如人工智慧醫療裝置依賴雲端服務以SIL 3級別執行。隨著更多軟體系統與安全關鍵系統交叉,SRE專業人員應該向安全關鍵系統學科尋求指導,為安全、可靠與可用的系統佈署開闢道路。

實用與可行的靜態分析

靜態分析(SA)是一種在不執行程式碼的情況下分析軟體特性的方法,其嚴謹程度各不相同,涵蓋從語法檢查(例如程式碼風格檢查器)到形式化驗證技術的各種分析。靜態分析可以是手動的或自動的,前者需要數學證明,後者需要由靜態分析器進行自動檢查。

靜態分析的三大類別

一般來說,靜態分析可以分為三大類別,按嚴謹程度遞增排序如下:

  1. 程式碼合規性和度量分析
  2. 完整性分析
  3. 形式化驗證 (FV)

程式碼合規性分析

程式碼合規性檢查針對一組被認為是良好實踐的已定義語法規則檢查原始碼。支援程式碼合規性的工具通常包括旨在評估程式碼複雜性的度量分析,其中包括:

  • 迴圈複雜度(模組中的決策點數量)
  • 路徑複雜度(透過程式碼模組的可能路徑數量)

程式碼合規性檢查器可以透過識別結構不良的程式碼、語法不合規或可能導致缺陷的複雜控制流來建立對程式碼品質的信心。這可以降低(而非消除)相關程式碼出現意外行為的機率。

一般來說,最適合驗證和確認軟體系統的靜態分析技術將取決於多種因素,例如SLO/SLA(服務水平目標或協定)中定義的服務可用性。在這種情況下,程式碼合規性適用於所有級別的SLO和SLA。

完整性分析

完整性分析旨在確保程式永遠不會進入程式語言未定義的狀態。這通常等同於執行時錯誤,包括讀取超出陣列末尾、讀取未初始化的記憶體位置或除以零。它還考慮與語言無關的缺陷,例如緩衝區溢位或任何可能破壞程式碼正確執行的並發問題(例如資料競爭、競爭條件等),或涉及並發模組之間的非故意互動,例如死鎖。

完整性分析因此是最適用的分析,可以增強系統的效能和可用性。也就是說,消除常見漏洞可確保系統執行時不會出現意外異常,特別是對於需要更高用性的系統(從99.9%及以上)。如果存在完整性錯誤,系統在功能上就不正確,完整性分析可以被視為形式化驗證的子集。

幸運的是,大多數完整性分析工具不需要靜態分析或形式化驗證的深入專業知識,因為有大量工具可以現成使用,自動與大規模應用,包括Polyspace、CodeSonar、Frama-C和Facebook Infer。

形式化驗證

形式化驗證旨在根據一組需求或規格,對給定程式的功能特性進行數學證明。它可以提供測試無法提供的系統行為保證。為此,必須首先將程式形式化為模型或抽象,然後在形式規格語言中定義程式的功能需求。因此,形式化驗證工具通常是半自動化的,需要形式化方法專業知識來形成模型和規格。

形式化驗證通常只對需要99.99%及以上服務可用性的系統必要,因為相對於規避的風險,其嚴謹性和手動工作量成本較高(參見ALARP原則)。

靜態分析的誤解與價值

靜態分析和形式化驗證技術的使用不足,這源於一種誤解,認為它們不必要的嚴謹和複雜。這不幸地阻礙了SRE考慮使用可能幫助消除生產系統中繁重與昂貴缺陷的工具。

在我的實踐中,我發現SRE專業人員很可能夠輕鬆佈署靜態分析工具,而無需大幅改變基礎架構,同時獲得靜態分析和形式化驗證技術提供的系統保證益處。

形式化規格的重要性

在處理非常複雜的系統時,發現錯誤變得更加困難。雖然各種各樣的工具可以幫助我們,但這些工具主要幫助識別錯誤發生的原因。作為一個行業,我們在幫助避免一開始就出現錯誤方面做得很少。

為什麼會這樣?部分原因是我們仍然習慣於將錯誤視為程式碼中的故障——未捕捉的空值、差一錯誤等,但最微妙和最危險的錯誤是設計問題。這些情況下,一切在區域性是正確的,但在全域互動時是不正確的。

考慮混合錯誤重試和滾動佈署的情況。客戶的初始請求和第一次重試可能由執行不同版本程式碼的不同伺服器處理。任何意外行為都不會是單個伺服器或程式碼版本的錯誤,而是設計本身的問題。

在我多年的經驗中,我注意到形式化規格在解決這類別問題上顯得尤為重要。形式化規格不僅能幫助我們更清晰地思考系統行為,還能在設計階段就發現潛在問題,避免這些問題進入實施階段。

與普遍認知相反,形式化方法不必總是複雜與難以實施的。有許多輕量級的形式化方法可以整合到現有的開發流程中,提供顯著的好處而不增加過多負擔。TLA+、Alloy和Spin等工具已被證明在各種環境中非常有效,從小型專案到大型分散式系統。

在系統可靠性工程的背景下,形式化規格可以成為確保系統正確行為的強大工具,特別是在處理複雜的分散式系統、並發操作和錯誤處理時。透過在設計階段應用形式化方法,我們可以捕捉那些難以透過傳統測試發現的微妙錯誤和邊緣情況。

隨著我們構建越來越複雜的系統,形式化規格的重要性只會增加。作為SRE專業人員,我們應該熟悉這些工具和技術,並將它們納入我們的工具箱中,以構建更可靠、更安全的系統。

安全關鍵系統與SRE的融合展望

隨著技術的發展,安全關鍵系統與系統可靠性工程之間的界限將繼續模糊。這種融合為兩個領域都帶來了機遇和挑戰。

從SRE的角度來看,採用安全關鍵系統的方法和技術可以提高系統的可靠性和可用性。同樣,安全關鍵系統也可以從SRE實踐中受益,特別是在大規模營運和快速迭代的環境中。

靜態分析和形式化驗證代表了這種融合的一個關鍵方面。透過將這些技術整合到開發和營運流程中,組織可以在早期發現並解決潛在問題,從而減少生產環境中的中斷和故障。

為了有效地實作這種融合,我建議採取以下方法:

  1. 評估系統的關鍵性和所需的可用性水平
  2. 根據這些需求選擇適當的靜態分析和驗證技術
  3. 將這些技術整合到現有的開發和佈署流程中
  4. 培訓團隊成員使用這些工具和技術
  5. 持續監控和評估這些技術的有效性

透過這種方法,組織可以在不過度增加開發和營運負擔的情況下,顯著提高系統的可靠性和安全性。

在未來,我們可能會看到更多專門為SRE設計的形式化方法和工具,這些工具將考慮到SRE環境的獨特需求和挑戰。同樣,安全關鍵系統也將越來越多地採用SRE實踐,特別是在需要快速迭代和佈署的領域。

在這個日益互聯的世界中,確保系統既安全又可靠變得比以往往任何時候都更加重要

設計先於實作:形式化規範的關鍵價值

在複雜系統設計中,我們經常遇到這樣的情況:每個區域性元件都完全按照設計運作,但整體系統卻出現了預料之外的行為。這不是某個開發者犯了錯,而是系統複雜度超出了人類直觀理解能力的結果。

當面對高度複雜的系統時,即使是最優秀的工作者也難以預見所有可能的互動影響。這就是為什麼我們需要更強大的工具來輔助設計過程。形式化規範(formal specification)正是應對這種挑戰的有力武器。

形式化規範的核心價值

形式化規範允許我們在軟體開發前建立系統的高層次模型,然後透過模擬來檢測潛在問題。這種方法有時也被稱為「可除錯的設計」(debuggable designs),它能幫助我們在實際編碼前發現設計缺陷。

在實際應用中,形式化規範帶來的好處令人驚嘆:

  • Amazon 使用形式化規範在 DynamoDB 中發現了一個需要35個步驟才能重現的錯誤,這個錯誤曾經躲過了嚴格的設計審查、程式碼審查和測試
  • Rackspace 在一個專案後期應用形式化規範,發現了需求不比對問題,最終不得不重做一年的工作
  • 一個嵌入式作業系統團隊發現,使用形式化規範後,他們的整體程式碼量減少了十倍

形式化規範並非萬能藥。它不會為你寫程式碼,也不會取代工程師的專業技能。但它是一種強大的工具,能幫助我們在投入數月開發前發現系統中的錯誤,避免凌晨三點被緊急呼叫處理系統故障。

玄貓認為,形式化規範就像建築藍圖之於建築物。你不會在沒有藍圖的情況下建造房屋,那為什麼要在沒有形式化設計的情況下構建價值百萬的系統呢?

社會技術系統中的風險與腐蝕

我們的工作不僅是技術系統,還包括由人組成的組織。這些組織受到結果偏差(outcome bias)的影響,可能低估或高估風險,取決於團隊中偏差正常化(normalization of deviance)的程度。

準備的悖論

在維運領域存在一種現象,我稱之為「準備的悖論」(paradox of preparation):一個有效管理風險並預防問題的組織可能無法獲得應有的認可。因為負面結果被有效預防了,決策者可能會認為風險遠低於實際情況,進而判斷預防工作不是資源的有效利用。

SRE 或維運團隊的主要功能之一是主動管理風險。這類別工作範圍廣泛:

  • 維護系統更新
  • 輪換憑證和令牌
  • 驗證備份
  • 編寫執行手冊和復原工具
  • 執行災難測試
  • 為新系統進行生產就緒審核
  • 徹底審查生產環境中的險情事件

當團隊超負荷或人手不足時,這些工作很容易被忽視,最終可能導致危機的爆發和新一輪投資的開始。

價值視覺化策略

作為SRE,我們的工作之一是使我們的價值可見,避免組織腐蝕導致風險被低估和可靠性投資不足。我們生活在一個資料驅動的世界,但我們無法追蹤「因為良好的預防工作而沒有發生的事故」。

然而,在非危機模式下,我們可以做很多事情來展示我們的工作如何提高系統可靠性:

  1. 為管理風險的日常工作建立內部SLO,設定儀錶板顯示是否達到這些SLO
  2. 制定生產就緒標準,涵蓋變更管理、監控和警示、負載平衡和請求管理、容錯移轉和容量規劃
  3. 跟蹤服務如何達到(或未達到)這些標準
  4. 設定混沌工程和演練日,測試服務如何處理故障
  5. 對系統進行負載測試,瞭解其擴充套件性,解決未來一兩年可能遇到的瓶頸
  6. 認真對待險情和意外情況,跟蹤相應的行動專案

這些實踐不僅有助於防止偏差正常化,還能提高我們工作的可見度。

作為工程師,我們有責任清晰地溝通系統中的風險和我們為減少這些風險所做的主動工作。然而,「魚從頭開始腐爛」;工程長官者最終做出關鍵決策。因此,他們必須敏銳地意識到結果偏差,以及前線工程師與自己之間對風險理解的可能脫節。最重要的是,他們必須警惕危機-自滿迴圈,保持對韌性和可靠性的持續適當投資,以避免危機。

SRE的危機與未來

反思當前SRE領域的狀態,我們可能正面臨一場危機,就像1968年軟體工程領域所面臨的那樣。當時,年輕的電腦科學家Edsger Dijkstra認識到,隨著機器變得更強大、複雜度增加,我們編寫高品質、可靠執行的軟體的能力正面臨壓力。

Dijkstra的解決方案是推動程式設計中的一致性、紀律性和嚴謹性。這導致了現在被視為基礎的方法——例如結構化程式設計,儘管像所有新事物一樣,最初受到懷疑。

現在,SRE領域似乎也面臨類別似的挑戰。我們行業中作為行為範本或系統推理的大部分內容,都依賴於一套缺乏證據支援的知識體系。SRE書籍出版四年後,許多從業者仍在從書中複製貼上標準操作程式,這種做法雖然可以理解,但並不正確。

環顧四周,玄貓發現SRE行業中嚴謹性不足。Dijkstra本人在分散式系統基礎方面的開創性工作——訊號量、互斥鎖、自穩定等——可能是我們最接近嚴謹的部分,但這只適用於我們工作的電腦科學方面。SRE的許多工作超出了這個範圍——可能甚至是大部分——而這些工作通常根據未經質疑的傳統和(充其量)經驗法則。

例如,我們可以質疑:

  • 為什麼瑣事與專案工作的比例是50:50?這是否是正確的數字,而不是20:80,或者根本不設固定比例而是根據具體情況靈活調整?

這種對傳統實踐的質疑和追求更嚴謹的方法論,將是SRE領域未來發展的重要方向。

建立更嚴謹的SRE實踐

面對SRE領域的挑戰,我們需要建立更嚴謹的實踐方法。這不僅是採用更多形式化工具,還包括重新思考我們的基本假設和方法論。

資料驅動的決策

我們需要超越「最佳實踐」的簡單複製,轉向根據實證的方法。這意味著:

  1. 收集和分析系統行為的實際資料
  2. 設計可測量的實驗來驗證我們的假設
  3. 建立反饋迴圈,不斷改進我們的實踐

跨學科知識整合

SRE不僅是技術問題,還涉及組織和人的因素。我們應該從其他領域汲取知識:

  • 系統理論和複雜性科學
  • 認知心理學和人因工程
  • 組織行為學和變革管理
  • 風險管理和應急回應理論

建立實踐社群

為了推動SRE領域的發展,我們需要建立更強大的實踐社群:

  • 分享失敗和成功的經驗
  • 共同開發和改進工具和方法
  • 建立同行評審和批評的文化
  • 支援研究和實驗

結語

形式化規範為我們提供了在實際編碼前發現系統設計缺陷的強大工具,這對於現代複雜系統的開發至關重要。同時,我們也必須認識到SRE工作的社會技術性質,主動管理風險並使我們的價值可見。

面對SRE領域的危機,我們需要像Dijkstra當年推動軟體工程進步那樣,追求更大的一致性、紀律性和嚴謹性。這意味著質疑傳統實踐,採用根據實證的方法,並整合跨學科知識。

透過這些努力,我們可以推動SRE領域從經驗法則和未經證實的傳統,向更嚴謹、更有效的實踐發展,最終建立更可靠、更有韌性的系統。

系統可靠性工程的根本挑戰:未知風險

在現代系統工程中,我們面臨著與1968年軟體危機時期相同的根本問題——複雜性。這種複雜性不僅困擾著我們,實際上它正在侵蝕我們系統的可靠性基礎。當我們談論微服務網格等系統級變更時,我們真的能在實施前就理解其影響嗎?還是隻能透過試驗和觀察來取得答案?這個問題引發了我對當前SRE實踐的深度思考。

系統可靠性工程(SRE)領域承諾提供一個全面的方法來應對複雜性,但現實中,我們經常無法兌現這個承諾。就像Cambridge Mathematical Laboratory的A. G. Fraser在1968年所說:「可靠性本質上是一個設計問題,除非你在整個設計過程中都意識到可靠性的需求,否則你可能會前功盡棄。」

這引發了一個更深層次的問題:當單一嚴重事故就能摧毀全年的錯誤預算時,我們引以為傲的SLO模型還能有效嗎?

風險分析方法學:現有工具的侷限

在處理系統風險時,我主要使用兩種風險分析方法學,但它們都有其本質上的侷限性。

架構分析:預見潛在風險

第一種方法是架構分析,主要針對感知到的或未實作的風險,透過某種形式的失效模式分析(FMA)進行評估:

  • 失效模式與影響分析(FMEA)
  • 失效模式、影響和嚴重性分析(FMECA)
  • 基本的白板會議,尋找系統設計中的常見反模式

這些分析可能純粹是定性和主觀的,但仍然有價值。然而,它們嚴重依賴於我們對系統的已知認知——或者更確切地說,依賴於我們對系統的心智模型和我們認為我們知道的東西。

玄貓為你解密:

架構分析的關鍵在於預防性思維。當我在評估分散式系統時,常發現團隊忽略的不是已知問題,而是缺乏「假設失敗」的思維模式。優秀的架構分析不僅關注可能出錯的地方,更關注當系統各部分失敗時,整體如何優雅降級。這種「失敗預設」思維是區分高可靠性系統與普通系統的關鍵差異。

資料驅動分析:量化已知風險

第二種方法是資料驅動分析,將歷史可靠性資料從已實作的風險新增到FMA過程中(失效模式、影響和診斷分析[FMEDA]),或者建立各種維度的故障熱圖—例如失敗類別、涉及的服務和地理位置—並根據降級程度、受影響使用者數和持續時間將它們與使用者影響相關聯。

這裡的目標是得出特定風險實作影響的年度化(或其他週期性)預期。這種方法強大有效,但與架構分析一樣,它也有侷限性。資料驅動分析只能提供關於我們已經在某種程度上知道我們有的問題的投資指導。它們已經在我們的風險登記冊中——我們以前見過的事情,如果與它們相關聯的已實作風險有堅實、可量化的歷史,那麼我們可能已經相對頻繁地見過它們。

玄貓為你解密:

資料驅動分析的真正價值不在於找出「根本原因」,而在於發現隱藏的模式。在一次分析中,我發現一個被團隊認為「夠用」的限流系統實際上是公司停機時間的第七大常見因素,儘管它只在不到2%的事件中被識別為「根本原因」。這種分析能揭示那些不是主要貢獻者但在許多故障中扮演輔助角色的問題,這正是純粹根因分析所忽略的寶貴資訊。

已知但無法量化的風險:投資決策困境

當我們面對已知但無法量化的風險時,這種方法難以提供年度化預期風險:我們將這些風險納入風險登記冊,因為我們認為它們可能不好或將來會成為問題,但我們實際上無法用任何資料來描述它們。

結果,我們很難決定如何平衡修復它們所需的工作與功能和其他更可測量的技術債務之間的關係,或者即使我們自己認為這是至關重要的,也難以為專案提供資金並針對這類別競爭優先事項為工作辯護。

在真正的黑天鵝事件(或帶電的鵜鶘)和未知的未知事件上,這種方法完全失效。

跨越組織邊界:分享失效資料的力量

在構建多家公司的失效分類別法的過程中,我對將這種機制擴充套件到單一部門或組織之外的想法產生了濃厚興趣。如果我們擁有更廣泛的分享分類別法和資料池,我們可能實作什麼?如果我們開始將系統失效視為一個承保專案呢?實際上是建立一個行業標準的不同類別系統失效類別和頻率的資料函式庫 如果我們將一個通用的分類別法應用於整個行業的這些事件,並結合該分類別法開發分享事件報告、貢獻因素和量化影響,那麼我們用於模式生成和頻率-風險預測的資料集的品質會發生相當大的變化。對於單一提供商來說,即使在大規模情況下不頻繁的事件,在多個提供商中可能會變得可辨識。

跨組織資料分享的價值

我們可能開始將一些已知的無法量化的風險轉變為可預測的風險,甚至將一些區域性未知的未知風險轉化為已知的失效模式,我們可以針對這些模式採取合理的預防措施,與它們的年度化預期影響成比例。

對於我們無法測量或未知的未知風險的答案,與電力行業和消費電子產品在早期階段面臨的答案相同,就像今天的電腦行業一樣。作為一個行業,我們可以為我們的資訊系統建立本質上與我們的實體系統相同的精算表。

建立系統失效的精算表:未來方向

我們已經在預測如果我們的辦公室有特定組合的元件和佈執行緒式碼實作,保險公司是否有可能因電氣火災而必須支付保單。我們可能夠做同樣的事情來確定在管道上實施生產金絲雀測試與關係型資料函式庫有多重要,或者由於我們資料中心的變壓器蒸發了一隻大鳥而導致的年平均停電預期分鐘數。

這種方法可能徹底改變我們對系統可靠性的理解和管理方式。想像一下,如果我們能夠像保險公司評估風險一樣,精確計算出各種系統設計決策的可靠性影響。這不僅會改變我們的投資決策,還會為整個行業建立一個分享的知識函式庫我們能夠從彼此的經驗中學習。

風險管理的新正規化:超越區域性風險

當前的風險管理方法學,無論是架構分析還是資料驅動分析,都有其內在侷限性。它們主要依賴於我們已有的知識和經驗,而對於未知風險或難以量化的風險則幫助有限。然而,透過建立跨組織的分享失效分類別法和資料池,我們可以開始將這些區域性未知的風險轉化為可預測和可管理的模式。

這種方法將使我們能夠:

  1. 識別單一組織內不常見但在整個行業中有模式的失效類別
  2. 為難以量化的風險提供更準確的影響評估
  3. 根據更廣泛的經驗池開發更有效的預防措施
  4. 建立類別似於保險業使用的精算表,用於資訊系統可靠性

在系統工程領域,我們仍處於早期階段,就像早期的電氣工程一樣。透過共同努力構建分享的風險模型和失效資料函式庫們可以為整個行業的系統可靠性奠定更堅實的基礎。

這不僅是技術挑戰,也是文化挑戰。它需要組織願意分享他們的失敗和經驗,這在當前競爭激烈的技術環境中可能具有挑戰性。然而,正如航空業已經證明的那樣,分享安全資訊最終使所有參與者受益。

在我看來,系統可靠性工程的未來不僅在於單個組織內部的卓越實踐,更在於整個行業如何共同學習和進步。只有這樣,我們才能真正應對系統複雜性帶來的挑戰,並建立真正可靠的系統。

當我們面對未知風險時,最強大的工具不是我們自己的經驗,而是整個行業的集體智慧。透過建立分享的失效分類別法和資料函式庫們可以開始將未知轉化為已知,並為系統可靠性工程開創新的正規化。

軟體安全工作者的觀點:SRE事件處理的新思維

在管理任何規模的服務時,SRE工程師難免會遇到「糟糕的一天」。當事件平息後,我們通常會進行事後分析(或稱為維運回顧)—除非真的發生人員傷亡,否則「事後剖析」這個術語對於我們軟體開發者和維運工程師來說可能過於嚴肅。然而,近年來安全科學的概念以及從事件中學習的機制,已開始深入影響個人、團隊和整個組織的運作方式。

經過深入研究,玄貓發現以下幾個軟體安全領域的重要洞見,這些洞見正幫助我們從重大事件中獲得更多價值:

擁抱複雜性的新視角

過去15年,網路規模分散式系統的崛起重新引發了我們對複雜性科學影響的思考。許多SRE工程師只是口頭上談論複雜性,但實際上,Mark Burgess在《尋找確定性》中的設定管理研究,為我們提供了重要基礎:雲端環境中的系統與量子物理學有更多共同點,而非傳統的因果關係和作用力反作用力物理模型。

在實踐中,我發現接受系統的量子性質意味著我們需要重新思考事件分析的方法。線性模型已不足以描述複雜事件;一旦線性思維被打破,「根本原因」、「五個為什麼」和「最佳實踐」等概念也就失去了意義。這種轉變可能令人不適,但在我們操作的複雜世界中,這些概念已不再適用。

重新定義「責任歸屬」

試想:你的團隊有多少事件被歸因為「人為錯誤」?在缺乏線性關係的複雜世界中,我們必須摒棄將人為錯誤作為事件解釋的概念。從根本上說,它只是「我們決定停止提問的點」的代名詞。

無責任回顧是一種實踐方式,但因為責任歸屬是人類面對壓力時的天性反應,現在的焦點已經從不可能實作的「無責任文化」轉向「責任意識文化」。這種文化承認責任歸屬的存在(工程師常自責!),並在事件分析過程中尋求以建設性的方式克服這種心理。

系統中的人因素

「社會技術」這個修飾詞被越來越多地用來描述我們的複雜系統。它承認SRE工作不僅是編寫程式碼、管理資料和維護機器。這些工作由人完成,而人直接貢獻於系統的成功與失敗,這一點我們長期以來都低估了。如果真要改進這些系統,我們必須改變這種認知。

專業知識的培養

這種新運動正在挑戰一個觀念:事件分析的唯一目的是頭腦風暴、記錄和實施補救措施。這些固然重要,但真正的改進價值在於培養自身和彼此的專業知識,而不僅是調整警示或增加單元測試。後者解決了我們遇到的事件;前者能解決我們將來會遇到的事件。

從個人經驗來看,安全科學能為SRE提供大量關於如何改進工作和提高系統可靠性的見解,但這需要重新框定問題,這可能會讓人感到不適。如果你對這些概念感興趣,不妨接觸SRE領域中不斷壯大的安全與可靠性工作者群體;你唯一可能失去的,是那些讓我們痛苦不堪的深夜警示。

事件:發現組織缺口的視窗

事件迫使我們面對一個現實:系統並不總是按照我們的預期執行。這種感覺令人不安,我們希望相信這種情況不會再次發生。為了在事件後重建這種信心,我們努力確定系統故障的原因,但從事件中我們可以學到的不僅是如何防止重複發生。我們還能識別組織記憶體在的各種缺口——可能需要解決的不足之處。

工具缺口的識別與改進

一種我們可以識別的缺口是工具缺口。例如,當工程師在事件期間難以理解工具反饋,或在進行生產變更時使用工具出錯時,我們就能看到這種情況。特別是當我們注意到變通方法,有人以錯誤的方式執行任務,這就是存在工具缺口的線索。關於工具缺口的資訊應該反饋給這些營運工具的所有者。

在我參與處理的多次事件中,我常看到工程師不得不在多個控制檯間切換以取得完整的系統狀態,這明顯是工具整合不足的表現。這類別問題如果不在事件中暴露,可能會長期被忽視。

維運專業知識缺口

另一種缺口是維運專業知識缺口。這是當工程師缺乏有效完成工作所需的重要維運技能時出現的情況。也許儀錶板上的某個圖表一直是錯的,因為建立它的工程師並不完全理解指標查詢語言。只有在事件發生後,才有人注意到這一點。

維運專業知識缺口可能隨著時間而發展,因為我們的系統不斷變化。去年設定自動擴充套件時使用的策略,現在可能已經被棄用。在技術快速演進的環境中,我認為持續的知識更新是克服這類別缺口的關鍵。

資源缺口與系統極限

最後是資源缺口,即團隊沒有足夠的資源來處理工作量。我們需要擔心資源缺口有兩個原因:

  1. 拉伸系統定律:每個系統最終都會被推到其容量極限。想象一個已達到容量的團隊獲得了額外的人力。當他們僱用新人時,團隊會有一些餘裕。然而,不可避免的是,團隊會繼續承擔更多工作,直到他們再次達到容量極限。

  2. 熟練度定律:這是一種現象,即熟練的工程師可以優雅地處理一定程度的工作超載,而與他們不會表現出正在超出容量的跡象(「我很好!」),直到他們完全不堪重負。

當工程師感到需要在不同任務間切換以完成所有工作時,你可以看到熟練度定律在起作用,例如監控複雜佈署、回應內部支援請求和進行開發工作。這種超載既增加了錯誤的風險,也增加了團隊倦怠的風險。倦怠可能導致團隊成員離職,進一步增加團隊的負擔。我們越早識別出有超載風險的團隊,組織解決問題的成本就越低。

組織內的每個人對整個系統的運作方式只有部分了解。每次事件發生,我們都有機會瞭解事件暴露的缺口。透過突出這些缺口,我們可以為未來做好準備。

SRE的第三個時代:角色的演變與未來趨勢

在SRE的發展歷程中,我們可以清晰地看到三個不同的時代:

第一時代:Google專有時期

在第一個時代,SRE是Google的專有實踐,相關知識只能透過擴散離開公司。這一時期,SRE更像是一個神秘的內部門,而非一個被廣泛認可的專業領域。

第二時代:SRE的釋放與普及

2016年《Site Reliability Engineering》一書的出版,標誌著從Google內部的一個奇怪命名部門到普遍認可的專業的根本性變化。恰如其名的SREcon自2014年以來定期舉行,與越來越成功。在就業市場上,SRE已成為一個響亮的流行詞,出現在履歷表和職位描述中。

第三時代:SRE角色的演變

SRE的驚人普及使我相信我們已經到達了第二時代的晚期,其結局將由當前徵才熱潮的一個有趣轉變來標記:我們所知的專職SRE角色的終結。

為什麼會這樣?在第二時代,許多組織很快意識到,由於規模較小,他們無法像Google那樣執行SRE。即使是一個足夠大的組織能夠維持一個專門的SRE團隊——大多陣列織做不到——通常也會得出這樣的結論:他們不能僅僱用一定數量的SRE來做「SRE的事情」。相反,每個工程師都必須成為兼職SRE。

在我看來,第三時代的SRE將是一個角色的融合時代。我們將看到:

  1. SRE原則的普遍採用:不再侷限於特定團隊,SRE的核心原則將融入所有技術團隊的日常工作中。

  2. 全堆積積疊責任的增強:開發人員將承擔更多維運責任,維運人員將更深入理解開發流程。

  3. 專業知識的重新分配:專門的SRE知識將不再集中在少數工作者手中,而是分散到整個工程組織中。

  4. 自動化與工具的民主化:原本由SRE團隊開發的自動化工具和平台將成為所有工程師的日常工具。

這種轉變並不意味著SRE的消亡,而是其演進和成熟。就像敏捷方法論已經從一套特定實踐發展為普遍的工作方式一樣,SRE原則也將融入技術組織的DNA中。

從事件中學習:建立學習型組織的實踐方法

在現代複雜系統環境中,從事件中有效學習已成為組織彈性的關鍵因素。我認為,建立真正的學習機制需要超越傳統的補救措施清單,建立更全面的知識取得和分享框架。

事件學習的多層次模型

根據我的經驗,有效的事件學習應該包含以下幾個層次:

  1. 事實層:準確記錄發生了什麼,避免主觀判斷和過早結論。這一層需要詳細的時間線和客觀資料。

  2. 分析層:理解系統行為與預期的差異,探索複雜的相互作用而非單一原因。

  3. 組織學習層:將知識轉化為可操作的見解,並在整個組織中分享。

  4. 系統改進層:不僅修復具體問題,還要加強系統的整體彈性和可觀測性。

實施有效學習的關鍵實踐

在建立學習型組織時,我發現以下實踐特別有效:

建立心理安全環境:團隊成員需要感到安全才能坦誠分享失敗和錯誤。這需要長官者以身作則,承認自己的錯誤並重視學習過程。

結構化知識分享:建立正式的知識分享機制,如定期的學習回顧會議、知識函式庫例研究函式庫 制定反思問題:使用開放式問題促進深度思考,如「如果你能回到事件發生前,你會做什麼不同的事?」或「哪些假設被證明是不正確的?」

跨團隊學習:建立機制讓不同團隊分享各自的事件經驗和學習,避免知識孤島。

量化學習效果:追蹤學習指標,如類別似事件的減少、解決時間的縮短或團隊對系統的理解改善。

避免常見的學習陷阱

在實施事件學習機制時,需要警惕以下常見陷阱:

  • 過度依賴補救專案:補救專案雖然重要,但不應成為學習的唯一成果。
  • 忽略成功案例:不僅要學習

SRE的演進:從專職角色到無所不在的思維模式

在技術世界快速變遷的今日,網站可靠性工程(SRE)的角色正經歷著深刻的轉變。從我觀察技術組織的發展軌跡來看,SRE已經歷了兩個時代的洗禮,現在正邁向第三個時代。這個轉變不僅反映了技術的進步,更深層次地體現了組織文化和工程哲學的演進。

從專職角色到全民參與:SRE的市場需求解析

當前市場對SRE人才的高需求,主要源於組織希望找到能夠將SRE知識和實踐擴散到團隊中的專業人士。這反映了一個關鍵的轉變趨勢:SRE不再只是一個專職角色,而是一種應該被廣泛採納的工程思維和實踐方法。

真正進入第三時代的組織,其特徵是SRE知識已經成功地在工程團隊中普及。在這樣的環境中,每位工程師都能在工作中戴上「SRE帽子」,特別是在規模較小的組織中,他們甚至會停止徵才專職SRE。相反,「SRE思維」將成為徵才每個工程角色的重要求。

推動SRE時代轉變的關鍵因素

是什麼推動了這些時代之間的轉變?對於第二時代,答案是雲原生技術的民主化和普及。雲原生技術聯盟(CNCF)發布的深刻定義表明,雲原生技術使得即使是小型組織也能迅速達到需要SRE的複雜度和規模。

而對於第三時代,關鍵在於最佳化專職SRE與直接從事產品開發的工程師之間的比例。處於第二時代成熟度的組織,其中大多數工程師都兼職擔任SRE角色,將會發現剩餘專職SRE的大部分任務可以交給服務提供商,這包括但不限於傳統的專注於基礎架構的雲提供商。實際上,越來越多建立在其他雲端服務之上的高階服務,將推動大部分機會的增長。

規模與自營的平衡藝術

當然,這裡存在一個權衡。組織規模越大,自行營運更大部分的技術堆積積疊就越有效率。但隨著服務提供商的持續創新,這個門檻正在不斷提高。

我們是否很快就能享受「SRE即服務」,從而完全忘記營運問題?恰相反。在第二時代的場景中,工程師實際上可以更容易地透過依賴組織內部的SRE來迴避某種程度的營運無知。而在第三時代,大多數工程師將非常接近生產環境,透過觸手可及的SRE啟發的工具和服務來實作。要有效地使用這些工具和服務,他們將需要具備SRE思維。

第三時代SRE的無限潛力

第三時代SRE的不可思議力量在於它將(也必須)存在於每個人的腦海中。當大學在電腦科學課程中加入SRE課程的那一刻,將是第三時代已經開始的確切標誌。

SRE思維普及的深遠影響

回顧SRE的發展歷程,我發現最初SRE被視為一種特殊的專業角色,負責確保系統的可靠性和可擴充套件性。隨著雲原生技術的普及,SRE的職責和影響範圍開始擴大,從單純的系統維護轉向更加主動的系統設計和最佳化。

在這個過渡期間,許多組織開始意識到,僅靠少數SRE工作者是無法滿足日益增長的系統可靠性需求的。這促使他們開始將SRE的知識和實踐擴散到更廣泛的工程團隊中,形成了第二時代的特徵—「兼職SRE」模式。

而現在,我們正站在第三時代的門檻上,這個時代的標誌是SRE不再是一個專職角色,而是一種思維模式和文化,滲透到組織的各個層面。在這種環境下,每個工程師都需要具備基本的SRE技能和思維,能夠主動考慮系統的可靠性、可觀測性和可擴充套件性。

SRE轉型對組織的實際影響

這種轉變對組織有著深遠的影響。首先,它改變了工程師的角色定義和職責範圍。在傳統模式下,開發工程師只需關注功能開發,而系統的可靠性和維運則由專門的SRE團隊負責。但在新模式下,開發工程師需要同時承擔部分SRE責任,這要求他們具備更廣泛的技能和更全面的系統思維。

其次,它推動了工具和平台的演進。為了支援這種「全民SRE」的模式,組織需要提供更加自動化、人工智慧化的工具和平台,使得普通工程師也能輕鬆地執行SRE相關任務。這促進了可觀測性平台、自動化佈署系統、自我修復機制等技術的發展。

最後,它改變了組織的文化和價值觀。在SRE思維普及的環境中,系統的可靠性和使用者經驗被視為每個工程師的共同責任,而不僅是SRE團隊的職責。這種文化轉變促使組織更加重視長期的系統健康和可持續性,而不僅是短期的功能交付。

對未來SRE角色的預測

我認為SRE作為一個專職角色可能會在某些特定領域保持其重要性,尤其是在大型技術組織中。這些專職SRE將更多地專注於構建工具和平台,以支援更廣泛的工程師團隊執行SRE實踐,而不是直接負責系統的可靠性。

同時,SRE的知識和技能將越來越成為每個軟體工程師必備的素質,就像今天的基礎程式設計技能一樣。大學和培訓機構可能會開始將SRE原則納入其基礎課程中,確保畢業生具備這些關鍵技能。

對於技術長官者來說,理解這種轉變並相應地調整組織結構和文化將變得至關重要。成功的組織將是那些能夠有效地將SRE思維融入其工程文化,並提供必要的工具和培訓來支援這種轉變的組織。

雲端服務提供商在SRE轉型中的角色

在SRE的第三時代,雲端服務提供商扮演著關鍵角色。他們不僅提供基礎設施,還越來越多地提供高階服務,這些服務本身就包含了SRE最佳實踐和原則。

高階服務的崛起

傳統上,雲提供商主要提供IaaS(基礎設施即服務)和PaaS(平台即服務)。然而,我們現在看到的趨勢是向更高階的服務發展,這些服務不僅提供功能,還內建了可靠性、可擴充套件性和安全性。

例如,無伺服器計算平台不僅處理計算資源的分配,還自動管理擴充套件、故障還原和負載平衡。資料函式庫不僅提供資料儲存,還處理備份、複製和災難還原。這些高階服務實際上將SRE最佳實踐「封裝」進了服務本身,使得即使沒有專職SRE的組織也能享受到SRE帶來的好處。

自建與外包的權衡考量

對於組織來說,決定哪些部分自行營運,哪些部分依賴雲端服務提供商是一個複雜的決策。這個決策不僅涉及成本考量,還涉及對控制、靈活性和專業知識的需求。

在我的觀察中,較大的組織往往更傾向於自行營運更多的基礎設施,因為他們有規模效應和專業知識來做這件事。然而,即使是這些大型組織也越來越多地採用雲端服務提供商的高階服務,特別是對於非核心功能或需要特殊專業知識的領域。

對於中小型組織,依賴雲端服務提供商的高階服務通常是更明智的選擇。這使他們能夠專注於自己的核心業務,同時仍然享受到高水平的可靠性和安全性。

雲端服務與SRE思維的協同作用

值得注意的是,使用雲端服務並不意味著組織不需要SRE思維。相反,有效地使用這些服務需要工程師理解SRE原則和實踐。例如,即使用無伺服器計算,工程師仍然需要理解監控、警示和事件回應的原則,以確保他們的應用程式在這個環境中可靠執行。

這就是為什麼在第三時代,SRE思維的普及變得如此重要。工程師需要理解SRE原則,以便能夠有效地利用雲端服務提供商提供的工具和服務,並在必要時做出明智的決策,確定何時使用這些服務,何時自行構建解決方案。

SRE教育

隨著SRE從專職角色向普遍思維模式轉變,SRE教育也需要相應調整。未來,我們可能會看到SRE原則和實踐被整合到電腦科學和軟體工程的基礎教育中。

學術教育的變革

傳統的電腦科學教育主要關注演算法、資料結構、程式設計語言和軟體開發方法。然而,隨著系統複雜性的增加和可靠性要求的提高,學術機構將需要將SRE原則納入其課程。

這可能包括教授學生如何設計可靠的系統、如何實施有效的監控和警示、如何進行事件回應和根本原因分析,以及如何設計和實施自動化來提高系統可靠性。

當大學開始在其電腦科學課程中包含專門的SRE課程時,這將是SRE第三時代真正開始的標誌。這些課程將不再是選修課或專業課程,而是每個電腦科學和軟體工程學生必修的基礎課程。

企業培訓的演進

在企業環境中,SRE培訓也將發生變化。不再只是為SRE團隊提供專門培訓,組織將需要為所有工程師提供SRE原則和實踐的基礎培訓。

這種培訓可能包括實際的演練和模擬,幫助工程師理解系統故障的影響和如何有效地回應這些故障。它還可能包括關於如何設計和實施有效監控、如何設定適當的服務水平目標(SLO),以及如何進行有效的事後分析的培訓。

社群和自學資源的增長

除了正式教育和企業培訓外,我們也可能看到SRE社群和自學資源的增長。這可能包括更多的書籍、線上課程、研討會和社群活動,專注於SRE原則和實踐。

這些資源將變得越來越重要,因為它們允許工程師在自己的時間和節奏下學習SRE技能,並且其他實踐SRE的專業人士交流經驗和最佳實踐。

在我的職業生涯中,我見證了SRE從一個小眾專業領域發展成為一個被廣泛認可和採用的工程學科。隨著我們進入SRE的第三時代,我期待看到SRE思維如何繼續演變和影響軟體工程的未來。

SRE思維的普及對工程文化的影響

SRE思維的普及不僅改變了技術實踐,也深刻影響了工程文化。在第三時代的環境中,責任共擔、持續學習和系統思維成為核心價值觀。

責任共擔的文化轉變

在傳統的工程組織中,開發團隊和維運團隊之間存在明顯的分

可靠性工程的多元視角:從實踐者的經驗出發

在現代技術環境中,系統可靠性已成為企業技術團隊最重要的使命之一。然而,真正的可靠性工程遠超過單純的技術實作,它需要團隊文化、流程設計與技術實踐的全方位整合。在這篇文章中,我將整合多位資深工程師的觀點,探討如何從不同維度開發真正有效的可靠性工程實踐。

可靠性的本質:超越技術的思考框架

可靠性工程的核心不僅是技術問題,而是一種思維模式。正如 Alex Hidalgo 所言,站點可靠性工程(SRE)的精髓可以用六個字概括:「測量、目標、結果、文化、行動、信任」。這六個字背後代表的是一套完整的思考框架:

  1. 測量:若無法測量,則無法改進
  2. 目標:明確的目標引導團隊行動方向
  3. 結果:關注最終使用者經驗而非技術指標
  4. 文化:建立支援可靠性的組織文化
  5. 行動:根據資料和洞察採取具體行動
  6. 信任:團隊間的信任是高效協作的基礎

這種思維框架提醒我們,可靠性並非僅靠技術工具就能實作,而是需要組織各層面的共同努力。

可靠性堆積積疊:構建系統穩定性的層次結構

想要建立真正可靠的系統,我們需要理解「可靠性堆積積疊」的概念。可靠性堆積積疊由四個主要層次組成:

可觀測性層

可觀測性是整個可靠性堆積積疊的基礎。如果無法看到系統的執行狀態,就無法知道系統是否正常運作。這一層包括:

  • 全面的監控系統
  • 詳細的日誌記錄
  • 分散式追蹤
  • 有效的告警機制

服務水平目標層

根據可觀測性資料,我們需要設定明確的服務水平目標(SLO)。這些目標應該:

  • 反映使用者真實體驗
  • 具有明確的數值標準
  • 與業務目標相符
  • 可作為團隊決策依據

自動化層

有了明確的目標,下一步是透過自動化減少人為錯誤:

  • 自動化佈署流程
  • 自動化測試
  • 自動化故障還原
  • 混沌工程實踐

組織文化層

最頂層也是最關鍵的是組織文化,它包括:

  • 無責備的事故回顧文化
  • 持續學習的團隊氛圍
  • 跨團隊協作機制
  • 對可靠性的共同承諾

在這四層架構中,每一層都依賴於下層的穩固基礎。若可觀測性不足,就無法設定合理的 SLO;若 SLO 不明確,自動化就會缺乏方向;若缺乏支援性的組織文化,前面的技術投資就難以發揮最大效益。

開發週期中的可觀測性:從設計到生產

可觀測性不應該只是生產環境的事後考量,而應該貫穿整個開發週期。Liz Fong-Jones 強調,真正有效的可觀測性應從設計階段開始整合,而非作為佈署後的附加功能。

設計階段的可觀測性考量

在系統設計階段,團隊應該問自己以下問題:

  • 我們如何知道這個功能是否正常運作?
  • 哪些指標能反映使用者經驗?
  • 系統的哪些部分最容易出現問題?
  • 我們需要哪些工具來診斷潛在問題?

透過在設計階段回答這些問題,團隊可以主動設計可觀測性,而非被動應對。

開發階段的可觀測性整合

在開發過程中,可觀測性應該與功能開發同步進行:

  • 在程式碼中新增有意義的日誌記錄
  • 設計關鍵效能指標
  • 實作分散式追蹤點
  • 開發自定義監控儀錶板

測試環境中的可觀測性驗證

在測試環境中,應該驗證可觀測性工具的有效性:

  • 檢查監控資料是否準確
  • 確認告警閾值是否合理
  • 測試故障場景下的可觀測性表現
  • 驗證團隊是否能夠利用這些工具快速診斷問題

生產環境中的持續改進

佈署到生產環境後,可觀測性工作仍然繼續:

  • 持續最佳化監控儀錶板
  • 根據實際情況調整告警閾值
  • 分析可觀測性資料識別改進機會
  • 將學習到的經驗應用於下一個開發週期

透過將可觀測性整合到整個開發週期,團隊可以更早地發現問題,更快地診斷故障,並持續改進系統可靠性。

理解技術基礎:為何你應該瞭解一點 TCP

在構建可靠系統時,對底層網路協定有基本瞭解是非常重要的。Julia Evans 指出,即使是簡單的網路問題診斷也需要對 TCP 有基本瞭解。

TCP 的關鍵概念

作為一名工程師,理解以下 TCP 基礎概念能讓你更有效地診斷問題:

  • 三次握手:建立連線的過程
  • 四次揮手:關閉連線的過程
  • 超時重傳:TCP 如何處理丟包
  • 流量控制:如何防止傳送方壓垮接收方
  • 擁塞控制:如何避免網路擁塞

實際應用場景

理解 TCP 如何在以下場景中幫助解決問題:

  • 診斷連線建立緩慢的原因
  • 瞭解為什麼某些請求會超時
  • 分析網路效能瓶頸
  • 解決服務之間通訊問題
  • 最佳化高流量系統的網路設定

當玄貓在處理一個服務間通訊延遲問題時,對 TCP 重傳機制的理解幫助我快速識別出問題根源在於網路丟包,而非應用層邏輯。這種底層理解能大加快問題解決速度。

基數問題:可觀測性的隱藏挑戰

在設計監控系統時,基數(Cardinality)問題常被忽視,但它對系統可觀測性有著重大影響。Liz Fong-Jones 強調基數管理對可擴充套件監控系統的重要性。

基數的定義與挑戰

基數指的是指標中唯一組合的數量。例如,如果你監控的指標包含客戶 ID、區域、服務版本等維度,這些維度的組合可能會產生數百萬個唯一時間序列,導致:

  • 監控系統儲存壓力增大
  • 查詢效能顯著下降
  • 監控成本急劇上升
  • 儀錶板渲染緩慢

基數管理策略

為有效管理基數問題,可以採取以下策略:

  • 選擇合適的維度:只新增真正有診斷價值的標籤
  • 使用取樣技術:對高流量服務採用人工智慧取樣
  • 聚合低價值維度:將某些細粒度標籤聚合為較粗粒度類別
  • 分層儲存策略:高基數資料短期保留,低基數資料長期儲存
  • 使用專為高基數設計的工具:某些現代可觀測性工具專門解決高基數問題

實際應用案例

在一個電子商務平台上,如果我們為每個請求都標記使用者 ID、商品 ID、促銷 ID 等,很快就會產生數十億個時間序列。更人工智慧的方法是:

  • 保留請求路徑、服務名稱等低基數維度用於長期趨勢分析
  • 使用高基數維度(如使用者 ID)僅用於實時故障診斷,並設定較短的保留期
  • 實作動態取樣,在正常情況下取樣率低,系統異常時自動提高取樣率

透過這種分層策略,既能保持診斷能力,又能控制監控系統的成本和效能。

安全如同洋蔥:多層防護策略

Lucas Fontes 將安全比作洋蔥,提醒我們安全應該是多層次的。在可靠性工程中,安全是不可分割的一部分,因為安全漏洞直接威脅系統可用性。

安全的多層架構

有效的安全策略應該包含多個防護層次:

邊界防護層

  • 防火牆與網路分段
  • DDoS 防護
  • API 閘道器與請求過濾
  • 邊緣安全監控

身份與存取控制層

  • 強健的身份驗證系統
  • 細粒度的授權控制
  • 最小許可權原則實踐
  • 安全的金鑰管理

應用安全層

  • 程式碼安全審查
  • 依賴項安全掃描
  • 輸入驗證與輸出編碼
  • 安全預設設定

資料保護層

  • 靜態資料加密
  • 傳輸中資料加密
  • 敏感資料隔離
  • 資料存取稽核

監控與回應層

  • 安全事件監控
  • 異常行為檢測
  • 事件回應計劃
  • 定期安全演練

安全與可靠性的融合

安全與可靠性不應被視為獨立關注點,而是相互支援的領域:

  • 安全漏洞可能導致可用性問題
  • 可靠性實踐(如自動化)可減少安全設定錯誤
  • 兩者都依賴於良好的變更管理和測試實踐
  • 兩者都需要建立事件回應機制
  • 兩個領域都受益於無責備的文化和持續學習

在構建系統時,應將安全視為可靠性的基礎要素,而非事後考慮的附加功能。

組織規模與 SRE 實踐:適應性策略

SRE 實踐不是一刀切的解決方案,它需要根據組織規模進行調整。Matthew Huxtable 分享了不同規模組織實施 SRE 的見解。

小型組織的 SRE 實踐

在小型組織中,專職 SRE 團隊可能不現實,但 SRE 理念仍然適用:

  • 每個人都是 SRE:開發者承擔維運責任,打破專業壁壘
  • 自動化優先:資源有限時,優先自動化重複任務
  • 簡化架構:選擇易於維護的技術堆積積疊,避免過度複雜化
  • 利用代管服務:善用雲端服務減輕基礎設施負擔
  • 建立核心實踐:即使規模小,也要建立事件回顧和學習文化

中型組織的 SRE 轉型

當組織增長到一定規模,SRE 實踐需要更加結構化:

  • 培養 SRE 擁護者:識別並支援對可靠性有熱情的工程師
  • 建立分享責任模型:明確開發團隊與維運團隊的責任邊界
  • 標準化關鍵流程:建立統一的監控、告警和事件回應流程
  • 引入 SLO 文化:開始使用 SLO 驅動決策和優先順序
  • 建立知識分享機制:防止關鍵知識集中在少數人手中

大型組織的 SRE 規模化

大型組織需要更系統化的 SRE 實踐:

  • 專職 SRE 團隊:建立專門的 SRE 團隊支援關鍵服務
  • 平台化思維:開發內部平台簡化可靠性工作
  • 標準化工具鏈:統一監控、佈署和事件管理工具
  • **建立 SRE 教育計劃

方法論除錯:從混亂走向系統化解決問題

在我的技術生涯中,發現許多工程師面對複雜技術問題時常陷入無序的嘗試與錯誤迴圈。無論你是初級開發者還是資深工程師,我們都曾遇到那種讓人束手無策的棘手問題,尤其在複雜的分散式系統中更是如此。這篇文章將分享我多年來沉澱出的方法論除錯思維,幫助你建立系統化的除錯流程。

為何需要方法論除錯?

傳統的除錯方式通常依賴於直覺和經驗,這在簡單問題上可能有效,但面對複雜系統時卻顯得力不從心。方法論除錯提供了一個結構化的框架,讓你能夠:

  1. 更快找到問題的根本原因
  2. 避免陷入無謂的嘗試錯誤迴圈
  3. 有效溝通和記錄問題解決過程
  4. 提高團隊協作效率
  5. 建立可重複的問題解決模式

在分散式系統環境中,問題可能跨越多個服務、多種技術堆積積疊,甚至涉及不同團隊。如果沒有系統化的方法,很容易迷失在問題的複雜性中。

方法論除錯的核心原則

問題定義:精確描述是成功一半

在開始除錯前,首先需要精確定義問題。這聽起來簡單,但實際上是很多工程師容易忽略的關鍵步驟。我發現,花時間準確描述問題能夠大幅減少後續的除錯時間。

精確的問題定義應包含:

  • 具體現象:系統表現出什麼異常行為?
  • 發生條件:在什麼情況下問題會出現?
  • 重現步驟:如何可靠地重現這個問題?
  • 影響範圍:問題影響了哪些功能或使用者?
  • 首次出現時間:問題何時開始出現?與最近的變更有關嗎?

我曾處理過一個網路延遲問題,最初報告只說「系統變慢了」。經過詳細定義後,問題變成了「在高流量時段,特定 API 端點的回應時間增加了300%,隻影響使用特定查詢引數的請求」。這種精確描述立即縮小了調查範圍。

建立假設:科學方法的應用

除錯本質上是一個科學探究過程。一旦問題被定義,下一步是建立可能的假設。我推薦以下流程:

  1. 列出所有合理的假設
  2. 按可能性和驗證成本排序
  3. 設計能夠驗證或否定每個假設的測試
  4. 執行測試並記錄結果
  5. 根據結果調整或細化假設

假設應該具體與可驗證。例如,「資料函式庫池設定不當導致連線耗盡」比「資料函式庫題」更有價值。

假設驗證的例項

以一個我處理過的案例為例,系統在特定時間點出現效能下降。我列出了以下假設:

  1. 資源耗盡(CPU/記憶體/網路)
  2. 資料函式庫爭
  3. 外部服務依賴變慢
  4. 程式碼變更引入效能問題
  5. 定時任務造成資源競爭

透過檢查監控資料,我很快排除了假設1和3。對比程式碼變更時間線,假設4也不太可能。最終透過日誌分析發現,某個新增的定時任務恰好在問題發生時執行,並產生了大量資料函式庫操作。

分層診斷:由外而內的系統性方法

在處理複雜系統問題時,採用分層診斷方法非常有效。我通常從使用者經驗層開始,逐步深入到底層基礎設施:

  1. 使用者經驗層:問題如何影響最終使用者?
  2. 應用層:應用程式行為是否正常?
  3. 服務層:微服務之間的互動是否正常?
  4. 資料層:資料函式庫儲系統是否正常?
  5. 基礎設施層:硬體、網路和雲端服務是否正常?

這種方法避免了一開始就陷入特定技術細節,而是保持全域視角。我曾見過工程師花費數小時調查資料函式庫,最終發現根本原因是負載平衡器設定錯誤。

實用的除錯工具與技巧

日誌分析:找出線索的關鍵

高效的日誌分析是除錯的基礎技能。我推薦以下方法:

  1. 建立時間線:根據時間戳記整理事件順序
  2. 關注異常模式:尋找錯誤訊息、警告和異常堆積積疊
  3. 使用連貫的背景與環境:分析問題前後的系統狀態
  4. 跨服務關聯:使用請求ID或跟蹤ID關聯不同服務的日誌

在分散式系統中,我發現使用集中式日誌管理工具(如ELK堆積積疊或Grafana Loki)能夠大幅提高效率。配合適當的查詢技巧,可以快速定位問題。

度量資料:問題的數字證據

除了日誌外,系統度量資料提供了問題的另一種視角:

# 使用Python分析系統度量資料的簡單範例
import pandas as pd
import matplotlib.pyplot as plt

# 載入度量資料
metrics_df = pd.read_csv('system_metrics.csv')

# 找出問題發生時間點
incident_time = '2023-03-15 14:30:00'

# 分析問題前後的系統行為
before_incident = metrics_df[metrics_df['timestamp'] < incident_time]
during_incident = metrics_df[metrics_df['timestamp'] >= incident_time]

# 比較關鍵指標
plt.figure(figsize=(12, 8))
plt.plot(before_incident['timestamp'], before_incident['response_time'], label='正常時間')
plt.plot(during_incident['timestamp'], during_incident['response_time'], label='問題期間')
plt.legend()
plt.title('系統回應時間變化')
plt.show()

玄貓為你解密:

這段程式碼展示瞭如何使用Python的pandas和matplotlib函式庫系統度量資料。我們先載入CSV格式的系統度量資料,然後根據事件發生的時間點將資料分為事件前和事件期間兩部分。這種分割方式能讓我們清楚比較系統在正常運作與問題發生時的差異。最後,我們繪製了系統回應時間的變化圖,可以直觀地看出問題發生前後的效能差異。這種視覺化分析在尋找效能下降的確切時間點和嚴重程度時非常有價值,尤其是在系統表現出間歇性問題或緩慢降級時。

分散式追蹤:跨服務問題定位

在微服務架構中,問題可能涉及多個服務之間的互動。分散式追蹤工具(如Jaeger、Zipkin)能夠提供端對端的請求檢視:

// 在Java應用中實作基本的分散式追蹤
@RestController
public class OrderController {
    
    private final OrderService orderService;
    private final Tracer tracer;
    
    public OrderController(OrderService orderService, Tracer tracer) {
        this.orderService = orderService;
        this.tracer = tracer;
    }
    
    @GetMapping("/orders/{id}")
    public OrderDetails getOrder(@PathVariable("id") String orderId) {
        Span span = tracer.buildSpan("getOrder").start();
        try (Scope scope = tracer.activateSpan(span)) {
            span.setTag("orderId", orderId);
            
            // 業務邏輯
            OrderDetails details = orderService.getOrderDetails(orderId);
            
            span.setTag("status", "success");
            return details;
        } catch (Exception e) {
            span.setTag("error", true);
            span.setTag("error.message", e.getMessage());
            throw e;
        } finally {
            span.finish();
        }
    }
}

玄貓為你解密:

這段Java程式碼展示瞭如何在Spring Boot應用中實作基本的分散式追蹤功能。程式使用了OpenTracing API,這是一個廣泛採用的分散式追蹤標準。

getOrder方法中,我們首先建立了一個名為"getOrder"的追蹤span,這代表一個可追蹤的工作單元。然後我們為這個span新增了"orderId"標籤,記錄請求處理的關鍵引數。

程式碼使用了try-with-resources結構來確保span的作用域(scope)能夠被正確關閉。這是追蹤系統的最佳實踐,確保父子span之間的關係被正確建立。

特別值得注意的是錯誤處理部分:當發生異常時,我們將錯誤資訊記錄到span中,這對於故障診斷非常重要。無論方法執行成功還是失敗,finally塊中的span.finish()確保了span會被正確結束並傳送到追蹤系統。

這種實作使開發者能夠在複雜的分散式系統中追蹤請求流程,識別效能瓶頸,並快速定位跨服務問題。

系統化除錯流程:從混亂到有序

將前面的原則和工具整合起來,我建立了一個系統化的除錯流程,適用於大多數複雜問題:

1. 問題收集與定義

首先,收集所有相關資訊並精確定義問題:

  • 問題的具體表現
  • 影響範圍和嚴重程度
  • 首次發現時間
  • 可能的關聯事件(如佈署、設定變更)
  • 重現步驟(如果可能)

2. 快速評估與分類別

對問題進行初步評估和分類別:

  • 是否為已知問題?
  • 是否需要立即處理(影響生產環境)?
  • 問題可能涉及哪些系統元件?
  • 類別似問題是否曾經發生過?

3. 環境準備與問題隔離

在開始深入調查前,確保有合適的環境:

  • 如果可能,在非生產環境重現問題
  • 隔離問題,減少幹擾因素
  • 準備必要的除錯工具和存取許可權

4. 系統性假設與驗證

建立並系統性地驗證假設:

假設1: 資料函式庫池耗盡
驗證方法: 檢查連線池度量和日誌
預期結果: 如果假設正確,應看到連線數接近或達到上限
實際結果: 連線數穩定在50%以下
結論: 假設被否定

假設2: 外部API回應變慢
驗證方法: 檢查外部API呼叫的時間分佈
預期結果: 如果假設正確,應看到API回應時間增加
實際結果: 90%的API呼叫回應時間超過SLA
結論: 假設得到支援,進一步調查API變慢的原因

5. 根本原因分析

一旦找到問題的直接原因,進一步分析根本原因:

  • 為什麼會出現這個問題?
  • 為什麼現有的監控和防護機制沒有預防或及早發現問題?
  • 是否有更深層次的系統設計或架構問題?

6. 解決方案實施與驗證

實施解決方案並驗證其有效性:

  • 制定短期修復方案
  • 規劃長期改進措施
  • 在測試環境中驗證解決方案
  • 謹慎佈署到生產環境
  • 確認問題已解決

7. 知識沉澱與經驗分享

最後,記錄整個問題解決過程並分享經驗:

  • 撰寫詳細的問題報告
  • 更新知識函式庫件
  • 分享學到的經驗和教訓
  • 改進監控和警示系統
  • 最佳化相關流程和實踐

常見陷阱與如何避免

在實施方法論除錯的過程中,我發現工程師常會陷入一些典型的陷阱:

技術工作者的個人風格與貢獻

技術領域的多元專才

在軟體工程與可靠性領域,每位工作者都帶著獨特的專業背景與技術視角,共同推動著行業的發展。Todd Palino作為LinkedIn容量工程團隊的資深工程師,正致力於建立應用程式容量測量、分析和變更智慧的框架。他曾負責管理全球最大的Apache Kafka佈署之一,並將這些寶貴經驗記錄在《Kafka: The Definitive Guide》一書中。當Todd不在辦公室時,你可能會在SREcon和LISA等技術研討會上找到他,分享他多年在SRE技術長官方面的心得。

技術檔案撰寫也是SRE生態系統中不可或缺的一環。Eva Parish作為一名技術寫作者,專注於為各類別受眾建立檔案,包括開發者、系統管理員和非技術終端使用者。Eva不僅自己撰寫檔案,更致力於在技術組織內外建立檔案文化,並樂於指導他人提升寫作能力。

開發者倡導與效能最佳化工作者

Dawn Parzych在LaunchDarkly擔任開發者倡導者,運用她出色的講故事能力,探討技術與心理學的交叉領域。她善於使技術資訊變得易於理解,盡可能避免使用行話和專業術語。Dawn的文章經常出現在各種技術刊物中,展現她將複雜概念簡化的獨特能力。

在基礎架構與效能領域,Suhail Patel作為Monzo平台團隊的工程師,專注於識別和修復分散式系統中核心基礎架構元件(如Kubernetes、Cassandra和etcd)的異常行為。有趣的是,Suhail工作時通常會戴著耳機聽電子音樂,同事們甚至注意到他的思考過程與音樂的節拍每分鐘(BPM)之間存在某種關聯。

SRE教育與實踐的先驅

Jennifer Petoff作為Google全球SRE教育主管,是暢銷書《Site Reliability Engineering》的共同編輯之一,以及《Training Site Reliability Engineers》的主要作者。她的工作突顯了培訓在SRE實踐中的重要性。

Jake Pittis是一位於加拿大蒙特婁的軟體工程師,在Stripe負責前端和服務間網路工作,專注於可靠性和開發者生產力。當他不撰寫程式碼時,Jake會彈奏爵士鋼琴或製作水蜜桃醋。

可靠性與韌性工程工作者

Bart Ponurkiewicz是Google的資深站點可靠性工程師,致力於提高移動應用程式的可靠性。在過去幾年中,他在多個團隊工作,涵蓋管道、儲存系統和導向使用者的產品(如Google相簿)。Bart在不確定性時刻表現最佳,能夠應對需要快速思考和創造性解決方案的抽象情境。

Ashley Poole是經驗豐富的工程師和技術長官者,擁有跨基礎架構、站點可靠性和軟體工程學科的背景。他熱衷於分享知識,曾在各種使用者組和會議上演講,同時也是英國軟體開發使用者組的共同組織者。

韌性工程與系統安全

Björn “Beorn” Rabenstein是Grafana的工程師,以他參與盡可能多的SRE書籍的志向而聞名,或許也因為他對Prometheus專案的貢獻。在之前的職業生涯中,他曾是SoundCloud的生產工程師,Google的SRE,以及科學計算工作者。

J. Paul Reed開始職業生涯時是一名構建/釋出和營運工程師。在創辦成功的諮詢公司後,他現在是Netflix關鍵營運和可靠性工程(CORE)團隊的資深應用韌性工程師,專注於事件分析、系統性風險識別和緩解、應用韌性工程以及人為因素在各種社會技術系統中的表現。

資料函式庫性與架構工作者

Frances Rees在Google都柏林擔任資深站點可靠性工程師,為雲端提供可靠的資料函式庫。她曾是Google Maps平台SRE的技術主管,並自2019年起共同主持SREcon APAC。在工作之外,她喜歡編織鎖子甲、贏得俄羅斯方塊戰鬥,以及照顧兩隻貓主子。

Tanya Reilly是Squarespace架構組的首席軟體工程師。在加入Squarespace之前,她在Google從事基礎架構工作12年。在閒暇時間,她喜歡在火車上程式設計、與孩子一起看卡通片、學習阿拉伯語,以及彈吉他(雖然技術不佳)。

企業技術顧問與創業家

David K. Rensin是Alphabet財務長辦公室的工程高階總監,為CFO提供關於Google資本適當分配給各業務和長期技術投資的指導。他擁有25年以上設計和交付行星級雲和移動產品的經驗。作為企業家,他共同創立並出售了多家企業,其中一家(Riverbed Technologies)以超過10億美元的價格售出。David擁有16項美國專利,已婚並育有三個孩子。

可觀察性與分散式追蹤系統工作者

Jacob Scott是目前專注於Stripe可靠性的軟體工程師,熱衷於參與韌性工程社群,並熱衷於將現代安全科學的學習應用到真實、複雜的社會技術系統中。

Ben Sigelman是LightStep的共同創始人兼CEO,Dapper(Google的分散式追蹤系統)的共同建立者,以及OpenTracing和OpenTelemetry專案(均為CNCF的一部分)的共同建立者。Ben的工作和興趣主要集中在可觀察性領域,特別是在微服務、高交易量和大型工程組織方面。

技術工作者的共同特質與啟示

觀察這些傑出的技術工作者,玄貓發現他們展現出一些共同特質:

  1. 跨領域專業知識:幾乎所有工作者都在多個相關技術領域展現出深厚的專業知識,而非僅專注於單一狹窄範疇。

  2. 知識分享的熱情:無論是透過寫書、演講、培訓還是組織社群活動,這些工作者都積極將自己的知識與經驗分享給更廣泛的技術社群。

  3. 實踐與理論的結合:他們不僅具備深厚的理論基礎,更將這些知識應用於解決實際工作中的複雜問題。

  4. 持續學習的態度:技術領域不斷發展,這些工作者展現出持續學習和適應新技術的能力。

  5. 跨界思維:許多工作者將不同領域的知識(如心理學、安全科學等)與技術結合,創造出更全面的解決方案。

在SRE和可靠性工程領域,這些工作者的貢獻不僅是技術層面的,更重要的是他們建立了一種文化和思維框架,幫助組織構建更可靠、更有韌性的系統。他們的工作不僅改變了工具和流程,更改變了人們思考和解決問題的方式。

作為技術從業者,我們可以從這些工作者身上學到的不僅是他們的專業知識,更是他們面對複雜問題時展現的思考方式、解決問題的策略以及持續學習和分享的精神。這些特質與能力,正是推動技術領域不斷前進的核心動力。

SRE實務精華:關鍵實踐與團隊建設

在現代技術組織中,站點可靠性工程(Site Reliability Engineering, SRE)已從一個新興角色發展為技術團隊的核心支柱。作為連線開發與維運的橋樑,SRE工程師不僅需要深厚的技術功底,還需要具備跨團隊協作、危機處理和策略思考的能力。本文將探討SRE實踐中的關鍵經驗,從自我調節流程到分散式系統設計,從事件回應到團隊文化建設。

建立自我調節的工作流程

SRE團隊的高效運作需要建立自我調節的流程。這些流程應設計為能夠自動調整並持續最佳化,而非依賴不斷的人為干預。

自我調節流程的核心在於建立正確的激勵機制。在技術團隊中,正向激勵比負向激勵更有效。例如,當團隊成功達成SLO目標時給予認可和獎勵,遠比僅在錯過目標時施加壓力更能促進持續進步。

玄貓在實踐中發現,建立合理的錯誤預算(error budget)是實作自我調節的關鍵。錯誤預算提供了一個框架,讓團隊能夠在穩定性與創新間做出合理的權衡。當預算充足時,團隊可以推動更多創新;當預算緊張時,自然會將重心轉向穩定性改進。

對於SRE團隊來說,責任共擔也是自我調節流程的重要部分。當開發團隊也需要參與輪值和處理生產問題時,他們自然會更關注程式碼品質和系統可靠性。

玄貓為你解密:建立自我調節流程的實踐步驟

  1. 建立明確的SLO和錯誤預算指標
  2. 確保指標對所有相關團隊透明可見
  3. 設計激勵機制,獎勵達成目標和改進行為
  4. 實施責任共擔模式,讓開發團隊也參與維運工作
  5. 定期回顧並調整流程,確保其有效性

可靠性與錯誤預算的平衡藝術

可靠性是SRE工作的核心,但100%的可靠性既不實際也不經濟。在實際工作中,我們需要透過錯誤預算來平衡可靠性與創新速度。

錯誤預算的理念是:將可接受的不可靠性量化,並在此範圍內做出權衡決策。例如,如果設定系統99.9%的可用性目標,則每月可以有約43分鐘的不可用時間。這個時間就是「預算」,團隊可以決定如何「花費」。

在玄貓的實踐中,錯誤預算不僅是一個技術指標,更是一個溝通工具。它幫助技術團隊與業務方建立共識,圍繞可靠性目標進行理性對話。當業務方要求「永不宕機」時,我們可以透過錯誤預算討論,引導他們思考真正的業務需求和成本效益的平衡。

值得注意的是,錯誤預算應該與業務影響掛鉤。不同的服務元件可能需要不同的可靠性目標。例如,支付系統可能需要99.99%的可靠性,而內部報表系統可能99.9%就足夠了。

緩解技術壓力與可持續發展

SRE工作壓力大是業界公認的事實。長期高壓會導致倦怠,進而影響團隊穩定性和服務品質。因此,建立可持續的工作模式至關重要。

在實踐中,玄貓發現以下策略對於維持SRE團隊的健康運作非常有效:

首先,建立健康的反饋迴圈。當系統出現問題時,團隊應該有機會學習和改進,而不僅是承受壓力。每次事件後的回顧應聚焦於系統改進,而非追責。

其次,創造心理安全的環境。團隊成員應該能夠坦率地討論問題和挑戰,而不擔心受到指責。這種環境有助於早期發現問題並促進創新解決方案。

第三,實施輪換制度。無論是輪值還是專案負責人,定期輪換可以避免知識孤島,同時減輕個人負擔。

最後,重視自動化和消除重複性工作(toil)。SRE團隊應該將時間投入到有創造性的工作中,而不是被重複性的操作消耗。

從小處著手的事件回應策略

有效的事件回應不必從複雜的流程開始。事實上,最成功的事件回應系統往往是從簡單開始,逐步演進的。

玄貓建議從建立基本的事件回應計劃開始:

  1. 定義什麼情況構成事件
  2. 明確責任人和溝通通路
  3. 建立基本的事件處理步驟
  4. 記錄和回顧每次事件

這個簡單的框架可以隨著團隊經驗的積累而不斷完善。重點是建立持續學習的文化,而不是一開始就追求完美的流程。

事件回應中,常見的誤區是過度依賴個人英雄主義。雖然有經驗的工程師能夠快速解決問題,但這種模式不可持續,也容易形成知識孤島。更好的方式是建立系統化的知識分享機制,確保團隊整體的回應能力。

SLO測量的設計目標

服務水平目標(SLO)是SRE實踐的核心,但如何設計和測量SLO往往決定了其有效性。

好的SLO測量系統應具備以下特點:

首先,測量應聚焦於使用者經驗。技術指標固然重要,但最終應該反映使用者實際感受到的服務品質。例如,除了測量API回應時間,還應考慮前端渲染時間和互動延遲。

其次,測量應高效與低成本。如果測量系統本身消耗過多資源或增加系統複雜性,可能得不償失。玄貓在實踐中發現,抽樣測量往往是一個好的平衡點,特別是在高流量系統中。

第三,測量結果應易於理解和溝通。複雜的指標可能技術上精確,但如果無法有效溝通給所有利益相關者,其價值就大打折扣。

最後,測量系統本身也應該可靠。如果無法信任測量結果,那麼根據這些結果做出的決策也將失去依據。

在企業環境中引導SRE文化

在傳統企業環境中引入SRE實踐面臨特殊挑戰。與科技公司相比,傳統企業往往有更為複雜的組織結構和既定流程。

玄貓在與多家企業合作中總結出以下策略:

首先,識別並贏得關鍵利益相關者的支援。在企業環境中,沒有高層支援的變革往往難以推進。找到對可靠性有切身利益的業務負責人,讓他們成為SRE實踐的擁護者。

其次,從小處著手,建立成功案例。選擇一個影響面適中的系統或服務,應用SRE實踐並展示成果。這些成功案例將為更廣泛的推廣提供有力支援。

第三,關注業務成果而非技術細節。企業決策者關心的是業務指標的改善,如系統正常執行時間、客戶滿意度和營運成本。將SRE實踐與這些指標掛鉤,更容易獲得支援。

最後,尊重現有文化和流程,尋求漸進式改變。激進的變革往往會遇到強烈抵抗。更有效的方式是將SRE實踐融入現有流程,逐步展示其價值。

講故事的力量:技術溝通的藝術

在SRE工作中,技術能力固然重要,但溝通能力同樣關鍵。特別是在跨團隊協作和向管理階層匯報時,講好故事的能力可以大提高影響力。

有效的技術故事通常包含以下元素:

首先,明確的問題陳述。在描述技術挑戰時,清晰地說明問題的本質、影響範圍和緊迫性。

其次,以人為中心。技術問題最終影響的是人,無論是使用者還是團隊成員。將技術挑戰與人的體驗聯絡起來,使故事更有共鳴。

第三,資料支援。用具體資料說明問題的規模和解決方案的效果,增加故事的可信度。

最後,清晰的行動建議。好的故事不僅描述問題,還提供明確的解決路徑。

玄貓在實踐中發現,維護一個「成就檔案」(brag document)非常有用。記錄自己解決的問題、實施的改進和取得的成果,不僅有助於績效評估,也是提煉故事素材的寶函式庫

技術圖解:一個被低估的工程技能

在複雜系統的設計和溝通中,圖解是一項強大但常被低估的工具。好的技術圖解可以迅速傳達系統架構、資料流向和依賴關係,大提高溝通效率。

在SRE工作中,圖解特別有用的場景包括:

  1. 系統架構描述:展示系統元件及其互動方式
  2. 事件分析:說明故障如何發生和擴散
  3. 改進方案比較:直觀展示不同方案的優缺點
  4. 效能瓶頸分析:視覺化資料流和處理時間

建立有效技術圖解的關鍵是找到合適的抽象級別。過於詳細的圖解可能讓人迷失在細節中,而過於簡化則可能忽略重要資訊。理想的圖解應該根據目標受眾和溝通目的選擇適當的詳細程度。

玄貓建議SRE工程師掌握基本的圖解工具,如Mermaid、Graphviz或Lucidchart。這些工具可以快速建立專業的技術圖解,提高溝通效率。

  graph TD
    A[使用者請求] --> B[負載平衡器]
    B --> C[Web伺服器1]
    B --> D[Web伺服器2]
    C --> E[資料函式庫    D --> E]
    C --> F[快取]
    D --> F

玄貓為你解密:

這個Mermaid圖解展示了一個典型的Web服務架構。使用者請求首先到達負載平衡器,然後被分發到多台Web伺服器。Web伺服器與資料函式庫取系統互動以處理請求。這種圖解可以在團隊討論中快速建立共識,幫助所有人理解系統結構,特別是在討論效能最佳化或故障排除時。

遠端工作中的SRE生產力

隨著遠端工作的普及,SRE團隊面臨著如何保持高效協作和回應能力的挑戰。

遠端SRE工作的關鍵成功因素包括:

首先,建立清晰的可見性。在遠端環境中,系統狀態和團隊活動的可見性尤為重要。使用分享儀錶板、實時協作工具和明確的檔案,確保所有人都能取得必要資訊。

其次,設定明確的界限。遠端工作容易模糊工作與生活的界限,特別是在輪值期間。建立明確的工作時間、輪值交接流程和休息政策,避免倦怠。

第三,投資於自動化。遠端環境中,手動協調的成本更高。增加自動化程度,減少對實時人工干預的依賴。

最後,重視非同步溝通。不同時區的團隊成員可能難以找到共同的會議時間。培養良好的非同步溝通習慣,如詳細的檔案、明確 軟體工程就像分子生物學一樣,需要精確的分析和解決方法。從生物學家到科技公司的工作經驗,玄貓觀察到這些領域共同追求的是系統化思考和問題解決能力。在探討事件管理和團隊協作時,我們看到了跨領域知識如何能夠創造更有效的工作環境。

無論是處理複雜的程式碼問題還是管理突發事件,關鍵在於建立結構化的流程和工具。優秀的工程團隊不僅依靠技術能力,還需要有效的溝通和協作機制。正如作者從分子生物學轉向軟體工程並最終專注於SRE工具開發的經歷所示,跨領域的視角能夠帶來獨特的解決方案。

透過建立適當的事件管理系統,團隊可以減少處理突發事件的時間,將更多精力投入到計劃性工作中。這種平衡不僅提高了生產力,也改善了工程師的工作體驗和滿意度。在快速變化的技術環境中,能夠靈活應對意外情況同時保持前進步伐的團隊,將在長期競爭中脫穎而出。