Hugo作者演講總結:Go語言的遺產

本文是gohugo作者Steve Francia在意大利佛羅倫薩舉辦的GoLab上分享的閉幕演講講稿的文字版,該演講的主題為"Go的遺產"。該演講討論了Go語言繼承的遺產,以及它是如何尊重這些遺產的,並在最後總結了Go希望留給後來者的遺產。

Hugo作者演講總結:Go語言的遺產

演講膠片

我們有責任保留好留給我們的遺產,並留下值得我們子孫後代繼承的遺產 - 克里斯汀·格雷格(Christine Gregoire)

1. Go語言之前

Hugo作者演講總結:Go語言的遺產

1950年

在1950年代後期,人們對每臺新計算機如何產生自己獨特的語言而感到不安。當時,編程語言是由硬件製造商提供的,並且因型號而異。跨計算機且保持一致的第一門編程語言是Fortran,但這仍然僅適用於其製造商IBM(生產的計算機)。而後,人們成立了一個委員會,該委員會的使命就是設計第一種真正通用的、獨立於機器的編程語言。

Hugo作者演講總結:Go語言的遺產

圖:編程語言歷史Babel塔,CACM封面,1961年1月

1960年

1960年1月,有13位計算機科學家在巴黎舉行了一次空前的會議,旨在(設計)開發出這樣一種語言。美國派出了6位代表,歐洲派出了7位代表。

會議上無休止、令人振奮的討論也讓科學家們筋疲力盡。當一個人的好主意與他人的壞主意一起被拋棄時,一個人就會變得更加惱火。然而,在整個會議期間內,大家都沒有懈怠,持續地努力投入著。

最終這13名科學家的思想碰撞產生了良好的化學反應 - Alan Perlis。

Algol

Hugo作者演講總結:Go語言的遺產



這是一種遠遠超越其時代的語言,它不僅是對其前輩的一種改進,而且對其所有後繼者也產生了重大影響。- Tony Hoare關於編程語言設計的提示– 1973年

  • 儘管發表了這一聲明,但Tony Hoare和Niklaus Wirth還是一起創建了稱為ALGOL W的ALGOL 60的後繼產品。
  • 進而導致Niklaus Wirth繼續創建了Pascal,Pascal編程語言最初於1970年發佈。
  • 接下來,CPL(Combined Programming Language)在劍橋大學獨立創建,也被稱為“劍橋編程語言”。
  • 接下來,一種稱為BCPL(或Basic CPL)的、基於CPL但比CPL更簡單的編程語言誕生。
  • 在美國貝爾實驗室,Ken Thompson和Dennis Ritchie創建了B語言,主要基於BCPL。
  • 在B語言發明後不久,它的後繼者C語言就誕生了。
Hugo作者演講總結:Go語言的遺產

之後,原本一脈相承的語言出現了分裂:

  • Pascal這一分支在歐洲蓬勃發展,有許多繼任者,包括Modula和Oberon。
Hugo作者演講總結:Go語言的遺產

  • C語言在美國激增,激發和促進了C++、C#、Java以及JavaScript、Python、Perl、PHP和許多其他語言的誕生和發展。
Hugo作者演講總結:Go語言的遺產

  • 到2007年,存在的數十種編程語言都可以追溯到其共同祖先:Algol。
Hugo作者演講總結:Go語言的遺產

1964年

我們的併發故事始於Doug McIlroy,他在1964年提出了一些新的想法,這些想法最終演化為Unix Pipes。

當有必要以另一種方式處理數據時,我們應該有一些耦合程序的方法,例如像將花園軟管擰入另一部分那樣。這也是IO的方式。- Doug McIlroy

1978年

到1978年,在對多處理器進行編程的背景下,有許多提議的方法被用於通信和同步。共享內存是最常見的通信機制。

託尼·霍爾(Tony Hoare)發表了一篇論文,該論文改變了一切。它比時代提前了幾十年。他稱他的論文為:"通訊順序進程,communicating sequential processes",就是大家熟知的CSP。

Hugo作者演講總結:Go語言的遺產

  • 進程(Processes):執行單元
  • 順序(Sequential):每個進程都作為一個普通的單線程程序運行
  • 通訊(Communicating):進程如何協調
  • 沒有內存共享
  • 沒有線程,沒有互斥體

Hoare的論文提出了一種語言,每個進程(或者作為一個普通的單線程程序)按順序執行,通過無緩衝通道(unbuffered channel)相互通信。Hoare的通信進程比典型的Unix Shell管道更通用,因為它們可以以任意模式連接。

