Go語言之父:四十年來軟件開發之鉅變與Go的過去和未來

Rob Pike 是 Go 語言核心作者之一。本文是針對 Rob 的一次專訪,話題涉及 Rob 四十年的職業生涯、Go 語言過去十年的發展及其未來。

與現今的很多開發人員不一樣,你幾十年前就在貝爾實驗室開始了自己的職業生涯。從你角度來看,你認爲軟件開發方式最大的變化是什麼?

現今的規模要大得多,不僅僅是計算機和網絡,還有程序本身。所有的 Unix V6(大約發佈於 1975 年)都可以輕而易舉地裝在一個 RK05 磁盤(只有差不多 2MB 的存儲空間)中,還留出了大量的用戶空間。這是一個很好的計算環境,至少在當時看起來是這樣的。

基於“抵制改變”和“承諾兼容”這樣的思想,你如何看待 Go 語言和它的生態系統在未來 10 年的發展?你設想的最好的未來是怎樣的?

儘管還不是很確定,但在經過十多年的發展之後,參數多態設計——也就是通常認爲的泛型,將在未來一兩年出現。爲已有的語言找到一種合適的設計是個大難題,不過 Ian Lance Taylor(Go 語言另一位核心作者)在這個問題上投入了驚人的精力,現在看來答案已經觸手可及了。

這將給庫、生態系統和社區帶來怎樣的影響?我們拭目以待。

隨着“漸進式類型”被引入到“動態類型”語言中,以及“類型推斷”被引入到“靜態類型”中,二者之間的界限現在變得越來越模糊了。你對現代編程語言的類型系統有什麼看法?

我非常喜歡靜態類型,因爲它的穩定性和安全性。

我非常喜歡動態類型,因爲它給我帶來了樂趣。

我不喜歡類型驅動編程、類型層次、類和繼承。儘管有很多非常成功的項目都是通過這種方式構建的,但我覺得這種方法將重要的決策過早地放在了設計階段。換句話說,我更喜歡組合,而不是繼承。

不過我要對那些喜歡使用繼承的人說:不要在意我所說的,請繼續使用你認爲有效的方式。

有時候人們應用技術的方式很奇怪,例如通過 Python 或 Ruby 來生成 Go 代碼(我們的確看到過這種做法)。這些年來,你都見過哪些奇怪、有創意或有趣的 Go 語言用法?令你感到最驚訝的是什麼?

最大的意外是我們得知 Go 語言被用來編寫惡意軟件。你無法控制誰會使用你的東西或者他們會用它做些什麼。

你開發了很多文本編輯器。你覺得 Visual Studio Code 怎麼樣?有了 LSP 這樣的技術,“文本編輯器”和 IDE 之間的界限現在變得越來越模糊了。你認爲軟件開發人員需要像 GoLand 那樣的全功能 IDE 嗎?或者使用 VS Code 就可以了?

我來自一個早於 IDE 出現的時代。在 Go 語言項目的早期,我們討論過 Go 語言是否需要藉助 IDE 才能獲得成功。但當時團隊中沒有人具備開發 IDE 的技能,所以我們沒有嘗試去開發一個 IDE。不過,我們確實開發了可用來解析和打印 Go 語言代碼的庫,並很快成爲各種編輯器和 IDE 插件的基礎,這是一個意外的成功。

最近,我們一直在努力開發一個叫作 gopls 的 Go LSP 服務器,任何支持該協議的編輯器或 IDE 都可以用它來改善 Go 語言編程體驗。

或許是因爲我們習慣使用簡單的編輯器樣式,所以我們確信 Go 語言開發人員在編程環境方面也不需要做很多繁重的工作。不過,IDE 確實可以提供一些幫助:我看到的大多數 Go 語言開發人員都使用了 IDE,或者至少是支持 Go 語言的編輯器,並從中獲得了很多好處。

使用什麼樣的編輯器是一個個人偏好問題,取決於你使用的編程語言。

軟件開發人員喜歡給事物貼標籤,比如 Dart 是“前端語言”,C 語言是“系統底層語言”,等等。從 Go 語言的特性和用法來看,你會給它貼什麼樣的標籤?

Go 語言是一種通用的編程語言。你可以用它開發你想要的東西,而不用擔心語言會被固定在一個問題領域。

你個人還喜歡哪些現代編程語言?

開發 Go 語言的經歷讓我明白了人們喜歡對編程語言發表意見。我自己也確實這樣,但我已經厭倦了這種消極的結果,所以現在我儘量避免去評判它們。

在過去的 10 年裏,語言設計領域出現了真正的復興,而在此之前,很少有新編程語言出現並獲得成功。我很高興看到這些以及它們所帶來的創新。

在谷歌工作給 Go 語言的開發帶來了哪些幫助?在 Twitter 上發佈類似“告訴我們你是如何使用我們的語言的”這樣的問題,並得到來自世界各地大公司的迴應,這對你來說有多重要?它只是一個補充還是語言發展的一個重要組成部分?谷歌給你帶來了哪些幫助?

谷歌對 Go 語言項目的支持是非常慷慨的,我非常感謝它。當然,Go 語言的出現是因爲我們認爲谷歌需要它,雲計算需要一種支持併發和易於部署的編程語言。不過,谷歌並沒有太過直接插手這個項目,它支持我們,讓我們做我們認爲是對的事情。

