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 集成测试的代码覆盖率
博客索引