Go語(yǔ)言之于系統(tǒng)管理員
“就算我從來(lái)沒(méi)有直接接觸過(guò)Go并發(fā)原語(yǔ),為了其部署的隨意性,我確信我會(huì)用Go重寫所有我的命令行程序。”
這是我以前說(shuō)過(guò)的話。我認(rèn)為這句話值得寫一篇更詳細(xì)的博文。
NKOTB
大多深入了解我的人都知道關(guān)于我的兩件事情:
- 對(duì)技術(shù)決策,我是相當(dāng)實(shí)用主義并有點(diǎn)保守的。
- 我是一個(gè)語(yǔ)言旅行者
第二個(gè)是Bryan Berry給我貼的標(biāo)簽,引自一個(gè)FoodFight早期片段。
有趣的是,這兩件事看起來(lái)是矛盾的。
我喜歡學(xué)習(xí)新的編程語(yǔ)言。這定期會(huì)給我?guī)?lái)不小的沖擊,因?yàn)椴皇莻€(gè)科班的程序員。我沒(méi)有去上大學(xué)學(xué)編程(實(shí)際上,我根本沒(méi)有讀大學(xué))。我的IT職業(yè)生涯幾乎100%集中于運(yùn)維。所有我接觸過(guò)的東西- QA、DBA、 DEV – 都是源于運(yùn)維領(lǐng)域,用于滿足某些運(yùn)維操作上的需求。
因此,我驚訝地發(fā)現(xiàn)18年后,自己擁有ruby,python,perl,java的實(shí)踐知識(shí),并了解其他一些編程語(yǔ)言。我學(xué)習(xí)新的編程語(yǔ)言主要是因?yàn)?ldquo;技癢”。
我就是在這種情況下,遇到了Go。
如果你沒(méi)聽(tīng)說(shuō)過(guò)Go,其實(shí)有無(wú)數(shù)的文章,博文和大量新的工具用Go寫成。***的linux容器周邊和新的部署模型就是基 于Go的。也有一些相當(dāng)“大”的用Go編寫的項(xiàng)目,如packer等。Mozilla正在用Go構(gòu)建所有內(nèi)部工具(據(jù)我了解到的是這樣的),很多開(kāi)發(fā)者也 在轉(zhuǎn)向Go。
你需要知道的是,我并不會(huì)因?yàn)闊岫热W(xué)習(xí)編程語(yǔ)言。比如,我根本就不關(guān)心JavaScript和Node。起初,我對(duì)Go也沒(méi)任何興趣。我認(rèn)為它只不過(guò)是Google的眾多學(xué)術(shù)實(shí)驗(yàn)中的一個(gè)。何況,如果我要接觸一個(gè)C風(fēng)格的編程語(yǔ)言,為什么我不直接學(xué)習(xí)C語(yǔ)言呢?
實(shí)際上,我用這個(gè)路子嘗試為StormPath寫一個(gè)PAM模塊。雖然也還滿意,但項(xiàng)目最終很讓人沮喪。
那,為什么開(kāi)始用Go?
我覺(jué)得再嘗試Go的一個(gè)原因是Go似乎一直都在我周圍。這至少給我?guī)?lái)一個(gè)競(jìng)爭(zhēng)者。其次,我使用的部分工具是用Go編寫的,我要修正一些這些工具的問(wèn)題(尤其是這些工具是新項(xiàng)目,必然會(huì)有問(wèn)題需要修復(fù)),我確實(shí)需要學(xué)習(xí)這們新的編程語(yǔ)言。
然而,一個(gè)工具把我推到了***一步 – etcd。
你自己可以通讀etcd,如果你知道我關(guān)于 Noah的歷史,你就明白為什么我對(duì)它如此感興趣。
讓我自己吃驚的是,我決定可能我自己也要用Go寫很多工具。
關(guān)于實(shí)用主義
在Dell Enstratius,我的團(tuán)隊(duì)開(kāi)發(fā)的所有內(nèi)部工具都是用Python寫成的。對(duì)我們而言,這是一個(gè)實(shí)用的選擇:
- 在我們產(chǎn)品支持的平臺(tái)上Python的依賴最小(它也會(huì)在我們客戶的系統(tǒng)上)。
- 對(duì)新的開(kāi)發(fā)者(我們團(tuán)隊(duì)確實(shí)有那么幾個(gè))來(lái)說(shuō),Python用正確的方式進(jìn)行了嚴(yán)格規(guī)定。
- 由于上一條,不管你的Python水平如何,你都可以經(jīng)常審閱和學(xué)習(xí)別人的代碼。
為什么我們不用Ruby?考慮到我個(gè)人Ruby技能更好并且我們內(nèi)部也擁有一些Ruby經(jīng)驗(yàn)。
- 你看過(guò)Ruby發(fā)行版的狀態(tài)么?
- 我們不想和任何潛在的使用Ruby的客戶工具沖突
- Ruby對(duì)新手而言不夠嚴(yán)格
- 和我一樣對(duì)Ruby熟悉的話,由于Ruby的靈活性和元編程,查看別人的代碼會(huì)極其困難。
我們團(tuán)隊(duì)考慮了以上所有選項(xiàng),我們?nèi)客馐褂肞ython。我著手寫了一個(gè)訪問(wèn)我們API的庫(kù)。這給我們構(gòu)建工具提供了基礎(chǔ),同時(shí)也作為一個(gè)新工具參考項(xiàng)目(如測(cè)試,項(xiàng)目結(jié)構(gòu),可執(zhí)行腳本等等)。
事情進(jìn)展的很順利,直到最近一個(gè)客戶的情況發(fā)生。為了顯而易見(jiàn)的原因,我們努力精簡(jiǎn)依賴。有幾個(gè)庫(kù)讓這件事變得如此順利- requests, envoy。我們也喜歡使用 Fabric來(lái)封裝一些東西。
然后,我們遇到一個(gè)狀況,一個(gè)客戶拒絕我們引入外部的包。因此,雖然我們可以“半死”大部分我們的工具,有些事情就是不能工作。追蹤傳遞的依賴真是痛苦。
這就是導(dǎo)致我上面陳述的原因。
用Go構(gòu)建工具
Go,雖然不像Python那么容易調(diào)試,也還非常容易調(diào)試。編譯速度很快,測(cè)試速度也相當(dāng)快。但依賴問(wèn)題才是真正的殺手锏。Go根本就不存在依賴問(wèn)題。我可以把我編譯好的二進(jìn)制文件任意移動(dòng)而不出任何問(wèn)題,也不需要安裝運(yùn)行時(shí)。在標(biāo)準(zhǔn)庫(kù)中也有很多有用的東西。
我也可以在osx,windows或者linux上不做任何更改的編譯相同的代碼。這也比我們使用Python方便。
和我說(shuō)的一樣,雖然我現(xiàn)在寫的工具一點(diǎn)也沒(méi)用上Go的高級(jí)并發(fā)特性,但是Go確實(shí)擁有這個(gè)特性,如果我要用,還是很好的。
這不是一個(gè)轉(zhuǎn)換語(yǔ)言的故事。
我們還沒(méi)有轉(zhuǎn)向用Go來(lái)構(gòu)建工具,但我很可能會(huì)用的。我已經(jīng)致力于用Go來(lái)寫一個(gè)我們API的封裝,因此我也可以重寫其他一些工具。在依賴受限的系統(tǒng)上,這種做法還是很好用的。這就是這篇博文的重點(diǎn)所在。
如果你的工作和運(yùn)維相關(guān),學(xué)習(xí)Go沒(méi)什么壞處。
語(yǔ)法簡(jiǎn)潔。C帶來(lái)的頭痛的問(wèn)題基本都會(huì)消失不見(jiàn)。同時(shí),你也不用擔(dān)心系統(tǒng)的Python或者Ruby版本是多少。Go是 一個(gè)開(kāi)發(fā)bootstrap工具的絕妙語(yǔ)言——因?yàn)閎ootstrap工具的運(yùn)行環(huán)境沒(méi)有任何安裝好的依賴。如果你開(kāi)始使用像docker, packer 或者etcd的工具,Go也會(huì)很有幫助。
試試Go吧。
原文鏈接:http://blog.lusis.org/blog/2013/08/11/go-for-system-administrators/

















