????先來(lái)一波場(chǎng)景:團(tuán)隊(duì)A忙忙碌碌終于把這個(gè)sprint的story做完了(我們玩的是敏捷開(kāi)發(fā)),給po(產(chǎn)品負(fù)責(zé)人,接下來(lái)篇幅會(huì)以po來(lái)表示)演示完了,po給客戶演示也ok了。po發(fā)來(lái)好消息,跟我們說(shuō)可以上生產(chǎn)了。團(tuán)隊(duì)B還在為處于sprint的周期中,苦苦掙扎。我們內(nèi)心也是滿懷喜悅,心想:“你看那群人還在苦苦掙扎”。終于到了下班時(shí)間了,團(tuán)隊(duì)A對(duì)這次上線已經(jīng)萬(wàn)事俱備了。就差東風(fēng)了。團(tuán)隊(duì)A的leader對(duì)A隊(duì)員說(shuō),麻煩deploy一下服務(wù)A;服務(wù)A部署完畢,沒(méi)有任何問(wèn)題。啪啦啪啦,服務(wù)A、B、C、D都部署好了。到最后發(fā)現(xiàn),天啊,服務(wù)E涵蓋了團(tuán)隊(duì)B的不完整的功能(團(tuán)隊(duì)B的功能還沒(méi)做完,也沒(méi)有測(cè)試過(guò))。好了,此時(shí)的你,我相信你會(huì)“吐血”,吐完血還是乖乖把服務(wù)A、B、C、D回滾回來(lái)。然后打電話跟po說(shuō),上線失敗了。
? ? 我相信在多團(tuán)隊(duì)協(xié)作的時(shí)候,總是會(huì)遇到上線不同步,代碼被覆蓋,功能不見(jiàn)了,等等這些讓痛心疾首的情況。那么該如何避免上述的情況呢?我們來(lái)一層一層拋開(kāi)問(wèn)題的本質(zhì)。問(wèn)題:為什么團(tuán)隊(duì)A上線,需要等待團(tuán)隊(duì)B?因?yàn)榇蠹业膕print的周期不一致,ok,這個(gè)我們沒(méi)辦法避免,因?yàn)槊總€(gè)團(tuán)隊(duì)負(fù)責(zé)的功能大小不一致,po也不一樣,所以在時(shí)間上無(wú)法同步。那么我們只需要做到團(tuán)隊(duì)A上線不需要等待團(tuán)隊(duì)B就好了。那么會(huì)有人問(wèn),如何做到不等待?團(tuán)隊(duì)A做完功能需要合并到develop環(huán)境(集成測(cè)試環(huán)境,接下來(lái)篇幅會(huì)以develop環(huán)境來(lái)表示),然后合并到uat環(huán)境(預(yù)發(fā)布環(huán)境,接下來(lái)篇幅會(huì)以u(píng)at環(huán)境來(lái)表示)給用戶演示。團(tuán)隊(duì)B也一樣,也需要做同樣的動(dòng)作。那又會(huì)有人提出建議,團(tuán)隊(duì)A把功能上到uat環(huán)境,然后給客戶演示,客戶ok了,團(tuán)隊(duì)A就把功能上線,接下來(lái)就輪到團(tuán)隊(duì)B,上到uat環(huán)境給客戶演示團(tuán)隊(duì)負(fù)責(zé)的功能,ok了,然后上線,這樣就不會(huì)沖突了。這個(gè)也算是一種方案。但是這個(gè)方案需要天時(shí)地利人和齊聚才能得以實(shí)現(xiàn),因?yàn)樵诂F(xiàn)實(shí)情況下,給po演示完,po給客戶演示這往往需要等待一段漫長(zhǎng)的過(guò)程,甚至給客戶演示完,客戶也會(huì)得到“啟發(fā)”,給你來(lái)個(gè)“我需要根據(jù)手機(jī)殼的顏色改變屏幕的顏色”的需求。這個(gè)時(shí)候,你可能還需要幾天時(shí)間去修改功能。整個(gè)過(guò)程下來(lái)可能需要一個(gè)星期。也就是說(shuō)團(tuán)隊(duì)B需要等待團(tuán)隊(duì)A用完這個(gè)坑才能用,效率極低。
? ? 上面講到一種方案,我想大家不會(huì)采用。那是否還有更好的方案嗎?當(dāng)然有,不然我早死了?!鞍l(fā)布火車(chē)”,什么是發(fā)布火車(chē)呢?從字面上來(lái)理解,就是像火車(chē)一樣,定時(shí)就會(huì)載貨走,不會(huì)等任何人。說(shuō)好的定時(shí),那什么為開(kāi)始時(shí)刻呢?在你的代碼推向develop環(huán)境那一刻開(kāi)始,“火車(chē)”就開(kāi)始啟動(dòng)了,也就是只要你的代碼部署到develop環(huán)境,就說(shuō)明你的功能是完整的、可用的、是可以上線的。這樣約束會(huì)有什么好處呢?限制其他團(tuán)隊(duì)把不完整或者殘缺的功能推向develop,影響可以上線的功能。也就是說(shuō)團(tuán)隊(duì)A開(kāi)發(fā)好功能了,團(tuán)隊(duì)向po演示完,po接收,我們把功能部署到uat環(huán)境,po向客戶演示完,決定可以上線,是不會(huì)攜帶不完整或者殘缺的功能的。但是也有可能會(huì)攜帶其他團(tuán)隊(duì)的功能,但是攜帶的功能起碼是完整的,可用的。這樣也不至于影響到團(tuán)隊(duì)A的上線了。這個(gè)約束可以解決上述案例中的一個(gè)痛點(diǎn):團(tuán)隊(duì)A上線時(shí)發(fā)現(xiàn)有團(tuán)隊(duì)B不完整的功能。
? ? 肯定有人問(wèn),那測(cè)試人員在哪里測(cè)試?如何保證部署到develop環(huán)境的功能是完整的?團(tuán)隊(duì)向po演示是用什么環(huán)境演示?同時(shí)也會(huì)出現(xiàn)團(tuán)隊(duì)A攜帶了團(tuán)隊(duì)B的完整功能,但是團(tuán)隊(duì)B的功能客戶那邊還沒(méi)確認(rèn)可以上線,就把團(tuán)隊(duì)B的功能帶上生產(chǎn)了,等等問(wèn)題。我來(lái)一個(gè)一個(gè)解釋我們是如何做的。
? ??