LoginSignup
20
12

More than 3 years have passed since last update.

Go: これまでとこれから - 2019 Edition -

Last updated at Posted at 2019-12-25

この投稿は CyberAgent Developers Advent Calendar 2019 24日目 兼 Go2 Advent Calendar 2019 25日目の記事です。

先日、社内限定で開催された カンファレンス で登壇した「Go: これまでとこれから - 2019 Edition -」のスクリプトから、confidential な内容を省いてお話しします。


slide 1.png

元々この発表をしようと思った理由は2つあります。

slide 3.png

1つ目は、現在CG R&Dチームにいらっしゃる山塚さんが以前ADC1で発表した内容から2年が経ち、その間にもGoに様々な変化が起きたため、アップデートが必要だと思ったから。

slide 4.png

2つ目に、Goが2009年の11月にリリースされてから先月でちょうど10周年と、今が発表するのにうってつけのタイミングだと思ったからです。

slide 5.png

今回お話しする内容についてですが、まずはじめに、Goが実際にどこでどれだけ利用されているのか見ていきます。

次に、Goエンジニアが最近まわりに増えてきているとみなさん肌で感じていると思いますし、事実ベースで紹介しますが、私が考えるGopher増加の理由をお話ししたいと思います。

そして最後に、これからGoに加わるであろう新機能の中から、私が特に注目している機能を紹介していきます。

slide 7.png

それでは社内のどんなサービスで Go の活用されているか見ていきましょう!

現在私が所属している AI事業本部 の極AIでは、フロントエンドと予測APIを繋ぐサーバサイドの開発で使っています。他にもAI事業本部の中では CheckBacks や CA Wise といったサービスで使われており、インターネット広告業界はScalaを使った開発が主流でしたが、Goも使われ出してきたのかなと感じています。

またゲーム事業部では主に Java や PHP でサーバサイドの開発が行われてきたのですが、最近では QualiArts の新規事業や、プログラミング学習サービス QUREO のサーバサイドやバッチ処理でも使われており、ゲーム業界でも使用事例を見かけるようになってきました。

メディア事業については、すでにいたるところで利用されており、ネット上でも様々な事例が紹介されているので、どのように使われているかはそちらに譲りたいと思います!(ぜひ調べてみてください!)

slide 8.png

国内に目を向けてみます。これは Go の公式 Wiki に載っている情報でほんの一例ですが、実に多くの会社で利用されていることがわかります。(この一覧に載っている企業以外で Go を利用しているところをご存知の方は追記してみてね)

slide 9.png

世界規模で見ると、日本でプログラミング教育やプログラミング塾が増え異分野からソフトウェアエンジニアになる人が増えているのと同様に、世界のソフトウェアエンジニア人口はここ2年で微増しています。しかし、それにもましてGoエンジニアの数は約2倍と、ムーアさんもびっくりするくらい急増しています。

slide 11.png

ここ数年で、なぜこれほどGoエンジニアが増えてきたのでしょうか?

例えば、他の主流な言語に比べ言語仕様が小さいためシンプルで誰でも読みやすいコードが書けたり、単一のソースコードで様々なプラットフォーム向けにバイナリをはけたり、並行処理を go キーワードで簡単に始められたりと、いろいろ理由は考えられると思います。

しかし、これら Go の利点は Go がリリースされた初期から現在に至るまで言われ続けていることで、ここ数年で Go エンジニアが増えてきた理由にはなりません。

slide 12.png

そこで私は、Go エンジニアが増えてきた理由として GC が改善されたからだと考えました。2

slide 13.png

GC とはみなさんご存知の通り Garbage Collection の略で、一般的にヒープで実現されたメモリの中から使用しなくなったオブジェクトをお掃除し、再利用できるようにする仕組みのことです。

slide 14.png

GCの処理過程は主に marking フェイズと sweeping フェイズの2種類で構成されています。marking フェイズはヒープをルートからリーフまで辿っていき、使用しているオブジェクトがどれか把握する処理を行い、sweeping フェイズでは marking フェイズで到達できなかった(=使われなくなった)オブジェクトを削除する処理を行います。

ここで勘の良い方は、「marking フェーズで探索し終わった領域にオブジェクトがアロケートされたり、参照が変更されたりすると、そのオブジェクトは使われているにもかかわらず sweeping フェーズで削除されるのではないのか」と思われるかも知れません。

slide 15.png

その問題を解決する方法として、Stop The World(STW) と呼ばれる処理を行います。

slide 16.png

やってることは非常に単純で、 marking&sweeping フェーズ中は外部からヒープに対するあらゆる操作を禁止します。

slide 17.png

しかし、この STW も万能ではなく、当たり前ですが marking&sweeping フェーズ中はメインの処理が完全にストップするため、レイテンシの増加に繋がります。この単純な GC の仕組みは go1.4 まで採用されていました。

slide 18.png

go1.5 からは GC の処理フェーズを3つに分ける Tri-Color GC と呼ばれるアルゴリズムの並行版が採用されました。3

slide 19.png

そんなこんなで新アルゴリズムが採用されてからは順調に GC のレイテンシが減少していきました。

slide 20.png

この図は2017年までのデータしか載ってないですが、最近のバージョン4でも着々と GC は改善されており、さらにレイテンシは縮小されているものと思われます。

slide 22.png

さて、最後にこれから Go に組み込まれる予定の機能の中から、私が最近注目している Contracts をご紹介します。

slide 23.png

みなさんは普段 Go を書いているときに「型が違うだけで何でほとんど同じ関数を書かないといけないの!」と一度は思ったことがあるでしょう。

slide 25.png

他の主流な言語では Genetics によりこの問題に対応しています。ただ、演算子のオーバーロードを実装しなければならない等、 Go の言語仕様を複雑にしてしまうため、導入するかどうかの議論自体はリリース初期から行われていますが、 Generics 自体の導入は見送られています。

slide 26.png

代わりに Go コミュニティでは Contracts という機能が提案されています。

slide 27.png

Contracts が導入されることで、今まで冗長に関数を書いていましたが、必要な型を列挙した contract を使うことでシンプルに記述することが可能になります。5


  1. このときは ADTech Developer Conference。資料は社内限定公開です。 

  2. こう断言しちゃうとマサカリが飛んできそうですね😅
    もちろん他にも、Goコミュニティの拡大や、公式によるパッケージ管理ツールサポートなども挙げられます。 

  3. Go の GC については こちら の記事が詳しいです。 

  4. 執筆時点っでの Go の最新バージョンは go1.13.5 (released 2019/12/04) です。 

  5. proposal なので今後仕様が変わるかも知れません。実際に、このカンファレンスの後日、日本の Go コミュニティでは proposal に書かれている Contracts の仕様に変更が加わるのではないかと議論が起きました。 ref. https://go-review.googlesource.com/c/go/+/187317 

20
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
12