Hugo作者演講總結:Go語言的遺產

三個語言分支因Hoare的CSP論文而誕生:Erlang 、Occam和Newsqueak。

  • 1983年誕生的Occam最接近CSP論文(由Hoare推薦)
  • Erlang在80年代後期專注於CSP的功能方面,並使用mailbox在進程之間進行通信
  • Rob Pike(Newsqueak之父)追逐了併發白鯨(the concurrency white whale)長達20年
Hugo作者演講總結:Go語言的遺產


Go是第一種可以同時擁有歐洲和美國語言設計分支傳統的語言。實際上,它已經統一了這三個分支

2016年,黑客新聞評論(Hacker News)上的一則帖子稱Go語言時停留在70年代的一種語言,這引起了一些對Go的批評……

2. 對過去偉大思想的復興

Hugo作者演講總結:Go語言的遺產

編程語言發展的四波浪潮

Hugo作者演講總結:Go語言的遺產

  • 第一波浪潮:語言擴張 - 巴別塔

特徵:多樣化。很久以前,語言是多種多樣的,並在在思想、方法和意見等方面體現出多樣性。

  • 第二波浪潮:語言的標準化

特徵:快速、複雜且對開發不友好。語言的標準化發生了數十年。到2000年代,事情開始停滯。他們融合為兩個陣營:Java/JVM和C/CLR。C++、Java、C#都非常相似。

  • 第三波浪潮:腳本語言

特徵:慢、不安全但對開發友好。腳本語言作為對上述語言的複雜性和痛苦的回應而應運而生。它們開發快速而鬆散,對開發人員友好,但缺乏性能和安全性。

  • 第四波浪潮:恢復

特徵:快速、安全、對開發人員友好

Go是對這些語言的複雜性和痛苦的一種反應,也是對腳本語言快速開發和鬆散本質的反應。

Go恢復了早期語言的簡單性和靈活性,增加了現代語言的安全性和開發友好性。Go以一種非常真實的方式復興了許多偉大的想法,這些想法終於準備就緒。

Go給人的感覺就像是來自60年代,70年代,80年代,90年代,00s,10年代的語言……Steve Francia 2019

Go感覺像這樣是因為它由過去60年來的許多偉大構想組成。

Hugo作者演講總結:Go語言的遺產


現在,我想談談Go中的3種特定功能(簡單、併發和Go的OO)以及這些思想起源的4種語言(Oberon、Newsqueak、Simula和Smalltalk)。在Go恢復它們之前,許多思想被遺忘了。

1988年

簡單易讀的結構和語法: Oberon&C

Niklaus Wirth負責Algol-W,Pascal,Modula。現在是1988年,他的最新語言是Oberon。

Oberon的程序結構,以"hello, world"例子為例:

MODULE hello;

IMPORT Out;

BEGIN
Out.String("Hello, World"); Out.Ln
END hello.

Oberon圍繞著愛因斯坦(Albert Einstein)的座右銘設計:“使事情儘可能簡單,但不要過於簡單。”

程序結構非常簡單。

下面是Go的"hello world"程序結構:

package main

import "fmt"

func main(){
fmt.Println"hello world")
}

這個例子看起來應該很熟悉,它直接採用Oberon的結構。

我們再來看看Oberon的聲明結構:

CONST n = 42;
TYPE mystring = ARRAY 32 OF CHAR;
VAR s: mystring;

PROCEDURE squared(x:INTEGER):INTEGER;
BEGIN
RETURN x * x
END squared;
VAR b,c: INTEGER = 1,2;
const n = 42

type mystring string

var s mystring

func squared(x int) int {
return x*x
}

var b, c int = 1, 2

在Go和Oberon中,聲明都是從左到右(名稱,類型,可選值),這恰與C相反,在C語言中,類型放在前面。

很多人看到Go後會問為什麼我們要翻轉C語法,他們錯誤地認為Go的聲明結構來自C語言。它不是,它來自Oberon。

Go使用了Oberon形態,但卻用C的token:

  • {}代替BEGIN END
  • ++,-- 代替(內置)的INC和DEC
  • != 代替#
  • %代替MOD
  • || 代替OR
  • []代替ARRAY
  • 結構體代替RECORD
  • *代替POINTER TO

