Go 博客
2023 年第一季度 Go 开发者调查结果
感谢各位受访者分享这些宝贵的见解!
我们很高兴与大家分享 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% 的人表示他们“比较满意”或“非常满意”。
与使用其他语言相比,我们的受访者在 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
我们的随机抽样组中新手受访者的比例高于自行选择的组,这表明有更多的新 Gopher 我们不太常听到他们的声音。因为他们是通过 Go VS Code 插件抽样的,我们可能会期望这个群体比其他经验水平的开发者更倾向于使用 VS Code 或在 Windows 上开发。虽然这是真的,但新手也比其他经验水平的开发者更倾向于在 Windows 上开发,无论他们是通过 VS Code 插件回复的。
在较高经验水平的情况下,我们没有看到更高的 Windows 用户比例可能有很多原因。例如,Windows 用户可能更容易遇到困难而停止使用 Go,或者可能存在与操作系统使用相关的更广泛趋势,而与 Go 无关。无论如何,在未来关于 Go 入门的研究中,我们应该纳入更多的 Windows 用户,以确保我们提供包容的入门体验。
不同经验水平的开发者目前如何使用 Go(以及他们希望在哪些领域使用)
根据受访者目前使用 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 服务。
在一个开放式问题中,19 位(占 29%)表示希望使用 Go 进行返回 HTML 的网站/Web 服务的受访者表示,他们之所以受阻,是因为其他语言有更好的框架来支持这种用例。经验更丰富的 Go 开发者可能不会尝试或期望使用 Go 来处理这个用例,因为其他语言已经有满足这些需求的框架。正如一位受访者所说:
“通常用其他语言,如 PHP 或 Ruby 来完成这项任务更容易。部分原因是这些语言中存在出色的框架。”
新手对 Web 开发感兴趣的另一个原因可能与他们使用 JavaScript / TypeScript 有关。新手花费在 JavaScript / TypeScript 上的时间比经验更丰富的受访者要多。对 Web 的更高兴趣可能与新手目前使用其他语言处理的工作有关,或者可能表明对 Web 技术普遍感兴趣。未来,我们希望更多地了解这个用例,以及如何帮助新 Gopher 在对他们最有用的领域开始使用 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 个“gophercoin”,并被要求将它们分配到他们希望看到改进的领域。受访者被随机分配到三个可能的问题中的一个,每个问题包含七个与工具、安全或编译器和运行时相关的项目。这种方法使我们能够在不给受访者增加过多的认知负担的情况下,询问与每个焦点领域相关的项目。
在该练习结束时,我们给受访者提供了一个开放式文本提示,让他们告诉我们任何他们认为 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 中的测试支持(例如,健壮且可扩展的测试浏览器 UI,第三方测试框架,子测试支持,代码覆盖率)
- 更好的代码编辑器/IDE 中处理多个模块的支持(例如,编辑模块 A 和模块 B,其中模块 A 依赖于模块 B)
- pkg.go.dev 中的依赖项洞察(例如,漏洞,破坏性更改,记分卡)
- 代码编辑器/IDE 中的依赖项洞察(例如,漏洞,破坏性更改,记分卡)
- 支持发布带有新模块路径的模块(例如,存储库所有权移交)
- 在代码编辑器/IDE 中查找实现接口的类型和类型实现的接口的支持
资金投入最多的编辑器功能是查找实现接口的类型和类型实现的接口的支持以及重构工具。我们还发现受访者根据偏好的编辑器使用情况分配 gophercoin 的方式存在有趣的差异。最值得注意的是,VS Code 用户在重构上花费的 gophercoin 比 GoLand 用户多,这表明自动代码转换目前在 GoLand 中比在 VS Code 中支持得更好。
编译器和运行时
我们本节的关键问题是确定受访者是希望默认提供更好的性能,更好的优化工具,还是仅仅更好地理解如何编写高性能的 Go 代码。
- 降低计算成本
- 减少内存使用
- 减小二进制文件大小
- 减少构建时间
- 更好的性能调试工具
- 优化指南(如何提高性能和降低成本,涵盖 Go 的实现和性能调试工具)
- 改进使用 cgo 进行交叉编译的支持
迄今为止,此列表中资金投入最多的项目是优化指南。这在组织规模、职位和经验水平方面是一致的。我们还增加了一个关于受访者是否有资源成本担忧的问题。大多数受访者(55%)表示他们没有成本担忧,但那些对资源成本有担忧的人花费的 gophercoin(平均 2.0 个)比没有担忧的人多用于降低计算成本和内存成本。然而,即使那些对资源成本有担忧的人,在优化指南上花费的 gophercoin 也差不多(平均 1.9 个)。这有力地表明,提供 Go 开发者理解和优化 Go 性能的指导,目前比额外的编译器和运行时性能改进更有价值。
结论
感谢您与我们一起审查 2023 年第一次开发者调查的结果!了解开发者的经验和挑战有助于我们确定如何最好地为 Go 社区服务。我们发现的一些要点特别有用:
- 新手 Go 开发者比其他经验水平的受访者更倾向于 Web 开发。这是我们希望进一步探索的领域,以确保我们满足新 Go 开发者的需求。
- 默认安全的开发、安全和优化方面的最佳实践指南,以及 IDE 中更多的重构辅助功能,将是对社区有价值的补充。
- 错误处理是社区高度关注的问题,并在冗余性和可调试性方面带来挑战。Go 团队目前没有公开的提案可以分享,但正在继续探索改进错误处理的方案。
- 入门和学习最佳实践是受访者面临的主要挑战之一,并将成为未来研究的重点。
- 对于 Go 模块维护者来说,保持依赖项更新、模块版本控制以及识别或避免破坏性更改是最大的挑战。帮助维护者提供一个稳定且健康的生态系统也是进一步用户体验研究的一个感兴趣的课题。
再次感谢所有回复并为本次调查做出贡献的人——没有你们,我们无法做到。希望今年晚些时候在下一份调查中再见到您。
下一篇文章:Go 1.21 Release Candidate
上一篇文章:Go 集成测试的代码覆盖率
博客索引