Go 部落格
Go 開發者調查 2023 Q1 結果
感謝各位調查參與者為我們提供了這些洞見!
我們很高興與大家分享 2023 年 1 月版 Go 開發者調查的結果。感謝 5,844 位參與者與我們分享了他們如何使用 Go、使用 Go 時遇到的最大挑戰以及他們對未來改進的首要優先事項。這些結果幫助 Go 團隊將精力集中在對社群最重要的領域,我們也希望這些洞見能幫助其他為 Go 生態系統做出貢獻和提供支援的人。
關鍵發現
- Go 新手開發者對 Web 開發感興趣。今年我們根據自我認定的經驗水平引入了新的細分。新手錶現出一些與其他經驗水平有趣的區別。最顯著的是他們對使用 Go 進行 Web 開發表現出更大的興趣。
- 錯誤處理和學習是參與者面臨的首要挑戰。歷史上,缺少泛型是使用 Go 的最大挑戰,但自從引入泛型以來,我們發現關於泛型的評論有所下降。現在最常報告的挑戰是錯誤處理(關於可讀性和冗長性)和學習最佳實踐的難度。
- 最佳化指南是提高 Go 效能的最有價值的方式。當被問及他們會如何分配資源來改進 Go 的編譯和執行時時,參與者在最佳化指南上投入最多,而不是具體的效能改進,這表明該領域文件的重要性。
- 管理依賴項和版本控制是開源 Go 模組維護者的首要挑戰。開源模組維護者在保持其依賴項最新以及避免因版本控制和破壞性變更造成的干擾方面面臨挑戰。這是一個我們將進一步探索的領域,以幫助維護者提供穩定健康的生態系統。
如何解讀這些結果
在本文中,我們使用調查回覆圖表來為我們的發現提供佐證。所有這些圖表都採用類似的格式。標題是調查參與者看到的 exact question。除非另有說明,否則問題是多項選擇題,參與者只能選擇一個回覆選項;每個圖表的副標題將告知您問題是否允許多項回覆或是一個開放式文字框而非多項選擇題。對於開放式文本回復圖表,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% 的人表示他們或多或少或非常滿意。
與使用其他語言相比,我們的參與者花費大量時間使用 Go 程式設計。大約三分之一的參與者甚至維護一個開源 Go 模組。我們認識到我們的調查受眾是由那些成功採用 Go、經常使用 Go 並對使用 Go 大部分感到滿意的人組成。為了識別滿足社群需求的潛在差距,我們研究了不同的參與者子群體,看看他們可能以何種不同方式使用 Go 或具有不同的優先事項。例如,今年我們考察了不同樣本來源(即 Go 部落格或透過 VS Code 外掛)、不同工作角色、組織規模和 Go 經驗水平之間的回覆差異。最有趣的差異體現在經驗水平之間。
來自新手參與者的洞見
以前,我們使用參與者使用 Go 的時間長短(按月/年計算)作為代理,以瞭解結果在不同經驗水平之間的差異。今年我們試驗了一個新的細分問題,“您的 Go 經驗水平如何?”,看看自我認定是否比將不同時間間隔混在一起更能有效地考察 Go 經驗。由於“新手”或“專家”等分類術語可能因人而異,我們提供了描述來幫助使這些類別更加客觀。選項包括:
- 瞭解:我瞭解 Go,但在沒有幫助的情況下無法編寫簡單的 Go 程式
- 新手:我可以使用 Go 完成簡單的程式設計專案,可能需要幫助
- 中級:我可以使用 Go 完成重要的程式設計專案,需要一些幫助
- 高階:我可以在沒有幫助的情況下使用 Go 完成重要的程式設計專案
- 專家:我可以為其他工程師提供與 Go 相關的指導、故障排除和解答問題
我們發現參與者使用 Go 的時間長短與其自我認定的經驗水平之間存在中度相關性(⍴ = .66)。這意味著經驗水平量表,雖然與時間量表相似,但可能會為我們提供關於參與者在經驗方面的差異的新洞見。例如,參與者編寫 Go 程式碼的時間比例與其編寫其他語言程式碼的時間比例與其自我認定的經驗水平的相關性,強於與其使用 Go 的時間長短的相關性。
在進行此細分分析時,我們通常排除“瞭解”類別,因為他們不被認為具有回答問題所需的經驗,並且僅佔參與者的約 1%。
與更有經驗的參與者相比,新手參與者更傾向於使用 Windows
我們的隨機抽樣群體中新手參與者的比例高於自行選擇的群體,這表明有更多新的 Go 愛好者我們平時接觸得較少。因為他們是透過 Go VS Code 外掛抽樣而來,我們可能認為這個群體更有可能偏愛使用 VS Code 或在 Windows 上開發,而不是其他經驗水平的群體。雖然這是事實,但無論他們是否透過 VS Code 外掛回覆,新手都比其他經驗水平的參與者更有可能在 Windows 上開發。
我們沒有在更高經驗水平的群體中看到更高比例的 Windows 使用者,原因可能有很多。例如,Windows 使用者可能更容易遇到困難而停止使用 Go,或者可能存在與 Go 無關的作業系統使用更廣泛的趨勢。無論如何,我們應該在未來關於 Go 入門的研究中包含更多的 Windows 使用者,以確保我們提供包容性的入門體驗。
不同經驗水平目前如何使用 Go(以及他們希望在哪些其他領域使用 Go)
根據參與者目前使用 Go 的方式,更有經驗的 Gophers 傾向於在更多型別的應用程式中使用 Go。例如,平均而言,專家在至少四個領域使用 Go,而新手平均只在兩個領域使用 Go。這就是為什麼新手和專家在每個使用場景中使用 Go 的比例存在巨大差異。然而,前兩個用途,API / RPC 服務和 CLI,是所有經驗水平中最常見的使用場景。
我們在 GUI 和網站/Web 服務(返回 HTML)方面看到了更多有趣的趨勢。所有經驗水平的參與者使用 Go 開發桌面/GUI 應用程式的比例大致相同。這表明對 GUI 的需求不僅僅來自尋找有趣入門專案的新手 Gophers,而是來自各個經驗層面。
網站/服務返回 HTML 顯示了類似的趨勢。一種解釋可能是,這對於剛開始 Go 之旅的人來說是一個常見的使用場景(因為它是新手最常見的前 3 個使用場景之一),或者新手更有可能在返回 HTML 的網站或 Web 服務上工作。在調查後期,我們問了參與者:“在哪個領域(如果有的話)您目前未使用 Go,但最希望使用?”雖然許多參與者(29%)表示他們已經在使用 Go 來滿足他們的所有需求,但擴充套件使用範圍的首要兩個領域是 GUI / 桌面和 AI / ML 應用程式。這在不同組織規模和工作角色的群體中是一致的,但在經驗水平方面則不一致。新手最希望更多地使用 Go 的首要領域是網站/Web 服務返回 HTML。
在一個開放文字問題中,表示希望使用 Go 進行網站/Web 服務返回 HTML 的 29 位參與者中,有 12 位表示他們受阻的原因是其他語言擁有更好的框架來支援此使用場景。可能是更有經驗的 Go 開發者在其他語言已經擁有滿足這些需求的框架時,不再嘗試或期望使用 Go 來解決此使用場景。正如一位參與者所說:
“通常使用其他語言(如 PHP 或 Ruby)更容易實現此目標。部分原因在於這些語言中存在的優秀框架。”
另一個促成新手對 Web 開發感興趣的解釋可能與他們對 JavaScript / TypeScript 的使用有關。新手花費更多時間編寫 JavaScript / TypeScript,而不是更有經驗的參與者。對 Web 的更高興趣可能與新手參與者目前在使用其他語言進行的工作有關,或者可能表明對 Web 技術的普遍興趣。未來我們希望更多地瞭解這個使用場景,以及我們如何幫助新的 Go 愛好者開始在對他們最有用的領域使用 Go。
參與者面臨著長尾挑戰
每次調查週期我們都會問參與者在使用 Go 時面臨的最大挑戰是什麼。歷史上,缺少泛型是最常被引用的挑戰——例如,它是 2020 年最常見的回覆,約有 18% 的參與者提到。自從引入泛型以來,錯誤處理(12%)和學習/最佳實踐/文件(11%)已成為一系列長尾問題中的首要問題,而不是某個單一問題變得更頻繁。
為什麼錯誤處理如此具有挑戰性?
關於錯誤處理的反饋經常將問題描述為冗長。表面上看,這可能反映了編寫重複性程式碼是枯燥或令人惱火的。然而,錯誤處理不僅僅是編寫樣板程式碼的煩惱,還可能影響參與者的除錯能力。
一位參與者簡潔地闡述了這個問題:
“錯誤處理會造成混亂,如果處理不當很容易掩蓋問題(沒有堆疊跟蹤)”
學習最佳實踐的掙扎
“有效使用 Go。易學難精。”
我們聽說 Go 易學,之前的調查顯示超過 70% 的參與者在使用 Go 的第一年內就感到高效,但學習 Go 最佳實踐卻成為使用 Go 的最大挑戰之一。今年的參與者告訴我們,關於程式碼結構以及推薦的工具和庫的最佳實踐文件不完善,這給初學者和團隊保持程式碼一致性帶來了挑戰。學習編寫慣用 Go 對於那些來自其他程式設計正規化的人來說尤其具有挑戰性。更有經驗的 Go 參與者證明,當開發者不遵循編寫慣用 Go 的最佳實踐時,會損害共享專案的一致性和質量。
模組維護者面臨的最大挑戰
Go 模組維護者是 Go 社群的關鍵成員,有助於發展和維持我們的包生態系統的健康。今年我們計劃與模組維護者進行研究,以確定支援包生態系統穩定和增長並幫助 Go 在組織內得到更廣泛應用的機會。為了指導這項研究,我們在調查中引入了一個問題,以瞭解開源維護者當前面臨的首要挑戰。
維護者面臨的首要挑戰是保持依賴項最新以及版本控制方面的困難,包括避免、識別或知道何時引入破壞性變更。這些洞見以及未來研究的結果將有助於指導支援維護者保持 Go 生態系統穩定安全的策略。
部署 Go 程式碼時面臨的最大挑戰
今年我們詢問了參與者在部署 Go 程式碼時面臨的最大挑戰。Go 經常被引用為“易於部署”的原因,但我們在最近的一項研究中收到了相互衝突的反饋,這促使我們探索部署 Go 程式碼時可能存在的問題。在我們的開放文本回復中,到目前為止最常見的主題是使用 cgo 進行交叉編譯的困難(16%),而對 WebAssembly 或 WASI 的支援位居第二(7%)。
社群優先事項:參與者最希望獲得什麼
今年我們使用了之前調查中基於“購買功能”優先排序方法的一個優先排序問題。參與者被給予 10 個“地鼠幣”,並被要求將其分配到他們希望看到改進的領域。參與者被隨機分配到三個可能問題中的一個,每個問題包含與工具、安全性或編譯器和執行時相關的七個專案。這種方法使我們能夠詢問與每個重點領域相關的專案,而不會給參與者帶來三組需要認知努力的優先排序問題。
練習結束時,我們給參與者一個開放文字提示,詢問他們認為在明年 Go 團隊應該優先處理的任何領域,無論他們把硬幣花在了哪些專案上。例如,如果一個參與者看到的是安全性部分,但他們並不太關心安全性,他們仍然有機會在開放文字區域告訴我們這一點。
安全性
我們選擇這些專案是為了測試我們關於安全實踐對社群相對重要性的假設。以下是向參與者描述的七個專案:
- pkg.go.dev 識別維護不善的軟體包(例如,對問題響應遲緩,未能及時更新其依賴項,長期存在漏洞)
- pkg.go.dev 識別會引入破壞性 API 變更的軟體包(即,在升級這些軟體包到新版本時需要修復這些 API 的使用)
- 支援在 govulncheck 中抑制漏洞
- 一個工具,用於跟蹤敏感資料如何在 Go 程式中流動(檢測 PII 洩漏)
- 安全最佳實踐指南(例如,如何選擇和更新依賴項;如何設定模糊測試、漏洞檢查和執行緒消毒器;如何使用加密)
- 預設安全的 Web & SQL 庫,幫助使用者避免在 Web 伺服器程式碼中引入漏洞
- FIPS-140 相容的加密庫
資金最多的安全功能是 Web 和 SQL 庫預設安全,以避免在 Web 伺服器程式碼中引入漏洞,但排名前四的功能都與避免引入漏洞有關。對安全預設值的需求與之前的安全研究一致,該研究表明開發者希望將安全“左移”:開發團隊通常沒有時間和資源用於解決安全問題,因此重視能夠首先減少引入漏洞可能性的工具。第二個最常見的專案是安全最佳實踐指南,這凸顯了最佳實踐文件相對於新工具或功能對大多數參與者的高價值。
工具
我們在此問題中包含的專案受到 VS Code 外掛使用者反饋的啟發。我們想知道哪些工具和 IDE 改進對可能使用其他 IDE 或編輯器的更廣泛受眾最有幫助。
- 更好的重構工具(例如,支援自動化程式碼轉換:重新命名、函式提取、API 遷移等)
- 在您的程式碼編輯器/IDE 中更好地支援測試(例如,強大且可擴充套件的 Test Explorer UI,第三方測試框架,子測試支援,程式碼覆蓋率)
- 在您的程式碼編輯器/IDE 中更好地支援處理多個模組(例如,編輯模組 A 和 B,其中模組 A 依賴於模組 B)
- pkg.go.dev 中的依賴項洞察(例如,漏洞、破壞性變更、記分卡)
- 在您的程式碼編輯器/IDE 中的依賴項洞察(例如,漏洞、破壞性變更、記分卡)
- 支援使用新的模組路徑釋出模組(例如,倉庫所有權交接)
- 支援在您的程式碼編輯器/IDE 中查詢實現介面的型別以及型別實現的介面
獲得最多資金的編輯器功能是支援查詢實現介面的型別以及型別實現的介面和重構工具。我們還發現參與者根據其偏好的編輯器使用方式,在花費地鼠幣方面存在有趣的差異。最值得注意的是,VS Code 使用者在重構方面花費的地鼠幣比 GoLand 使用者更多,這表明自動化程式碼轉換目前在 GoLand 中比在 VS Code 中得到更好的支援。
編譯器和執行時
本節的關鍵問題是確定參與者是希望預設獲得更好的效能、更好的最佳化工具,還是僅僅希望更好地理解如何編寫高效能的 Go 程式碼。
- 降低計算成本
- 減少記憶體使用
- 減少二進位制檔案大小
- 減少構建時間
- 更好的效能除錯工具
- 最佳化指南(如何提高效能和降低成本,涵蓋 Go 的實現和效能除錯工具)
- 在使用 cgo 進行交叉編譯時提供更好的支援
在此列表中,獲得最多資金的專案是最佳化指南。這在組織規模、工作角色和經驗水平之間是一致的。我們還問了參與者是否有資源成本擔憂的附加問題。大多數參與者(55%)表示他們沒有任何成本擔憂,但那些對資源成本有擔憂的人在降低計算成本和記憶體成本方面花費了更多的地鼠幣(平均 2.0)而不是沒有擔憂的人。然而,即使是那些擔心資源成本的人,在最佳化指南上的花費也差不多(平均 1.9 個地鼠幣)。這是一個強烈的訊號,表明為 Go 開發者提供理解和最佳化 Go 效能的指導,目前比額外的編譯器和執行時效能改進更有價值。
結論
感謝您與我們一起回顧 2023 年第一次開發者調查的結果!瞭解開發者的經驗和挑戰有助於我們優先考慮如何更好地服務 Go 社群。我們認為特別有用的一些收穫:
- 與具有其他經驗水平的參與者相比,Go 新手開發者更傾向於 Web 開發。這是一個我們希望進一步探索的領域,以確保我們滿足新的 Go 開發者的需求。
- 預設安全設定、安全和最佳化方面的最佳實踐指南以及 IDE 中更多的重構協助將是社群的寶貴補充。
- 錯誤處理是社群高度重視的問題,並在冗長性和可除錯性方面帶來挑戰。Go 團隊目前沒有公開的提案可以分享,但正在繼續探索改進錯誤處理的選項。
- 入門和學習最佳實踐是參與者面臨的首要挑戰之一,將是未來研究的領域。
- 對於 Go 模組維護者來說,保持依賴項最新、模組版本控制以及識別或避免破壞性變更面臨的最大挑戰。幫助維護者提供穩定健康的生態系統是進一步 UX 研究感興趣的另一個主題。
再次感謝所有參與和貢獻本次調查的人——沒有你們我們不可能完成。我們期待在今年晚些時候的下一次調查中再次見到您。
下一篇文章:Go 1.21 釋出候選版本
上一篇文章:Go 整合測試的程式碼覆蓋率
部落格索引