🐯 猫头虎博主在此,今天我们一起探索2023年第一季度Go开发者调研的精彩内容!这次调研揭示了Go社区的最新动态和发展趋势。让我们一起深入挖掘Go的奥秘,探讨新手开发者对网络开发的兴趣,应对Go中的挑战,以及社区对未来改进的期待吧!
大家好!作为猫头虎博主,我很高兴与大家分享2023年1月Go开发者调研的成果。感谢5844位响应者提供的宝贵见解。这些结果不仅帮助Go团队聚焦于社区最关心的领域,也为支持Go生态系统的其他贡献者提供了参考。
今年的调研首次根据自我评估的经验水平进行了新的细分。新手和其他经验水平的开发者在使用Go的兴趣上表现出一些不同。最值得注意的是,新手更加倾向于使用Go进行网络开发。
历史上,缺乏泛型是使用Go的最大挑战。自从引入泛型以来,关于泛型的评论有所减少。现在,最常报告的挑战是错误处理(关于可读性和冗余)以及学习最佳实践的难度。
在询问响应者如何在Go的编译和运行时的各种改进上分配资源时,他们最多地投入到了一个优化指南,而不是具体的性能改进,这表明在这一领域中文档的价值非常高。
开源模块维护者在保持依赖项更新和避免因版本控制和破坏性更改而造成的中断方面面临挑战。这是一个我们将进一步探索的领域,以帮助维护者提供一个稳定且健康的生态系统。
在这篇文章中,我们使用调研响应的图表来为我们的发现提供支持证据。所有这些图表都使用类似的格式。标题是调研响应者看到的确切问题。除非另有说明,问题都是多项选择题,参与者只能选择单个答案;每个图表的副标题将告诉您问题是否允许多个答案选择或是否是开放式文本框而非多项选择题。对于开放式文本回应的图表,Go团队成员阅读并手动分类了所有回应。许多开放式问题引发了各种各样的回应;为了保持图表大小合理,我们将它们压缩到前10-15个主题,其他主题则归入“其他”类别。我们还在适用的情况下包括了“无”这一类别。
为了帮助读者理解每个发
现背后的证据重量,我们包括了显示95%置信区间的误差条;误差条越窄表示置信度越高。有时两个或更多回应的误差条会有重叠,这意味着这些回应的相对顺序统计上没有意义(即,回应实际上是并列的)。每个图表的右下角显示了包含在图表中的人数,形式为“n = [响应者数量]”。
大多数调研响应者是通过在Go博客、@golang on Twitter或其他社交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的时间与他们自我识别的经验水平之间有中等相关性(⍴ = .66)。这意味着尽管经验水平量表与时间量表相似,但可能给我们提供了一些关于响应者在经验上的不同之处的新见解。例如,响应者用于编写Go的时间与他们用于编写其他语言的时间相比,与他们自我识别的经验水平的相关性比与他们使用Go的时间的相关性更强。
在我们使用这种细分进行分析时,我们通常排除了“认知”类别,因为他们不被认为有回答问题所需的经验,并且只占响应者的大约1%。
我们的随机样本组比自选组有更高比例的初学者,这表明我们不常听到的新Gopher可能更多。由于他们是通过Go VS Code插件抽样的,我们可能会期望这个群体更倾向于使用VS Code或比其他经验水平更倾向于在Windows上开发。虽然确实如此,但不论通过VS Code插件还是其他方式响应的初学者,也更倾向于在Windows上开发。
我们不在更高经验水平看到更高比例的Windows用户可能有多种原因。例如,Windows用户可能更有可能遇到困难并停止使用Go,或者与Go无关的更广泛的操作系统使用趋势可能存在。无论如何,我们应该在未来的Go入门研究中包含更多Windows用户,以确保我们提供包容性的入门体验。
根据响应者目前如何使用Go,更有经验的Gopher似乎使用Go进行更多类型的应用程序开发。例如,平均专家至少在四个领域使用Go,而平均初学者只在两个领域使用Go。这就是为什么在每个使用案例中使用Go的初学者和专家的比例有很大差异的原因。然而,API / RPC服务和CL
Is是所有经验水平的前两大用例。
我们看到更有趣的趋势是对于GUI和返回HTML的网站/网络服务。所有经验水平的响应者都以大致相同的比率使用Go进行桌面/GUI应用开发。这给我们证据表明,对GUI的需求不仅仅来自寻找有趣初学项目的新Gopher,而是来自整个经验谱系。
返回HTML的网站/服务显示出类似的趋势。一种解释可能是,这是某人Go之旅中一个常见的早期用例(因为它是初学者前三大最常见的用例之一),或者初学者更有可能在返回HTML的网站或网络服务上工作。稍后在调研中,我们询问了响应者:“在哪个领域(如果有的话)你没有使用Go,但最想使用?”尽管许多响应者(29%)表示他们已经在他们想要的所有地方使用Go,但扩大使用范围的前两个领域是GUI/桌面和AI/ML应用。这在不同组织规模和工作角色的群体中是一致的,但在经验水平上并非如此。初学者最想在返回HTML的网站/网络服务中更多地使用Go。
在一个开放文本问题中,29名表示他们想使用Go进行返回HTML的网站/网络服务的响应者中有12名说他们被阻止了,因为其他语言有更好的框架支持这个用例。可能是更有经验的Go开发者在其他语言已经有满足这些需求的框架时,不尝试或期望使用Go进行这个用例。正如一位响应者所说,
“通常在其他语言中完成这一任务更容易,比如PHP或Ruby。部分原因是这些语言中存在的优秀框架。”
初学者对网络开发的兴趣的另一个促成因素可能与他们在其他语言中目前工作的内容有关,或者可能表明对网络技术的一般兴趣。未来我们希望更多地了解这个用例,以及如何帮助新Gopher开始使用Go。
每个调研周期我们都会询问响应者在使用Go时遇到的最大挑战。历史上,缺乏泛型是最常被提到的挑战——例如,它是2020年最常见的回应,约18%的响应者提到了它。自从引入泛型以来,错误处理(12%)和学习/最佳实践/文档(11%)成为了众多问题中的前沿,而不是任何单一问题变得更频繁。
关于错误处理的反馈通常描述问题为冗长。表面上,这可能反映了编写重复代码是无聊或烦人的。然而,错误处理不仅仅是编写样板代码的问题,还可能影响响应者的调试能力。
一位响应者简洁地阐述了这个问题:
“错误处理创造了混乱,并且如果
处理不当(例如,没有堆栈跟踪)很容易掩盖问题。”
“有效使用Go。容易学,难精通。”
我们听说Go易于学习,而且以前的调研显示,超过70%的响应者表示在第一年内使用Go就感到生产力提高,但学习Go最佳实践成为使用Go的最大挑战之一。今年的响应者告诉我们,关于代码结构和推荐工具和库的最佳实践文档不够充分,这对初学者和团队保持代码一致性造成了挑战。对于那些来自其他编程范式的开发者来说,学习编写惯用Go代码尤其具有挑战性。有经验的Go开发者证实,当开发者不遵循编写惯用Go的最佳实践时,会损害共享项目的一致性和质量。
Go模块维护者是Go社区的重要成员,帮助增长和维持我们的包生态系统的健康。今年我们计划与模块维护者进行研究,以识别支持包生态系统稳定性和增长的机会,并帮助在组织内推广Go的使用。为了为这项研究提供信息,我们在调研中引入了一个问题,以了解开源维护者当前面临的主要挑战。
维护者面临的最大挑战是保持依赖项更新,以及围绕版本控制的困难,包括避免、识别或知道何时引入破坏性更改。这些见解,连同未来研究的结果,将帮助制定策略,支持维护者保持Go生态系统的稳定和安全。
今年我们询问了响应者在部署Go代码时遇到的最大挑战。Go经常被称为“易于部署”,但我们在最近的一项研究中收到了相互矛盾的反馈,促使我们探索部署Go代码时可能存在的问题。在我们的开放文本回应中,迄今为止最常见的主题是跨编译时与cgo的困难(16%),支持WebAssembly或WASI紧随其后(7%)。
今年我们使用了以前调研中使用的一种基于购买特性方法的优先级问题。响应者被给予10个“gopher币”,并被要求将它们分配给他们希望看到改进的领域。响应者被随机分配一个包含三个可能问题中的一个,每个问题都包含七个与工具、安全性或编译器和运行时相关的项目。这种方法允许我们询问与
每个重点领域相关的项目,而不会让响应者感到三组认知上需求高的优先级问题过于繁重。
在练习结束时,我们给了响应者一个开放文本提示,让他们告诉我们无论他们如何在项目上花费币,都认为Go团队在明年应该优先考虑的任何领域。例如,如果一个响应者被显示了安全性部分,但他们并不太关心安全性,他们仍然有机会在开放文本区域告诉我们。
我们选择这些项目是为了测试我们对社区对安全实践重要性的假设。以下是向参与者描述的七个项目:
响应者最希望资助的安全特性是让Web和SQL库默认安全,以避免在Web服务器代码中引入漏洞,但前四个特性都与避免引入漏洞有关。对于安全默认设置的需求与之前的安全研究一致,表明开发者希望在安全方面“向左转移”:开发团队通常没有时间或资源来解决安全问题,因此更看重减少引入它们的可能性的工具。其次最常见的项目是安全最佳实践指南,这凸显了与新工具或特性相比,大多数响应者更看重最佳实践文档的价值。
我们在这个问题中包含的项目是受VS Code插件用户反馈的启发。我们想知道哪些工具和IDE改进对可能使用其他IDE或编辑器的更广泛受众最有帮助。
编辑器功能中资金最多的是支持查找实现接口的类型和由类型实现的接口,以及重构工具。我们还注意到,根据首选编辑器的使用情况,响应者在他们的gopher币上的花费存在有趣的差异。尤其值得注意的是,VS Code用户在重构上花费的gopher币比GoLand用户多,这表明在GoLand中自动代码转换的支持目前比VS Code更好。 编译器和运行时 我们这部分的关键问题是确定响应者是否希望默认更好的性能,更好的优化工具,或者仅仅是更好地理解如何编写高性能的Go代码。
在这个列表中,资金最多的项目是一个优化指南。这在组织规模、工作角色和经验水平上都是一致的。我们还提出了一个额外的问题,询问响应者是否对资源成本有担忧。大多数响应者(55%)表示他们没有任何成本担忧,但那些对资源成本有担忧的人平均在减少计算成本和内存成本上花费了更多的gopher币(平均2.0),尽管如此,即使是那些担心资源成本的人也在优化指南上花费了差不多的gopher币(平均1.9)。这是一个强烈的信号,表明为Go开发者提供理解和优化Go性能的指导,目前比额外的编译器和运行时性能改进更有价值。 总结 感谢您加入我们回顾2023年第一次开发者调研的结果!了解开发者的经验和挑战有助于我们确定如何最好地服务于Go社区。我们发现了一些特别有用的收获: