Go 語言之父:四十年來軟件開發(fā)之巨變與 Go 的過去和未來(go語言創(chuàng)始人)

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

與現(xiàn)今的很多開發(fā)人員不一樣,你幾十年前就在貝爾實(shí)驗(yàn)室開始了自己的職業(yè)生涯。從你角度來看,你認(rèn)為軟件開發(fā)方式最大的變化是什么?

現(xiàn)今的規(guī)模要大得多,不僅僅是計(jì)算機(jī)和網(wǎng)絡(luò),還有程序本身。所有的 Unix V6(大約發(fā)布于 1975 年)都可以輕而易舉地裝在一個(gè) RK05 磁盤(只有差不多 2MB 的存儲空間)中,還留出了大量的用戶空間。這是一個(gè)很好的計(jì)算環(huán)境,至少在當(dāng)時(shí)看起來是這樣的。

基于“抵制改變”和“承諾兼容”這樣的思想,你如何看待 Go 語言和它的生態(tài)系統(tǒng)在未來 10 年的發(fā)展?你設(shè)想的最好的未來是怎樣的?

盡管還不是很確定,但在經(jīng)過十多年的發(fā)展之后,參數(shù)多態(tài)設(shè)計(jì)——也就是通常認(rèn)為的泛型,將在未來一兩年出現(xiàn)。為已有的語言找到一種合適的設(shè)計(jì)是個(gè)大難題,不過 Ian Lance Taylor(Go 語言另一位核心作者)在這個(gè)問題上投入了驚人的精力,現(xiàn)在看來答案已經(jīng)觸手可及了。

這將給庫、生態(tài)系統(tǒng)和社區(qū)帶來怎樣的影響?我們拭目以待。

隨著“漸進(jìn)式類型”被引入到“動態(tài)類型”語言中,以及“類型推斷”被引入到“靜態(tài)類型”中,二者之間的界限現(xiàn)在變得越來越模糊了。你對現(xiàn)代編程語言的類型系統(tǒng)有什么看法?

我非常喜歡靜態(tài)類型,因?yàn)樗姆€(wěn)定性和安全性。

我非常喜歡動態(tài)類型,因?yàn)樗o我?guī)砹藰啡ぁ?/p>

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

不過我要對那些喜歡使用繼承的人說:不要在意我所說的,請繼續(xù)使用你認(rèn)為有效的方式。

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

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

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

我來自一個(gè)早于 IDE 出現(xiàn)的時(shí)代。在 Go 語言項(xiàng)目的早期,我們討論過 Go 語言是否需要借助 IDE 才能獲得成功。但當(dāng)時(shí)團(tuán)隊(duì)中沒有人具備開發(fā) IDE 的技能,所以我們沒有嘗試去開發(fā)一個(gè) IDE。不過,我們確實(shí)開發(fā)了可用來解析和打印 Go 語言代碼的庫,并很快成為各種編輯器和 IDE 插件的基礎(chǔ),這是一個(gè)意外的成功。

最近,我們一直在努力開發(fā)一個(gè)叫作 gopls 的 Go LSP 服務(wù)器,任何支持該協(xié)議的編輯器或 IDE 都可以用它來改善 Go 語言編程體驗(yàn)。

或許是因?yàn)槲覀兞?xí)慣使用簡單的編輯器樣式,所以我們確信 Go 語言開發(fā)人員在編程環(huán)境方面也不需要做很多繁重的工作。不過,IDE 確實(shí)可以提供一些幫助:我看到的大多數(shù) Go 語言開發(fā)人員都使用了 IDE,或者至少是支持 Go 語言的編輯器,并從中獲得了很多好處。

使用什么樣的編輯器是一個(gè)個(gè)人偏好問題,取決于你使用的編程語言。

軟件開發(fā)人員喜歡給事物貼標(biāo)簽,比如 Dart 是“前端語言”,C 語言是“系統(tǒng)底層語言”,等等。從 Go 語言的特性和用法來看,你會給它貼什么樣的標(biāo)簽?

Go 語言是一種通用的編程語言。你可以用它開發(fā)你想要的東西,而不用擔(dān)心語言會被固定在一個(gè)問題領(lǐng)域。

你個(gè)人還喜歡哪些現(xiàn)代編程語言?

開發(fā) Go 語言的經(jīng)歷讓我明白了人們喜歡對編程語言發(fā)表意見。我自己也確實(shí)這樣,但我已經(jīng)厭倦了這種消極的結(jié)果,所以現(xiàn)在我盡量避免去評判它們。

在過去的 10 年里,語言設(shè)計(jì)領(lǐng)域出現(xiàn)了真正的復(fù)興,而在此之前,很少有新編程語言出現(xiàn)并獲得成功。我很高興看到這些以及它們所帶來的創(chuàng)新。

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

谷歌對 Go 語言項(xiàng)目的支持是非??犊?,我非常感謝它。當(dāng)然,Go 語言的出現(xiàn)是因?yàn)槲覀冋J(rèn)為谷歌需要它,云計(jì)算需要一種支持并發(fā)和易于部署的編程語言。不過,谷歌并沒有太過直接插手這個(gè)項(xiàng)目,它支持我們,讓我們做我們認(rèn)為是對的事情。

