-
在第一階段,網際網路應用程式的構建和部署與“伸縮包裝”軟體的運輸方式類似。三個不同的工作角色(開發,QA和運營)相互協作,經過很長的工程週期將應用程式從開發轉移到生產。在此階段,每個應用程式都部署在專用資料中心或託管設施中,這進一步需要熟悉特定站點網路,硬體和系統管理的操作人員。
-
在第二階段,主要由亞馬遜和谷歌在90年代末和00年代初帶頭,網際網路應用程式在超高速發展的公司中開始採用類似於現代DevOps運動的做法(鬆散耦合的服務,敏捷開發和部署,自動化等等)。這些公司仍然執行私有的(大型)資料中心,但由於涉及的規模,他們開始開發集中式基礎架構團隊去解決所有服務所需的常見問題(網路,監控,部署,配置,資料儲存,快取,物理基礎設施等)。然而亞馬遜和谷歌從未完全統一開發工作角色(亞馬遜稱之系統工程師,谷歌稱之網站可靠性工程師)以及認識到每個人所涉及的不同技能和興趣。
-
在第三階段或雲原生階段,網際網路應用程式現在依賴託管彈性架構以從頭開始構建,通常這由“三大”公有雲服務商之一提供。盡可能快地將產品推向市場的主要原因一直是因為產品失敗的可能性高,但是在雲原生時代,“開箱即用”的基礎技術允許一種比以前更加笨重的迭代速度。在這個時代開始的公司的另一個定義特徵是避免聘用非軟體工程師角色。可用的基礎設施基礎是如此相當強大,他們認為創業資金應更好地花在可以同時進行工程和運營(DevOps)的軟體開發人員身上。
-
根據我的經驗,成功的早期創業公司工程師是一個特殊的工程師。他們具有風險承受能力,學習速度極快,無論發生何種技術債務都能儘快完成工作,通常可以在多種系統和語言中工作,並且通常具有操作和系統管理的先前經驗,或者願意學習所需知識。簡而言之,典型的創業工程師非常適合成為DevOps工程師,無論他們是否想這樣子稱呼自己。
-
如上所述,現代公有雲為構建提供了令人難以置信的基礎架構。過去的大多數基本操作任務都已自動化,剩餘的底層足以發行最小的可行產品去驗證是否有適合的產品市場。
-
我堅信,當開發人員被迫on-call並對他們編寫的程式碼負責時,系統的質量將會提高。沒有人喜歡經常被尋呼。這個反饋迴圈構建了一個更好的產品,正如我在(1)中所描述的那樣,吸引到早期初創產品工作的工程師非常願意學習和完成操作工作。鑒於對可靠性差的初創產品通常幾乎沒有反響,這一點尤為如此。可靠性需要足夠好以使產品找到適合市場併進入超高速發展階段。
-
人員增長率迅速增加,對通訊和工程效率造成嚴重壓力。我強烈推薦閱讀The Mythical Man-Month[2](在最初出版近50年後仍然具有相關性),以獲取有關此主題的更多資訊。
-
上述幾乎總是導致從單體架構向微服務架構轉變,這是一種解耦開發團隊並提高通訊和工程效率的方法。
-
從單體到微服務架構的轉變將系統基礎架構的複雜性提高了幾個數量級。網路,可觀察性,部署,庫管理,安全性以及以前不難解決的數百個其他問題,這些現在都是急需解決的主要問題。
-
與此同時,超高速發展意味著流量增長和由此產生的技術擴充套件問題,以及對完全失敗和次要使用者體驗問題的更大影響。
-
正如我以上描述,現代雲原生技術和大量抽象允許使用越來越複雜的基礎設施來構建功能非常豐富的應用程式。自然而然,大多數公司將不再需要一些專業技能,如資料中心設計和運營。
-
在過去的15年中,業界一直專註於軟體工程是所有學科的根本。例如,微軟淘汰了傳統的QA工程師,並將其替換為軟體測試工程師,其理念是手動QA效率不高,所有測試都應該自動化。同樣,傳統的運營角色已經被站點可靠性工程師或類似的所取代,其理念是手動操作效率不高,並且擴充套件的唯一方法是透過軟體自動化。首先宣告我是同意這些趨勢的,自動化是一種更有效的擴充套件方式。
-
通用型與專家。更複雜的應用程式和體系結構需要更多的專業技能才能成功,無論是前端,基礎架構,客戶端,操作,測試,資料科學等。這並不意味著全能型不再有用,或者全能型不能學會併成為專家,它只是意味著更大的工程組織需要不同型別的工程師才能取得成功。
-
所有工程師都不喜歡去做所有的事情。有些工程師喜歡做全棧。有些人喜歡專業化。有些人喜歡編寫程式碼。有些人喜歡除錯。有些喜歡UI。有些喜歡系統。一個支援各型別專家不斷發展的工程組織必須解決這樣一個事實,即員工的幸福感有時涉及某些具體型別的問題,而非其他。
-
所有工程師也不都擅長做所有事情。在我的整個職業生涯中,我遇到了很多很棒的人。某些人可以從IDE中的空檔案開始,從頭開始建立一個令人難以置信的系統。與此同時,這些人對如何執行可靠系統,如何除錯它們,如何監控它們等等幾乎沒有直覺經驗。相反,我一直在進行許多令人激動的訪談迴圈,其中一個真正令人難以置信的是運營工程師可以純粹透過除錯方面的專業知識和如何執行可靠系統的天生直覺,對整個組織產生巨大好處,但他們被拒絕僅是因為沒有展示“足夠的編碼技能”。
-
遷移到微服務。當一個工程組織達到約75人時,幾乎可以肯定有一個核心基礎設施團隊開始開發構建產品團隊構建微服務所需的基礎通用功能。
-
純粹的DevOps。與此同時,產品團隊被告知要做DevOps。
-
可靠性顧問。在這種組織規模上,那些傾向於從事基礎設施工作的工程師很可能是那些在該領域具有先前運營經驗或良好直覺的工程師。這些工程師不可避免地成為事實上的SRE/生產工程師,並作為顧問來幫助組織內的其他成員,同時繼續開發業務執行所需的基礎架構。
-
缺乏教導。作為一個行業,我們現在希望僱用可以介入開發和運營網際網路服務的人。然而,我們普遍在新員工以及執行這項任務所需的繼續教育方面做得很糟糕。當我們從不教授技能時,我們怎能指望工程師具備操作直覺?
-
支援失敗。隨著工程組織招聘率的不斷提高,核心基礎架構團隊不再能夠在繼續構建和運營對業務成功至關重要的基礎架構的同時還要保持支援幫助產品團隊完成運營任務。基礎設施工程師在其現有工作量的基礎上,作為組織範圍的SRE顧問,承擔雙重責任。每個人都明白培訓和檔案是至關重要的,但是很少有人優先安排去完成這兩件事的時間。
-
職業倦怠。更糟糕的是之前描述的情況造成了人員流失並降低了整個組織計程車氣。產品工程師覺得他們被要求做他們不想做或者沒有被教過的事情。基礎設施工程師在提供支援的重壓下開始倦怠,雖然知道培訓和檔案迫切需要但卻無法優先處理它,當同時在保持整個公司的現有系統以高可靠性執行。
-
僅是SRE需時刻待命還是軟體工程師也分擔待命職責?
-
SRE是否實施實際工程以及自動化,還是他們僅需要執行手動和重覆性任務,例如部署,重覆頁面解析等?
-
SRE是屬於核心諮詢機構還是嵌入到產品團隊?
-
認識到運營和可靠性工程是一個獨立且極具價值的技能組合。我們急於實現一切自動化以及軟體工程師可互換的想法,使得與軟體工程師同等價值的工程人員的一部分邊緣化。運營工程師和軟體工程師是合作伙伴,而不是可互換的齒輪。
-
SRE不是隨叫隨到的,監控儀錶面板或是隻會部署的猴子。他們是專註於可靠性任務而非產品任務的軟體工程師。理想的結構要求所有工程師會執行基本的運營任務,包括待命on-call,部署和監控等。我認為這非常重要,因為它有助於避免可靠性和軟體工程師之間的類/工作分層,並使軟體工程師更直接地對產品質量。
-
SRE應該嵌入到產品團隊中,而不是向產品團隊工程經理報告。這允許SRE與他們的團隊融合,獲得相互信任,並且仍然具有適當的核查與平衡,以便在嘗試權衡可靠性與功能時可以進行真正的對話。
-
嵌入式SRE的標的是透過實施面向可靠性的功能和自動化,指導和教育團隊其他人員的運營最佳實踐來提高產品的可靠性,並充當產品團隊和基礎架構團隊之間的聯絡人(檔案反饋,痛點,所需功能等)。
-
任何希望參與競爭的新技術公司都需要DevOps風格的敏捷開發和自動化。
-
公有雲原生基元以及一個小型的核心基礎架構團隊可以允許工程組織在由於缺乏教導和角色特性而開始出現運營損失之前擴充套件到數百名工程師。
-
想要在可掌控的人員擴充套件問題上獲得成功,需要對新員工和繼續教育,檔案以及嵌入式SRE團隊的開發進行真正的投資,這些團隊可以在產品團隊和基礎架構團隊之間架起橋梁。
-
https://twitter.com/mattklein123/status/1001979384968957952
-
https://en.wikipedia.org/wiki/The_Mythical_Man-Month