亞馬遜是這種模式的極端例子:向后兼容所有事情。每個(gè)團(tuán)隊(duì)全副武裝后前進(jìn)。一切完全獨(dú)立,沒有團(tuán)隊(duì)可以預(yù)測(cè)其他團(tuán)隊(duì)的情況。它使得AWS的產(chǎn)品成為可能。然而,它帶來了大量的技術(shù)開銷,以及不那么親和的工作文化。
谷歌走向另一個(gè)極端。他們的monorepo允許更多團(tuán)隊(duì)之間的耦合,庫是共享的。他們通過極度的工具化來彌補(bǔ)——測(cè)試,重構(gòu)工具,自定義版本控制和構(gòu)建系統(tǒng),甚至整個(gè)編程語言。成千上萬的工程師在為谷歌的基礎(chǔ)設(shè)施工作,所以他們通過技術(shù)開銷來實(shí)現(xiàn)并頭前進(jìn)。
平凡如我們,平衡一下吧
對(duì)于谷歌亞馬遜之外的我們來說,公司里有7-1000個(gè)工程師,不能過于極端化。我們不禁要問:哪里的一致性比較重要?哪里的一致性會(huì)阻礙我們前進(jìn)?
目標(biāo)和方向上的一致性是非常重要的。我們建立了相同的業(yè)務(wù),所追求的業(yè)務(wù)結(jié)果最好也是相同的。
一致性在后端可能會(huì)造成嚴(yán)重后果。當(dāng)需要協(xié)調(diào)發(fā)布時(shí),當(dāng)不能在無法預(yù)測(cè)是否影響其他團(tuán)隊(duì)的前提下升級(jí)庫時(shí),當(dāng)數(shù)據(jù)庫變化可能打破一個(gè)系統(tǒng)關(guān)鍵性生產(chǎn)時(shí)——這些都可能會(huì)導(dǎo)致系統(tǒng)癱瘓。所以不要讓團(tuán)隊(duì)彼此共享數(shù)據(jù)庫或者庫。
利用共享的工具和專業(yè)知識(shí)呢?如果每個(gè)團(tuán)隊(duì)運(yùn)行自己的數(shù)據(jù)庫,這些箭頭會(huì)迅速變寬,除非他們克扣了檢測(cè)和冗余——然而這樣會(huì)導(dǎo)致系統(tǒng)非常脆弱。我們并不想在系統(tǒng)掛掉后重構(gòu)一切。
答案是寬箭頭和高箭頭兼而有之。當(dāng)它們?cè)趦?nèi)部服務(wù)時(shí),共享的工具非常棒。讓數(shù)據(jù)管道服務(wù)合作伙伴以及向團(tuán)隊(duì)匯報(bào)。讓數(shù)據(jù)庫團(tuán)隊(duì)為其他團(tuán)隊(duì)提供支持良好的數(shù)據(jù)庫實(shí)例。(它們?nèi)匀皇菃为?dú)的數(shù)據(jù)庫,但是現(xiàn)在我們有共享的工具來與之合作,數(shù)據(jù)管道讓彼此同步。)

綠色、紅色和藍(lán)色箭頭窄而高,幾乎全部填滿工作,一些線將它們彼此連接。紫色和一個(gè)新的黑色箭頭寬且短,工作充分。寬箭頭(內(nèi)部服務(wù))巧妙地與高箭頭(產(chǎn)品團(tuán)隊(duì))進(jìn)行溝通。
敲黑板,總結(jié)
避免共享代碼庫,除非你像谷歌那樣有完美的測(cè)試覆蓋率,或者像亞馬遜那樣有一整個(gè)團(tuán)隊(duì)負(fù)責(zé)支持向后兼容的庫。
避免共享數(shù)據(jù)庫實(shí)例,但是要建立內(nèi)部團(tuán)隊(duì)支持常見的數(shù)據(jù)庫工具。
鼓勵(lì)分享想法,在一個(gè)組織內(nèi)人們隨機(jī)的交流擁有巨大的潛力。弄明白其他團(tuán)隊(duì)在做什么,可以完善自己的方向以及提升開發(fā)速度。
在目標(biāo)結(jié)果、為什么做以及如何做上達(dá)成一致。在同一個(gè)方向上,獨(dú)立地前進(jìn)。
每一個(gè)組織都是一個(gè)分布式的系統(tǒng),哪怕我們彼此就坐在旁邊。協(xié)調(diào)使得共同工作成為可能,卻不是全無代價(jià)。在你的組織成長(zhǎng)過程中注意權(quán)衡,因?yàn)橐恢滦栽絹碓綗o用,也越來越花費(fèi)巨大。新人的加入需要更多的協(xié)調(diào)成本。讓團(tuán)隊(duì)按照他們各自的方式前進(jìn),只要在一個(gè)大方向上是一致的就可以。
分布式系統(tǒng)很難,然而我們可以做到。
作者:Jessitron 文章來自: http://blog.jessitron.com