The Go Blog
Go開発者調査 2023年第1四半期結果
ご回答いただいた皆様、貴重な insights をありがとうございます!
Go開発者調査の2023年1月版の結果を発表できることを嬉しく思います。5,844名の回答者の皆様、Goの使用方法、Goの使用における最大の課題、今後の改善のための最優先事項についてご回答いただき、ありがとうございました。これらの結果は、Goチームがコミュニティにとって最も重要な分野に注力するのに役立ちます。また、これらの insights が、Goエコシステムに貢献し、サポートする他の皆様にも役立つことを願っています。
主な findings
- Go初心者開発者はWeb開発に興味があります。今年は、自己申告による経験レベルに基づいた新しいセグメンテーションを導入しました。初心者は、他の経験レベルとは異なる興味深い点を見せてくれました。最も注目すべきは、Web開発にGoを使用することに対する関心の高さです。
- エラー処理と学習が回答者の最大の課題です。従来、ジェネリクスの欠如がGoを使用する上での最大の課題でしたが、ジェネリクスの導入以来、ジェネリクスに関するコメントは減少しています。現在、最も多く報告されている課題は、エラー処理(可読性と冗長性に関して)とベストプラクティスの学習の難しさに関するコメントです。
- 最適化ガイドは、Goのパフォーマンスを向上させるための最も価値のある方法でした。Goのコンパイルとランタイムのさまざまな改善にリソースをどのように費やすか尋ねられたとき、回答者は特定のパフォーマンスの向上よりも最適化ガイドに最も多くを費やしました。これは、この分野でドキュメントがどれほど重視されているかを示しています。
- 依存関係の管理とバージョン管理は、オープンソースのGoモジュールメンテナにとって最大の課題です。オープンソースのモジュールメンテナは、依存関係を最新の状態に保ち、バージョン管理と破壊的変更による混乱を回避するという課題に直面しています。これは、メンテナが安定した健全なエコシステムを提供できるよう、今後さらに調査していく分野です。
これらの結果の読み方
この記事全体を通して、調査回答のチャートを使用して、 findings を裏付ける証拠を提供しています。これらのチャートはすべて同様の形式を使用しています。タイトルは、調査回答者が見たのと同じ質問です。特に明記されていない限り、質問は複数選択式で、参加者は1つの回答しか選択できませんでした。各チャートのサブタイトルには、質問が複数回答を許可していたか、複数選択ではなく自由回答形式のテキストボックスであったかが示されます。自由回答形式のテキスト回答のチャートについては、Goチームのメンバーがすべての回答を読み、手動で分類しました。多くの自由回答形式の質問は、多種多様な回答を elicit しました。チャートのサイズを妥当な範囲に収めるために、上位10~15のテーマに絞り込み、その他のテーマはすべて「その他」にグループ化しました。該当する場合には、「なし」のカテゴリも設けました。
読者が各 finding の根拠となる証拠の重みを理解できるように、回答の95%信頼区間を示すエラーバーを含めています。バーが狭いほど、信頼性が高いことを示します。2つ以上の回答のエラーバーが重なっている場合、これらの回答の相対的な順序は統計的に意味がありません(つまり、回答は事実上同点です)。各チャートの右下には、チャートに含まれる回答者の数が「*n = [回答者数]*」の形式で表示されます。
方法論に関する注意
ほとんどの調査回答者は、Goブログ、@golang on Twitter、またはその他のGoソーシャルチャンネルのリンクからアクセスすることで、調査への参加を「自己選択」しました。これらのチャンネルをフォローしていない人は、熱心にフォローしている人とは異なる回答をする可能性があります。回答者の約4分の1はランダムにサンプリングされました。つまり、VS Codeでプロンプトが表示された後に調査に回答しました(2023年1月18日から2月8日までの間にVS Code Goプラグインを使用しているすべての人に、このランダムプロンプトを受け取る確率が10%ありました)。このランダムにサンプリングされたグループは、これらの findings をより大きなGo開発者コミュニティに一般化するのに役立ちます。ほとんどの調査質問では、これらのグループ間に有意な差は見られませんでしたが、重要な差がある少数のケースでは、回答を「ランダムサンプル」グループと「自己選択」グループに分類したチャートが表示されます。
回答者のさまざまなグループを詳しく見てみる
回答者の属性は、前回の調査から大きく変化していません。以前のサイクルと同様に、Goは主にテクノロジー業界で使用されており、回答者の約80%が職場でGoでプログラミングを行っていると回答しています。全体として、調査回答者は過去1年間、Goに満足しており、92%が「どちらかといえば満足」または「非常に満足」と回答しています。
回答者は、他の言語と比較して、Goでのプログラミングに多くの時間を費やしています。回答者の約3分の1は、オープンソースのGoモジュールを保守しています。調査対象者は、Goを正常に採用し、頻繁に使用し、Goの使用に概ね満足している人々で構成されていることを認識しています。コミュニティのニーズを満たす上での潜在的なギャップを特定するために、回答者のさまざまなサブグループを見て、Goをどのように異なって使用しているか、または異なる優先順位を持っているかを調べます。たとえば、今年は、サンプルソース(GoブログまたはVS Codeプラグイン)、職務、組織の規模、Goの経験レベルによって回答がどのように異なるかを調べました。最も興味深い違いは、経験レベルの間でした。
初心者回答者からの insights
以前は、回答者がGoを使用してきた期間(月/年)をプロキシとして使用し、経験レベルによって結果がどのように異なるかについての insights を得ていました。今年は、「Goの経験レベルはどのくらいですか?」という新しいセグメンテーション質問を試して、自己識別が、さまざまな期間をまとめて考えるよりも、Goの経験を調べるためのより有用な方法であるかどうかを確認しました。「初心者」や「エキスパート」などのカテゴリ用語は人によって異なる場合があるため、これらのバケットをより客観的にするための説明を提供しました。選択肢は次のとおりです。
- 認識:Goを知っているが、支援なしでは簡単なGoプログラムを書くことができない
- 初心者:支援があれば、Goで簡単なプログラミングプロジェクトを完了できる
- 中級:多少の支援があれば、Goで重要なプログラミングプロジェクトを完了できる
- 上級:支援なしで、Goで重要なプログラミングプロジェクトを完了できる
- エキスパート:他のエンジニアからのGoに関する質問に対し、ガイダンス、トラブルシューティング、回答を提供できる
回答者がGoを使用してきた期間と自己申告による経験レベルの間には、 moderate な相関関係(⍴ = .66)があることがわかりました。これは、経験レベルスケールはタイムスケールと似ていますが、回答者が経験によってどのように異なるかについて、いくつかの新しい insights をもたらす可能性があることを意味します。たとえば、回答者が他の言語で記述する時間と比較して、Goで記述する時間に費やす割合は、Goを使用してきた期間よりも、自己申告による経験レベルとの相関が強くなります。
このセグメンテーションを使用する分析では、通常、認識カテゴリは除外します。これは、質問に答えるために必要な経験がないと考えられ、回答者の約1%しか占めていないためです。
初心者回答者は、経験豊富な回答者よりもWindowsを好む可能性が高い
ランダムにサンプリングされたグループは、自己選択されたグループよりも初心者回答者の割合が高かった。これは、私たちがあまり耳にすることのない新しいGopherが多く存在することを示唆しています。彼らはGo VS Codeプラグインを通じてサンプリングされているため、このグループは他の経験レベルよりもVS Codeの使用やWindowsでの開発を好む可能性が高いと予想されるかもしれません。これは事実ですが、VS Codeプラグインを通じて回答したかどうかに関係なく、初心者は他の経験レベルよりもWindowsで開発する可能性が高くなります。
経験レベルが高くなるにつれてWindowsユーザーの割合が高くならない理由はいくつか考えられます。たとえば、Windowsユーザーは問題が発生してGoの使用を停止する可能性が高いか、Goとは関係のないOSの使用状況のより広い傾向がある可能性があります。いずれにせよ、Goを使い始めることに関する今後の調査には、より多くのWindowsユーザーを含めて、包括的な onboarding エクスペリエンスを提供する必要があるでしょう。
さまざまな経験レベルが現在Goをどのように使用しているか(および使用したいと考えている他の分野)
回答者が現在Goをどのように使用しているかによると、経験豊富なGopherはより多くの種類のアプリケーションにGoを使用する傾向があります。たとえば、平均的なエキスパートは少なくとも4つの分野でGoを使用していましたが、平均的な初心者は2つの分野でのみGoを使用していました。そのため、各ユースケースでGoを使用している初心者とエキスパートの割合には大きな違いがあります。ただし、上位2つの用途であるAPI / RPCサービスとCLIは、すべての経験レベルで上位のユースケースです。
GUIとWebサイト/ Webサービス(HTMLを返す)については、より興味深い傾向が見られます。すべての経験レベルで、ほぼ同じ割合でデスクトップ/ GUIアプリにGoを使用していました。これは、GUIに対する要望が、楽しい starter プロジェクトを探している新しいGopherからだけでなく、経験のスペクトル全体から来ていることを示す証拠となります。
HTMLを返すウェブサイト/サービスも同様の傾向を示しています。これは、Goを使い始めたばかりの人がよく遭遇するユースケースである(初心者に最も多い上位3つのユースケースに入っているため)、あるいは初心者はHTMLを返すウェブサイトやWebサービスの開発に従事している可能性が高いことが考えられます。 後半の調査では、「Goを使っていないが、最も使ってみたい分野はありますか?」という質問をしました。多くの回答者(29%)は、すでにGoを使用したいすべての分野で使用していると回答しましたが、使用を拡大したい分野の上位2つは、GUI/デスクトップアプリケーションとAI/MLアプリケーションでした。これは、組織の規模や職種が異なるグループでは一貫していましたが、経験レベルでは一貫していませんでした。初心者がGoをもっと活用したい分野の第1位は、HTMLを返すウェブサイト/Webサービスでした。
自由記述式の質問では、ウェブサイト/WebサービスのHTML返却にGoを使用したいと回答した29人中12人が、他の言語にはこのユースケースをより適切にサポートするフレームワークがあるため、Goの使用が阻害されていると回答しました。経験豊富なGo開発者は、他の言語にすでにニーズを満たすフレームワークがある場合、このユースケースにGoを使用しようとしない、あるいは期待していない可能性があります。ある回答者は次のように述べています。
「PHPやRubyなどの他の言語では、通常、これを達成する方が簡単です。これらの言語に存在する優れたフレームワークのおかげです。」
初心者がWeb開発に興味を持つもう1つの理由は、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%)でした。
コミュニティの優先事項:回答者が最も求めているもの
今年は、以前の調査で使用した、機能購入方式の優先順位付けに基づく優先順位付けの質問を使用しました。回答者には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初心者の開発者は、他の経験レベルの回答者よりもWeb開発に親しみを感じています。これは、新しいGo開発者のニーズを満たしていることを確認するために、さらに調査したい分野です。
- 安全なデフォルト、セキュリティと最適化に関するベストプラクティスのガイダンス、IDEでのリファクタリング支援の強化は、コミュニティにとって貴重な追加要素となります。
- エラー処理はコミュニティにとって優先順位の高い問題であり、冗長性とデバッグ可能性の面で課題となっています。Goチームは現時点では公開できる提案はありませんが、エラー処理を改善するための選択肢を検討し続けています。
- オンボーディングとベストプラクティスの学習は、回答者にとって最大の課題の1つであり、今後の研究分野となります。
- Goモジュールメンテナにとって、依存関係の更新、モジュールバージョン管理、破壊的変更の特定または回避が最大の課題です。メンテナが安定した健全なエコシステムを提供できるよう支援することも、今後のUX調査の対象となる興味深いトピックです。
この調査にご回答、ご協力いただいた皆様に改めて感謝申し上げます。皆様のご協力なしには、この調査は実現できませんでした。今年の後半に行われる次回の調査でお会いできるのを楽しみにしています。
次の記事:Go 1.21 リリース候補版
前の記事:Go統合テストのコードカバレッジ
ブログインデックス