Go 部落格

2023 年第一季度 Go 開發者調查結果

Alice Merrick
2023 年 5 月 11 日

感謝各位受訪者分享這些寶貴的見解!

我們很高興與大家分享 2023 年 1 月份 Go 開發者調查的結果。感謝 5,844 位受訪者與我們分享他們如何使用 Go、在使用 Go 時遇到的最大挑戰以及對未來改進的最高優先順序。這些結果有助於 Go 團隊將精力集中在對社群最重要的領域,我們也希望這些見解能幫助那些為 Go 生態系統做出貢獻和支援 Go 生態系統的人們。

主要發現

  • 新手 Go 開發者對 Web 開發感興趣。我們今年根據自我認定的經驗水平引入了新的細分方式。新手開發者表現出與其他經驗水平不同的有趣之處。最值得注意的是,他們對使用 Go 進行 Web 開發表現出更大的興趣。
  • 錯誤處理和學習是受訪者面臨的最大挑戰。歷史上,泛型缺失是使用 Go 的最大挑戰,但自泛型推出以來,我們看到的關於泛型的評論有所減少。關於錯誤處理(可讀性和冗餘性方面)以及學習最佳實踐的難度,現在是最常報告的挑戰。
  • 最佳化指南是被認為最有價值的改進 Go 效能的方式。當被問及如何將資源用於改進 Go 的編譯和執行時時,受訪者將最多的資源投入到最佳化指南上,而不是特定的效能改進,這表明文件在這個領域受到了極大的重視。
  • 管理依賴項和版本控制是開源 Go 模組維護者的最大挑戰。開源模組維護者在保持依賴項更新以及避免因版本控制和破壞性更改而中斷方面面臨挑戰。我們將進一步探討這一領域,以幫助維護者提供一個穩定且健康的生態系統。

如何解讀這些結果

在本文中,我們使用調查響應圖表來為我們的發現提供支援證據。所有這些圖表都採用相似的格式。標題是調查受訪者看到的準確問題。除非另有說明,問題都是單項選擇題,參與者只能選擇一個答案;每個圖表的副標題會告訴你該問題是否允許多選,或者是一個開放式文字框而不是單項選擇題。對於開放式文字響應的圖表,Go 團隊成員會閱讀並手動分類所有響應。許多開放式問題會引出各種各樣的回答;為了保持圖表大小合理,我們將它們精簡為前 10-15 個主題,其他所有主題都歸類為“其他”。如果適用,我們也包含了一個“無”類別。

為了幫助讀者理解每個發現背後的證據權重,我們加入了誤差線,顯示 95% 的置信區間;誤差線越窄,置信度越高。有時兩個或多個響應具有重疊的誤差線,這意味著這些響應的相對順序在統計學上沒有意義(即,這些響應實際上是並列的)。每個圖表的右下角顯示了包含在圖表中的響應人數,格式為“n = [受訪者人數]”。

關於方法論的說明

大多數調查受訪者透過訪問 Go 部落格Twitter 上的 @golang 或其他 Go 社交渠道的連結“自行選擇”參加調查。不關注這些渠道的人可能與那些密切關注他們的人反應不同。大約四分之一的受訪者是隨機抽樣的,這意味著他們在看到 VS Code 中的提示後回覆了調查(在 2023 年 1 月 18 日至 2 月 8 日之間使用 VS Code Go 外掛的每個人都有 10% 的機會收到此隨機提示)。這個隨機抽樣組幫助我們能將這些發現推廣到更廣泛的 Go 開發者群體。大多數調查問題在這些組之間沒有顯示出有意義的差異,但在少數存在重要差異的情況下,讀者將看到將響應細分為“隨機樣本”和“自行選擇”組的圖表。

深入瞭解不同群體的受訪者

與我們上次調查相比,我們的受訪者人口統計學特徵沒有顯著變化。與以往一樣,Go 主要用於科技行業,約 80% 的受訪者表示他們在工作中會使用 Go 程式設計。總的來說,受訪者在過去一年中對 Go 的滿意度較高,92% 的人表示他們“比較滿意”或“非常滿意”。

