Goを「教育」で伝える。メルペイエンジニア2人のプログラミング言語談義

Read this article in English

Goとは、Googleが開発しているプログラミング言語のこと。数ある言語のなかでもまだ歴史が浅く、シンプルな言語設計と文法のほか、標準ライブラリやツールが豊富で、並行処理できる特徴もあります。当初はメルカリのグループ会社であるソウゾウ設立時に取り入れられ、「メルカリ アッテ」や「カウル」での開発、フリマアプリ「メルカリ」内のバナーツールにも使用。さらに、最近ではマイクロサービスへの移行とともに、Goへの書き直しも進められています。

そんなGoを開発に用いるだけでなく、「教育」を通じて情報発信を行い続けているメンバーがいます。それが、メルペイエキスパートチームの上田拓也と、Backendチームの柴田芳樹です。

社内外問わずイベントや勉強会を主催し、その特徴や魅力を語る彼らがGoに心酔したきっかけは? また、Goを通じて見えてきたメルペイ開発組織の課題とは何か? 個人の好みが走り出す、メルペイエンジニアによるGo談義が始まります。

Goに触れたきっかけは「純粋な興味」

上田:私がGoを触り始めたのは大学時代なので、確か2010年ごろだったと思います。コンピュータシミュレーションを行う研究室でJavaで書いていたのですが、もっとごりごり動かしたくていろいろな言語を試しているときに、Goに出会ったんです。

柴田:ということは、Goのバージョンがまだ1になっていないころですね。当時は、コンパイラ(自動プログラミングに使うプログラムの一種)とリンカ(リンケージエディタ)が別々だった気がします。

上田:そうです! 今思い返すと懐かしい(笑)。柴田さんは、何がきっかけでGoを触り始めたんですか?

上田拓也(メルペイエキスパートチーム)

柴田:なぜか日付をはっきり覚えているのですが、あれは2010年8月のことでした。当時、一緒に仕事をしていた若手エンジニアと「新しい言語の勉強会をしよう!」と話したことがきっかけでしたね。そのころはまだ日本語で解説された本もなかったので「みんなでGoの本を書こう!」と盛り上がったんです。それから翻訳者として、Go関連の技術書づくりに関わることが増えていきました。

上田:当時のGoはまだ正式リリースする前だったので、言語仕様もFIXしていませんでしたよね。何と言うか、つくりながら走っている感じがあったと言うか。

柴田:そんな時代もありましたね。私は長い間、C++で組み込みシステムのプログラミングをしていましたが、Goは不思議な感じがしていました。バグみたいなプログラミングなのに、ローカル変数のアドレスをなぜか返せるようになっているという。今ではもう、ちょっとしたツールを書くときはだいたいGoを使っています。……そう言えば、そろそろ新バージョンであるGo1.13が出るころでしょうか?

柴田芳樹(メルペイBackendチーム)

上田:ベータ版は出たので、8月のリリースまで楽しみですね。

Goの最大の魅力は、シンプルさにあり

上田:Goのいいところは、コンパイルで大まかな状態を把握できることです。他の言語だと、タイポを見つけるために1日潰してしまうなんてよくありました。さんざん時間をかけて探した挙げ句、「ああ……ここの“s”が抜けていたのか」みたいな。Goではそういった不毛な時間がないので、とてもいいですね。もちろん、他の言語で書く際でもユニットテストをすればいいんですが、タイポについては見つけること自体がけっこう難しかったりします。あとはgofmt(Goにあるツールの1つ)の存在も、私のなかではとても大きいです。雑にコードを書いて保存しても、シュッと整形してくれるところがいい。

柴田:コピペした部分が崩れていても、保存するときれいに整えてくれるのはありがたいですよね。私の場合、Goの魅力はVimで開発できるところです。ほかの言語ではVimを使うよりIDE(統合開発環境)を使った方が効率がいいです。しかし、Goだとプラグインだけで開発できます。そういった利点もあり、私がリコーで勤務していたときに、スキャナーやプリンターのエンジンといったハードウェア制御を含むコントローラソフトウェアをGoで書き直すプロジェクトをやったことがあります。

上田:すごいですね!

