3 ポイント 投稿者 GN⁺ 2024-01-05 | 1件のコメント | WhatsAppで共有

Go言語のオープンソースプロジェクト公開14周年を迎えて

  • Go言語の共同創始者の一人が、2023年11月10日にシドニーで開催されたGopherConAUカンファレンスで最後の講演を行った。
  • 講演では、Go言語がオープンソースプロジェクトとして公開されてから14年になったことを記念し、その間の成功と反省すべき点について議論した。
  • 講演者はGoチームやGoogleを代表するものではなく、個人的な見解を述べるものだとしたうえで、Go言語の成功に貢献したコミュニティに感謝を表した。

Go言語の成功要因と改善点

  • Go言語の当初の目標は、新しいプログラミング言語を作ることではなく、ソフトウェアの書き方を改善することだった。
  • Go言語は、依存関係管理、大規模チームとの協業、保守のしやすさ、効率的なテスト、マルチコアCPUやネットワーキングの効果的な活用など、現代的なサーバーソフトウェア構築の複雑さを解決しようとした。
  • Go言語は単なるプログラミング言語ではなく、本番ソフトウェアをより簡単かつ生産的に構築するためのプロジェクトである。

Go言語のマスコット、ゴーファー

  • Go言語のマスコットであるゴーファーは、Go言語の成功に重要な役割を果たした。
  • ゴーファーはGoプログラマーの象徴であり、コミュニティの旗印として、プロジェクトの成長に不可欠だった。
  • ゴーファーのデザインをCreative Commons Attributionライセンスで公開したことは、コミュニティ精神を促進する助けになった一方で、著作権問題による困難もあった。

Go言語の技術的成功要因

  • 公式仕様書の作成、複数実装の存在、移植性、互換性保証、豊富なライブラリ、ツール開発のしやすさ、自動コード整形ツールである gofmt などがGo言語の成功に貢献した。
  • gofmt はプログラミングコミュニティ全体に影響を与え、ほとんどの言語が標準フォーマッターを持つきっかけを作った。

並行性(Concurrency)とインターフェース

  • Go言語は並行性を言語の主要な構成要素とし、サーバーソフトウェアの構造を単純化することに貢献した。
  • インターフェースはGo言語を特徴づけるアイデアであり、オブジェクト指向設計に対するGoの答えとして、標準ライブラリや依存関係管理などに重要な役割を果たした。

ジェネリクス(Generic)とコンパイラ

  • インターフェースの存在は、Go言語にジェネリクスを追加するのに長い時間がかかった原因の一つだった。
  • 初期のGoコンパイラがCで書かれていたことはプログラミング言語コミュニティで論争の的となったが、Go言語の発展には適した選択だった。

プロジェクト管理とパッケージ管理

  • Go言語はオープンソースプロジェクトとして、開発初期には非公開で進められていたが、公開に転じた後はコミュニティからの貢献が爆発的に増加した。
  • パッケージ管理の開発過程は順調ではなく、コミュニティとの協業の進め方に対する理解が不足していた。

ドキュメント化と例

  • 初期のGo言語ドキュメントはコミュニティの期待に応えられなかったが、実行可能なサンプルをWebで提供するなど改善が進んだ。

GN⁺の意見

  • Go言語の成功は、強力な標準ライブラリ、並行性のサポート、インターフェースベースの設計、明確なパッケージ管理、高速なビルドおよびテストツール、一貫したコード整形、可読性重視、互換性保証といった要素に起因する。
  • Go言語はプログラミング言語としての機能だけでなく、ソフトウェア開発の進め方にも革新をもたらしており、これはコミュニティの多様性と支援のおかげである。
  • Go言語の開発過程とそれに対する反省は、オープンソースプロジェクトを運営するうえで重要な教訓を与える。

1件のコメント

 
GN⁺ 2024-01-05
Hacker Newsの意見
  • プロジェクトの振り返りに時間を割いた中心人物たちへの感謝

    • システムプログラミングに焦点を当てた言語上の制約
    • 言語と原則を明確に定義し、曖昧さや目的の異なる設計による無駄を防止
    • 品質を優先し、問題をリリース前に解決することは、すべての利害関係者にとって低コスト
    • コミュニティとの共有と、厳格な言語およびリリース管理とのバランス維持
    • Googleの不介入がGoの成功に寄与したとし、これが他のプロジェクトでも可能か疑問を提起
    • GoはサーバーサイドソフトウェアをJavaからネイティブコンテナへ移行させる中核技術であり、この10年間のWebアプリケーション基盤の大半を支えてきた
  • Go言語とコミュニティへの愛着

    • 2012年にPython開発者としてGoに触れ、ビット操作のしやすさに驚いた
    • 10年後もなお、Goの機能の大半がうまく機能していることに驚き
    • Rob、Ian、RussらがGoのために行ってきたことと、コミュニティとの「道の凸凹」について率直だったことに感謝
    • パッケージ管理の問題には批判的な見方もあるが、現在は良い解決策に到達したと評価
  • Goのパッケージ管理システムに関する批判的な経験の共有

    • 10年前にgo-nutsでGoのパッケージ管理方式について批判的な意見を述べた際、Rob Pikeに無視された経験
  • Go言語に対する批判的な見方

    • 言語の深い問題に対する認識が不足している
    • 型システム、エラー処理、安全でない並行性、単純すぎる文法などを理由にGoを勧めない
    • Rustを主言語として使っており、GoにはなかったビジョンをRustに見いだした
  • Ken ThompsonのCコンパイラ使用決定に関する興味深い点

    • LLVMではなくKen ThompsonのCコンパイラを使う決定への不満と、初期バージョンで最適化されていないコード生成への言及
    • この決定により、セグメント化スタックを素早く実装できた
  • gofmtの導入成功の強調

    • プロジェクト初期からコードフォーマットをめぐる議論を完全に排除し、大きな価値を提供した
    • 多くの新しい言語がgofmtを模倣したり、似たツールを作ったりしている
  • GopherConAU主催者としてプレイリスト全体を共有

    • プレイリストを公開できない理由が分からない
  • Goを使ってモノレポを簡単に作れ、アプリを素早くビルドできる利点

    • GoでCLIツールを作りやすく、Unixパイプラインの一部として使える
    • Goは大規模ログ分析などに有用
  • Goの相互運用性とC FFIに関する選択への言及不足

    • 「Goで書き直す」という答えが他の選択肢を排除している
  • コンパイラを自前の言語で書くことに関する意見

    • 自身の言語でコンパイルされない言語はコンパイラ作成に適していないのか、という問いを提起
    • コンパイラに適した言語が他のアプリケーションには適さないという含意への理解不足と、より多くの文脈を求める