天天看點

用Go語言做産品半年的一些感覺

用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語言,愛看網絡小說,對算法充滿了愛,又身在上海,那不妨找我聊聊,咱也許能一起開開心心的做個好東西出來。