柴田:それまであったコントローラソフトウェアのコードベースは、制約が大きかったのです。そこで、Goの勉強会を始めたメンバーが中心となり、すべてイチから書き、完全なテスト駆動開発を行いました。2年ほど費やしましたが、おかげで完成度の高いものができました。その開発では、Goで書いたコントローラソフトウェアとテストプログラムを一晩中動かしていました。テストを回してから退社し、翌朝止まっていたらその部分のコードを書いた人ではなく、テストを動作させていた開発PCを所有しているエンジニアが原因を調べる、といったこともやっていましたね。若手エンジニアはまだ経験が浅いため、2時間ほど調べてわからなければ、誰かに助けを求めるように伝えていました。

上田:それ、いいですね。そうなると若手エンジニアだけでなく、シニアなエンジニアもランダムで他の人が書いたコードを読まなければならない状況になります。メルペイでもコードレビューしていますが、そこまで踏み込んで見ているかというと、そうじゃないケースもあります。これ、メルペイでも取り入れていいやり方かもしれないです。

エンジニアとして、Goの教育を行い続ける本当の理由

柴田:ここらへんで、私たちがGoを広める活動をしていることにも触れておきたいところです。

上田:ですね!

柴田:先ほどお話ししたように、私がGoを触り始めたころは日本語で解説された本がなかったため、翻訳者として技術書づくりに関わるようになりました。上田さんは、社内外問わずGoの勉強会やイベントを主催していますよね。なぜ「教育」というかたちでGoを広める活動を?

上田:まず、Go自体がとても教えやすいプログラミング言語です。開発環境の導入も簡単ですし、雑に書いたコードも保存時にシュッと整形してくれます。Webアプリをつくるような講義でも、Goの開発環境を用意するだけで実施できるんです。そのため、私の講義ではコマンドラインツールやWebアプリなど、何かしらの開発をひと通りできるレベルまで教えています。

柴田:何か課題などを出しているんですか?

上田:最終課題では、自分で考えたものをアウトプットしてもらっています。例えば、「学校生活で困っていることを解決するツールをつくっていください」みたいな。やはり、自分がつくりたいと思うものをつくったほうが、身につきますし、覚えられるんです。

柴田:体系立てて講義するようにしているんですね。

上田:そうですね。これは、私が講義などを通じてGoを広める活動をしている理由の1つなのですが、ぶっちゃけて言うと、Goは本を読まなくても書けるようになります。しかし、場当たり的に覚えると、つまみ食い状態になってしまう。Goの場合、本にしか書かれていない仕様もたまにあったりするんです。それに、現場でGoを使っていたとしても、限られた範囲しか使わなかったりします。体系的に身につける機会を増やしたいという意図も、講義を続けている理由の1つです。

柴田:そうなんですよね。私は前職時代から翻訳と同時に、他企業でのGo研修を行っています。そこでは指定テキストを中心に研修を行っているのですが、成果発表会後にはみんなが口を揃えたように「初めて技術書を最後までちゃんと読みました」「いい経験になりました」と言っていて(笑)。

上田:(笑)。柴田さんはどういったGo研修を行っているんですか?

柴田:Go研修では受講者に指定テキストである『プログラミング言語Go』の予習範囲を事前に読み込んでもらい、疑問点は質問表に書き、練習問題の回答はすべてGitHubにアップしてもらいます。そして、講義では質問表をベースに回答し、練習問題を解いていく。そういったかたちで6ヶ月間、研修コースが続きます。これは現在も副業として、他企業で実施しています。

上田:けっこう長いんですね。

柴田:『プログラミング言語Go』は練習問題だけで130問以上あったりするので、なかなかハードかもしれません(笑)。そして、私がこの研修で受講者に達成してほしいのが、1冊のテキストを「読む」という経験です。Goはネットで検索すれば拾い読みができ、なんとなくプログラミングできます。だからこそ、バイブル本と呼ばれるものを一度でいいからひと通りすべて読んでほしい。さらに言うと、研修で実際に手を動かしながら学んでほしいんです。

上田:確かに、斜め読みする人のほうが多い印象です。Go関連の本は書かれている内容も少ないので、ぱっと読めるはずなんですが。

