Go語言之父反思錯誤:“併發”理念指導不足、沒做好包管理、用C寫了編譯器、文檔缺失……

前段時間給大家分享了 《 》 ,看了看大佬認爲成功的地方在哪裡。

今天這篇將會繼續延續前文,一起深入探究 Go 做錯、失敗的地方在哪。學習前人的經驗。

沒有引導好併發理念

從歷史背景來看,在 Go 誕生的那個年代,併發編程是一個比較新穎的理念。許多其他編程語言、論文甚至書籍都寫過關於併發編程的內容。但併發編程當時還沒有成爲主流思想。

Go 團隊發明了 “goroutine” 這個詞,Go 讓協程的使用變得非常簡單。也正因爲有了併發,讓這一切看起來像是一種新鮮的事物。

聽起來都很美妙。但是,Go 做錯了什麼?

rob 認爲:Go 團隊在併發上,缺乏對使用 Go 的開發者進行併發編程的指導。認爲這是重大錯誤。

爲此 Go 團隊整體上花了非常多的時間做教育和宣導,來澄清並行和併發之間的區別。

這一現象,直到 2012 年在技術大會上做了以下分享:

Concurrency is not Parallelism by Rob Pike[1]

自此,“併發不是並行” 這句 Go 哲學用語流行了起來。一直到現在。

編譯器有些困擾

早期的 Go 編譯器是用 C 編寫的。對社區裡的開發者造成一定的困擾。

普遍上正確的方式是使用 LLVM 或類似的工具包,或者用 Go 本身編寫編譯器。這被稱爲自託管或自舉。

The Go compiler architecture post Go 1.5

後面 rsc 加入後寫了個工具,半自動地將編譯器從 C 翻譯爲 Go。再到後面(現在)絕大部分都是 Go 編寫的了。

編譯器的正式完善,Go 團隊一開始優先級是放的比較低的。只是 ken 用 C 快速寫了個 plan9 風格的編譯器。直至後面 Go 核心相對穩定,也有了新的人員進入後才逐步改變。

有的同學看到這,可能在想。這有什麼錯誤的?rob 的解釋是:有些人對這一選擇感到不快,但這是我們當時最正確的選擇。

項目管理沒做好

這裡特指的是開源社區。Go 團隊一開始就知道,Go 如果希望成功,必須要是一個開源項目。

但是 Go 團隊向開源的過渡的不是很順利,也比較缺乏經驗。花費了大量的時間與社區溝通、互動、討論。

最終花了很長時間才瞭解轉爲開放源代碼項目的影響,以及如何進行管理這個項目。

另外,Go 項目曾使用過 4 種不同的內容管理系統:SVN、Perforce、Mercurial 和 Git。相關閱讀:

Russ 做了一項艱鉅的工作,讓所有的歷史都得以保留,這非常有價值。

包管理做的不太好

開發 Go 軟件包管理的過程並不順利。

嚴謹來講,Go 本身的軟件包設計非常出色,但包管理和過程不太好。

主要分爲以下兩點:

1、沒有使用包管理的經驗:早期 Go 核心團隊的成員都很熟悉 Google 的工作方式,即使用 monorepo 和每個人都在進行構建。但是,我們在使用軟件包管理器沒有足夠的經驗,軟件包版本衆多,解決依賴關係圖的問題也非常困難。

2、與社區的合作不太成功:讓社區參與幫助解決依賴管理問題的初衷是好的,但當最終設計出來時,即使有大量的文檔和關於理論的文章,社區中的許多人還是覺得被輕視了。

Go 團隊認爲這次失敗給團隊上了一課,讓他們知道如何真正與社區互動,並且自此取得了很大的進步。

現在包模塊的事情已經塵埃落定,新出現的設計在技術上非常出色,而且似乎對大多數用戶來說都很好用。只是時間太長,道路崎嶇。

本煎魚表示,這次包管理的社區和官方的鬥爭事件,也成爲了 Go 團隊在社區裡顯著的黑料,這麼多年了也一直被記着。反覆被人提起。

文檔和示例沒寫好

前期沒有做好的事情是文檔。Go 團隊寫了很多文檔,並認爲自己做得很好,但很快就發現,社區需要的文檔水平與團隊的預期不同。

原先的文檔,即使是最簡單的功能,我們也缺少示例。原以爲只要說出某個功能的作用就可以了,我們花了很長時間才認識到,展示如何使用這些功能才更有價值。

Executable examples

劃重點,要有例子!

後面這些問題都已經解決,現在的文檔中有很多示例,可以在瀏覽器上直接運行這些代碼片段。

總結

在 rob 對 Go 過去那麼多年做回顧時,我們能夠發現無論是做得好,做的不好,都不是單純一點就能夠涵蓋的。

在本篇文章中,我認爲更多的是 Go 團隊的成長過程中,一開始不懂,後面慢慢才懂的事情。我們可以以此吸取好的地方,爭取站在大佬的肩膀上。

最後 rob 也再次強調了,Google 對 Go 的支持慷慨得令人難以置信,Google 並不制定議程。社區的參與度要高得多。核心 Go 團隊由 Google 支付報酬,但他們是獨立的。

參考資料

[1] C oncurrency is not Parallelism by Rob Pike:https://www.youtube.com/watch?v=oV9rvDllKEg