GO的語言特性是什麼?Go語言到底好不好用?

真的很好用啊。

個人認爲GO最重要的一個語言特性就是KISS(保持簡單和愚蠢)。這個特性看似簡單,實則是解決當代和未來軟件工程問題的一項非常必要的特性,具體原因下面細說:

Go背後的設計思想是現代編程的“保守派”思緒,它的產生是因爲像谷歌這樣的工程團隊已經開始遇到一些非常棘手的問題而在現有編程語言框架下不能很好地解決。因此他們決定去創新,用一種退步”的思想去面對軟件開發領域的大量新問題,這種“以退爲進”是其最大的哲學思辨,也是能否Get到它的好用的最核心一點。

科技主導的進步論是今天社會的主流信仰,在軟件開發的世界裏面也是如此。畢竟計算機編程是最近30年主導創新的最重要的科學和技術基底層,所以這個領域內充斥着進步論應該是很好理解的。

進步論具體怎麼體現呢?比如你去學習Node.js,那種激進的、靈活的社區文化開始會讓你很燃、很興奮,然而過一段時間以後,尤其是你自己經歷的項目多了以後,你會發現過於激進有時候=“聰明反被聰明誤”。這種不夠謹慎的“唯技術進步論“思想現在在開發領域很常見,比如在很多現代編程語言裏面,爲了實現一些技術性的突破,會發明一些語言級別的新語法,而這些語法又與語言以前的一些語法邏輯相互矛盾或者無法兼容(比如爲人熟知的Python的2、3不兼容問題、JS的ES6改革引起的瀏覽器兼容問題等等)。

與進步論相互呼應的,就是開發思想的分化。比如,現代編程裏面,一個簡單的函數往往都有多種實現方法。這些方法有些是因爲計算機執行上有本質的不同(這是一種非常合理的不同,GO這種奉行簡單的語言也會支持這些不同);而更多的不同完全都是基於語法、習慣、思維方式等方面的差異,某些時候一種函數甚至有數十種實現方法,到了讓人抓狂的程度。

方法多、思路寬初看是好事兒,但從長遠看它只是滿足了人們思維的貪慾,對提高效率或者解決問題沒有多少實質性的幫助。因爲,幾乎所有的應用都只是在解決有限問題,而隨着項目和公司的發展,參與軟件編寫的人會越來越多,因此軟件所要包容的思想也就越來越多。這樣一來,大多數軟件開發面臨的中長期問題都變成了「由於軟件越來越複雜而導致工程難以維護」這個問題。

說到這裏,基本解釋了Go的好處是「保持編程的簡單和愚蠢」,下面總結一下。第一,這個好處需要對比才能感覺到;第二,這個好處需要一些經驗和反思才能體會到。總之,這個好處不那麼容易被初涉此道的人明顯地感覺到,而對於另外一些有經驗的人則會感受強烈,這也就是爲什麼很多活躍的Go開發者都是掌握多種語言的老鳥的原因。而另一方面,這個好處是直指現代軟件工程的一些核心問題的,因此我認爲時間和歷史會證明Go的高明(“低明”?)之處。

另外,爲什麼這種簡約的思想會招致一些非常明確的反對聲音呢?我認爲有兩類原因,一類是人云亦云的思維慣性,如果你基於過往的經驗來看待一個新事物,給它挑挑毛病其實是一件很簡單的事情,但是瑕不掩瑜,這些毛病與其帶來的好處相比,大都不是很重要的。或者說,隨着時間的推移,都是可以被明顯改善的。

另一類是“思想背後的利益”在作祟。在現代軟件工程師的文化圈子裏面,存在一些利益“山頭”,也就是由於一些人把大量精力注入到某些編程語言、工作流當中,這些已經給他們個人或集團帶來了大量的既得利益(財富方面的、社會影響方面的……),因此他們會自覺不自覺地捍衛自己的利益——通過各種對比來貶低Go語言,或者誇大一些問題。這一方面充斥於大量校園、培訓機構裏面,另一方面已經成爲了很多大型互聯網企業內的政治勢力或者既得利益集團。只要去稍稍瞭解一下爲了面試BAT、谷歌、亞馬遜的那些職位要預先讀多少書、考多少試題就不難感受到這些山頭的實在性。

總結KISS(保持簡單和愚蠢)的好處
下面我從“保持簡單和愚蠢”爲什麼未來對一個工程師來說整體上是一件好事來總結一下。首先,如果你是最近幾年纔開始接觸計算機編程,而不是從幾十年前就開始學習編程的老司機的話,那麼你要面對的現實有如下幾個要點:

1、現代的編程經過幾十年的發展,其知識體系已經變得非常龐大而複雜
2、現代的計算機硬件架構也與幾十年前相比發生了巨大的變化
3、應用和軟件的需求變得日趨複雜
4、項目團隊的組成和工程師的思維愈發多元化
5、人的認知能力有限,而且絕大多數人都沒有那麼聰明

爲了面對這這些問題,絕大多數編程語言選擇的道路都是激進地改革,它們選擇在語言層面進行「創新」,製造很多新的語法、加入很多新的概念。前文已經提到了這種激進思想導致的後果 —— 你除了要學習編程語言本身外,你還需要學習很多額外的“思想”,問題變得越來越複雜。

事實上,我個人認爲學習很多語言難以深入某種程度上都是因爲那些額外的“思想”太複雜或者太難以理解。我個人對學習Java和Scala時讀那些規矩的痛苦記憶猶新。那些厚重的寶典裏面,記錄的不僅僅是聰明的編程思想,還有很多“你要當心”的思維規則限制。有時候,一個那樣的規矩會讓你學習編程完全卡住,因爲你搞不明白爲什麼要這樣,然後就會有一些沮喪——懷疑是不是自己太笨了,懷疑是不是自己“基礎不好”還得惡補。

這時,如果你去問那些老鳥們這是怎麼回事。由於倖存者偏差,以及只有成功者願意分享經驗之類的規律,你聽到的都是那些繞過了或者渡過了這些坑的人的觀點。他們大多數可能都並沒意識到自己是怎麼渡過那些坑的,甚至有人會覺得你搞不明白那些“思想”是很奇怪的,或者簡言之——“你不夠聰明”。

我得承認,我的確是沒那麼聰明,但是我不能蠢一點嗎?“笨”方法就不可以解決問題了嗎?事實上,如果接觸錯了,你會發現並不是那樣,還是可以有笨方法的(而且這和編程語言沒有直接的綁定關係,就是一種方法論)。

Go就是在語言層面上提供了這樣一種可能性,就是簡化,甚至部分地“語言退化”,以便適應日趨複雜的未來。當然,簡單的背後肯定也有複雜的工作要做,比如對語法的抽象、基礎包的建設、對這種思想的傳播等等。而且,我的意思也並不是必須學習Go才能解決問題,Go也有它適合和不適合的領域,但是總體上講,一個面向當下和未來的工程師應該要理解這種保持簡單和愚蠢的可貴和重要性。

天下皆知美之爲美,斯惡已。皆知善之爲善,斯不善已。

Golang還處於發展階段,其“善”還沒有到世人皆知的程度。因此,我覺得它還在「好用」的階段。

GO的語言特性是什麼?Go語言到底好不好用?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章