Go語言之於系統管理員
| 2013-08-21 08:58
“就算我從來沒有直接接觸過Go併發原語,為了其部署的隨意性,我確信我會用Go重寫所有我的命令列程式。”
這是我以前說過的話。我認為這句話值得寫一篇更詳細的博文。
NKOTB
大多深入瞭解我的人都知道關於我的兩件事情:
- 對技術決策,我是相當實用主義並有點保守的。
- 我是一個語言旅行者
第二個是Bryan Berry給我貼的標籤,引自一個FoodFight早期片段。
有趣的是,這兩件事看起來是矛盾的。
我喜歡學習新的程式語言。這定期會給我帶來不小的衝擊,因為不是個科班的程式設計師。我沒有去上大學學程式設計(實際上,我根本沒有讀大學)。我的IT職業生涯幾乎100%集中於運維。所有我接觸過的東西- QA、DBA、 DEV – 都是源於運維領域,用於滿足某些運維操作上的需求。
因此,我驚訝地發現18年後,自己擁有ruby,Python,perl,JAVA的實踐知識,並瞭解其他一些程式語言。我學習新的程式語言主要是因為“技癢”。
我就是在這種情況下,遇到了Go。
如果你沒聽說過Go,其實有無數的文章,博文和大量新的工具用Go寫成。最新的Linux容器周邊和新的部署模型就是基於Go的。也有一些相當“大”的用Go編寫的專案,如packer等。Mozilla正在用Go構建所有內部工具(據我瞭解到的是這樣的),很多開發者也在轉向Go。
你需要知道的是,我並不會因為熱度去學習程式語言。比如,我根本就不關心JavaScript和Node。起初,我對Go也沒任何興趣。我認為它只不過是Google的眾多學術實驗中的一個。何況,如果我要接觸一個C風格的程式語言,為什麼我不直接學習C語言呢?
實際上,我用這個路子嘗試為StormPath寫一個PAM模組。雖然也還滿意,但專案最終很讓人沮喪。
那,為什麼開始用Go?
我覺得再嘗試Go的一個原因是Go似乎一直都在我周圍。這至少給我帶來一個競爭者。其次,我使用的部分工具是用Go編寫的,我要修正一些這些工具的問題(尤其是這些工具是新專案,必然會有問題需要修復),我確實需要學習這們新的程式語言。
然而,一個工具把我推到了最後一步 – etcd。
你自己可以通讀etcd,如果你知道我關於 Noah的歷史,你就明白為什麼我對它如此感興趣。
讓我自己吃驚的是,我決定可能我自己也要用Go寫很多工具。
關於實用主義
在Dell Enstratius,我的團隊開發的所有內部工具都是用Python寫成的。對我們而言,這是一個實用的選擇:
- 在我們產品支援的平臺上Python的依賴最小(它也會在我們客戶的系統上)。
- 對新的開發者(我們團隊確實有那麼幾個)來說,Python用正確的方式進行了嚴格規定。
- 由於上一條,不管你的Python水平如何,你都可以經常審閱和學習別人的程式碼。
為什麼我們不用Ruby?考慮到我個人Ruby技能更好並且我們內部也擁有一些Ruby經驗。
- 你看過Ruby發行版的狀態麼?
- 我們不想和任何潛在的使用Ruby的客戶工具衝突
- Ruby對新手而言不夠嚴格
- 和我一樣對Ruby熟悉的話,由於Ruby的靈活性和超程式設計,檢視別人的程式碼會極其困難。
我們團隊考慮了以上所有選項,我們全部同意使用Python。我著手寫了一個訪問我們API的庫。這給我們構建工具提供了基礎,同時也作為一個新工具參考專案(如測試,專案結構,可執行指令碼等等)。
事情進展的很順利,直到最近一個客戶的情況發生。為了顯而易見的原因,我們努力精簡依賴。有幾個庫讓這件事變得如此順利- requests, envoy。我們也喜歡使用 Fabric來封裝一些東西。
然後,我們遇到一個狀況,一個客戶拒絕我們引入外部的包。因此,雖然我們可以“半死”大部分我們的工具,有些事情就是不能工作。追蹤傳遞的依賴真是痛苦。
這就是導致我上面陳述的原因。
用Go構建工具
Go,雖然不像Python那麼容易除錯,也還非常容易除錯。編譯速度很快,測試速度也相當快。但依賴問題才是真正的殺手鐧。Go根本就不存在依賴問題。我可以把我編譯好的二進位制檔案任意移動而不出任何問題,也不需要安裝執行時。在標準庫中也有很多有用的東西。
我也可以在osx,windows或者linux上不做任何更改的編譯相同的程式碼。這也比我們使用Python方便。
和我說的一樣,雖然我現在寫的工具一點也沒用上Go的高階併發特性,但是Go確實擁有這個特性,如果我要用,還是很好的。
這不是一個轉換語言的故事。
我們還沒有轉向用Go來構建工具,但我很可能會用的。我已經致力於用Go來寫一個我們API的封裝,因此我也可以重寫其他一些工具。在依賴受限的系統上,這種做法還是很好用的。這就是這篇博文的重點所在。
如果你的工作和運維相關,學習Go沒什麼壞處。
語法簡潔。C帶來的頭痛的問題基本都會消失不見。同時,你也不用擔心繫統的Python或者Ruby版本是多少。Go是一個開發bootstrap工具的絕妙語言——因為bootstrap工具的執行環境沒有任何安裝好的依賴。如果你開始使用像docker, packer 或者etcd的工具,Go也會很有幫助。
試試Go吧。
相關文章
- Go語言之包(package)管理GoPackage
- Go語言之methodGo
- Go語言之介面Go
- Go語言之ContextGoContext
- Go語言之 Struct TagGoStruct
- go語言之反射-------ReflectionGo反射
- 深度解密 Go 語言之 channel解密Go
- 深度解密Go語言之 map解密Go
- 深度解密Go語言之Slice解密Go
- 深度解密Go語言之channel解密Go
- 深度解密GO語言之反射解密Go反射
- Go語言之讀寫鎖Go
- 深度解密Go語言之context解密GoContext
- 深度解密 Go 語言之 context解密GoContext
- go語言之陣列與切片Go陣列
- Go語言之併發示例(Runner)Go
- Go語言之旅:基本型別Go型別
- Go語言之錯誤處理Go
- 深度解密Go語言之關於 interface 的10個問題解密Go
- 深度解密 Go 語言之 sync.Pool解密Go
- 深度解密 Go 語言之 sync.map解密Go
- go語言之結構體和方法Go結構體
- Go語言之併發示例-Pool(二)Go
- Go語言之併發示例-Pool(一)Go
- 員工管理系統
- Go語言分散式系統配置管理實踐--go archaiusGo分散式AI
- 在 Fefora 上開啟 Go 語言之旅Go
- Go語言之變數逃逸(Escape Analysis)分析Go變數
- Go語言之陣列快速入門篇Go陣列
- Go語言之切片(slice)快速入門篇Go
- Go語言基於go module方式管理包(package)GoPackage
- python和GO語言之間的區別!PythonGo
- 深入理解GO語言之併發機制Go
- Go語言之Goroutine與通道、異常處理Go
- Go語言之對映(map)快速入門篇Go
- Win10系統提示“工作管理員已被系統管理員停用”怎麼辦Win10
- 10本適合於系統管理員的最佳書籍
- 時間管理--給系統管理員1