雖然結構來自Oberon,但Go使用的token卻來自C。

  • 這裡沒有太多,這就是重點。語法和結構都很簡單。
  • 沒有繼承,沒有層次。沒有複雜的作用域(scope)系統。
  • 它們儘可能簡單,但並不過於簡單。

您可以看到Go如何採用Oberon的簡單結構,但是刪除了笨拙的語法,並採用C語言的更加優雅和熟悉的語法替換了它們。

這樣做的結果是一種非常易讀的語言誕生了。

1989年

併發與Newsqueak

羅伯·派克(Rob Pike),他於1989年在貝爾實驗室工作。他在這裡設計了Newsqueak。

  • Newsqueak是一門用於研究和探索的編程語言
  • 它致力於在Sequeak基礎上添加實用的、切實可行的併發(concurrency)支持
  • Newsqueak語法上類似C
  • 像CSP一樣,Newsqueak使用Channel作為Process的集合點

Rob Pike的Newsqueak在語法上看起來像C,但對併發支持的更好。Squeak用於設計菜單和滾動條之類的設備,Newsqueak解決了同樣的問題,但涉及範圍更廣:Newsqueak用於編寫整個應用程序,尤其是窗口系統。

Newsqueak-Prime Sieve pt.1

譯註:Rob Pike拿手的素數篩例子

Newsqueak-Prime Sieve pt.2

與CSP和Squeak不同,Newsqueak將channel視為一等公民:channel可以存儲在變量中,可以作為參數傳遞給函數,甚至channel自身也可以通過channel發送。

另外"

channel和routine

我們看到:Go的併發方法幾乎與Newsqueak完全相同,channel和 goroutines的使用方式也是相同的。

select

Newsqueak還使用了看起來與Go的select語句非常相似的select。

select {
case msg1 = print(“received”, msg1, “\\n”);
case msg2 = print(“received”, msg2, “\\n”);
}

您可以清楚地看到Go併發的基礎在25年前是如何在Newqueak中被建立起來的。Go採納了這些"老想法",並對其進行了改進,使其可以投入生產。

Ryan Dahl: Node.js的創建者的訪談(2017)

我喜歡Go的編程模型。使用goroutine是如此簡單和有趣……如果您要構建服務器,那麼我無法想象使用Go以外的任何工具。Goroutine使Go的併發變得簡單。

1965年

面向對象基礎(Smalltalk)

OO在C++/Java之前就已存在,在C++和Java重新定義面向對象之前。

什麼是面向對象?

  • 附加到數據對象的過程(Procedure)
  • Procedure的可重用性

Procedure+數據

Hugo作者演講總結:Go語言的遺產


Simula繼承了Algol,並在其中添加了對象,類,繼承和子類。Simula被認為是第一種面向對象的編程語言,並且在Smalltalk和所有隨後的OO語言的開發中具有重要的影響力。

Simula改變了一直以來的從Procedure的角度來看的思維方式,…他將其翻轉為…面向對象的視角,即在每種類型的對象中,您都有處理它的所有方法。- Small Talk的實現者Dan Ingalls

1980

接下來是Smalltalk,其中一切都是對象,並且僅通過發送消息與對象進行通信。

Hugo作者演講總結:Go語言的遺產

我確實發明了“面向對象”這個術語,但這是一個錯誤的選擇,因為它沒有強調消息發送這個更重要的思想。- Alan Kay: 從A到Z的編程語言:Smalltalk-80 – 2010

1989年

Procedure重用

我們將討論兩個出版物:

如果系統的任何部分取決於另一部分的內部結構,那麼複雜度會隨著系統大小的平方而增加 - Dan Ingalls面向對象編程— 1989年

繼承。我們看到了繼承帶來的這種指數級複雜性

對於使用半新的OO語言進行編程的任何人,這應該看起來都很熟悉。關係線無處不在。- SPAGHETTI CODE的誕生

論文《強類型面向對象編程的接口》中所提到的系統提供了Ada和Modula-2之類的語言中的模塊接口的優點,同時保留了可表達性,使無類型的面向對象的語言(如Smalltalk)具有靈活性。

Go interfaces

Go團隊在實現interface時並不知道到該論文的存在。由於這兩種方法的明顯相似性,後來與他們share了該論文。

Go採取了非常相似的方法,但是對上面論文中想法進行了改進,因為Go接口是隱式的,這使Go應用程序解耦並提供了極大的靈活性。

當您嘗試分解一個複雜的問題時,您想要嘗試將其分解為儘可能少的部分,並且希望它們儘可能獨立。- Dan Ingalls 面向對象編程— 1989