Bar chart
showing where respondents use Go Bar chart showing proportion of satisfied
respondents

與使用其他語言相比,我們的受訪者在 Go 程式設計上花費了大量時間。大約三分之一的受訪者甚至維護著一個開源 Go 模組。我們認識到,我們的調查受眾是由那些成功採用 Go、經常使用 Go 並對使用 Go 大體滿意的人組成的。為了識別在滿足社群需求方面可能存在的差距,我們查看了不同的受訪者子群體,以瞭解他們可能如何使用 Go,或者擁有不同的優先順序。例如,今年我們研究了不同樣本來源(即 Go 部落格或透過 VS Code 外掛)、不同職位、組織規模和 Go 經驗水平的受訪者之間的差異。最有趣的差異在於經驗水平之間。

來自新手受訪者的見解

Bar chart of years of experience using
Go

以前,我們使用受訪者使用 Go 的時間(月/年)作為代理來了解不同經驗水平的結果差異。今年,我們嘗試了一個新的細分問題,“您的 Go 經驗水平如何?”,以檢視自我識別是否比將各種時間間隔分組更有效地研究 Go 經驗。由於“新手”或“專家”等類別術語因人而異,我們提供了一個描述來幫助使這些分組更具客觀性。選項是:

  • 意識:我瞭解 Go,但無法在協助下編寫簡單的 Go 程式
  • 新手:我可以完成簡單的 Go 程式設計專案,可能需要協助
  • 中級:我可以完成重要的 Go 程式設計專案,需要一些協助
  • 高階:我可以獨立完成重要的 Go 程式設計專案
  • 專家:我可以為其他工程師提供 Go 相關的指導、故障排除和回答問題

Bar chart of levels of experience
using Go

我們發現受訪者使用 Go 的時長與他們自我認定的經驗水平之間存在中度相關性 (⍴ = .66)。這意味著經驗水平的量表,儘管與時間量表相似,但可能為我們提供一些關於受訪者因經驗而異的新見解。例如,與使用 Go 的時長相比,受訪者花費在 Go 程式設計上的時間佔總程式設計時間的比例,與其自我認定的經驗水平的相關性更強。

在我們使用此細分進行的分析中,我們通常會排除“意識”類別,因為他們不被認為具有回答問題所需的經驗,並且只佔受訪者的大約 1%。

新手受訪者比經驗更豐富的受訪者更傾向於偏好 Windows

我們的隨機抽樣組中新手受訪者的比例高於自行選擇的組,這表明有更多的新 Gopher 我們不太常聽到他們的聲音。因為他們是透過 Go VS Code 外掛抽樣的,我們可能會期望這個群體比其他經驗水平的開發者更傾向於使用 VS Code 或在 Windows 上開發。雖然這是真的,但新手也比其他經驗水平的開發者更傾向於在 Windows 上開發,無論他們是透過 VS Code 外掛回覆的。

Bar chart of levels of experience
using Go for self-selected and random samples Bar chart of editor
preference broken down by experience levels for self-selected group only Bar chart of
levels of experience using Go

在較高經驗水平的情況下,我們沒有看到更高的 Windows 使用者比例可能有很多原因。例如,Windows 使用者可能更容易遇到困難而停止使用 Go,或者可能存在與作業系統使用相關的更廣泛趨勢,而與 Go 無關。無論如何,在未來關於 Go 入門的研究中,我們應該納入更多的 Windows 使用者,以確保我們提供包容的入門體驗。

不同經驗水平的開發者目前如何使用 Go(以及他們希望在哪些領域使用)

Bar chart of use cases Bar chart of use
cases broken down by experience level

根據受訪者目前使用 Go 的方式,經驗更豐富的 Gopher 傾向於將 Go 用於更多型別的應用程式。例如,平均而言,專家在至少四個領域使用 Go,而平均新手僅在兩個領域使用 Go。這就是為什麼新手和專家在每個用例中使用 Go 的比例存在巨大差異。然而,排名前兩位的用途,API / RPC 服務和 CLI,是所有經驗水平開發者的首要用例。

