可汗網路學院編寫了50萬行Go程式碼後兩點心得

banq發表於2021-05-17

這是他們使用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。

  1. 缺乏泛型是人們對Go最大的抱怨。接受調查的工程師讚賞Go團隊花了很多時間來製作適合Go泛型這一事實,我們為這項工作正在向前而感到興奮。至少從釋出Go語言以來至今我們才用了幾年的時間。
  2. 在移植Python程式碼時,一位工程師指出,某些語言結構在Go上編寫時花費了更多的精力,但是Go相對較精簡的語言功能也使程式碼更一致,更易於閱讀。對於我們系統的一部分,我們需要2.7倍的Go行來處理與Python程式碼相同的功能,儘管部分原因是由於使用跨服務查詢替換了某些函式呼叫。
  3. 另一位工程師希望能夠更好地利用高階函式,並且所提出的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語言和其他語言,我們當然有多種見解。我們感謝推動其持續發展的團隊以及圍繞它建立的社群!


 

相關文章