Go 博客
Go 开发者调查 2023 年第一季度结果
感谢各位受访者为我们带来这些见解!
我们很高兴与您分享 2023 年 1 月版 Go 开发者调查的结果。感谢 5844 位受访者与我们分享他们如何使用 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
我们的随机样本组中初学者受访者的比例高于自行选择组,这表明还有更多我们不太常听到的新 Gophers。因为他们是通过 Go VS Code 插件进行抽样的,所以我们可能会预计,与其他经验水平相比,该组更有可能偏好使用 VS Code 或在 Windows 上进行开发。虽然这是真的,但无论他们是通过 VS Code 插件回复还是其他方式,初学者也比其他经验水平更有可能在 Windows 上进行开发。
我们没有看到在更高的经验水平上出现更高比例的 Windows 用户,这可能有许多原因。例如,Windows 用户可能更容易遇到困难并停止使用 Go,或者可能存在与 Go 无关的操作系统使用更广泛的趋势。无论如何,我们应该在未来围绕 Go 入门的相关研究中纳入更多 Windows 用户,以确保我们提供包容性的入门体验。
不同经验水平目前如何使用 Go(以及他们希望使用的其他领域)
根据受访者目前如何使用 Go,更有经验的 Gophers 倾向于将 Go 用于更多类型的应用程序。例如,平均专家在至少四个领域使用过 Go,而平均初学者仅在两个领域使用过 Go。这就是为什么初学者和专家在每个用例中使用 Go 的比例存在巨大差异的原因。然而,前两个用途,即 API/RPC 服务和 CLI,是所有经验水平的首要用例。
我们看到 GUI 和网站/Web 服务(返回 HTML)出现了更多有趣的趋势。所有经验水平以大致相同的比率使用 Go 进行桌面/GUI 应用程序开发。这为我们提供了证据,表明对 GUI 的需求不仅来自寻找有趣入门项目的新的 Gophers,还来自各个经验层面的开发者。
返回 HTML 的网站/服务也呈现出类似的趋势。一种解释可能是,这在 Go 初学者的学习过程中是一个常见的用例(因为它位列新手前三个最常见的用例),或者新手更有可能在返回 HTML 的网站或 Web 服务上进行工作。在调查的后期,我们询问了受访者:“在哪些领域(如果有)您没有使用 Go,但最希望使用?”虽然许多受访者(29%)表示他们已经在他们希望的每个地方都使用 Go,但扩展使用量的两个主要领域是 GUI/桌面和 AI/ML 应用程序。这在不同组织规模和工作角色的群体中是一致的,但在经验水平上则不一致。新手最希望更多地使用 Go 的领域是返回 HTML 的网站/Web 服务。
在一个开放式文本问题中,在 29 位表示希望使用 Go 开发返回 HTML 的网站/Web 服务的受访者中,有 12 位表示他们被阻碍,因为其他语言拥有更好地支持此用例的框架。可能是经验丰富的 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 代码的最佳实践时,会损害共享项目的 consistency 和质量。
模块维护人员面临的最大挑战
Go 模块维护人员是 Go 社区的关键成员,帮助我们扩展和维持软件包生态系统的健康发展。今年,我们计划对模块维护人员进行研究,以确定支持软件包生态系统稳定性和增长的机会,并帮助在组织内部推广 Go 的采用。为了为这项研究提供信息,我们在调查中引入了一个问题,以了解开源维护人员目前面临的主要挑战。
维护人员面临的主要挑战是保持依赖项更新以及版本控制方面的困难,包括避免、识别或了解何时引入重大更改。这些见解,以及未来研究的结果,将有助于为支持维护人员保持 Go 生态系统稳定和安全的策略提供信息。
部署 Go 代码时遇到的最大挑战
今年,我们询问了受访者在部署 Go 代码时遇到的最大挑战是什么。“易于部署”通常被认为是使用 Go 的原因,但在最近的一项研究中,我们收到了相互矛盾的反馈,这促使我们探索部署 Go 代码时可能出现的问题。在我们的开放式文本回复中,最常见的主题是 cgo 跨编译困难 (16%),而对 WebAssembly 或 WASI 的支持则远低于此 (7%)。
社区优先事项:受访者最想要什么
今年,我们使用了一个在之前的调查中使用过的优先级问题,该问题基于“购买功能”的优先级方法。我们给受访者 10 个“gophercoins”,并让他们将其分配到他们希望看到改进的领域。受访者被随机分配了三个可能的问题之一,每个问题都包含七个与工具、安全或编译器和运行时相关的项目。这种方法使我们能够询问与每个重点领域相关的项目,而不会让受访者承受三组认知要求高的优先级问题的负担。
在练习结束时,我们给受访者提供了一个开放式文本提示,让他们告诉我们他们认为 Go 团队明年应该优先考虑的任何领域,无论他们将 gophercoins 花在了哪些项目上。例如,如果向受访者展示了安全部分,但他们并不太关心安全,他们仍然有机会在开放式文本区域告诉我们这一点。
安全
我们选择这些项目来检验我们对安全实践对社区的相对重要性的假设。以下是向参与者描述的七个项目
- 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 中查找实现接口的类型和类型实现的接口
获得最高资金的编辑器功能是支持查找实现接口的类型和类型实现的接口以及重构工具。我们还观察到受访者根据首选编辑器使用情况在如何花费 gophercoins 方面存在有趣的差异。最值得注意的是,VS Code 用户在重构方面花费的 gophercoins 比 GoLand 用户多,这表明 GoLand 中的自动代码转换目前比 VS Code 中支持得更好。
编译器和运行时
我们本节的关键问题是确定受访者是否希望默认情况下获得更好的性能、更好的优化工具,或者只是更好地了解如何编写高性能的 Go 代码。
- 降低计算成本
- 减少内存使用
- 减小二进制文件大小
- 缩短构建时间
- 更好的性能调试工具
- 优化指南(如何提高性能并降低成本,涵盖 Go 的实现和性能调试工具)
- 在跨编译时更好地支持使用 cgo
在该列表中,获得最高资金的项目是优化指南。这在组织规模、工作角色和经验水平上都是一致的。我们还询问了一个额外的问题,即受访者是否对资源成本有任何顾虑。大多数受访者 (55%) 表示他们没有任何成本顾虑,但那些对资源成本有顾虑的受访者在降低计算成本和内存成本方面花费的 gophercoins 比那些没有顾虑的人多(平均为 2.0)。然而,即使是那些对资源成本有顾虑的人,在优化指南上花费的 gophercoins 也大致相同(平均为 1.9 个 gophercoins)。这强烈表明,为 Go 开发人员提供指导,让他们了解和优化 Go 性能,目前比其他编译器和运行时性能改进更有价值。
结论
感谢您与我们一起回顾 2023 年首次开发者调查的结果!了解开发人员的体验和挑战有助于我们确定如何最好地服务 Go 社区。我们发现的一些特别有用的要点
- 与其他经验水平的受访者相比,Go 初学者对 Web 开发更有亲和力。这是一个我们希望进一步探索的领域,以确保我们满足新 Go 开发人员的需求。
- 安全默认值、关于安全和优化的最佳实践指南以及 IDE 中更多的重构协助将是社区的宝贵补充。
- 错误处理是社区高度关注的问题,并在冗长性和可调试性方面带来了挑战。Go 团队目前还没有公开的提案可以分享,但仍在继续探索改进错误处理的方案。
- 入门和学习最佳实践是受访者面临的主要挑战之一,并将成为未来研究的重点领域。
- 对于 Go 模块维护者来说,保持依赖项更新、模块版本控制以及识别或避免重大更改是最大的挑战。帮助维护者提供一个稳定健康的生态系统是另一个值得进一步进行 UX 研究的主题。
再次感谢所有回复并参与此次调查的人员——没有你们,我们无法完成这项工作。我们希望今年晚些时候能再次在下一轮调查中见到大家。
下一篇文章:Go 1.21 发布候选版本
上一篇文章:Go 集成测试的代码覆盖率
博客索引