我們在 GUI 和網站/Web 服務(返回 HTML)方面看到了更有趣的趨勢。所有經驗水平的開發者使用 Go 進行桌面/GUI 應用的比例大致相同。這為我們提供了證據,表明對 GUI 的需求不僅僅來自尋找有趣入門專案的新 Gopher,而是來自整個經驗譜系。

返回 HTML 的網站/服務呈現出相似的趨勢。一種可能的解釋是,這是某人 Go 之旅早期的一個常見用例(因為它在新手中最常見的三個用例中),或者新手更有可能在網站或返回 HTML 的 Web 服務上工作。在調查的後期,我們問受訪者:“您目前不使用 Go,但最希望在哪個領域使用?” 雖然許多受訪者(29%)表示他們已經在所有希望使用的領域都使用了 Go,但希望擴充套件使用的前兩個領域是 GUI / 桌面應用程式和 AI / ML 應用程式。這在不同組織規模和職位型別的群體中是一致的,但在經驗水平上則不然。新手希望更多地使用 Go 的首要領域是返回 HTML 的網站/Web 服務。

Bar chart of levels of
experience using Go

在一個開放式問題中,19 位(佔 29%)表示希望使用 Go 進行返回 HTML 的網站/Web 服務的受訪者表示,他們之所以受阻,是因為其他語言有更好的框架來支援這種用例。經驗更豐富的 Go 開發者可能不會嘗試或期望使用 Go 來處理這個用例,因為其他語言已經有滿足這些需求的框架。正如一位受訪者所說:

“通常用其他語言,如 PHP 或 Ruby 來完成這項任務更容易。部分原因是這些語言中存在出色的框架。”

新手對 Web 開發感興趣的另一個原因可能與他們使用 JavaScript / TypeScript 有關。新手花費在 JavaScript / TypeScript 上的時間比經驗更豐富的受訪者要多。對 Web 的更高興趣可能與新手目前使用其他語言處理的工作有關,或者可能表明對 Web 技術普遍感興趣。未來,我們希望更多地瞭解這個用例,以及如何幫助新 Gopher 在對他們最有用的領域開始使用 Go。

Bar chart of levels of
experience using Go

受訪者面臨著長尾挑戰

每個調查週期,我們都會詢問受訪者在使用 Go 時遇到的最大挑戰。歷史上,泛型缺失是最常被提及的挑戰——例如,它是 2020 年最常見的回答,約佔受訪者的 18%。自泛型推出以來,錯誤處理(12%)和學習/最佳實踐/文件(11%)已經成為一系列問題的突出之處,而不是任何單一問題變得更頻繁。

Bar chart of
biggest challenges

為什麼錯誤處理是一個如此大的挑戰?

關於錯誤處理的反饋通常將問題描述為冗餘。表面上看,這可能反映了編寫重複程式碼令人厭煩或惱人。然而,錯誤處理不僅僅是編寫樣板程式碼的煩惱,它還可能影響受訪者除錯的能力。

一位受訪者簡潔地說明了這個問題

“錯誤處理會造成混亂,如果不正確,很容易掩蓋問題(沒有堆疊跟蹤)”

學習最佳實踐的掙扎

“有效地使用 Go。易於學習,難於精通。”

我們聽說 Go 易於學習,並且之前的調查顯示,超過 70% 的受訪者在第一年內感到使用 Go 很有成效,但學習 Go 的最佳實踐是使用 Go 的最大挑戰之一。今年的受訪者告訴我們,關於程式碼結構推薦的工具及庫的最佳實踐文件不夠完善,這給初學者和團隊保持程式碼一致性帶來了挑戰。學習編寫慣用的 Go 對於來自其他程式設計正規化的人來說尤其具有挑戰性。更有 Go 經驗的受訪者證明,當開發者不遵循編寫慣用的 Go 的最佳實踐時,會損害共享專案的程式碼一致性和質量。

