寫了50萬行Go代碼是一種什么樣的體驗?
大家好,我是 polarisxu。
今天看到一篇文章:看看寫了 50 萬行代碼的 Gopher 對 Go 有什么感想。我對其中的核心內(nèi)容進行整理,分享給大家!
先簡單介紹下可汗學(xué)院(Khan Academy)。
這是一個非營利性組織,其使命是在任何地方為任何人提供免費的、世界級的教育。
全球有 6.17 億兒童缺乏基本的數(shù)學(xué)和閱讀技能??珊箤W(xué)院是一個提供他們所需教育的非營利組織,因此需要大家的幫助,你的幫忙可以改變一個孩子的一生。
所以,從網(wǎng)站介紹可以看出,這個組織主要靠大家的贊助維持運營。如果你支持這樣的公益事業(yè),可以到官網(wǎng):https://www.khanacademy.org/ 贊助。
從 Python2 遷移到 Go
可汗學(xué)院的項目 Goliath,最開始使用 Python2 實現(xiàn)的,2019 年逐步將其遷移到了 Go。這里有一篇文章介紹了遷移的事情:https://blog.khanacademy.org/go-services-one-goliath-project/。
因為這個決定,現(xiàn)在可汗學(xué)院所有的后端和全棧工程師都開始寫 Go 代碼,經(jīng)過幾年的積累,該項目跨域了一個巨大的里程碑:有超過 50 萬行 Go 代碼在線上運行著。這對于 Go 整個社區(qū)來說也是一件好事。
工程師很喜歡 Go
可汗學(xué)院的工程師們普遍認為「Go 很容易寫和讀」,用 Go 越多就越喜歡它。
一個有多年 .NET 經(jīng)驗的工程師說,Go 的錯誤處理和 .NET 的異常處理很不一樣。雖然經(jīng)常要處理 error,但如果一個函數(shù)沒有返回錯誤,那可以確定它一定成功了,這一點還是很棒的。
此外,他們對 Go 的工具鏈很喜歡。比如通過 go doc 可以查找標(biāo)準庫的文檔,特別方便。gofmt 讓代碼格式都一直,很適合閱讀代碼。雖然 Go Module 在社區(qū)抱怨的聲音不少,但相比之前來說,還是有很大進步,而且可汗學(xué)院在使用過程中沒有什么特別差的體驗。
同時,他們很喜歡 Go 的編譯速度,那叫一個快!
泛型,還是需要的
雖然大部分時候,并不需要泛型。但有時候,特別是是在寫內(nèi)部庫時,尤其涉及到 slice 時,明顯得感覺到需要泛型。
沒有泛型是目前社區(qū)對 Go 抱怨最多的(雖然也有人說不需要泛型,有泛型了就不用 Go 了。。。),目前 Go 團隊花了大量的時間在推進泛型。目前已經(jīng)可以嘗鮮,預(yù)計泛型會在 1.18 正式發(fā)布。
他們在遷移 Python 代碼時,有些 Python 的語言結(jié)構(gòu),使用 Go 實現(xiàn)需要花費較多時間。不過,Go 的語言特性少,使得代碼更一致,可讀性更好。就他們的系統(tǒng),有些特性,需要 2.7 倍的 Go 代碼實現(xiàn)同樣功能的 Python 代碼。注意,是部分功能。
習(xí)慣了 Python 的人,他們希望 Go 中能夠有更多的高階函數(shù)。隨著泛型的加入,這方面可能會加強,比如計劃增加的 slices 包。
性能和并發(fā)性
相比 Python,發(fā)現(xiàn) Go 的性能非常優(yōu)秀。盡管遷移過程中,有點直接從 Python 翻譯到 Go 的感覺,沒有對 Go 代碼做專門優(yōu)化,但性能表現(xiàn)依然搶眼。優(yōu)化后會有更好的表現(xiàn)。
其中一名工程師發(fā)現(xiàn),Python 版本中,某些批量數(shù)據(jù)更改每小時會產(chǎn)生大約 100 個 Google Cloud Datastore 競爭警告,而在 Go 版本中,競爭警告接近于零,因為它處理數(shù)據(jù)的速度要快得多。他們有一個包含 1000 名學(xué)生的課程,在 Python 中加載需要 28 秒,而在 Go 中只需要 4 秒。
雖然他們的 Python 版本時候單線程的,但 Go 版本還是使用了并發(fā)的特性。
Go 官方一般推薦使用 Goroutine + Channel,但可汗學(xué)院發(fā)現(xiàn),他們使用 sync 包的數(shù)量遠超 channel,不知道這種情況將來會不會改變。
50 萬行代碼后的總結(jié)
一般來說,實現(xiàn)同樣的功能,Go 代碼會比 Python 多; 但 Go 的速度快,工具好用,而且在線上運行穩(wěn)定、良好;
雖然可汗學(xué)院的工程師有不同的背景,對 Go 和其他語言也有不同的看法。經(jīng)過這段時間的磨合,目前看,對 Go 他們還算滿意。
你寫了多少 Go 代碼?你對 Go 的感受是什么?
推薦閱讀
