原話是“Continuous Deployment is the holy grail”。在聽到的這句話的時候,我的燈泡突然被點亮了。說得實在是太對了。有一句老話是“綱舉目張”。意思是提起漁網上總繩,一個個網眼就會被張開。我們的很多實踐,就像這漁網上的網眼,琳瑯滿目。我們缺乏的就是這樣一個總繩來把所有的實踐聯系起來。No,No,No,你錯了。你可能要說,我們有這樣的一個總繩,它的名字叫Agile。那是昨天的名字了,今天的名字叫Lean,天曉得明天的名字會是啥。這個總繩,還叫Pragmatic,還叫Value Driven。這些確實是可以起到概括一切的作用,但是你怎么知道你做的是不是
Agile呢?是不是Lean呢?是不是Pragmatic呢?是不是Value Driven呢?這些都缺乏一個實際的可測性。Continuous Deployment,強大之處就在于,他很直白,甚至是缺乏內涵的。所以很容易知道,你到底做到了沒有。這就是我們所需要的總繩,能夠時刻時刻地把我們所有的實踐團結在一起,綱舉目張。
那么持續部署為什么就是王道了?這里有兩個可以產生歧義的地方,持續部署與王道。什么是持續部署?而王道又是什么?Holy grail,王道其實就是說this thing is good。我們經常在口頭上對某件事物表示贊嘆,常用的詞匯就是“好”。王道就是特別好。好是主觀的,我認為軟件開發這個領域中,好就意味能夠從投入產生出持續的真金實銀的回報。好也不在于界面如何友好,不在于code有多優美,所有這些指標都是間接的。唯一的指標就是到底產生了多少金錢上的回報。如果我們假設,軟件開發產生回報的唯一手段就是把軟件部署到產品環境,去提供服務(另外一個方面,如果不用部署就能產生回報,也許就不是一個軟件開發項目,也許是某些政府部門的政治項目)。可以得出一個結論就是,要持續的產生回報就必須持續地進行部署。這看似是一個很淺顯的道理,但是淺顯的問題的可怕之處就在于,不是所有的人都意識到了這一點。
持續部署又是什么?持續意味著一直在部署,相對的就是偶爾部署。持續與偶爾部署的區別就在于,你把部署看做一種常態,還是一種偶然發生的事情。如果部署在所有的開發行為中,所在占到了10%而不是1%,那么就不再是偶爾才做的事情了。要想朝著持續部署的方向前進,意味著以前開發向前10步做一次部署,就得朝著5步一次部署,2步一次部署前進。持續并不是很難理解的問題,難度在于How?前面說了持續部署只是一個總繩,而漁網上的那么多的網眼就是How的答案。我們有SOA的架構,有高耦合低內聚的設計,有Domain Driven Design。有在線的Migration。給持續部署找出具體于你的Context的解決方案,就是整個Team需要努力的事情,它只是一個方向,而不是一個具體的solution。
最容易在實踐中被混淆的就是“部署”。這似乎是另外一個很淺顯的問題,但同樣你會驚訝于到底有多少次我們做到了真正的部署。部署不僅僅是把軟件包安裝到某臺機器上 ,讓人可以來用。部署意味著,確實給業務提供服務。最容易檢測的方法就是,把你部署好的軟件反部署之后,會有多少業務無法運行,有多少比例的用戶受到影響。根據這樣的定義,部署到Staging環境不是部署,部署成為一個只有1%用戶使用的Pilot版本也不是部署,部署到服務器上,但是所有用戶仍然再用舊的系統,只是出于好奇才來用一兩下的情況也不是部署。只有部署到產品環境上,給絕大部分用戶使用,提供別的系統無法提供的服務時,才算是真正的部署。不要拿什么用戶體驗改進來搪塞了,不要再喊什么這只是一個Pilot了。只要不是真正地提供無可替代的服務,就根本不可能產生一個子的價值。“部署”成一個測試環境,只不過是給將來真正的部署,去賺那真真的一個子的錢,做準備而已。在此之前,都是投入,而不是產出。在產出真正實現之前,都是浪費。
你有沒有問過你自己,你過去一年寫的代碼,有現在是部署了的。你過去三個月寫的代碼,現在是部署了的。你過去一個月寫的代碼,現在是部署了的。你過去兩個星期的代碼,現在是部署了的?不在于代碼的多少,以及功能是否強大,只要是部署了,起碼就有提供價值的可能。我們需要的就是,每天都問自己一遍這個問題。不但要個人的reflection,整個團隊都要問這個問題。最重要的是,product owner,也就是我們乙方所謂的甲方,是不是也在問自己這個問題?如果是,那么很好,那么我們在追求卓越軟件的道路上了,至少已經開始上路了。之前,只不過是在泥沼中爬行而已。
浙公網安備 33010602011771號