キーポイント
- Go’s simplicity allows you to quickly get started using it—you can digest the whole spec in just one afternoon.
- The author considers Go to be one of the best modern languages of today (together with Dart + Flutter and Rust).
- Go’s future is shaped by its open-source community which discusses and debates on all feature proposals. Unless a clear consensus is reached, the feature won’t be implemented.
- The community’s size doubles around every 18 months.
- Initially, the base of adopters was coming from dynamic languages like python or ruby, now as the language has matured Java, .NET, and C++ programmers have started adopting it as well.
- In a challenging year, the community adapted to support each other, multiple meetups appeared, and new resources.
プログラミング言語の歴史は、これまでは一方向にのみ進むものでした。しかしながら、最近の新しい言語では、状況はより複雑に、より抽象的なものになっています。十数年前、GoはGoogleでその歴史をスタートしました。その後、このプログラム言語は別の道を歩み始め、単純さと巧緻さを身上とするようになりました。このレシピは今日まで維持されていて、現在のGoは、ハードルの低い、すぐにコードの書ける言語になったと言えます。信頼性が高く、広範に使用されている最新ソフトウェアの大部分 — Docker、Kubernetes、Prometheus、他にもまだあります — がGoで記述されていることを考えれば、その印象も深まると思います。Goがどこから来たのか、さらに重要なこととして、どこへ行こうとしているのか。それを理解すべく、InfoQは今回、Goプログラミング言語のコアメンバとしてGoogleでストラテジとプロダクトを担当する、Steve Francia氏に会うことにしました。
InfoQ: 読者の質問に答える時間を頂いてありがとうございます。最初に自己紹介と、Googleでのあなたの役割、毎日の業務について説明して頂けますか?
Steve Francia: 私はSteve Freanciaです。GoogleのGoプログラミング言語チームのコアメンバとして、プロダクトとストラテジを担当しています。
InfoQ: Goが13年前に誕生した理由として、技術的な課題と工学的な課題を挙げていましたが、他にも何かあったのでしょうか?当時のGoogleの公式プログラミング言語は何であって、それには何が欠けていたのですか?
Francia: Goを開発した最大のモチベーションは、私たちのシステムが複雑さを増している、という認識でした。指数級数的な"Googleスケール"の成長に追い付くために、私たちのニーズに応える複雑なシステムが設計されていたのです。時間が経つにつれて、それらの基本システムやライブラリや言語の上に、新たに複雑なシステムが積み重ねられていきました。複雑性の隠れたコストについては、考慮されないことがよくあります。コードは書くよりも読まれることの方がはるかに多いのですから、複雑性はチームのベロシティを大きく棄損します。対照的にGoはシンプルです。半日もあれば覚えられてしまいます。コードは非常に具体的で、可読性に富んでいます。この単純さがチームに対して、これまで実現できなかった方法でのコラボレーションを可能にするのです。
InfoQ: Goの開発は、どのようにして始まったのでしょうか?トップダウンの指示(ニーズに対応する言語をマネージャが求めた)だったのでしょうか、あるいはボトムアップだったのですか?Googleの有名な"イノベーションのための20パーセント"、あるいは、エンジニアが最善を尽くすこと -- 問題解決なのでしょうか?
Francia: Goは誰かに依頼されたものではありません。実際には、20パーセントプロジェクトでもありませんでした。ある会話がきっかけで研究プロジェクトが生まれ、それが勢いを得て、誰も創造し得なかったほど広く使われるようになったのです。とは言っても、複雑性の軽減や生産性向上の手段を探るという点では、当然ながらGoogle全体として、関心は上からも下からもありました。
InfoQ: スタートアップの世界のことばに、ローンチの日にプロダクトを恥ずかしく思っていないようであれば、おそらくは手遅れだ、というものがあります。Goは2011年に公開されましたが、同じ時にGoogle App Engineのサポートが追加され、YouTubeがVitessの使用を開始しました。Goはローンチ時点から実用レベルだったのでしょうか、あるいは開発に苦労するようなものだったのでしょうか?
Francia: Goはよいタイミングでローンチされました。基盤になるよい機能がたくさん揃っていましたが、ローンチ当時にはなかったものが、現在のGoにはたくさん備わっています -- オープンソースでは、これは普通のことです。代表的なものとして、当時は"go"コマンドがありませんでした。ですから、現在のGoではとても自然にできる"go build"のような作業が、当初はもっと難しかったのです。
開発初期にリリースしたことによる最大のメリットは、Goの設計プロセスにコミュニティが参加できたことです。Goの成功の大半を占めるコントリビューションのおもな部分は、コミュニティによって提供されました。
記述したプログラムが運用環境で安定して動作するという意味においては、Goは公式リリースの初期段階から運用レベルに達していました。しかしながら、プログラミングエクスペリエンスという意味では改善の余地をたくさん残していたので、それ以降、Goチームとコミュニティが協力して言語を形作ることができたのです。
InfoQ: 振り返ってみて、Goの開発中に対処しなければならなかった、最も技術的な問題は何でしたか?
Francia: 難しい質問ですね。というのも、その質問は、Goの開発がすでに完了している、ということを暗に前提としているからです。これまでにGoプロジェクトが対処してきた"最も難しい"技術的問題はたくさんありましたし、今でもなお、非常に困難な技術的課題に取り組み続けていると思います。現在Goは、ジェネリクスのサポートを加えるための開発を進めています。ジェネリクスの追加それ自体が困難なタスクなのですが、私たちはそれをGoらしいものにしたい、つまりジェネリクスの可読性を向上したいと思っているのです。これは非常に難しいことで、中心的な開発者の何人かは、開発に10年以上を要するのではないか、と考えています。
この数年間は、依存関係の管理に関連した最大の課題のいくつかに取り組んできました。私たちはGoに、ひし形依存関係(diamond dependencies)や依存関係地獄(dependency hell)のないモジュールサポートを追加しました。今まではどの言語もなし得なかったことです。
もうひとつの課題は、各リリースにおいて一貫して取り組んでいる、Goのパフォーマンス改善の歴史です。この成果が明確に分かる一例は、ガベージコレクションによる停止時間が秒単位からミリ秒、さらにはマイクロ秒へと削減されたことです。これはGoにとっての変革であり、ビジネスにおいて成功する上で重要なことなのです。
InfoQ: もしGoの実装をもう一度、最初から始めなければならないとすれば、何を変えたいと思いますか?その理由も教えてください。
Francia: 結果論というアドバンテージがありますし、当初の数年間は関係していなくて、後に今日のGoの形成に一役買ってくれた人もいるのですが、正直に言うと、ほとんど変わることはないと思います。Goは美しく、考え抜かれた言語です。完璧ではありませんが、とても使いやすいものです。
細かな部分で修正したい点はいくつかありますが、それを議論するのは、些細なものにスポットライトを当て過ぎることになるでしょう。それよりも、すべてをもう一度やり直せるとするならば、同じ過ちを、ただし、もっと早く犯したいと思いますね。Go言語はとても急速に成長しています。18か月毎に、Goのユーザベースは2倍に膨れ上がっているのです。これはつまり、今日行われる変更は、5年前に比べて10倍の人々に影響を与える、という意味になります。
Goが現在備えている依存管理は素晴らしいものですが、おそらくは5年前に実現するべきものでした。この遅れが難しい問題をより難しくして、結果的に必要以上のストレスをコミュニティに起こしているのです。
同じように、現在開発を進めている大きな言語変更がジェネリクスです。これもコミュニティに大きな影響を与えるでしょう。もし最初からすべてをやり直すことができて、この機能がいかに重要かを事前に理解しておくことが可能だったならば、おそらく7年前から本格的な開発を始めておきたかった、と思っています。
InfoQ: プログラミング言語としてのGoに、現在でも欠けているものは何でしょう?
Francia: 言語として不足している唯一の大きな機能はジェネリクスです。先程も話したように、現在はこの開発に注力しています。プレイグラウンドが公開されているので、現時点での言語機能のプロトタイプを使って、そのフィードバックを提供することができます。
これ以外では、開発作業の大部分は、おもに言語自体の機能に関するリファインメントとブラッシュアップに充てられています。ツーリングに関しては、オーサリング、リリース、編集に関するエクスペリエンスの改善計画があります。依存関係に関して、よりよい判断を下すための支援にも取り組んでいます。
InfoQ: GoはGoogleからスタートしましたが、現在はオープンソースですね。何を実装するかについて、現在は誰が決定権を持っているのですか?
Francia: 2020年11月にGoは、オープンソースとして11年目を迎えました。Goでは、プロジェクトの方向性全体を決める提案プロセスが明確に定義されています。アイデアや実験はどこからでも -- コミュニティのあらゆる場所から送られてきます。GitHubのプロポーザルとして、プロジェクトに送られるのです。その時点から、そのプロポーザルについてどう思うかをコミュニティが検討して、アイデアをさらに洗練するための支援をします。提案委員会が毎週開かれて、公開されているプロポーザルを検討します。現在の委員会には6名のメンバがいて、その中の4人はGoogleの社員です。ただし、この週次ミーティングはおもに"ガーデニング"であって、決定はほとんどの場合、プロポーザルの問題自体に対するコミュニティの議論をもとに行われています。問題に関する議論で賛成のコンセンサスが明確にならない限り、プロポーザルは否決されます。Goの変更はゆっくりと、オープン性を意識して行わるように、意図的に制度設計されています。それを支援するように、このプロセスは設計されているのです。
InfoQ: 広く普及したことで、Goのエコシステムはどのように変わりましたか?当初のGoは、ネットワーキングとインフラストラクチャを重視していました。年月を経て、その用途はどのように発展したのでしょうか?
Francia: Goの興味深い点のひとつは、プロジェクトの発展の道筋が、開発者たちが当初考えていたものとはまったく違うものになったことです。Goを開発した人たちは最初、その頃一般的に普及していた、ハイパフォーマンスなサーバサイド用プログラミング言語であるC++の代替として、言語の開発を始めました。彼らは当時、もっとシンプルな言語を開発すれば、このクラスの開発者にとって、パフォーマンスを維持しながら生産性を大幅に向上できるのではないか、と考えたのです。
GoはJavaやC++のエンジニアにもある程度普及しました。ですが、最初に導入した人たちの大部分は、PythonやJavaScript、Ruby、PHPといった言語を扱っていた動的言語のプログラマたちでした。実際にGoが最初にアピールしたのは、生産性を維持しながらパフォーマンスを大幅に向上したいと思っていた、こうした動的言語のクラスだったのです。
Goとそのエコシステムが成長すると、採用は企業へと広がり、当初の対象であったJavaやC++、そしてC#のエンジニアたちがGoを積極的に導入するようになりました。
Goの際立った特徴のひとつとして、小型言語においては、イノベーションのほとんどがエコシステム内で行われる、という点があります。コミュニティがGoを使って見せてくれる、創造性と多様性に富んだ方向性に、私たちは驚かされてばかりいます。Goの強みが、その開発目的であったクラウド/サーバアプリケーションにあることは変わりませんが、その他のさまざまなタイプのアプリケーションにも適している、ということが分かりました。DevOps/SRE、CLI、Webアプリケーション、データ処理などの分野でもGoが使われていますし、マイクロコントローラやロボティクス、ゲームなどにも広がっています。
InfoQ: Kubernetes、Docker、PrometheusなどはすべてGoで書かれています。その他のツールでも、Goで書かれたものはありますか?
Francia: たくさんあって、ここでは挙げきれません。一般的に使用されているツールをいくつか紹介しましょう。
- Hugo — 静的サイトジェネレータ (私が以前開発したもの)。
- Syncthing — 分散同期ツール (Dropbox/Google Driveのようなものだが、サーバ不要)。
- Istio — サービスメッシュ。
- Terraform — インフラストラクチャ・アズ・コード。
- InfluxDB — 時系列データベース。
もっと網羅的なリストがAwesome Goにあります。
InfoQ: Goはネットワーキングやシステムプログラミングにおいて効率がよく、信頼性も高いのですが、Goが向いていない分野というものはあるのでしょうか?
Francia: 私自身の考えですが、最新の言語というものは、現時点では3つしかないと思っています。いずれも前世代の言語の持つさまざまな欠点に対処するために、深く考えた設計がなされています。結果として、それぞれが異なる点で優れていて、相互に補い合う関係になっているのです。その3つの言語について、私の考えを述べましょう。
- Goは優れた既定言語(default language)で、システムやサーバ、API、デーモン、データベース、Webサイトなどに適しています。Goはパフォーマンスと開発者の生産性を、高いレベルで両立させています。
- Dart + Flutterは、GUIベースアプリケーション(モバイルおよびデスクトップ)に適しています。Flutterは、複数のOSとフォーマットで動作する単一クライアントアプリケーションの記述というアイデアを、高いレベルで実現しました。
- Rustは、詳細なコントロールが必要な場合に適しています。低レベルな処理やカーネルなどです。Rustは精密性に優れていますが、その分、複雑さは大きくなります。このトレードオフが理に適っている場合もあります。そうであれば、Rustが最適です。
今後10年以上にわたって、"現代的"ワークロードの大多数は、これらの言語で記述されることになると思います。もちろん、サポートの必要なレガシアプリケーションは常に存在しますから、これを他の言語が不要になるという意味には捉えないでください。それに、RやSQL、あるいはJavaScriptといった、ニッチな言語が役割を果たす領域というのも間違いなく存在します。
InfoQ: 2年前にブダペストで開かれたカンファレンスに参加した時、あなたは、Goの使用に関するワークショップを行っていましたね。その時、あなたの友人よりも、あなたの敵に対してGoを推奨しているように思えたのですが、それはなぜでしょうか?
Francia: ブダペストは初めてだったのですが、素晴らしいカンファレンスでした。その後も何回か訪れています。とても魅力的で、大好きな都市のひとつです。
ずっと前のことになりますが、私はMongoDBで働いていました。そこでの私は、開発者エクスペリエンスチームのリーダをしていたので、ユーザが触れるすべての部分について責任を負っていました。具体的には、ドキュメントやWebサイト、開発者とのリレーション、MongoDBインターフェース、言語やフレームワークとのインテグレーションの設計とエンジニアリング、といったものです。チームに対して10以上のプログラミング言語(と、いくつかの人の言語)のスキルを求めるという、非常に広範で難しい役割でした。私自身は、その時点までのキャリアの中で、すでに多くの言語を使っていたので、それぞれの言語で貢献できることを目標にしていました。その時の私は、自分自身が多言語技術者であると認識していて、この機会に自分の経験をさらに広げて、これらさまざまな言語を学ぶことを期待していたのです。
まず最初は、最も人気のある言語のサポートに重点を置くことにしたので、"次にくる言語"が何になるのかを探り続けました。私が最初に学んだ"次の言語"はScalaでした。これにはMartin Odersky氏による無償にScalaコースが役に立ちました。言語の学習を楽しみながら、調査も続けていたのですが、次に試した言語がGoだったのです。そして恋に落ちました。まるで誰かが、私のために設計してくれた言語のように思えたのです。フリータイムの大部分、マンハッタンへ毎日通勤する電車の中の3時間以上、Goでソフトウェアを書いていました。こうやってHugoやCobra、Viper、Afero、その他たくさんのライブラリやアプリケーションが生まれたのです。
このプロセスの中で、自分は多言語プログラマではなく、単に自分の言語を見つけられていなかったのだ、と知りました。初めてGoを使った瞬間から、私はGoコミュニティとエコシステムに没頭するようになりました。世界中でトレーニングを行い、数多くのカンファレンスで講演し、いくつものイベントを企画しました。この7年間は、Goに関する話を聞いてくれる人たちと話をしてきました。その中で、GoチームやGoogleに自分を参加させてくれるように、彼らを説得したのです。これ以外にも、数えきれないほどの人たちがGoに関する話をするのをサポートしてきました。その多くはGo.devにあります。
InfoQ: Goは13歳になりました。ティーンエイジャーの年代ですが、それについてはどう思いますか?ユーザの生活を楽にしてくれるような、信頼できる存在になったでしょうか、それとも、反抗的で不機嫌な、親の手を煩わせるタイプなのでしょうか?
Francia: ユーザとして見れば、申し分ない若者だと思いますね。モジュールへの移行は極めてスムーズに実現できました。非常に安定していて、パフォーマンスも変わらず良好です。ツーリングも日増しによいものになっています。Go.devは、すべてのコミュニティの提供するエンドユーザ向けリファレンスやチュートリアル、ドキュメント、ライブラリなどを一か所に集めた、素晴らしいワンストップリソースになりました。肩入れが過ぎるかも知れませんが、Goチームに参加するずっと前からのユーザとして、Goの現状や今後にはとても満足しています。
InfoQ: Go開発のツールボックスとしては、何を推奨しますか?
Francia: Goの優れた点のひとつは、今いる場所で使用できることです。開発方法はMac、Linux、Windowsすべでにおいてほぼ同一ですし、クロスコンパイル機能が、開発対象とするアーキテクチャやOSの違いを些細な問題にしてくれます。gopls言語サーバを導入すれば、すべてのエディタやIDEでGo記述の素晴らしいエクスペリエンスが実現します。Goディストリビューションの一部として提供されるツーリングには、開発者が言語を使い始めるのに必要なすべてのものが含まれています。
私は3つのOSに開発時間を使い分けていますが、おもにVSCodiumあるいはVimを使ってWindows上で開発しています。Cobraのツールやライブラリもよく使っていますが、最近の個人的な利用は、タスクの自動化や合理化のための小さなCLIアプリの開発が中心で、それにはぴったりなのです。
InfoQ: Goをスクラッチから始める場合、学習曲線はどのようなものになるのでしょうか?初学者に対しては、どのようなことを推奨しますか?
Francia: 先にも述べたように、Goの最大の強みのひとつは、その取っ付きやすさにあります。驚く人も多いのですが、間違いなく事実なのです -- その全体仕様を読んで理解するのには、半日あれば十分です。Goは1度の週末で学べますし、2週間あればプログラミングに習熟することができます。もっと早い人もいるでしょう。他のいくつかの言語で経験があれば、Goは非常に短期間に習得できます。
Goを導入した企業と会った時に、彼らが一貫して話してくれることのひとつが、Goは習得の容易な言語だ、という点なのです。
InfoQ: Goの初心者に必要な条件は何ですか?
Francia: 正直に言えば、時間と興味だけです。Goはすべての人のものなのです。go.devには、コミュニティ中から集められた優れた入門用のリソースがいくつもあります。
InfoQ: Goの進化は、あなたたち自身を含むすべての人々を驚かせましたが、次の10年はどのようなものになるのでしょうか?
Francia: コンピュータ言語の歴史を見渡してみると、メインストリーム言語の大半は15~20年の間に進歩を遂げています。これはJava、Python、Ruby、JavaScript、その他多くの言語に当てはまることです。誕生してから13年の間に、Goは素晴らしい基礎を築き上げて、メインストリーム言語のひとつになりました。パフォーマンスと開発者生産性を高いレベルで両立させることによって、Goは際立った存在になっています。
今後10年間については、クラウドコンピューティングへの大規模なシフトが加速し続けることになるでしょう。企業は市場投入時間の短縮、運用コストの削減、セキュリティの向上を求めています。このマイグレーションの最初のフェーズは、既存ワークロードのクラウドへの移行が中心になるものと思われます。ここでのGoは、"レガシ(legacy)"ワークロードをクラウド上で動作可能にするためのAPIを提供をすることで、重要なサポートの役割を担うことになります。さらに重要な第2フェーズでは、独自のクラウドサービスのメリットを活用するための業界レベルの移行により、クラウドネイティブなアプリケーション開発へのシフトがますます進むことでしょう。これらのケースにおいて、Goが選択されることは明確です。
実際に、すべてのクラウドプロバイダが、重要なインフラストラクチャをGoで記述しているのです。最新技術を目指す企業が、りセキュアで安全な言語、10年以上にわたって世界最大規模の企業の重要なワークロードで鍛え上げられてきた言語、開発コストの削減と運用コストの大幅な削減を可能にする言語を選ばないはずがありません。つまり、Goはクラウド開発の代名詞となり、クラウド開発は業界における圧倒的最大規模のセグメントへと成長するでしょう。
InfoQ: 他に何か、お聞きすべきことはありますでしょうか?
Francia: 言語について語る時、そのコミュニティに触れずにおくことはできません。極めて現実的な感覚として、Goが存在するのは世界中で何百万人という人たちが、Goを使ってプログラムを書いているからなのです。Goコミュニティは強力で、快適で、多様性に富んでいます。今年、すべての人たちがそうであったように、Goコミュニティは適応を迫られ、そして適応しました。世界中のGopherたちが集結して、お互いを助け合ったのです。30の(仮想)カンファレンスが開催されました。数百のミートアップ(大半はネット上)が行われて、/r/golangとGopher slackの参加者は大きく増加しました。新たなGopherを支援するために、play-with-go.devとmentoring.gobridge.orgという、コミュニティ主導の注目すべきプログラムが2つ、新たにローンチされました。
Goの活気にあふれたエコシステムに貢献し、Goの明るい未来を一緒に待ち望んでくれている、世界中のGopherたちに感謝したいと思います。
インタビュー回答者について
25年以上の間、Steve Francia氏は、最も革新的かつ成功を収めたテクノロジや企業を作り上げてきました。それらは現在、クラウドコンピューティングの礎として、世界中の企業や開発者によって支持されています。現在はGoogleで、Goプログラミング言語のプロダクトおよびストラテジリーダの職にあります。それまではDocker、MongoDB、Drupal Associationの役員やディレクタとして、エンジニアリング、プロダクト、開発者とのリレーション、オペレーション、オープンソースを指揮してきました。氏はHugo、Cobra、Viper、spf13-vim、その他多数のオープンソースプロジェクトの作者であり、世界最大級のオープンソースプロジェクトの5つをリードするという、比類のない名誉を得ています。著作者であり、講演者であり、開発者であり、メンタであり、そして何よりも、4人の子を持つ父親であります。テクノロジ以外では、写真や旅行、スケートボード、パンクロック、ディストピア映画が好みです。