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