Go的interface和method採用儘可能獨立的方式。只要添加正確的方法,任何類型都可以滿足任何接口。可以在滿足該接口的類型之前或之後定義一個接口。事實證明,這種方式是有效的,而且效果很好。

Go的OO

  • method提供任何類型的消息發送機制
  • 接口通過動態調度多態性提供可重用性

Go提供了像Smalltalk定義的那種面向對象編程,只是更加貼近實際,即使它不包含類,對象或繼承。

  • Smalltalk: OO是關於消息發送
  • Go的interface允許方法像Smalltalk的消息一樣自由使用,但是是在一種有類型的語言中使用

3. Go的設計哲學

Hugo作者演講總結:Go語言的遺產

2007年

在一次耗時45分鐘的C++構建過程中……

羅勃·派克:把時鐘撥回到2007年9月,當時我正在對一個巨大的谷歌C++程序做一些微小但重要的優化工作,你們都與這個龐大的程序做過交互。我得這個編譯過程在我們的巨大的分佈式編譯集群上跑了約45分鐘。我收到一條消息:為C++標準委員會服務的幾位Google員工將進行一個演講,他們將告訴我們C++ 11的新功能。

在一個小時的演講中,我們聽到了有關計劃中的35個新功能的消息。……這時我問自己一個問題:"C++委員會真的相信C++的不足之處在於它沒有足夠的功能嗎?" 當然……,簡化語言而不是為其添加更多功能將是一個更大的成就。Rob Pike和他的辦公室同事(Robert Griesemer、Ken Thompson)回到了辦公桌前。這真的讓他們開始思考…

現代實用的編程語言應該是什麼樣?到45分鐘構建完成時,他們已經有了一個充滿想法的白板。

語言設計的進化過程

我們從頭開始構建,僅從C中借鑑了一些小東西,例如運算符和大括號,以及一些通用關鍵字。當然,我們還借鑑了我們所知道的其他語言的想法。- 羅伯·派克(Rob Pike)

少即是(指數級的)多 – 2012年,在談到Go的靈感時 Rob Pike

Go的眾多祖先和對Go有影響的語言:

Hugo作者演講總結:Go語言的遺產


我要說的是,沒有哪位語言設計師比這三位語言設計師(Rob Pike, Robert Griesemer, Ken Thompson) 具有更廣泛或更深的語言設計專業知識。他們對以前發生的事情有很豐富的瞭解,他們知道該採摘什麼。他們還具有事後觀察的優勢(後發優勢)。這是修復他們認為可以做得更好的事情的機會。

進化不是革命

  • 原則1:大多數思想都來自先前的思想

大多數思想根本不是新事物

進化不是革命:新語言應該鞏固而不是發明新特性

等待良好的設計

  • 原則2:No是暫時的,Yes是永遠的。

在Go的整個歷史中,有很多這樣的實例。通常的想法是,在設計語言時,不會出現“撤消(undo)”的情況。如果您今天說“No”,那麼您明天總是可以說“Yes”,但是如果今天您說“Yes”,那麼您將在很長一段時間或永遠被它“困”住…。

如有疑問,請將其排除在外。- Joshua Bloch:關於設計的對話– 2002

共識驅動的設計

  • 原則3: 應該使一切都儘可能簡單,但不要過於簡單。-愛因斯坦

當我們三個人開始時,這純粹是研究。…我們從一個想法開始,即我們三個人都必須針對該語言的每個特性進行討論,因此,無論出於何種原因,都不會在該語言中放入多餘的垃圾。- 肯·湯普森(Ken Thompson)訪談– 2011年,肯從Bell Labs學習了這種做法

有兩種構建軟件設計的方法。一種方法是使其變得如此簡單,以至於顯然沒有缺陷。另一種方法是使其變得如此複雜,以至於沒有明顯的缺陷。- 託尼·霍爾(Tony Hoare)皇帝的舊衣服-1981年,Go採取了第一種方法,而大多數其他語言都採用第二種方法。

快速迭代期待並實現大規模改變

  • 最後一個原則是快速迭代的原則。

當您處於語言的設計階段時,您將需要進行頻繁且有時是巨大的更改。朝著這個期望前進,並圍繞它建立您的流程。

4. 今天的Go

Hugo作者演講總結:Go語言的遺產


我們來看Go如今是如何演變的。

2019年

Go今天是如何繼續進行演化的。

上面的4條原則在該語言的初期,在發行穩定版之前和被採用之前都非常有效。