模組維護者的最大挑戰

Go 模組維護者是 Go 社群的關鍵成員,有助於成長和維持我們軟體包生態系統的健康。今年,我們計劃與模組維護者進行研究,以確定支援軟體包生態系統穩定和增長的機會,並幫助在組織內推廣 Go 的採用。為了給這項研究提供資訊,我們在調查中增加了一個問題,以瞭解開源維護者目前面臨的最大挑戰。

Bar chart of
challenges for open source module maintainers

維護者的主要挑戰是保持依賴項的更新以及版本控制方面的困難,包括避免、識別或知道何時引入破壞性更改。這些見解,以及未來研究的結果,將有助於制定支援維護者保持 Go 生態系統穩定和安全的策略。

部署 Go 程式碼時面臨的最大挑戰

今年我們詢問了受訪者在部署 Go 程式碼時遇到的最大挑戰。“易於部署”通常被認為是選擇 Go 的原因,但在最近一項研究中,我們收到了相互矛盾的反饋,這促使我們探索部署 Go 程式碼時可能存在的問題。在我們開放式文本回答中,最常見的主題是使用 cgo 進行交叉編譯的困難(16%),而對 WebAssembly 或 WASI 的支援則遠遠落後(7%)。

Bar chart of challenges
for open source module maintainers

社群優先順序:受訪者最希望什麼

今年,我們採用了之前調查中使用過的基於“購買功能”的優先順序排序方法。受訪者獲得了 10 個“gophercoin”,並被要求將它們分配到他們希望看到改進的領域。受訪者被隨機分配到三個可能的問題中的一個,每個問題包含七個與工具、安全或編譯器和執行時相關的專案。這種方法使我們能夠在不給受訪者增加過多的認知負擔的情況下,詢問與每個焦點領域相關的專案。

在該練習結束時,我們給受訪者提供了一個開放式文字提示,讓他們告訴我們任何他們認為 Go 團隊明年應該優先關注的領域,無論他們將硬幣花在哪些專案上。例如,如果一個受訪者看到了安全部分,但他們並不太關心安全,他們仍然有機會在開放式文字區域中告訴我們。

安全

我們選擇這些專案是為了檢驗我們對安全實踐對社群相對重要性的假設。這些是向參與者描述的七個專案:

  • pkg.go.dev 識別維護不善的軟體包(例如,對問題響應遲緩,未能更新依賴項,長期存在漏洞)
  • pkg.go.dev 識別會進行破壞性 API 更改的軟體包(即,在升級這些軟體包到新版本時需要修復對這些 API 的使用)
  • 支援在 govulncheck 中抑制漏洞
  • 一個用於跟蹤敏感資料如何在 Go 程式中流動的工具(檢測 PII 洩露)
  • 安全最佳實踐指南(例如,如何選擇和更新依賴項;如何設定模糊測試、漏洞檢查和執行緒消毒器;如何使用加密)
  • 預設安全的 Web 和 SQL 庫,幫助使用者避免在 Web 伺服器程式碼中引入漏洞
  • 符合 FIPS-140 的加密庫

Bar chart of where
respondents spent the most on security issues

資金投入最多的安全功能是提供預設安全的 Web 和 SQL 庫,以避免在 Web 伺服器程式碼中引入漏洞,但排名前四的功能都與避免引入漏洞有關。對安全預設值的需求與之前的安全研究一致,該研究表明開發者希望將安全“左移”:開發團隊通常沒有時間或資源來解決安全問題,因此重視可以降低他們首先引入安全問題的工具。第二常見的專案是安全最佳實踐指南,這突顯了與新工具或功能相比,最佳實踐文件對大多數受訪者的高價值。

工具

