メルカリ・ソウゾウでは、どのようにGoでソフトウェア開発をしているのか聞いてみた

ソウゾウは「メルカリアッテ」を含め、新規アプリをほとんどGoで開発している。一方、メルカリ本体も、サーバーサイドに積極的にGoで書いたプログラムを投入している。
両社がどのようにGoで開発を行っているのか、ソウゾウの上田拓也氏と、メルカリの久保達彦氏に、Goの現状とこれからについて語ってもらった。

既存のプログラムをGoで書き直したら……

──まずGoとの出会いやメルカリグループへの転職経緯を含めて、簡単に自己紹介をお願いします。

上田:今まで、サーバーサイドからWebフロントエンド、Unityでの開発など幅広く経験してきました。Goには学生時代から関心があって、勉強会に参加したり、自分で主催したりしていました。就職してからも社内外で勉強会の主催をしています。

2016年9月にソウゾウにジョインしたのですが、その理由のひとつはやはりGoで製品開発が行えるという点です。以前からソウゾウではGoによる新規アプリケーションの開発に力を入れているのは知っていました。

仕事で本格的に使う方が、個人では経験できない課題やチーム開発ならではの課題に直面します。そういった課題に直面することで、これまで以上に実践的な面でGoが学べるのではないかと考え、ソウゾウにジョインすることを決めました。