但我們現在的處境非常不同。我們不再能夠將所有貢獻者都放在白板上,甚至不能放在如此大的房間中(譯註:Go目前的contributor數量龐大)。

現在,我想與大家分享Go項目今天如何進行更改的。

我們的原則是“等待良好的設計”,這似乎意味著這是一種消極的活動,但這與事實相去甚遠。真正的意思是,除非我們非常有信心採用正確的方法,否則我們不會接受更改。

這意味著所有問題的默認答案是“否”。“是”的成本非常高,因此需要一個壓倒性的理由。

對一件事說“Yes”意味著對其他一切都說“No”。

軟件複雜性的主要原因是供應商不加批判地採用了用戶想要的幾乎所有功能。人們似乎將複雜誤解為先進。

不可理解的應該引起懷疑而不是欽佩。- Niklaus Wirth, 1995年

我們對Go進行了長期展望。為下一個十年或兩個或更多個而設計。大多數項目的運行時間要短得多,因此通常會接受第一個可通過的解決方案。

隨著時間的流逝,經過長時間這種訓練的人們已經意識到:如果一個好主意會被接受,或者反之,不好的主意會被拒絕。

由於我們的長期觀點,在為Go項目做出貢獻時人們掙扎並不罕見。當他們的想法不能被接受時,許多人感到被親自拒絕。

或更糟糕的是,人們會感到自己不合格或不稱職。我記得有這種感覺。

幾年前,我創建了一個網站引擎Hugo,隨著時間的推移,它成為Go模板的第一用戶,並在此過程中發現了幾個問題。儘管如此,我感到非常沒有資格報告這些問題,因為我認為創建這些庫的“專家”顯然比我瞭解更多,並且我無能為力。在第一次或第二次Gophercon上,我碰巧在午餐檯上站在Russ Cox旁邊,我們開始交談。他強烈鼓勵我報告這些問題,並讓我知道他們多麼地需要反饋。

幾年後,我加入了Go團隊,並從這個經驗中學到了很多。我觀察到的一件事是,Go團隊那些加入較久的核心成員有一件事比大多數其他成員都做得更好,這可能不是您的想法。Go團隊的老成員已經非常習慣於聽到“不”的聲音。我們團隊成員的提議被拒絕的比率很高,甚至高於Go團隊之外的提議。我們已經瞭解到,每個“No”都與擁有正確的“Yes”僅一步之遙。

因為我們經常聽到“No”的聲音,所以我們同情別人被拒絕的感覺。

今天我要傳達給您的信息是您受到重視和需要。請繼續嘗試。在接下來的十年或二十年或更長的時間內,您是Go演化的關鍵部分。

Go開發流程

Go開發流程

實驗流程簡化始於今年早些時候,Russ Cox談論了我們用來對Go進行更改的流程以及它的演變方式。在演講中,他討論了實驗的兩個步驟,並簡化了我們的迭代過程。

我們的過程不是為了速度而建立的,而是為了正確。我們花費大量時間進行實驗和簡化,然後完善自己的想法,直到它們正確為止。

你們都是Go偉大實驗的一部分,並且是繼續構建Go的過程的關鍵部分

我想與大家分享3種方法,每個人都可以為Go做出貢獻。

  • 使用Go -> 識別問題 -> 您遇到的事情/體驗並寫下來。
  • 您有想法-> 編寫建議 -> 納入反饋
  • 您閱讀提案 -> 閱讀評論 > 添加您的聲音
Hugo作者演講總結:Go語言的遺產


Go開發過程:實驗 -> 簡化 -> 最終交付。通過此提煉過程,想法將準備就緒,我們將進行交付。我想對過程的這一部分及其工作原理提供更多見解。

共識驅動的設計

  • 誤解:谷歌有一小群“決策者”
  • 真相:評論者之間達成共識

關於提案過程的事實

  • 事實上,大多提案提案都很小
  • 幾乎所有提案的討論最終都在參與者(評論員)之間達成了共識。
  • 提案審核委員會主要進行一些“園藝勞動”(譯者:社區行為培養)

您看到這不是一件非常迷人的工作。我們評論的大多數問題都要求您澄清問題或什麼也不做,讓對話繼續進行。我們還會考慮誰在對話中丟失,並邀請他們加入對話。

當討論似乎已經解決(贊成或反對)時,我們將關閉其中的一小部分。

讓我們看一下最近的一個建議。這只是從最近提案池中隨機選取的一個。

