這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
用Go語言做產品剛好半年,有一些感覺跟大家說道說道。
在使用Go之前,我常常想象,無法使用先進的Debug工具會對工作進度造成多麼巨大的影響。甚至在Visual Studio的嬌慣下認為,不能調試基本就無法正確的寫出代碼了。
由於我在Windows平台,能夠支援Go語言調試的gdb老是無法工作,所以在這半年中,我一次都沒有打過斷點,也沒有開啟過一次單步跟蹤。剛開始我心裡非常沒底,只好老老實實為每一個方法寫測試代碼,每開發完一個功能之後就運行所有測試。這個方法其實也算是家喻戶曉的了,但很奇怪,我在寫C#的時候並不會自覺地這樣做。只有在一些非常特殊的部分會寫部分測試代碼。
事後我想了想,懶惰只是其中一個原因,還有一個原因是“編譯速度”。眾所周知,Go語言的編譯速度是非常快的。平時看到這個訊息應該沒什麼感覺,一旦開始寫一段就執行一次”編譯-》測試“,效果馬上就出來了。我的項目目前約有3萬行代碼,編譯速度平均時間2秒。再加上SublimeText3裡面方便的GoSublime外掛程式,寫完代碼 Ctrl+. Ctrol+r,幾秒之後就看到結果了。非常方便。
當然,你可能說這樣的事情在Visual Studio裡面也很容易能做到,哈,你說的對,但你堅持寫一段就來一次試試看,會有被打斷的感覺。(我可能有編輯器強迫症,以前喜歡Vim,現在愛SublimeText,總覺得圖形化IDE的各種面板很容易讓我分神,大家別較真,:P)
以前每次碰到bug,必須用單步調式跟下去,現在武功被廢了,我只能硬著頭皮肉眼看代碼,不時用print把變數值打出來看看。一段時間之後我發現碰到bug的次數在減少。語言熟練度增加是一方面,但我自認是個粗心的人,況且寫了近10年C#也沒這種感覺。
仔細想了想,我覺得是Go語言本身的簡潔帶來的好處。Go語言的文法和特性就那麼點,清清楚楚,沒有什麼詭異的技巧,也沒太多花哨的概念。寫之前不需要去看”Go語言注意事項100條“之類的東西。再加上編譯器的嚴格提示(比如聲明一個變數不賦值會導致編譯無法通過),很大程度上保證了不會因為疏忽而寫出”神奇“的代碼。
在這裡還得提一下Go語言在問世之初就固執的帶上的一個小工具”GoFmt”,它的作用很簡單,格式化Go代碼。當初我還挺納悶,這東西可有可無,早期有這時間做點別的什麼不好?
現在明白了,代碼的可讀性對於程式員來說再重要不過了。這讓肉眼找問題舒服了不少。
所以一套組合拳下來,簡潔的文法設計+極好的代碼可讀性+嚴格的編譯器+內建的測試支援 = 非常舒適的編寫體驗+高品質的代碼。
大家應該都對“最佳實務”這個詞又愛又恨,應該都過這種情境:要實現一個功能,但腦子裡出現了兩三種實現方式,於是花了很長時間做選擇。當然,對系統級的設計,這樣做無可厚非。但如果是非常簡單的功能,比如“這裡究竟應該用指標呢?還是指標的指標呢?還是數組呢?還是鏈表?“,這種選擇的痛苦就顯得意義不大了。
在寫Go的時候我很少會被這種問題擋住,不需要考慮這裡究竟是傳遞引用還是傳遞值,到底是深拷貝還是淺拷貝。不知不覺間編寫過程就非常順滑,真正的專註到了商務邏輯上。大家也可以罵我沒出息,這種基礎問題還會糾結?水平太差了吧!可是,能用三行代碼錶達的邏輯,為什麼要用十行呢?這個道理大家都懂,嘿嘿,那運用到語言設計上應該也是一樣的吧。
另外一點就是部署上的舒服了。反正Go語言的程式到最後編譯出來都是一個可執行檔,跑起來就行了。這句話看起來沒什麼意義對吧?好,那咱就先來聊聊如何部署一個網站,安裝Apache,安裝xxxMod(比如Python和Ruby),配置xxx(此處省略200字),中間還要注意各個模組的版本哦,否則遇到各種不明白的錯誤還得抓掉無數頭髮。
Go語言呢?編譯,運行。什嗎?恩,就是這麼簡單。不要Apache或者其他Http伺服器了?不要。那不是很不科學?呃,是有點魔幻。
以前一直覺得IIS和Apache都是很黑很大的一坨東西,裡面全是超科技,設定檔也很高深,高人過來這裡改改那裡改改默默的效能就提高了n倍。
剛開始還覺得一個可執行檔孤零零的跑起來好單薄,等理解的更多之後就發現其實Http伺服器的核心概念就這麼幾個,Go語言內建支援了,所以這麼輕便就能跑了。
不覺得厲害?恩,考慮一下更新代碼的情境呢?關閉執行個體,更新代碼,編譯,運行(更新時間如何讓服務不間斷咱先不討論,這需要其他伺服器配合)。很省心。
特別像我這種windows程式員,本來面對linux的時候就各種心驚膽顫,各種不熟悉,要是讓我再去修改修改檔案夾許可權什麼的我就炸了。
好吧,嘮嘮叨叨說了一堆,總結下來就一點。我已經從Go語言的粉絲變成死忠了(所以大家也不用費口舌來跟我辯論了哈哈),看到Go語言就開心,寫著舒心,用著順心。
你要是看到這兒了,那就順便提一句,我們打算在1月份召一個Go語言的伺服器端工程師,如果你碰巧喜歡Go語言,愛看網路小說,對演算法充滿了愛,又身在上海,那不妨找我聊聊,咱也許能一起開開心心的做個好東西出來。