可汗網路學院編寫了50萬行Go程式碼後兩點心得
這是他們使用Go語言的經驗教訓的分享,其中主要比較了Go與Python兩者語言的不同使用感受:
早在2019年12月,我首先寫了關於可汗學院的專案Goliath的專案,該專案將我們的後端從Python 2整體遷移到用Go編寫的服務。當我們開始Goliath時,團隊中沒有人知道Go,除了我們進行的實驗以證明Go比其他選擇對我們來說是一個更好的選擇。今天,我們所有的後端和全棧工程師都在編寫Go,而Goliath的增量交付使我們跨過了一個重要的里程碑:現在有超過500,000條Go生產線正在執行。這似乎是對Go本身進行反思的好時機。
工程師喜歡Go
我向工程師詢問了有關Go的一些開放式反饋,並且聽到了諸如“易於閱讀和編寫”以及“我更喜歡Go”之類的反饋。
一位工程師在.NET領域花費了多年的時間,並重視異常樣式的錯誤處理,這與Go的錯誤處理大不相同。如果您不熟悉該主題,則Go錯誤是從可能具有錯誤條件的函式返回的值。這位前.NET工程師現在說:“能夠呼叫不會返回錯誤並確定必須成功的函式真是太好了。”
另一位工程師引用了Go的標準庫文件。他喜歡“透過go doc io.Writer可以進行無網際網路瀏覽的功能”。
通常,Go工具是很棒的。編譯器速度很快,格式化已成為標準工具鏈的一部分,有助於消除大多數有關格式化的問題。儘管我仍然在Internet上看到關於Go模組的抱怨,但是它們比Go中以前的軟體包管理方法要好得多,因此,就我們的經驗而言,它們總體上還不錯。我們也很容易找到需要完成的工具和庫,例如gqlgen。
我們需要泛型,否則Go會更加冗長
在大多數情況下,編寫沒有泛型型別的Go程式碼是可以的。大多數時候,但是很多時候我們一直在編寫內部庫程式碼,或者當我們感覺到無法使用泛型時只能使用slices。
- 缺乏泛型是人們對Go最大的抱怨。接受調查的工程師讚賞Go團隊花了很多時間來製作適合Go泛型這一事實,我們為這項工作正在向前而感到興奮。至少從釋出Go語言以來至今我們才用了幾年的時間。
- 在移植Python程式碼時,一位工程師指出,某些語言結構在Go上編寫時花費了更多的精力,但是Go相對較精簡的語言功能也使程式碼更一致,更易於閱讀。對於我們系統的一部分,我們需要2.7倍的Go行來處理與Python程式碼相同的功能,儘管部分原因是由於使用跨服務查詢替換了某些函式呼叫。
- 另一位工程師希望能夠更好地利用高階函式,並且所提出的slice軟體包在這些方面看起來是不錯的補充。最終,我們希望編寫更少的程式碼,而泛型獲得的選項將對此有所幫助。
效能與併發
相比Python(或Python 2),我們發現Go的效能非常出色。從Python到Go,我們正在儘可能接近1:1比例原樣移植執行,而最終仍然以類似於Go的方式結束,而不是像看起來像Python-in-Go的程式碼。在這個過程中,我們明確地不優先考慮效能的工作,除非有真正的遞迴功能。
一位工程師指出,某些批次資料更改曾經在Python版本中每小時產生約100個Google Cloud Datastore競爭警告,而在Go版本中幾乎每小時都產生零個警告,因為它處理資料的速度更快。我們有一個異常案例,某個課程包含1,000名學生,Python可能需要28秒才能載入,而在Go中只需4秒。
儘管我們從大量的單執行緒Python進行了直接移植,但是我們確實已經對Go的併發功能進行了一些使用。一位工程師指出,儘管通道Channel是Go的突出功能,但我們使用sync軟體包的功能遠遠超過了通道。看看我們的喜好是否隨時間變化會很有趣。
總結一下:
- 是的,Go一般比Python更冗長...
- 但是我們喜歡它!快速,工具紮實,並且在生產中執行良好
我們的工程師來自不同的程式設計背景,因此對於Go語言和其他語言,我們當然有多種見解。我們感謝推動其持續發展的團隊以及圍繞它建立的社群!
相關文章
- 寫了 50 萬行 Go 程式碼後,我明白這些道理Go
- 可汗學院為何用Golang重寫他們的Python後端?GolangPython後端
- 網際網路架構實踐心得:業務程式碼究竟難不難寫?架構
- Linux系統中Shell指令碼編寫的一點心得Linux指令碼
- 兩週自制指令碼語言 - 讀後心得指令碼
- EBS SQL編寫心得SQL
- 可汗學院使用Go靜態上下文理順全域性變數和依賴 - khanacademyGo變數
- 從300萬行到50萬行程式碼,遺留系統的微服務改造行程微服務
- Go 語言編寫輕量級網路庫,GrapeNetGo
- 將GO編繹成JavaScript,用GO語言來寫前端程式碼GoJavaScript前端
- 寫了 20-50 年的程式碼,才明白的那些真理
- 寫了 100 萬行程式碼的程式設計師身上發生了什麼故事行程程式設計師
- 畢業前寫了20萬行程式碼,讓我從成為同學眼裡的麵霸!行程
- 如何學習用Java編寫程式碼?Java
- 最近讀了點 nsq 的原始碼,寫了兩篇文章給大家分享下。原始碼
- 每秒 50 萬行——MySQL 寫入壓測併發實踐MySql
- 中國社會科學院:後疫情時代的網際網路適老化研究
- 開發心得之想要好程式碼問世,我們至少要寫兩次
- 手寫 30 個主流機器學習演算法,程式碼超 3 萬行,全都開源了!機器學習演算法
- ??Mybatis原始碼我搞透了,面試來問吧!寫了134個原始碼類,1.03萬行程式碼!MyBatis原始碼面試行程
- 為程式碼編寫穩定的單元測試 [Go]Go
- Linux網路驅動程式編寫(四)(轉)Linux
- Linux網路驅動程式編寫(三)(轉)Linux
- Linux網路驅動程式編寫(二)(轉)Linux
- Linux網路驅動程式編寫(一)(轉)Linux
- Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 編寫python後臺程式Python
- 封裝DataBinding讓你少寫萬行程式碼封裝行程
- 身為程式設計師寫一百萬行程式碼的感覺程式設計師行程
- go學習--->開始編碼Go
- EA指令碼編寫要點指令碼
- 為了讓你搞定資料庫選型,這些工程師重寫了 26 萬行程式碼資料庫工程師行程
- Go Web 程式設計入門--深入學習用 Go 編寫 HTTP 伺服器GoWeb程式設計HTTP伺服器
- 六百萬行程式碼行程
- [譯] Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 兩行程式碼 寫個代理行程
- Sublime 編寫編譯 swift程式碼編譯Swift
- 程式碼編寫提示配置