blob: 6bc7a448482ca8f286b190a427cb379eadab5f18 [file] [log] [blame] [view]
---
title: Go Developer Survey 2023 Q1 Results
date: 2023-05-11
by:
- Alice Merrick
tags:
- survey
- community
summary: An analysis of the results from the 2023 Q1 Go Developer Survey.
---
<style type="text/css" scoped>
.chart {
margin-left: 1.5rem;
margin-right: 1.5rem;
width: 800px;
}
.quote {
margin-left: 2rem;
margin-right: 2rem;
color: #999;
font-style: italic;
font-size: 120%;
}
@media (prefers-color-scheme: dark) {
.chart {
border-radius: 8px;
}
}
</style>
## Thank you respondents for bringing us these insights!
We’re excited to share with you the results of the 2023 January edition of the
Go Developer Survey. Thank you to the 5,844 respondents who shared with us how
they’re using Go, their biggest challenges in using Go, and their top
priorities for future improvements. These results help the Go team focus our
efforts on areas that matter most to the community, and we hope these insights
also help inform others who contribute to and support the Go ecosystem.
### Key findings
- __Novice Go developers are interested in web development__. We introduced a
new segmentation this year based on self-identified experience levels.
Novices expressed some interesting differences from other experience levels.
Most notably they showed greater interest in using Go for web development.
- __Error handling and learning are respondents' top challenges__.
Historically, lack of generics was the biggest challenge to using Go, but
since the introduction of generics, we've seen comments about generics
decline. Comments about error handling (with respect to readability and
verbosity) and difficulty learning best practices are now the most commonly
reported challenges.
- __An optimization guide was the most valued way to improve Go's
performance__. When asked how they would spend resources on various
improvements to Go's compile and runtime, respondents spent the most on an
optimization guide rather than specific performance improvements,
demonstrating how much documentation is valued in this area.
- __Managing dependencies and versioning are the top challenges for open
source Go module maintainers__. Open source module maintainers face
challenges in keeping their dependencies up to date and avoiding disruptions
due to versioning and breaking changes. This is an area we'll explore
further to help maintainers provide a stable and healthy ecosystem.
### How to read these results
Throughout this post, we use charts of survey responses to provide supporting
evidence for our findings. All of these charts use a similar format. The title
is the exact question that survey respondents saw. Unless otherwise noted,
questions were multiple choice and participants could only select a single
response choice; each chart’s subtitle will tell you if the question allowed
multiple response choices or was an open-ended text box instead of a multiple
choice question. For charts of open-ended text responses, a Go team member
read and manually categorized all of the responses. Many open-ended questions
elicited a wide variety of responses; to keep the chart sizes reasonable, we
condensed them to the top 10-15 themes, with additional themes all grouped
under “Other”. We also included a category for "None" where applicable.
To help readers understand the weight of evidence underlying each finding, we
include error bars showing the 95% confidence interval for responses; narrower
bars indicate increased confidence. Sometimes two or more responses have
overlapping error bars, which means the relative order of those responses is
not statistically meaningful (i.e., the responses are effectively tied). The
lower right of each chart shows the number of people whose responses are
included in the chart, in the form “_n = [number of respondents]_”.
### A note on methodology
Most survey respondents “self-selected” to take the survey by accessing it
through a link on [the Go blog](/blog), [@golang on
Twitter](https://twitter.com/golang), or other social Go channels. People who
don’t follow these channels might respond differently from people who _do_
closely follow them. About a quarter of respondents were randomly sampled,
meaning they responded to the survey after seeing a prompt for it in VS Code
(everyone using the VS Code Go plugin between Jan 18 - Feb 8, 2023 had a 10%
chance of receiving this random prompt). This randomly sampled group helps us
generalize these findings to the larger community of Go developers. Most
survey questions showed no meaningful difference between these groups, but in
the few cases with important differences, readers will see charts that break
down responses into “Random sample” and “Self-selected” groups.
## Taking a closer look at different groups of respondents
Our respondent demographics did not change significantly from [our last
survey](/blog/survey2022-q2-results). Consistent with previous
cycles, Go is primarily used in the tech industry, and about 80% of
respondents said they program in Go at work. Overall, survey respondents
tended to be satisfied with Go over the past year, with 92% saying they were
somewhat or very satisfied.
<img src="survey2023q1/where.svg" alt="Bar chart
showing where respondents use Go" class="chart"/> <img
src="survey2023q1/csat.svg" alt="Bar chart showing proportion of satisfied
respondents" class="chart"/>
Our respondents spend a lot of time programming in Go compared to other
languages. About a third of respondents even maintain an open source Go
module. We recognize that our survey audience is made up of those who
successfully adopted Go, use Go often, and are mostly satisfied using Go. To
identify potential gaps in meeting community needs, we look at different
sub-groups of respondents to see how they might be using Go differently or
have different priorities. For example, this year we looked at how responses
differ between different sample sources (i.e., the Go Blog or through the VS
Code plugin), different job roles, organization sizes, and levels of Go
experience. The most interesting differences were between experience levels.
## Insights from novice respondents
<img src="survey2023q1/go_exp.svg" alt="Bar chart of years of experience using
Go" class="chart"/>
Previously, we used how much time (in months / years) respondents have used Go
as a proxy to gain insight into how results vary between levels of experience.
This year we experimented with a new segmentation question, “What is your
level of experience with Go?”, to see if self-identification might be a more
useful way of examining Go experience than lumping together various intervals
of time. Since categorical terms like “novice” or “expert” might vary from
person to person, we provided a description to help make these buckets more
objective. The options were:
* Awareness: I'm aware of Go, but could not write a simple Go program without
assistance
* Novice: I can complete simple programming projects in Go, possibly with
assistance
* Intermediate: I can complete significant programming projects in Go with
some assistance
* Advanced: I can complete significant programming projects in Go without
assistance
* Expert: I can provide guidance, troubleshoot, and answer questions related
to Go from other engineers
<img src="survey2023q1/exp_level.svg" alt="Bar chart of levels of experience
using Go" class="chart"/>
We found a moderate correlation (⍴ = .66) between how long respondents had
been using Go and their self-identified experience level. This means that the
experience level scale, although similar to the time scale, may give us some
new insights into how respondents differ by experience. For instance, the
proportion of time that a respondent spends writing in Go compared to how much
time they spend writing in other languages is more strongly correlated with
their self-identified experience level than with how long they’ve been using
Go.
In analyses where we use this segmentation we typically exclude the Awareness
category since they wouldn’t be considered to have the experience necessary to
answer the question and only represented about 1% of respondents.
### Novice respondents are more likely to prefer Windows than more experienced respondents
Our randomly sampled group had a higher proportion of novice respondents than
the self-selected group, suggesting that there are more new Gophers out there
that we don’t tend to hear from as often. Because they are sampled through the
Go VS Code plugin, we might expect this group to be more likely to prefer
using VS Code or to develop on Windows more than other experience levels.
While this is true, novices are also more likely to develop on Windows than
other experience levels, regardless of whether they responded through the VS
Code plugin.
<img src="survey2023q1/exp_level_s.svg" alt="Bar chart of levels of experience
using Go for self-selected and random samples" class="chart"/> <img
src="survey2023q1/editor_self_select_exp.svg" alt="Bar chart of editor
preference broken down by experience levels for self-selected group only"
class="chart"/> <img src="survey2023q1/os_dev_exp_s.svg" alt="Bar chart of
levels of experience using Go" class="chart"/>
There could be a number of reasons why we don’t see higher proportions of
Windows users at higher experience levels. For example, Windows users may be
more likely to experience difficulties and stop using Go, or there could be
wider trends in OS usage that have nothing to do with Go. In any case, we
should include more Windows users in future research around getting started
with Go to make sure we provide an inclusive onboarding experience.
### How different experience levels currently use Go (and other areas where they would like to)
<img src="survey2023q1/go_app.svg" alt="Bar chart of use cases"
class="chart"/> <img src="survey2023q1/go_app_exp.svg" alt="Bar chart of use
cases broken down by experience level" class="chart"/>
According to how respondents use Go right now, more experienced Gophers tend
to be using Go for more types of applications. For example, the average expert
used Go in at least four areas while the average novice used Go in only two
areas. That’s why there are large differences in the proportion of novices and
experts using Go for each use case. The top two uses, API / RPC services and
CLIs, however, are the top use cases across all experience levels.
We see more interesting trends for GUIs and Website / Web services (returning
HTML). All experience levels used Go for Desktop / GUI apps at about the same
rate. This gives us evidence the desire for GUIs isn’t just coming from new
Gophers looking for a fun starter project, but from across the experience
spectrum.
Websites / services returning HTML show a similar trend. One explanation could
be that this is a common use case early in someone’s Go journey (since it is
in the top 3 most common for novices), or that novices are more likely to be
doing work on websites or web services returning HTML. Later in the survey, we
asked respondents, "In which area (if any) are you not using Go, but would
most like to?" Although many respondents (29%) said they already use Go
everywhere they would like to, the top two areas for expanding usage were GUI
/ Desktop and AI / ML applications. This was consistent across groups at
different organization sizes and job roles, but not experience levels. The
number one area where novices would like to use Go more is for websites / web
services returning HTML.
<img src="survey2023q1/app_opportunities_exp.svg" alt="Bar chart of levels of
experience using Go" class="chart"/>
In an open text question, 12 out of 29 respondents who said they would like to
use Go for websites / web services returning HTML said they were blocked
because other languages had frameworks to better support this use case. It
could be that more experienced Go developers don’t try or expect to use Go for
this use case when other languages already have frameworks that meet those
needs. As one respondent put it,
>“It's usually easier to accomplish this in other languages such as PHP or
>Ruby. Partly due to the excellent frameworks that exist in those languages.”
Another contributing explanation for novices' interest in web development may
be related to their usage of JavaScript / TypeScript. Novices spend more of
their time writing in JavaScript / TypeScript than more experienced
respondents. The higher interest in web could have something to do with what
novice respondents currently work on in other languages or could indicate a
general interest in web technologies. In the future we’d like to learn more
about this use case and how we can help new Gophers get started using Go in
areas most useful to them.
<img src="survey2023q1/language_time_exp.svg" alt="Bar chart of levels of
experience using Go" class="chart"/>
## Respondents face a long tail of challenges
Every survey cycle we ask respondents what their biggest challenge is when
using Go. Historically, lack of generics was the most commonly cited
challenge—for example, it was the most common response in 2020, and mentioned
by about 18% of respondents. Since the introduction of generics, error
handling (12%) and learning / best practices / docs (11%) have emerged at the
front of a long tail of issues rather than any single issue becoming more
frequent.
<img src="survey2023q1/text_biggest_challenge.svg" alt="Bar chart of
biggest challenges" class="chart"/>
### Why is error handling such a challenge?
Feedback on error handling often describes the problem as verbosity. On the
surface, this could reflect that writing repetitive code is boring or
annoying. More than just an annoyance of writing boilerplate, however, error
handling may also impact respondents’ ability to debug.
One respondent succinctly illustrated this issue:
>“Error handling creates clutter and easily masks problems if not done
>correctly (no stack traces)”
### The struggle to learn best practices
>"Using Go effectively. Easy to learn, hard to master."
We’ve heard that Go is easy to learn, and a [previous survey showed that over
70%](/blog/survey2020-results#TOC_6.2) of respondents feel
productive using Go within their first year, but learning Go best practices
came up as one of the biggest challenges to using Go. Respondents this year
told us that best practices around **code structure** and **recommended tools
and libraries** aren’t well documented, creating challenges for beginners and
teams to keep code consistent. Learning to write idiomatic Go can be
especially challenging to those coming from other programming paradigms.
Respondents who were more experienced with Go attested that when developers
don’t follow best practices for writing idiomatic Go, it hurts the consistency
and quality of shared projects.
## The biggest challenges for module maintainers
Go module maintainers are critical members of the Go community, helping to
grow and sustain the health of our package ecosystem. This year we plan to
conduct research with module maintainers to identify opportunities to support
stability and growth of the package ecosystem and help grow Go adoption within
organizations. To inform this research, we introduced a question on the survey
to get an idea of the current top challenges for open source maintainers.
<img src="survey2023q1/text_maintainer_challenge.svg" alt="Bar chart of
challenges for open source module maintainers" class="chart"/>
The top challenges for maintainers are keeping dependencies up to date and
difficulties around versioning, including avoiding, identifying, or knowing
when to introduce breaking changes. These insights, along with the results of
future research, will help inform strategies to support maintainers in keeping
the Go ecosystem stable and secure.
## The biggest challenges when deploying Go code
This year we asked what respondents’ biggest challenge was when deploying Go
code. Being “easy to deploy” is often cited as a reason for using Go, but we
received conflicting feedback during a recent study that prompted us to
explore potential issues when deploying Go code. In our open text responses,
by far the most common theme was difficulty cross-compiling with cgo (16%),
and support for WebAssembly or WASI was a distant second (7%).
<img src="survey2023q1/text_deploy_challenge.svg" alt="Bar chart of challenges
for open source module maintainers" class="chart"/>
## Community priorities: what respondents want most
This year we used a prioritization question we’ve used in previous surveys
based on the buy-a-feature method of prioritization. Respondents were given 10
“gophercoins” and asked to distribute them to areas where they want to see
improvements. Respondents were randomly assigned one of three possible
questions, each containing seven items related to tooling, security, or
compiler & runtime. This approach allowed us to ask about items relevant to
each focus area without overburdening respondents with three sets of
cognitively-demanding prioritization questions.
At the end of the exercise, we gave respondents an open text prompt to tell us
about any area they thought should be the Go team’s top priority in the next
year, regardless of which items they spent their coins on. For example, if a
respondent was shown the security section, but they didn’t care all that much
about security, they still had the opportunity to tell us that in the open
text area.
### Security
We chose these items to test assumptions we held on the relative importance of
security practices to the community. These were the seven items as described
to participants:
* pkg.go.dev identifies packages that are poorly maintained (e.g.,
unresponsive to issues, fail to keep their dependencies updated, remain
vulnerable for long periods of time)
* pkg.go.dev identifies packages that make breaking API changes (i.e.,
requires fixing uses of those APIs when upgrading those packages to newer
versions)
* Support for suppressing vulnerabilities in govulncheck
* A tool to track how sensitive data flows through a Go program (detect PII
leaks)
* A security best practices guide (e.g., how to choose and update
dependencies; how to set up fuzzing, vulnerability checking, and thread
sanitizer; how to use crypto)
* Secure-by-default Web & SQL libraries that help users avoid introducing
vulnerabilities in web server code
* FIPS-140-compliant cryptographic libraries
<img src="survey2023q1/prioritization_security.svg" alt="Bar chart of where
respondents spent the most on security issues" class="chart"/>
The highest funded security feature was for web & SQL libraries to be secure
by default to avoid introducing vulnerabilities in web server code, but the
top four features all relate to avoiding the introduction of vulnerabilities.
The desire for secure defaults is consistent with previous security research
that showed developers want to “shift left” on security: development teams
often don’t have time or resources to spend on addressing security issues, and
thus value tooling that reduces the likelihood of introducing them in the
first place. The second most common item was a security best practices guide,
highlighting the high value of best practices documentation compared to new
tools or features to the majority of respondents.
### Tools
Items we included in this question were inspired by feedback from VS Code
plugin users. We wanted to know which tooling and IDE improvements would be
most helpful to a wider audience who may use other IDEs or editors.
* Better refactoring tools (e.g., support for automatic code transformation:
renamings, function extraction, API migration, etc.)
* Better support for testing in your code editor/IDE (e.g., robust and
scalable Test Explorer UI, 3rd party test framework, subtest support, code
coverage)
* Better support for working on multiple modules in your code editor/IDE
(e.g., editing modules A and B, where module A depends on module B)
* Dependency insights in pkg.go.dev (e.g., vulnerabilities, breaking changes,
scorecards)
* Dependency insights in your code editor/IDE (e.g., vulnerabilities, breaking
changes, scorecards)
* Support for publishing modules with new module paths (e.g., repo ownership
handoff)
* Support finding types that implement an interface & interfaces implemented
by a type in your code editor/IDE
<img
src="survey2023q1/prioritization_tooling.svg" alt="Bar chart of where
respondents spent the most on tooling" class="chart"/>
The most funded editor feature was *support for finding types that implement
an interface and interfaces implemented by a type* and *refactoring tools*. We
also saw an interesting difference in how respondents spent their gophercoins
according to preferred editor usage. Most notably, VS Code users spent more
gophercoins on refactoring than GoLand users, suggesting that automatic code
transformations are currently better supported in GoLand than in VS Code.
### Compiler & runtime
Our key question for this section was to determine whether respondents wanted
better performance by default, better optimization tooling, or just a better
understanding of how to write performant Go code.
* Reduce compute costs
* Reduce memory use
* Reduce binary size
* Reduce build times
* Better performance debugging tools
* An optimization guide (how to improve performance and reduce costs, covering
Go’s implementation and performance debugging tools)
* Better support for using cgo when cross-compiling
<img src="survey2023q1/prioritization_core.svg" alt="Bar chart of where
respondents spent the most on compiler and runtime improvements"
class="chart"/>
By far the most funded item in this list was an optimization guide. This was
consistent across organization size, job role, and experience level. We asked
an additional question about whether respondents had resource costs concerns.
Most respondents (55%) said they did not have any cost concerns, but those who
had concerns about resource costs spent more gophercoins (on average, 2.0) on
reducing compute costs and memory costs than those who did not. However, even
those who were concerned about resource costs still spent about as much on the
optimization guide (on average 1.9 gophercoins). This is a strong signal that
providing guidance for Go developers to understand and optimize Go performance
is currently more valuable than additional compiler and runtime performance
improvements.
## Conclusion {#conclusion}
Thank you for joining us in reviewing the results of our first developer
survey of 2023! Understanding developers’ experiences and challenges helps us
prioritize how to best serve the Go community. Some takeaways we found
particularly useful:
* Novice Go developers have more of an affinity for web development than
respondents of other levels of experience. This is an area we’d like to
explore further to make sure we’re meeting the needs of new Go developers.
* Secure defaults, best practice guidance on security and optimization, and
more refactoring assistance in IDEs would be valuable additions to the
community.
* Error handling is a high priority issue for the community and creates
challenges in terms of verbosity and debuggability. The Go team doesn’t have
a public proposal to share at this time but is continuing to explore options
to improve error handling.
* Onboarding and learning best practices are among the top challenges for
respondents and will be areas of future research.
* For Go module maintainers, keeping dependencies up to date, module
versioning, and identifying or avoiding breaking changes are the biggest
challenges. Helping maintainers provide a stable and healthy ecosystem is
another topic of interest for further UX research.
Thanks again to everyone who responded and contributed to this survey—we
couldn't have done it without you. We hope to see you later this year for the
next survey.