The Go Blog
Go Developer Survey 2023 Q1 結果
ご回答者の皆様、貴重なご意見をいただきありがとうございます!
2023年1月実施のGo開発者アンケートの結果を皆様と共有できることを嬉しく思います。Goの使用方法、Goを使用する上での最大の課題、将来の改善のための最優先事項についてご意見をお寄せいただいた5,844人の回答者の皆様に感謝いたします。これらの結果は、Goチームがコミュニティにとって最も重要な分野に注力するのに役立ち、これらの知見がGoエコシステムに貢献し、支援する他の人々にも役立つことを願っています。
主な調査結果
- Goの初心者開発者はWeb開発に興味を持っている。今年は、自己申告による経験レベルに基づいた新しいセグメンテーションを導入しました。初心者は他の経験レベルとはいくつかの興味深い違いを示しました。最も顕著なのは、Web開発にGoを使用することに強い関心を示したことです。
- エラー処理と学習が回答者の最大の課題。これまで、Goを使用する上での最大の課題はジェネリクスの欠如でしたが、ジェネリクスの導入以来、ジェネリクスに関するコメントは減少しました。エラー処理(可読性と冗長性に関して)とベストプラクティスの学習の難しさが、現在最も一般的に報告されている課題となっています。
- 最適化ガイドがGoのパフォーマンスを向上させる最も価値のある方法。Goのコンパイルとランタイムの様々な改善にリソースをどのように費やすかを尋ねたところ、回答者は特定のパフォーマンス改善よりも最適化ガイドに最も多くのリソースを費やしており、この分野におけるドキュメントの価値の高さを示しています。
- 依存関係の管理とバージョン管理が、オープンソースGoモジュールメンテナーにとって最大の課題。オープンソースモジュールメンテナーは、依存関係を最新の状態に保ち、バージョン管理や破壊的変更による混乱を避けるという課題に直面しています。これは、メンテナーが安定した健全なエコシステムを提供できるよう、さらに探求していく分野です。
これらの結果の読み方
この投稿全体を通して、調査回答のグラフを使用して調査結果の裏付けとなる証拠を提供しています。これらのグラフはすべて同様の形式を使用しています。タイトルは、調査回答者が目にした正確な質問です。特に断りのない限り、質問は多肢選択式で、参加者は1つの回答しか選択できませんでした。各グラフのサブタイトルは、質問が複数の回答選択肢を許可しているか、多肢選択式の質問ではなく自由形式のテキストボックスであったかを示します。自由形式のテキスト回答のグラフについては、Goチームのメンバーがすべての回答を読み、手動で分類しました。多くの自由形式の質問は多種多様な回答を引き出しました。グラフのサイズを適切に保つため、上位10〜15のテーマに凝縮し、追加のテーマはすべて「その他」にまとめました。該当する場合は「なし」のカテゴリも含まれています。
各調査結果の裏付けとなる証拠の重みを読者が理解できるように、回答の95%信頼区間を示すエラーバーを含めています。バーが狭いほど信頼度が高いことを示します。2つ以上の回答にエラーバーが重なっている場合があり、これはそれらの回答の相対的な順序が統計的に意味がないことを意味します(つまり、回答は実質的に同点です)。各グラフの右下には、グラフに含まれる回答者の数が「n = [回答者数]」の形式で表示されます。
調査方法に関する注意
ほとんどの調査回答者は、Goブログ、Twitterの@golang、またはその他のGo関連のソーシャルチャネルのリンクからアクセスして、自主的に調査に参加しました。これらのチャネルをフォローしていない人は、熱心にフォローしている人とは異なる回答をする可能性があります。回答者の約4分の1はランダムにサンプリングされました。これは、VS Codeでプロンプトを見て調査に回答したことを意味します(2023年1月18日から2月8日までの間にVS Code Goプラグインを使用しているすべてのユーザーは、このランダムなプロンプトを受け取る可能性が10%ありました)。このランダムにサンプリングされたグループは、これらの調査結果をGo開発者のより大きなコミュニティに一般化するのに役立ちます。ほとんどの調査質問では、これらのグループ間で意味のある違いは見られませんでしたが、重要な違いがあったいくつかのケースでは、読者は回答を「ランダムサンプル」と「自主選択」のグループに分類したグラフを目にすることになります。
異なる回答者グループを詳しく見てみる
回答者の属性は、前回の調査から大きく変化していません。これまでのサイクルと同様に、Goは主にテクノロジー業界で使用されており、回答者の約80%が職場でGoをプログラミングしていると回答しました。全体として、調査回答者は過去1年間でGoに満足している傾向があり、92%が多少なりとも非常に満足していると回答しました。
回答者は、他の言語と比較してGoでのプログラミングに多くの時間を費やしています。回答者の約3分の1は、オープンソースの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で開発する可能性が高いと予想されるかもしれません。これは事実ですが、初心者は、VS Codeプラグインを通じて回答したかどうかに関わらず、他の経験レベルよりもWindowsで開発する可能性が高いという点もあります。
経験レベルの高いユーザーでWindowsユーザーの割合が増加しない理由には、いくつかの可能性があります。たとえば、Windowsユーザーは困難を経験してGoの使用を中止する可能性が高い、あるいはGoとは関係のないOSの使用状況におけるより広範なトレンドがあるのかもしれません。いずれにせよ、Goの導入に関する今後の調査には、より多くのWindowsユーザーを含め、包括的なオンボーディング体験を提供できるようにする必要があります。
異なる経験レベルの現在のGoの使用方法(および使用したいその他の分野)
現在のGoの使用方法によると、経験豊富なGopherほど、より多くの種類のアプリケーションにGoを使用する傾向があります。たとえば、平均的なエキスパートは少なくとも4つの分野でGoを使用しているのに対し、平均的な初心者は2つの分野でしかGoを使用していません。そのため、Goを各ユースケースで使用している初心者の割合とエキスパートの割合には大きな違いがあります。しかし、API / RPCサービスとCLIの2つの主要な用途は、すべての経験レベルでトップのユースケースです。
GUIとウェブサイト/ウェブサービス(HTMLを返す)には、さらに興味深い傾向が見られます。すべての経験レベルで、Goをデスクトップ/GUIアプリに使用する割合はほぼ同じでした。これは、GUIへの要望が、楽しい入門プロジェクトを探している新しいGopherだけでなく、経験のスペクトル全体から来ているという証拠になります。
HTMLを返すウェブサイト/サービスも同様の傾向を示しています。1つの説明として、これはGoの旅の初期段階で一般的なユースケースである(初心者にとって最も一般的な上位3つに入るため)、または初心者がHTMLを返すウェブサイトやウェブサービスに関する作業を行う可能性が高い、ということが考えられます。調査の後半で、「(もしあれば)Goを使っていないが、最も使いたい分野はどこですか?」と尋ねました。多くの回答者(29%)は、すでに使いたいすべての場所でGoを使用していると答えましたが、使用を拡大したい上位2つの分野はGUI/デスクトクトップとAI/MLアプリケーションでした。これは、組織規模や職務が異なるグループ間では一貫していましたが、経験レベル間では異なりました。初心者がGoをもっと使いたいと考える最大の分野は、HTMLを返すウェブサイト/ウェブサービスでした。
自由記述式の質問で、HTMLを返すウェブサイト/ウェブサービスにGoを使いたいと答えた29人の回答者のうち12人が、他の言語にはこのユースケースをより良くサポートするフレームワークがあるため、ブロックされていると答えました。これは、経験豊富なGo開発者は、他の言語にすでにニーズを満たすフレームワークがある場合、このユースケースにGoを試そうとしない、または期待しないのかもしれません。ある回答者が述べたように、
「PHPやRubyなど他の言語でこれを達成する方が通常は簡単です。それは、それらの言語に優れたフレームワークが存在する部分的な理由でもあります。」
初心者のWeb開発への関心のもう一つの要因は、JavaScript/TypeScriptの使用に関連しているかもしれません。初心者は経験豊富な回答者よりもJavaScript/TypeScriptでコードを書くことに多くの時間を費やしています。Webへの高い関心は、初心者回答者が現在他の言語で取り組んでいることと関係があるか、またはWeb技術への一般的な関心を示している可能性があります。将来的には、このユースケースと、新しいGopherが最も役立つ分野でGoを使い始めるのにどのように役立つかについて、さらに詳しく知りたいと考えています。
回答者は多くの課題に直面している
毎年、Goを使用する上での最大の課題は何かを回答者に尋ねています。これまで、ジェネリクスの欠如が最も一般的に挙げられる課題でした。たとえば、2020年には最も一般的な回答であり、回答者の約18%が言及していました。ジェネリクスの導入以来、エラー処理(12%)と学習/ベストプラクティス/ドキュメント(11%)が、単一の問題がより頻繁になるのではなく、多くの課題の長い尾の先頭に現れています。
なぜエラー処理はそれほど大きな課題なのでしょうか?
エラー処理に関するフィードバックは、問題を冗長性として表現することがよくあります。表面上、これは繰り返しコードを書くことが退屈または煩わしいことを反映しているのかもしれません。しかし、ボイラープレートを書くことの煩わしさだけでなく、エラー処理は回答者のデバッグ能力にも影響を与える可能性があります。
ある回答者はこの問題を簡潔に説明しました
「エラー処理はコードを乱雑にし、正しく行われない場合(スタックトレースがない場合)には問題を容易に隠蔽する」
ベストプラクティスの学習の難しさ
「Goを効果的に使うこと。学ぶのは簡単だが、習得するのは難しい。」
Goは習得が容易だと聞いており、以前の調査では、回答者の70%以上がGoを使い始めて1年以内に生産的だと感じていることが示されました。しかし、Goのベストプラクティスの学習は、Goを使用する上での最大の課題の1つとして挙げられました。今年の回答者からは、コード構造や推奨されるツールとライブラリに関するベストプラクティスが十分に文書化されておらず、初心者やチームがコードの一貫性を保つ上で課題が生じていると聞きました。イディオマティックなGoの書き方を学ぶことは、他のプログラミングパラダイムから来た人々にとっては特に困難な場合があります。Goの経験が豊富な回答者は、開発者がイディオマティックなGoの書き方のベストプラクティスに従わない場合、共有プロジェクトの一貫性と品質を損なうと証言しました。
モジュールメンテナーの最大の課題
Goモジュールのメンテナーは、Goコミュニティの重要なメンバーであり、私たちのパッケージエコシステムの健全性の成長と維持を助けています。今年は、モジュールメンテナーとの調査を実施し、パッケージエコシステムの安定性と成長をサポートし、組織内でのGoの採用を促進する機会を特定する予定です。この調査に役立てるため、オープンソースメンテナーにとって現在の最大の課題を把握するための質問をアンケートに導入しました。
メンテナーにとっての最大の課題は、依存関係を最新の状態に保つことと、バージョン管理に関する困難、特に破壊的変更を回避、特定、またはいつ導入すべきかを知ることです。これらの洞察は、今後の研究結果とともに、Goエコシステムを安定して安全に保つためのメンテナーをサポートする戦略の策定に役立ちます。
Goコードをデプロイする際の最大の課題
今年は、Goコードをデプロイする際の最大の課題は何かを回答者に尋ねました。「デプロイが簡単」はGoを使用する理由としてよく挙げられますが、最近の調査で相反するフィードバックを受け、Goコードをデプロイする際の潜在的な問題を探求するきっかけとなりました。自由記述式の回答では、Cgoを用いたクロスコンパイルの難しさ(16%)が圧倒的に最も一般的なテーマであり、WebAssemblyまたはWASIのサポートがはるかに2位(7%)でした。
コミュニティの優先事項:回答者が最も望むもの
今年は、以前の調査でも使用した「buy-a-feature」方式の優先順位付け質問を使用しました。回答者には10枚の「ゴーファーコイン」が与えられ、改善してほしい分野にそれらを配布するように求められました。回答者は、ツール、セキュリティ、コンパイラ&ランタイムに関連する7つの項目を含む3つの質問のいずれかにランダムに割り当てられました。このアプローチにより、認知的に要求の厳しい3つの優先順位付けの質問で回答者に負担をかけることなく、各重点分野に関連する項目について尋ねることができました。
演習の最後に、回答者には自由記述式のプロンプトを与え、コインをどの項目に費やしたかに関わらず、Goチームが来年最も優先すべきだと考える分野について教えてもらいました。たとえば、回答者がセキュリティセクションを表示されたものの、セキュリティにそれほど関心がなかった場合でも、自由記述欄でその旨を伝える機会がありました。
セキュリティ
これらの項目は、セキュリティプラクティスのコミュニティに対する相対的な重要性について私たちが抱いていた仮定をテストするために選択しました。これらは参加者に説明された7つの項目です。
- pkg.go.devが適切に管理されていないパッケージを特定する(例:問題への対応が遅い、依存関係を更新しない、長期間脆弱なまま放置されているパッケージ)
- pkg.go.devが破壊的API変更を行うパッケージを特定する(例:それらのパッケージを新しいバージョンにアップグレードする際にAPIの使用を修正する必要があるもの)
- govulncheckでの脆弱性の抑制のサポート
- Goプログラムを介して機密データがどのように流れるかを追跡するツール(PII漏洩の検出)
- セキュリティベストプラクティスガイド(例:依存関係の選択と更新方法、ファジング、脆弱性チェック、スレッドサニタイザーの設定方法、暗号の使用方法)
- Webサーバーコードに脆弱性を導入するのをユーザーが回避するのに役立つ、デフォルトでセキュアなWebおよびSQLライブラリ
- FIPS-140準拠の暗号ライブラリ
最も資金が投じられたセキュリティ機能は、Webサーバーコードに脆弱性を導入するのを避けるために、WebおよびSQLライブラリがデフォルトで安全であることでしたが、上位4つの機能はすべて脆弱性の導入を避けることに関連していました。安全なデフォルトへの要望は、開発者がセキュリティを「シフトレフト」したいと示した以前のセキュリティ調査と一致しています。開発チームはしばしばセキュリティ問題に対処する時間やリソースがなく、そのため、そもそもそれらを導入する可能性を減らすツールを高く評価します。2番目に多かった項目はセキュリティベストプラクティスガイドであり、新しいツールや機能と比較して、ほとんどの回答者にとってベストプラクティス文書化の価値が高いことを強調しています。
ツール
この質問に含めた項目は、VS Codeプラグインユーザーからのフィードバックにインスパイアされました。私たちは、他のIDEやエディターを使用する可能性のあるより幅広いユーザーにとって、どのツールとIDEの改善が最も役立つかを知りたいと考えました。
- より優れたリファクタリングツール(例:自動コード変換のサポート:名前変更、関数抽出、API移行など)
- コードエディター/IDEでのテストのより良いサポート(例:堅牢でスケーラブルなテストエクスプローラー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の初心者開発者は、他の経験レベルの回答者よりもウェブ開発への親和性が高いです。これは、新しいGo開発者のニーズを確実に満たすために、さらに探求したい分野です。
- セキュアなデフォルト設定、セキュリティと最適化に関するベストプラクティスガイド、IDEでのリファクタリング支援の強化は、コミュニティにとって価値のある追加機能となるでしょう。
- エラー処理はコミュニティにとって優先度の高い問題であり、冗長性とデバッグのしやすさという点で課題を生み出しています。Goチームは現時点では公開する提案を持っていませんが、エラー処理を改善するための選択肢を引き続き検討しています。
- オンボーディングとベストプラクティスの学習は、回答者にとって最大の課題の1つであり、今後の研究分野となるでしょう。
- Goモジュールメンテナーにとって、依存関係を最新の状態に保つこと、モジュールのバージョン管理、および破壊的変更の特定または回避が最大の課題です。メンテナーが安定した健全なエコシステムを提供できるよう支援することは、さらなるUX研究の対象となるもう1つの関心事です。
この調査にご協力いただいた皆様、改めてありがとうございました。皆様のご協力なしには実現できませんでした。今年の後半に次の調査でお会いできることを願っています。
次の記事:Go 1.21 リリース候補
前の記事:Go統合テストのコードカバレッジ
ブログインデックス