Goから見えてきた、メルペイ開発環境の課題

柴田:メルカリグループでもわりと早い段階からGoが使われていると聞いていますが、本格的に取り入れていったのはソウゾウがきっかけだったのですか? 

上田:そうですね。ソウゾウで「開発ではすべてGoを使います」と決めたあたりから、社内でもGoを採用する場面が一気に増えていった印象があります。爆発的に増えたのは、やはりメルペイができてからですね。

柴田:私自身、Goを用いたソフトウェア開発を行い、かつ、多くの若いソフトウェアエンジニアと一緒に働けるということでメルペイを選びました。そして今、メルペイBackendチームにいます。そこでは、Go Module(Goの新しいモジュール管理の仕組み)に切り替えるなどしていますが、それ以上に凝った使い方はしていません。

上田:そうなんです。先ほどお話ししたように、現場での開発を通じてGoを学ぼうと思っても、体系的に学べるわけではありません。あくまで日々の開発で必要な知識を必要なだけ身につければ十分だからです。またGoは新しい言語なので、体系的に学ぶ機会が少ないということもあると思います。

柴田:つまり、Goをバリバリと使いこなそうとなると、それなりに難易度がある課題を解かないといけないということですか?

上田:そうです。とはいえ、Goに関わるのであれば、みんなある程度はできるようになってほしい。しかし、ゴルーチン(Go内のキーワードを付けて関数呼び出す、軽量なスレッドに近いもの)を使うような場面は、日々の開発ではそこまでたくさん転がっているわけではありません。

柴田:ある程度Goを理解できるようになっても、難しいのがメモリモデルですね。GoだけでなくJavaもそうですが、メモリモデルの定義、そしてGoの代表的な機能の1つであるゴルーチンを読めるかどうか。だいたいの人はメモリモデルそのものがよくわかっていないので、これが非常に難解なんです。

上田:公式ドキュメントにメモリモデルの説明こそあれど、実際にデバックなどしなければ理解できませんよね。

柴田:ですね。ゴルーチンやチャネルなどの基本機能は、言語仕様に書かれていたりします。しかし、Goのメモリモデルに関しては、言語仕様とは別のところに書いてあったりするんです。普段の業務で触れるのはなかなか難しいように思います。

上田:このあたりは、Goを使う開発環境としてまだまだ根深い課題ですね。だからこそ、Goを体系的に学べる場として社内でも「Go Friday」のような勉強会や講義を積極的に行っています。嬉しいことに、Goの場合は言語仕様やFAQに書かれていることがほぼすべて。確実なドキュメントがしっかり残されているので、何かあれば公式サイトを見るようにと他のエンジニアにも伝えています。また、2013〜2014年あたりのブログ記事にもいいものがあったりします。

柴田:しっかり更新されているからこそ、逐一チェックすることが大事。メルペイもメルカリも、最低限どんなものなのかを読んでみて、学ぶことは引き続き伝えていきたいですね。ひょっとすると、メルペイエンジニアでFAQの定期購読会をやってもいいかもしれないですが(笑)。

上田:いいですね(笑)。Goの見解を深めてもらうための活動は、まだまだ終わりそうにありませんね。

上田拓也(Takuya Ueda)

大学時代にGoに出会い、それ以来のめり込む。メルペイのエキスパートチームに所属。Backendエンジニアとして日々Goを書いている。Google Developer Expert(Go)。社内外で自ら勉強会を開催し、Goの普及に取り組んでいる。Go Conference主催者。golang.tokyo、Goビギナーズ、GCPUG Tokyo運営。マスコットのGopherの絵を描くのも好き。人類をGopherにしたいと考えている。

柴田芳樹 (Yoshiki Shibata)

ソフトウェア開発に従事。2000年から私的な時間に技術書の翻訳を行っており、『プログラミング言語Go』(丸善出版)も担当していた。2000年以降、Java言語教育を行ってきており、Go言語教育も2016年から行っている。メルペイではBackendエンジニアとしてGoでソフトウェア開発を行っている。

関連記事 この記事もおすすめ!✨

メルカン情報は、こちらでも