它具有一些有趣的屬性:大量參與,來自9個參與者的25條評論引用用戶問題(體驗)。早期該issue尚無共識(由點贊決定)。

在對該想法進行討論和完善之後,很明顯已經達成了普遍共識。

它被標記為“可能接受”,並且留下足夠的時間窗口允許任何人提供我們不接受的理由。

這是一組最近審核的提案。您會注意到,他們每個人都引用了之前的評論,並根據這些評論提出了建議。

在提案審核委員會中,通常會有一個人留下評論,但代表所有出席者。Russ Cox通常志願承擔了這個角色,這就是為什麼所有這些issue上面都加上他的名字的原因。在大多數情況下,此窗口不會附加註釋。我們覺得這個窗口雖然很少使用,但對於建立共識的過程至關重要。

變化是緩慢發生的

這是設計使然。這是緩慢的、謹慎和有條不紊的,以確保我們最終達到想要的目標。

過去十年的主要里程碑

儘管Go的變化緩慢,但增長迅速。我想了解一下過去十年中的一些主要里程碑。

Hugo作者演講總結:Go語言的遺產

  • 2009年, Go語言開源,Gopher誕生,Go脫離了Google的實驗場;
  • 2010年,獲得年度TIOBE語言,Bossie獎,引入append和go tour;
  • 2011年,gccgo合併到GCC中,引入gofix,YouTube在生產中採用了Go;
  • 2012年,Go 1.0發佈!發佈Go1兼容性承諾;在Google內部發布第一項Go生產服務
Hugo作者演講總結:Go語言的遺產

  • 2013年,Packer,Docker,Hugo用Go編寫;6個月發佈週期;第一個Go大會舉行(日本東京)
  • 2014年,Kubernetes使用Go開發;代碼倉庫由Mercurial→Git;第一次美國和歐洲會議;Go項目貢獻者達到500名;
  • 2015年,Go編譯器使用Go重寫,實現自舉;GC精化; Women Who Go&GoBridge born; 印度、中國第一次go大會舉行;
  • 2016年,支持HTTP/2和Context;第一次拉丁&中東Go大會舉行;最受喜歡的5門編程語言;第一次Go用戶調查;貢獻者達1000名;
Hugo作者演講總結:Go語言的遺產

  • 2017年,GC小於ms級的暫停; 引入type alias;開發人員想要使用編程語言第一名第一次); 13次會議; 第一屆貢獻者峰會
  • 2018年,引入Go模塊;來自Go團隊之外的貢獻者人數首次超過Go團隊;19次Go會議;Go新品牌和logo發佈;PR數在github排名第四; 開發人員打算學習的語言中排名第一

5. Go的遺產

Hugo作者演講總結:Go語言的遺產

沒有時間機器可以達到未來。未來的到來緩慢而又出乎意料。我們不知道Go或世界將會發生什麼。但是我們確實知道我們想留下什麼標記。

  • 我們希望Go能夠留下創新的遺產

Go向主流受眾帶來了創新的想法,例如goroutine,channel,簡單的interface。這些想法現在正在其他語言中出現,我們為這一趨勢繼續感到高興。

Go fmt於2009年推出時頗有爭議。現在,大多數語言都採用了類似的方法。

也許我們最有影響力的遺產將是,我們像Go一樣激勵人們挑戰既定的規範,並在各處尋找靈感。

  • 我們希望Go留下增強信心和能力的遺產

Go使開發人員能夠編寫生產服務器軟件而無需C和C++所需的額外專業知識,而無需現代Java的複雜性,也無需解釋語言的性能成本。

Go比其他任何語言都更能使人們把他們的想法變成現實。當我第一次開始撰寫Hugo時,我個人感覺到了這一點,這是Go最吸引我的地方。

其他那些也被賦予了類似的能力和信心的人,其中許多人在本次會議上談到了Go的創造性用途,包括Florin的家庭自動化研討會,Ron的機器人,Elias的GUI等。

  • Go改變生活。

我有幸環遊世界,在任何地方遇到的男人和女人,他們通常沒有CS背景或學位,但能夠學習Go並用它來創辦公司,獲得更好的工作並改善他們和他們家人的生活。

遺產不會為人們留下任何東西。它在人們身上留下了一些東西。- 彼得·斯特普爾

我們每個人都受到過往歷史的影響。我們是遺產。我們被影響,我們影響別人。

原文鏈接:https://tonybai.com/2019/11/04/the-legacy-of-go/


分享到:


相關文章: