揭秘Shopify的軟件發(fā)布流程,如何做到合并上千程序員的工作?
2019 年,Shopify 在博客中分享了自己成功合并千名開發(fā)人員工作的經(jīng)驗(yàn),并介紹了工具 Merge Queue v2,很多人都好奇為什么 Shopify 要構(gòu)建這樣的一款工具呢?
其實(shí)答案很簡(jiǎn)單,不少企業(yè)發(fā)展到一定階段后就會(huì)遇到這樣的情況。隨著業(yè)務(wù)發(fā)展,Shopify 意識(shí)到市面上沒有任何現(xiàn)成的產(chǎn)品可以徹底解決他們面臨的困難。從更長(zhǎng)遠(yuǎn)地來看,Shopfiy 認(rèn)為公司應(yīng)該為開發(fā)人員提供盡量完善的開發(fā)體驗(yàn),并要塑造一種"軟件發(fā)布文化",所以就開始不斷改進(jìn)現(xiàn)有的工具鏈和流程方法。
Shopify 是這樣定義企業(yè)文化的:
Shopify 所有人信念和行為的總和。
軟件發(fā)布工作是開發(fā)工作的子集,自然,"軟件發(fā)布文化"也要和企業(yè)文化保持一致。Shopfiy 的軟件發(fā)布工作規(guī)范與其他企業(yè)沒有太大不同,比如他們要求錯(cuò)誤的更改不應(yīng)該流入生產(chǎn)環(huán)境,破壞用戶體驗(yàn);生產(chǎn)環(huán)境中所做的更改不應(yīng)該犧牲安全性等等。
通往羅馬的道路不止一條,同樣的軟件發(fā)布文化,也有很多可選的實(shí)現(xiàn)路徑。Shopify 認(rèn)為,企業(yè)支持團(tuán)隊(duì)?wèi)?yīng)該為開發(fā)人員開辟一條路徑,讓他們自由發(fā)揮生產(chǎn)力和創(chuàng)造力,并實(shí)現(xiàn)自己的目標(biāo)。企業(yè)應(yīng)該營(yíng)造一種氛圍,讓版本發(fā)布成為一種勝利時(shí)刻。
1. Shopify 如何評(píng)估軟件發(fā)布文化
如何塑造軟件發(fā)布文化?
首先要考慮以下問題:
- 開發(fā)人員希望選擇怎樣的工作方式?
- 對(duì)他們來說哪些事情比較重要?
- 他們?nèi)绾慰创脕碇С炙麄兊墓ぞ撸?/li>
- 他們想知道多少幕后信息,想了解多少自己使用的工具背后的知識(shí)?
這些問題往往沒有單一的答案,尤其是 Shopify 這家企業(yè)中每天參與軟件部署工作的人員眾多,涉及的崗位也多種多樣。Shopify 選擇了一些主動(dòng)和被動(dòng)的方法來評(píng)估企業(yè)內(nèi)部的軟件發(fā)布文化,這些方法不分先后,它們共同描繪出了一幅關(guān)于開發(fā)人員如何使用各種工具的圖景。
其中,被動(dòng)方法主要用來管理和匯總輸入的信息,并不需要企業(yè)支持團(tuán)隊(duì)去做很多工作。其中,有一個(gè)方法是 開發(fā)人員滿意度調(diào)查,這是對(duì) Shopify 全公司的開發(fā)人員每半年進(jìn)行一次的調(diào)查研究。開發(fā)人員需要報(bào)告很多信息,比如說他們對(duì)自己所使用的工具的滿意度,或者工作中哪些環(huán)節(jié)非常浪費(fèi)時(shí)間等等。
此外,公司還專門設(shè)立了面向所有人開放的 Slack 頻道。在這個(gè)頻道上,產(chǎn)品用戶可以從開發(fā)團(tuán)隊(duì)或其他用戶那里獲得支持,并報(bào)告他們遇到的問題。Shopify 團(tuán)隊(duì)會(huì)積極參與這些頻道的互動(dòng),培養(yǎng)社區(qū)氛圍并鼓勵(lì)開發(fā)人員分享經(jīng)驗(yàn)。需要注意的是,這些頻道并不是用來獲取產(chǎn)品反饋的主要渠道。
總的來說,他們希望能主動(dòng)找出產(chǎn)品和服務(wù)中的痛點(diǎn)所在,而且意識(shí)到了這個(gè)過程并不能過分依賴用戶,因此 Shopify 也采取了一些積極的措施來找出最重要、優(yōu)先級(jí)最高的問題。
一種措施叫做 dogfooding。公司內(nèi)開發(fā)團(tuán)隊(duì)用來發(fā)布代碼的工具是和構(gòu)建與維護(hù)代碼的工具完全一致的。這樣就很容易找出服務(wù)的缺陷所在,并在出現(xiàn)產(chǎn)品問題時(shí)站在用戶的視角上理解其影響。
另一項(xiàng)重要資源是 Shopify 的 內(nèi)部支持團(tuán)隊(duì)。他們需要幫助用戶,還要支持企業(yè)內(nèi)部不斷發(fā)展的工具套件,這是很艱巨的挑戰(zhàn)。他們需要診斷問題,幫助用戶找到合適的團(tuán)隊(duì)來指導(dǎo)他們解決這些問題。他們能夠找出用戶在當(dāng)前工作流程中遇到的常見痛點(diǎn)以及概念和原型的潛在問題。
最后,在添加新功能或更改現(xiàn)有工作流程時(shí),Shopify 會(huì)在整個(gè)過程中實(shí)施 用戶體驗(yàn)研究分析:
- 更好地了解用戶行為和期望
- 在開發(fā)概念和原型時(shí)測(cè)試它們
當(dāng)開發(fā)人員發(fā)布 PR 時(shí),團(tuán)隊(duì)會(huì)單獨(dú)考察開發(fā)人員的想法,了解他們都在考慮哪些內(nèi)容,在制定決策時(shí)都有怎樣的根據(jù)。團(tuán)隊(duì)會(huì)與設(shè)計(jì)師和撰稿人等用戶交流,學(xué)習(xí)他們的日常工作流程,了解他們所依賴的工具和用法。公司會(huì)讓實(shí)習(xí)生和新人測(cè)試產(chǎn)品原型,從中了解外部和新鮮視角的觀點(diǎn),并挑戰(zhàn)原有的產(chǎn)品假設(shè)。
有了這些流程,企業(yè)就能在整個(gè)構(gòu)建和發(fā)布過程中都能從真實(shí)用戶那里獲得一手反饋,進(jìn)而打造更好的產(chǎn)品和服務(wù)。
反饋是一種禮物
在 Shopify 經(jīng)常提到的一句話就是,反饋是一種禮物。
評(píng)估軟件發(fā)布文化的目的是創(chuàng)建一個(gè)反饋循環(huán),讓用戶可以輕松談?wù)撍麄冇龅搅四男┱系K,收到反饋的開發(fā)團(tuán)隊(duì)會(huì)重視這些意見并嘗試采取對(duì)策。
還有很重要的一點(diǎn)是,用戶的反饋會(huì)讓產(chǎn)品團(tuán)隊(duì)充滿動(dòng)力,即便反饋是負(fù)面的,這也是用戶重視產(chǎn)品、希望產(chǎn)品變得更好的一種證明,這自然會(huì)鼓勵(lì)團(tuán)隊(duì),甚至讓他們?cè)诿鎸?duì)困境時(shí)振作起來。用戶希望自己的反饋能有價(jià)值,這是企業(yè)要給用戶營(yíng)造的氛圍,企業(yè)的軟件開發(fā)文化和工具鏈應(yīng)該支持這種良性循環(huán),讓所有人都能從中獲益。
2. Shopify 的軟件發(fā)布流程
Shopify 的軟件發(fā)布流程是怎樣的形態(tài),又有哪些可以改進(jìn)的部分呢?
發(fā)布管道
發(fā)布管道路徑
這就是 Shopify 發(fā)布管道的路徑。一開始是拉取請(qǐng)求(PR),然后是持續(xù)集成(CI)/ 合并,接著是金絲雀部署,最后是生產(chǎn)發(fā)布。
PR 和 /shipit 命令
這套流程的第一步是開發(fā)人員創(chuàng)建 PR,然后在準(zhǔn)備交付時(shí)發(fā)出一條 /shipit 命令。接下來,Merge Queue 系統(tǒng)會(huì)嘗試將 PR 與主干 Master 集成起來。
PR 合并到 Master,金絲雀部署
當(dāng) Merge Queue 確定更改可以成功集成時(shí),PR 就會(huì)合并到 Master,并部署到 Shopify 的金絲雀基礎(chǔ)架構(gòu)中。金絲雀環(huán)境會(huì)隨機(jī)接收所有傳入請(qǐng)求的 5%。
更改部署到生產(chǎn)環(huán)境
開發(fā)人員有一套工具,可以在金絲雀環(huán)境中測(cè)試更改 10 分鐘的時(shí)間。如果沒有手動(dòng)干預(yù),并且金絲雀自動(dòng)分析不會(huì)觸發(fā)任何警報(bào),則更改將部署到生產(chǎn)環(huán)境中。
發(fā)布與恢復(fù)機(jī)制
每一位開發(fā)人員都希望能被信任,并對(duì)自己的工作擁有自主權(quán)。開發(fā)人員應(yīng)該能控制自己 PR 的整個(gè)發(fā)布過程。
開發(fā)人員控制整個(gè)過程
在 Shopify 的軟件發(fā)布流程中,開發(fā)人員能控制整個(gè)發(fā)布過程。這里不存在什么發(fā)布管理器、注銷或者審核窗口。
限制不良更改爆炸半徑的基礎(chǔ)設(shè)施
然而是人就會(huì)犯錯(cuò),出現(xiàn)問題是難免的,Shopify 當(dāng)然也不例外。為此,公司建立了一套基礎(chǔ)架構(gòu)來限制不良更改的爆炸半徑。最重要的是,企業(yè)相信每位開發(fā)人員都應(yīng)該承擔(dān)自己應(yīng)負(fù)的責(zé)任,并且如果他們的更改捅了簍子,他們也應(yīng)該能自己去恢復(fù)它。
開發(fā)人員可以使用 /shipit--emergency 命令快速跟蹤修訂
一旦準(zhǔn)備好了修復(fù)程序(修復(fù) - 轉(zhuǎn)發(fā)或還原),開發(fā)人員就可以使用一條 /shipit --emergency 命令快速追蹤整個(gè)修復(fù)進(jìn)程。Shopify 沒有那么多恢復(fù)協(xié)議,而只有一個(gè) 緊急狀況 功能,這樣就能讓開發(fā)人員以最快的速度完成恢復(fù)操作。
快速發(fā)布
開發(fā)人員希望快速發(fā)布。
發(fā)布速度是大多數(shù)企業(yè)應(yīng)用程序的一個(gè)關(guān)鍵要素。對(duì)于開發(fā)人員而言,如果能一天多次發(fā)布代碼并立即將其發(fā)送給最終用戶,就能極大提高生產(chǎn)力。但更重要的是,采用快速的發(fā)布流程可以帶來同樣快速的恢復(fù)流程。
為了真正加快發(fā)布過程,企業(yè)是需要投入資源和成本的。除了專門的基礎(chǔ)架構(gòu)團(tuán)隊(duì),Shopify 還管理著自己的 CI 群集,容量高達(dá)數(shù)千個(gè)節(jié)點(diǎn)。
自動(dòng)化
開發(fā)人員不想執(zhí)行重復(fù)性的任務(wù)。計(jì)算機(jī)最擅長(zhǎng)做重復(fù)工作,所以這類工作應(yīng)該盡可能地自動(dòng)化。Shopify 在諸如連續(xù)部署和金絲雀分析之類的地方實(shí)現(xiàn)了自動(dòng)化。
在 Shopify,開發(fā)人員用不著按一個(gè)部署按鈕,自動(dòng)化流程會(huì)持續(xù)部署到金絲雀和生產(chǎn)環(huán)境。
自動(dòng)化固然很棒,但是某些時(shí)候開發(fā)人員還是需要手動(dòng)控制的。在緊急情況下,開發(fā)人員可以鎖定自動(dòng)部署并轉(zhuǎn)為手動(dòng)部署。