對於其他公司和用戶來說,社區輸入是瞭解項目進展(語言、編譯器、工具、運行時、庫、環境)的關鍵組成部分。

經過 10 年的開發和觀察,你能說出 Go 語言在設計上最大的成功和失敗是什麼嗎?它的強項和弱項分別是什麼?

我想說兩件事,一個是技術上的,一個是政治上的。

從技術方面說,Go 語言支持併發計算。Go 語言只有十年左右的歷史,但在它誕生之初,“線程”和併發並沒有在編程社區得到廣泛的重視。事實上,開發 Go 語言的一個主要原因是當時在 C++ 中執行併發計算比較困難。在項目啓動後不久,對併發性的支持成了一個明顯的優勢,彌補了其他方面的不足。人們看到併發性的優勢之後,他們就開始探索語言的其他方面,然後進一步瞭解到更多的東西。所以,對併發的支持是一道很重要的關口。

正如 Cloudflare 的 John Graham-Cumming 所言,“我是爲了併發而來,爲了組合而留”。

Go 語言改變了多核計算編程。

從政治方面說,我們兌現了對 Go 1.0 兼容性的承諾。在使用了幾年 Go 語言之後,我們有一長串需要修復的東西,而且都是重大的變更。我們開發了一個更新程序,用“go fix”命令來推動社區,然後我們就停了下來。這種穩定性——2012 年編寫的 Go 程序到今天仍然可以完美地編譯和運行——是 Go 語言發展的一股巨大的推動力。其他公司可以非常自信地使用 Go 語言,相信我們不會對他們的程序造成破壞。在 1.0 和兼容性承諾兌現之後,使用率得到顯著的提高。

你是如何平衡工作和生活的?現在很多人都在談論“職業倦怠”,而疫情對解決這一問題毫無幫助。你的 40 年職業生涯可以給新一代開發人員帶來哪些啓示?

避免倦怠的最好方法是在一個可以爲你提供支持的環境中做你真正喜歡做的事情。在我的整個職業生涯中,我非常幸運,但並不是每個人都像我一樣幸運。如果你感到工作壓力很大,你應該放鬆一下,或者改變一下方向,尤其是當下這種情況。

事後看來,很多技術的流行要歸功於所謂的“殺手級應用”。你能說出一個 Go 語言的“殺手級應用”嗎?你對“殺手級應用”持什麼樣的看法?

幾年前,Danny Berkholz 說 Go 語言是“雲基礎設施的新興語言”,這並非偶然。Go 語言是谷歌員工設計的,目的是讓谷歌相關程序的開發變得更容易,尤其是部署在聯網服務器上的程序,也就是我們今天所說的“雲”。

因此,看到一些使用 Go 語言開發的雲計算組件(Docker、Kubernetes 等),我們感到欣慰,但並不會很驚訝。Go 語言確實已經成爲雲基礎設施事實上的編程語言。

你認爲目前 Go 語言在哪些領域存在競爭?你對 Rust 的“無垃圾回收”和編譯時保證有什麼看法?

Rust 是一種有趣的編程語言,我饒有興趣地關注着它的發展。除此之外,我沒有其他意見,就像我上面說的那樣。

Go 語言在 GitHub 上的星數剛剛達到 7 萬!你認爲 GitHub、Reddit、Twitter、離線和在線會議、網絡研討會等不同的活動對 Go 語言有怎樣的影響?它們對編程語言取得成功是否很重要?還是說它們僅僅是對語言的一種反映?

我們在各種會議和社交媒體上遇到的人是 Go 語言發展的關鍵組成部分。很多貢獻者以積極的方式影響着語言的發展,包括最初移植到 Windows 和非 x86 架構、工具和庫的開發、對技術建議的深入討論,等等。

當 Go 開發團隊參與到社區,參與討論、提出問題、尋求幫助和指導,就走向了另一個方向。

有一件事我認爲很重要,那就是讓社區的聲音保持統一,讓社區成爲一個團隊,而不只是個體。一致的信息更容易理解。

作爲一種流行編程語言的作者,這給你的生活帶來了哪些改變?

需要說明的是,我是一個聯合作者。Ken Thompson 和 Robert Griesemer 和我一起啓動了這個項目,還有其他很多人也爲項目做了巨大貢獻,所以請不要把我當成“作者”。

Go 語言確實提高了我的公衆形象,讓我被一個新的充滿活力的社區所認識。但除此之外,並沒有太大的影響。在漫長的職業生涯中,我有過很多成功的經歷(也有無數次的失敗)。

假如你有機會回到過去,給年輕時的自己一個建議,也就是在你開始設計 Go 語言規範的時候,你會給自己和同事什麼樣的建議呢?

很簡單,忽略那些討厭你的人。只需要傾聽那些理解你的目標的聲音,他們纔是你需要關心的人。不是每個人都認同你所做的,不過這沒關係,那些參與推進你正在嘗試做的事情的人是一個極好的想法、能量和靈感的來源。

我們將永遠感謝這個充滿激情的社區。

英文原文

Rob Pike Interview

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