我們在這個問題中包含的專案受到了 VS Code 外掛使用者反饋的啟發。我們想知道哪些工具和 IDE 的改進對更廣泛的使用者群體(可能使用其他 IDE 或編輯器)最有幫助。

  • 更好的重構工具(例如,支援自動程式碼轉換:重新命名、函式提取、API 遷移等)
  • 更好的程式碼編輯器/IDE 中的測試支援(例如,健壯且可擴充套件的測試瀏覽器 UI,第三方測試框架,子測試支援,程式碼覆蓋率)
  • 更好的程式碼編輯器/IDE 中處理多個模組的支援(例如,編輯模組 A 和模組 B,其中模組 A 依賴於模組 B)
  • pkg.go.dev 中的依賴項洞察(例如,漏洞,破壞性更改,記分卡)
  • 程式碼編輯器/IDE 中的依賴項洞察(例如,漏洞,破壞性更改,記分卡)
  • 支援釋出帶有新模組路徑的模組(例如,儲存庫所有權移交)
  • 在程式碼編輯器/IDE 中查詢實現介面的型別和型別實現的介面的支援

Bar chart of where
respondents spent the most on tooling

資金投入最多的編輯器功能是查詢實現介面的型別和型別實現的介面的支援以及重構工具。我們還發現受訪者根據偏好的編輯器使用情況分配 gophercoin 的方式存在有趣的差異。最值得注意的是,VS Code 使用者在重構上花費的 gophercoin 比 GoLand 使用者多,這表明自動程式碼轉換目前在 GoLand 中比在 VS Code 中支援得更好。

編譯器和執行時

我們本節的關鍵問題是確定受訪者是希望預設提供更好的效能,更好的最佳化工具,還是僅僅更好地理解如何編寫高效能的 Go 程式碼。

  • 降低計算成本
  • 減少記憶體使用
  • 減小二進位制檔案大小
  • 減少構建時間
  • 更好的效能除錯工具
  • 最佳化指南(如何提高效能和降低成本,涵蓋 Go 的實現和效能除錯工具)
  • 改進使用 cgo 進行交叉編譯的支援

Bar chart of where
respondents spent the most on compiler and runtime improvements

迄今為止,此列表中資金投入最多的專案是最佳化指南。這在組織規模、職位和經驗水平方面是一致的。我們還增加了一個關於受訪者是否有資源成本擔憂的問題。大多數受訪者(55%)表示他們沒有成本擔憂,但那些對資源成本有擔憂的人花費的 gophercoin(平均 2.0 個)比沒有擔憂的人多用於降低計算成本和記憶體成本。然而,即使那些對資源成本有擔憂的人,在最佳化指南上花費的 gophercoin 也差不多(平均 1.9 個)。這有力地表明,提供 Go 開發者理解和最佳化 Go 效能的指導,目前比額外的編譯器和執行時效能改進更有價值。

結論

感謝您與我們一起審查 2023 年第一次開發者調查的結果!瞭解開發者的經驗和挑戰有助於我們確定如何最好地為 Go 社群服務。我們發現的一些要點特別有用:

  • 新手 Go 開發者比其他經驗水平的受訪者更傾向於 Web 開發。這是我們希望進一步探索的領域,以確保我們滿足新 Go 開發者的需求。
  • 預設安全的開發、安全和最佳化方面的最佳實踐指南,以及 IDE 中更多的重構輔助功能,將是對社群有價值的補充。
  • 錯誤處理是社群高度關注的問題,並在冗餘性和可除錯性方面帶來挑戰。Go 團隊目前沒有公開的提案可以分享,但正在繼續探索改進錯誤處理的方案。
  • 入門和學習最佳實踐是受訪者面臨的主要挑戰之一,並將成為未來研究的重點。
  • 對於 Go 模組維護者來說,保持依賴項更新、模組版本控制以及識別或避免破壞性更改是最大的挑戰。幫助維護者提供一個穩定且健康的生態系統也是進一步使用者體驗研究的一個感興趣的課題。

再次感謝所有回覆併為本次調查做出貢獻的人——沒有你們,我們無法做到。希望今年晚些時候在下一份調查中再見到您。

下一篇文章:Go 1.21 Release Candidate
上一篇文章:Go 整合測試的程式碼覆蓋率
部落格索引