對于其他公司和用戶來說,社區(qū)輸入是了解項(xiàng)目進(jìn)展(語言、編譯器、工具、運(yùn)行時(shí)、庫、環(huán)境)的關(guān)鍵組成部分。

經(jīng)過 10 年的開發(fā)和觀察,你能說出 Go 語言在設(shè)計(jì)上最大的成功和失敗是什么嗎?它的強(qiáng)項(xiàng)和弱項(xiàng)分別是什么?

我想說兩件事,一個(gè)是技術(shù)上的,一個(gè)是政治上的。

從技術(shù)方面說,Go 語言支持并發(fā)計(jì)算。Go 語言只有十年左右的歷史,但在它誕生之初,“線程”和并發(fā)并沒有在編程社區(qū)得到廣泛的重視。事實(shí)上,開發(fā) Go 語言的一個(gè)主要原因是當(dāng)時(shí)在 C 中執(zhí)行并發(fā)計(jì)算比較困難。在項(xiàng)目啟動后不久,對并發(fā)性的支持成了一個(gè)明顯的優(yōu)勢,彌補(bǔ)了其他方面的不足。人們看到并發(fā)性的優(yōu)勢之后,他們就開始探索語言的其他方面,然后進(jìn)一步了解到更多的東西。所以,對并發(fā)的支持是一道很重要的關(guān)口。

正如 Cloudflare 的 John Graham-Cumming 所言,“我是為了并發(fā)而來,為了組合而留”。

Go 語言改變了多核計(jì)算編程。

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

你是如何平衡工作和生活的?現(xiàn)在很多人都在談?wù)摗奥殬I(yè)倦怠”,而疫情對解決這一問題毫無幫助。你的 40 年職業(yè)生涯可以給新一代開發(fā)人員帶來哪些啟示?

避免倦怠的最好方法是在一個(gè)可以為你提供支持的環(huán)境中做你真正喜歡做的事情。在我的整個(gè)職業(yè)生涯中,我非常幸運(yùn),但并不是每個(gè)人都像我一樣幸運(yùn)。如果你感到工作壓力很大,你應(yīng)該放松一下,或者改變一下方向,尤其是當(dāng)下這種情況。

事后看來,很多技術(shù)的流行要?dú)w功于所謂的“殺手級應(yīng)用”。你能說出一個(gè) Go 語言的“殺手級應(yīng)用”嗎?你對“殺手級應(yīng)用”持什么樣的看法?

幾年前,Danny Berkholz 說 Go 語言是“云基礎(chǔ)設(shè)施的新興語言”,這并非偶然。Go 語言是谷歌員工設(shè)計(jì)的,目的是讓谷歌相關(guān)程序的開發(fā)變得更容易,尤其是部署在聯(lián)網(wǎng)服務(wù)器上的程序,也就是我們今天所說的“云”。

因此,看到一些使用 Go 語言開發(fā)的云計(jì)算組件(Docker、Kubernetes 等),我們感到欣慰,但并不會很驚訝。Go 語言確實(shí)已經(jīng)成為云基礎(chǔ)設(shè)施事實(shí)上的編程語言。

你認(rèn)為目前 Go 語言在哪些領(lǐng)域存在競爭?你對 Rust 的“無垃圾回收”和編譯時(shí)保證有什么看法?

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

Go 語言在 GitHub 上的星數(shù)剛剛達(dá)到 7 萬!你認(rèn)為 GitHub、Reddit、Twitter、離線和在線會議、網(wǎng)絡(luò)研討會等不同的活動對 Go 語言有怎樣的影響?它們對編程語言取得成功是否很重要?還是說它們僅僅是對語言的一種反映?

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

當(dāng) Go 開發(fā)團(tuán)隊(duì)參與到社區(qū),參與討論、提出問題、尋求幫助和指導(dǎo),就走向了另一個(gè)方向。

有一件事我認(rèn)為很重要,那就是讓社區(qū)的聲音保持統(tǒng)一,讓社區(qū)成為一個(gè)團(tuán)隊(duì),而不只是個(gè)體。一致的信息更容易理解。

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

需要說明的是,我是一個(gè)聯(lián)合作者。Ken Thompson 和 Robert Griesemer 和我一起啟動了這個(gè)項(xiàng)目,還有其他很多人也為項(xiàng)目做了巨大貢獻(xiàn),所以請不要把我當(dāng)成“作者”。

Go 語言確實(shí)提高了我的公眾形象,讓我被一個(gè)新的充滿活力的社區(qū)所認(rèn)識。但除此之外,并沒有太大的影響。在漫長的職業(yè)生涯中,我有過很多成功的經(jīng)歷(也有無數(shù)次的失敗)。

假如你有機(jī)會回到過去,給年輕時(shí)的自己一個(gè)建議,也就是在你開始設(shè)計(jì) Go 語言規(guī)范的時(shí)候,你會給自己和同事什么樣的建議呢?

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

我們將永遠(yuǎn)感謝這個(gè)充滿激情的社區(qū)。

關(guān)注我并轉(zhuǎn)發(fā)此篇文章,私信我“領(lǐng)取資料”,即可免費(fèi)獲得InfoQ價(jià)值4999元迷你書!

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部