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