為什么我們要使用Go語(yǔ)言以及如何使用它的
我們SoundCloud是一個(gè)使用多種編程語(yǔ)言的公司,雖然我們的技術(shù)架構(gòu)最外層一直使用的是Ruby on Rails,但是在后端,各種各樣的編程語(yǔ)言都有涉及。在這里我想多講一下為什么要使用和如何使用Go這樣一種開(kāi)源的、剛剛發(fā)布其1.0版本的編程語(yǔ)言的。
在我們的公司里,所有的技術(shù)人員都是全能選手,而不是專(zhuān)才,這是根植于公司基因文化里的特征。我們希望每個(gè)人都能對(duì)公司的基礎(chǔ)架構(gòu)中每一部分都至少有相當(dāng)?shù)牧私?。更進(jìn)一步,我們鼓勵(lì)技術(shù)人員在個(gè)開(kāi)發(fā)團(tuán)隊(duì)間調(diào)換,甚至組成新的團(tuán)隊(duì),使成員跟各團(tuán)隊(duì)的沖突和摩擦盡量減少。在這樣一種代碼共產(chǎn)共有的環(huán)境中,非常需要一種表達(dá)性強(qiáng),效率高的語(yǔ)言來(lái)降低實(shí)施的困難,Go語(yǔ)言證明了它是一種非常適合的語(yǔ)言。
我們已經(jīng)有好幾個(gè)程序員都把Go語(yǔ)言描述為是一種所見(jiàn)即所得(WYSIWYG)的編程語(yǔ)言。這是說(shuō),代碼要做的事和它在字面上表達(dá)的意思是完全一致的。這種特征對(duì)于使軟件無(wú)歧義和可維護(hù)有著巨大的幫助。Go語(yǔ)言明確的拒絕“helper”習(xí)慣用法以及諸如統(tǒng)一訪問(wèn)原則(Uniform Access Principle)、操作符重載、缺省參數(shù)、甚至異常等特征,基本上,這些特征相較于能產(chǎn)生更豐富的表達(dá),它們的歧義性會(huì)帶來(lái)更大的問(wèn)題。不否認(rèn),這樣的策略會(huì)帶來(lái)更多的鍵盤(pán)敲擊——尤其是,正如大多數(shù)參與Go語(yǔ)言項(xiàng)目的新手程序員痛斥的,在異常處理時(shí)最麻煩——但是,換來(lái)的報(bào)答是,還是這些新手程序員,他們能輕易的、迅速的將應(yīng)用在腦海里形成一個(gè)完整的模型。我可以很有信心的告訴大家,從項(xiàng)目開(kāi)始到提交代碼,Go是我們使用過(guò)的效率***的語(yǔ)言。
Go語(yǔ)言嚴(yán)格的結(jié)構(gòu)原則和它的“一種事情有且只有一種方法完成”的思想意味著我們無(wú)需在風(fēng)格問(wèn)題上糾纏不休。在針對(duì)Go語(yǔ)言程序的代碼審查上,審查會(huì)變得更針對(duì)問(wèn)題,而不是針對(duì)語(yǔ)言上的錯(cuò)綜復(fù)雜,這是每個(gè)人都愿意看到的。
更值得一提的是,一旦一個(gè)程序員對(duì)Effective Go有了一個(gè)基本掌握,你會(huì)發(fā)現(xiàn)他們的關(guān)注點(diǎn)能非常自然的從“應(yīng)用目前應(yīng)該怎樣運(yùn)行”過(guò)度到“應(yīng)用在理想狀況下應(yīng)該如何的運(yùn)行”。是否是后臺(tái)的響應(yīng)緩慢致使整個(gè)請(qǐng)求失敗?是否應(yīng)該只重試一次,不成功就只提供部分的結(jié)果?瀏覽器表現(xiàn)異常,我們是否要設(shè)置一個(gè)250毫秒的超時(shí)限制?系統(tǒng)中任何一個(gè)外層的行為場(chǎng)景都能用一種直接的、理想化的實(shí)現(xiàn)來(lái)表示,不需要類(lèi)庫(kù)或框架的支持。去掉抽象層降低了復(fù)雜性;直白陳述式、簡(jiǎn)單的代碼是更好的代碼。
Go語(yǔ)言還有其它一些非常好的特征,讓我們受益不少。靜態(tài)類(lèi)型和快速編譯使我們能夠在開(kāi)發(fā)過(guò)程中做幾乎實(shí)時(shí)的靜態(tài)檢查和單元測(cè)試。這也意味我們開(kāi)發(fā)的基于Go語(yǔ)言的系統(tǒng)中的編譯,測(cè)試和發(fā)布幾乎是一起完成的。
事實(shí)上,快速的編譯,快速的測(cè)試,快速的相互審查和快速的部署意味著你的一些想法能在一個(gè)小時(shí)內(nèi)從白板上的設(shè)計(jì)變成產(chǎn)品中可運(yùn)行的程序。例如,Next軟件中的搜索基本功能是由Elastic Search驅(qū)動(dòng)的,但是它接受SoundCloud的管理和交換幾乎全部是Go服務(wù)來(lái)完成。在驗(yàn)證過(guò)程中,我們認(rèn)識(shí)的,我們需要一種能在某個(gè)特殊環(huán)境中把索引標(biāo)志為只讀狀態(tài)的方法,需要索引系統(tǒng)能知道并順從這種狀態(tài)。在代碼中加入抽象層,開(kāi)發(fā)一個(gè)新的入口點(diǎn)正確的檢測(cè)這種狀態(tài),修改跟索引相關(guān)的行為,為它們寫(xiě)測(cè)試代碼,這一切只用了半個(gè)下午的時(shí)間。晚上時(shí),這些修改已經(jīng)部署并運(yùn)行了好幾個(gè)小時(shí)了。這樣的速度,尤其是對(duì)一種靜態(tài)類(lèi)型的,本地編譯的語(yǔ)言,簡(jiǎn)直沒(méi)得說(shuō)了。
我說(shuō)到了我們的編譯和部署系統(tǒng)。它叫Bazooka,它被設(shè)計(jì)成一個(gè)平臺(tái),用來(lái)管理內(nèi)部服務(wù)的部署。(我們很快就會(huì)把它開(kāi)源;關(guān)注我們,不要走開(kāi)!)我們?cè)ㄟ^(guò)一個(gè)情況復(fù)雜的網(wǎng)絡(luò)環(huán)境升級(jí)12-Factor應(yīng)用,你可以把它當(dāng)成一個(gè)巨大的、復(fù)雜的狀態(tài)機(jī),隨時(shí)都有可能造成數(shù)據(jù)污染和相互競(jìng)爭(zhēng)的狀態(tài)。對(duì)于這種工作,Go語(yǔ)言是最自然的選擇。Go語(yǔ)言很獨(dú)特,它有天生的并行安全特征。Bazooka系統(tǒng)的開(kāi)發(fā)人員能夠分析出問(wèn)題的復(fù)雜性而不需要使用那些復(fù)雜的輔助工具。Bazooka利用Doozer來(lái)協(xié)調(diào)它的共享狀態(tài),Doozer是世界上唯一一個(gè)Paxos開(kāi)源實(shí)現(xiàn)軟件(就我們所知)——它也是用Go語(yǔ)言開(kāi)發(fā)的。
總之,我們?cè)赟oundCloud公司維護(hù)著都是用Go語(yǔ)言寫(xiě)成的十幾種服務(wù)和十幾種知識(shí)庫(kù)。當(dāng)有新的后臺(tái)項(xiàng)目時(shí),我慢慢的都會(huì)選擇使用Go語(yǔ)言來(lái)完成。
你對(duì)使用Go語(yǔ)言解決真正問(wèn)題和開(kāi)發(fā)真正產(chǎn)品感興趣嗎?我們很樂(lè)意聽(tīng)到你的聲音!
英文原文:Go at SoundCloud