株式会社ソウゾウ エキスパートエンジニア 上田 拓也氏(@tenntenn

久保:私の場合、以前から自分が他の言語で実装したことのあるアルゴリズムをGoに移植して遊んだりしていました。

それをGitHubで公開していたら上田さんからプルリクエストが来たこともありましたね(笑)。大分前の話ですけど。

メルカリには2014年にジョインしました。ウノウ時代に一緒だった代表の山田(進太郎)に誘われたのがきっかけです。

株式会社メルカリ プリンシパルエンジニア 久保 達彦氏(@cubicdaiya

──Goに触れたのはいつ頃でしょうか?

上田:Goが世に出たのは2009年で、存在は知られていたものの知名度という意味では高くはなかった2010年か2011年頃、私が学生の時に初めて触れました。

大学の研究室であるシミュレーターを開発していたのですが、もう少しパフォーマンスが出ないかと考え、別の言語での書き直しを考えてました。

ちょうどそのときに、並行処理が得意なGoに出会いました。
取り組んでいたシミュレーションが並行処理と相性が良いものだったことと、新しいプログラミング言語を学ぶのが好きだったこともあり、勉強してみることにしました。

好きな言語という意味ではJavaの経験が長かったこともあり、静的型付けの言語が好きです。

同じく静的型付けのGoもコンパイルで多くのバグが発見できるので、一気に書いてあとはコンパルエラーを直していくという感じで開発しています。

使ってない変数があるとコンパイルエラーになったりするので、未然にバグが防げて助かっています。
 
久保:Goはリリースされた直後から触っていました。その後もたまに遊んでいたりしていたのですが、本格的に使い始めたのは2013年頃かな。その頃には本番でも使い始めていました。

8,568通り、あなたはどのタイプ?

シンプルだから使い勝手がいいし、実行速度も十分に速い。学習もしやすい

──あらためてGoの言語としての優れたところは何かをお話しください。

上田:Goの本体の言語仕様はすごくシンプル。言語にどんどん機能を足して成長していくというのではなく、むしろ「効率的な実装が可能か?」、「本当に必要か?」などを吟味しながら、導入する機能を選択してきた言語だと思います。

このシンプルさは初心者にとって入りやすいのではないでしょうか。学習しやすいという点は、チーム開発におけるアドバンテージの1つになりますから。

その一方で、シンプルだからといってやれることが少ないわけではないと思います。Goの機能はそれぞれが単位ベクトルのようになっていて、それぞれの機能が直交し、それらを組み合わせることで様々なことができるようになっています。

また、言語自体はシンプルな一方で周辺ツールは多機能で開発効率が上がるようによく整備されていると思います。例えばコードフォーマッター。

本体に付属するgofmtを使えば、誰が書いてもフォーマットを統一できます。人によって書き方がバラバラということが少ない。この特徴はチーム開発に向いていますね。

久保:運用者の観点からみると、Goは手元でビルドして、ビルドしたバイナリを配布するだけでデプロイができるので本番投入がサクッとできるという点は非常に良いですね。

単体性能も十分いいし、並行処理が簡単に書けます。また、ゴルーチンやチャネルをうまく利用することでマルチコアCPUの環境で容易にプログラムをスケールさせることができます。

上田:そうですね。Goがマルチコアを前提に開発されているということは、Go開発者たちの公式の見解でも表明されていますし、Goの得意な領域だと思います。

8,568通り、あなたはどのタイプ?

全ユーザー向けプッシュ配信で驚くべきパフォーマンス

──ソウゾウとメルカリでは、実際にどんな感じでGoが使われていますか。

久保:メルカリの場合、パフォーマンスが要求される箇所やバックエンドのミドルウェア、コマンドラインツールなんかはGoで書いていますね。

例えばスマートフォンへのプッシュ通知を行うためのミドルウェアなんかがそうです。

プッシュ通知処理って外部サーバとの通信を伴うのでネットワークのレイテンシが非常に大きくなるんですが、そのせいで短時間で大量にプッシュ通知を行うのが結構難しいんですよ。

メルカリだと数十分から1時間くらいの間に全ユーザに向けてプッシュ通知を行うことがありますが、これを効率良く実現するにはプログラムに高い並行性が要求されます。

そこでGoの出番というわけです。忙しい時だと1つのGoプロセスで数百個以上のゴルーチンが同時に起動していたりしますが、リソース的にはまだかなり余裕がありますね。

ちなみに、このミドルウェアはGitHubでオープソースとして公開されています。

 
上田:そういうメルカリでのプッシュ配信の実績があったので、ソウゾウで本格的にGoを使っていく話に繋がったんじゃないかと思います。

ソウゾウはもともと新規事業を戦略的に進める会社なので、よりフットワーク軽く、新しい技術を取り入れるという雰囲気があります。

Goだけじゃなくて、Swiftの導入にも積極的だし、インフラ担当のエンジニアがいなくて、バックグラウンドは全部Google Cloud Platform (GCP) を採用しているというのもそうした取り組みの表れです。

これはエンジニア採用のアピールにもつながっていて、「Goを使って開発したい」と応募動機に挙げてくれる人が増えているみたいです。

金曜日はGoの日。勉強会の継続が開発力の底上げにつながる

──ソウゾウやメルカリでは、Goエンジニアはどのぐらい育っていますか。

上田:やはり「Goで開発しています」と宣言するからには、全員のGoのレベルをあげる必要があります。ただ、ソウゾウも最初からGoに詳しい人がたくさんいたわけではありません。毎週金曜日に社内で「Go Friday」という勉強会を開いて、それを継続することで、エンジニアの開発力の底上げを図ってきました。

継続するということが大切だと思っているので、発表者の負担がかかる発表資料などは特別準備はせず、ソースコードを直接見ながら話すことが多いですね。

また、Goだけに限らず、開発に関する話ならなんでもします。たとえば、GCPや開発手法の話とか。エンジニアが集まればたとえ雑談ベースでも、なんらかの有益な話になりますから、Goから少し話題がずれてもそれはそれで構わないと思っています。

最近は、社外の著名なエンジニアをゲストとして呼んだりして、他社の事例からも学ぶようにしています。ちなみにソウゾウのiOSチームも我々APIチームの取り組みを真似て「Swift Wednesday」を開催していますね(笑)。

久保:メルカリでは最初は私だけでしたが、今ではGoを使ってソフトウェアを開発する人も増えてきています。新規の開発だとGoが第一候補に挙げられることも多いですね。

世界に広がるGoコミュニティ。日本でのイベントはいつも満杯

──いま、日本全体のGoエンジニアのマーケットはどんな感じで広がっているんでしょうか。

上田:確実に増えていると思いますよ。Go Conferenceなどの登壇者は3年以上の経験という人もいますが、多くの方が2年以下の経験のようです。

業務ではまだ使っていないけど、趣味的・自主的にGoを勉強している人は結構増えています。

久保:上田さんの活動がすそ野を広げるのに貢献していると思います。

上田:いや、それほどでは(笑)。Go Conferenceは2013年の第1回は登壇者の1人だったんですが、2回目からは主催者の1人として運営に関わっています。

参加者が多くて毎回定員をオーバーしているくらい人気です。Go Conferenceは定員数が1回あたりだいたい200人くらいですが、申込者は多いときで2倍以上になります。

運営の都合上なかなか規模は大きくできないのですが、各地で他にも初心者向けのハンズオンイベントや、golang.tokyoのような中~上級者向けのイベントが頻繁に開かれています。

golang.tokyoは、メルカリ、ソウゾウはもちろんのこと、日本のGoを製品開発に採用している企業が集まって各社のノウハウを共有する場として利用されています。

そういった点でGoの勢いをダイレクトに感じられるイベントになってきています。Goのコミュニティは世界的に見ても活発的です。

私もこの前、GopherCon Indiaというインドで行われた国際カンファレンスで登壇してきました。GopherConは欧米、アジア、南米ブラジルと開催地がどんどん増えていますね。

その中でも日本のGoコミュニティのレベルはかなり高いと思います。実際に海外のカンファレンスに参加して、「ああ、この講演内容は前に東京で聞いたことのある話だな」と思うこともたまにあります。

久保:Go Conferenceには何度か参加していますが、以前と比べると実際にGoを導入されている方がかなり増えてきているので、本番環境に投入するにあたって実際どんな工夫をしているのかという段階にまで関心が移っていると思います。

上田:開発効率や速度向上のためにどんなTIPSがあるのか、運用はどうしているのかと、より皆の関心が実際の日々の開発や運用にフォーカスしたものになっている感じですね。

Goによる開発の今後

──これからのGoはどうなっていって、メルカリやソウゾウでの導入はどう進んでいくと思いますか。

上田:Goはいくつも魅力のある言語なので、Goのエンジニアはこれから増えていくと思います。そのためには若いエンジニアがそれを学べる環境をもっと整える必要があります。

例えば、大学の講義で、従来のC言語に代わってGoの学習が進むとか。コンピュータサイエンスを知る場として、Goの標準パッケージはとてもいい教材になると思います。

久保:最近だと、利用している運用系のツールがGoで実装されていることも増えてきましたね。

上田:Goはクロスコンパイルが簡単にできるので、運用ツールを開発した場合、動かす環境を特別に用意することなく配布できます。こういう利点だけとっても、業務での実績も今後増えていくでしょうね。

ソウゾウのなかでGoエンジニアの開発力を上げ、それを事業にも反映させていくことが私のミッションでもあるので、そこに全力を注ぎたい。

私1人の開発力をアップするだけを考えるより、やはりチームのみんなの開発力がアップしたほうがチーム全体のパフォーマンスの向上につながると思います。

こういう環境で開発を続けていくことで、社内からも世界のGoコミュニティの中で活躍できる人がでてくるんじゃないかと思っています。

社内勉強会は今後も続けますが、私以外のエンジニアが社外で発表する機会も意識的に増やそうとしています。外で話すことは、自分の知識を整理するとてもいい機会になりますから。

こうした活動がまた社内のエンジニアを刺激しますし。好循環のループが生まれることを期待しています。

執筆:広重隆樹 撮影:設楽政浩

※本記事は「CodeIQ MAGAZINE」掲載の記事を転載しております。

PC_goodpoint_banner2

Pagetop