アンドパッドには Ruby/Rails のプロダクトが沢山ありますが、 ... アンドパッドは Go のプロダクトも沢山あります !
そこで今回はアンドパッドの Go の技術顧問である tenntenn さんをお迎えし、アンドパッドの Gopher 、 小島 夏海 と tomtwinkle の二人と "アンドパッドの Go" について対談しました。 アンドパッドは Go をどう使っているか、 Gopher の雰囲気、 Go の社内勉強会 "Gopher 会" など成長できる環境を紹介しています。
Gopher だけでなく、 Go 未経験だけど Go に興味があるという方も、ぜひご覧ください !
小島 夏海 @replu5
社内開発者向けの分散 DB 基盤の運用・ライブコマースサービスの開発・ toB 向けサービスの開発を経て、 2021 年にアンドパッドに入社。 現在はバックエンドエンジニアとして、マイクロサービスの基盤開発に従事。 Go Conference 2024 / 2023 、 Go Conference mini 2023 Winter IN KYOTO で登壇。 tomtwinkle (土屋 友樹) @tomtwinklestar
アンドパッドに 2021 年に入社。 ANDPAD ボードのバックエンドの設計開発を担当し、テックリードを務める。 Go, Python, Node.js たまにフロントエンドも書くが最近は専ら Go を書いている。 セキュリティとテストを書くのとリファクタリングと Middleware を書くのと山登りが大好物。 ANDPAD Tech Blog では ヒット作を連発 。 tenntenn
アンドパッドの技術顧問 (Go)。 バックエンドエンジニアとして日々 Go を書いている。Google Developer Expert (Go)。一般社団法人 Gophers Japan 代表。大学時代に Go に出会い、それ以来のめり込む。人類を Gopher にしたいと考え、 Go の普及に取り組んでいる。 複数社で Go に関する技術アドバイザーをしている。 マスコットの Gopher の絵を描くのも好き。 二人の Go 歴 tenntenn : まずはお二人の Go 歴 ( Go に出会うまでと、 Go に出会ってからの開発歴) から聞かせてください。
小島 : 新卒で入社後、 Cassandra の運用をしているチームに所属してました。 Cassandra は Java で書かれていて、 GC がボトルネックになることが多く、 隣の Go を使っていたチームから「 Cassandra を Go で書くと GC がネックにならないんじゃないの」と冗談混じりに言われたことがありました。 そこから Go に興味を持ち、ちょっとしたツールを Go で書いたりしていました。 その後運用ではなく、どうせなら本格的に Go を書きたいと思い、 2 社目ではじめて Go で Web 開発をするようになり、その後アンドパッドに来たという感じです。
tomtwinkle : 前職では Python / Django で WebAPI を書いていたのですが、もう一つプロダクトをマイクロサービスで作ることになりました。 そこでバックエンドをどうするかという話で「流行っていて知見も溜まっているから Go でやるか」となって、それから Go を使うようになりました。
tenntenn : お二人とも何年ぐらいから Go を始めたのでしょうか ?
tomtwinkle : 2019 年ぐらいですね。
小島 : 2017 年ぐらいに少し触って、本格的に使い始めたのが 2018 年ぐらいですね。
tenntenn : そのころだと、恐らくメルカリさんとか DeNA さんとかが使い始めて少したったころですね。 小島さんの場合は Go を使ってどんな開発から始めました?
小島 : 2 社目で本格的に使うまでは、オレオレ運用ツールをつくって、クロスコンパイルして踏み台サーバで使ってたような感じですね(笑)。
tenntenn : そんな人が多かったですね。 tomtwinkle さんはマイクロサービスという前提があったから Go の選択になったのですかね。 マイクロサービスでやろうとすると、当時はそんな選択肢が無かったような。
tomtwinkle : それもありつつ、前職では Kubernetes や Lambda を使っていたので、クロスコンパイルにより同じコードベースで Lambda にも転用できるところも評価しました。
tenntenn : なるほど。 やはり 2017 ~ 2019 年だと環境的にも Go が当たり前のように選択肢に入ってくるようになったということですね。 中堅以上のエンジニアはだいたいこれぐらいから始めることからが多い印象です。
(対談はオンラインで行われました)
アンドパッドの Go の使い方 tenntenn : アンドパッドは Ruby のイメージが強いのですが、 Go をどう使い分けていますか?
tomtwinkle : 新規のプロダクトは Go で作ることが最近多くなっていますね。
小島 : モノリスから分けようとしている流れもあり、マイクロサービスっぽく作っているものはだいたい Go で開発していますね。
tenntenn : それらは "リプレイスするなら Go で書こう" とか "パフォーマンスを上げよう" だとか、どういう目的で Go になっているのでしょうか?
tomtwinkle : 昔は EC2 で動かしたりしていたので Rails でもいいかとなっていたのですが、現状ではアンドパッドのベースプラットフォームが Kubernetes / EKS になったので、コンテナが前提の環境になりました。そうなると、Go ならパフォーマンスとコスト効率が良い、例えば AWS Graviton など Arm 向けにもクロスコンパイルが可能で、かつモジュール管理が楽というのが背景にあると思います。 また、アンドパッドには Go のテンプレートリポジトリが用意されているので、私もそれを使って、ある新機能プロダクトを 2 ヶ月で本番リリースできました。
tenntenn : それはすごい。そのテンプレートリポジトリを fork して手を入れていく感じですか?
tomtwinkle : ですね。 開発できたら terraform のパラメータを変えると、スグに本番公開までできます。 Ruby on Rails の場合、特化したデプロイツールが豊富にあることからプロセスが簡略化 → 高速化されていますが、アンドパッドでは Go の場合でもそれにも勝るとも劣らないスピードで開発出来る環境になっています。
小島 : あとは、 Go だと特に意識しないでもリソース効率がいい、というのも Go を選択している背景にありそうです。
tomtwinkle : そう、 Go はアップデートもしやすいですしね。 Ruby の依存ライブラリのアップデートで苦しんでいるチームも見かけるので、プロダクト開発に関わらないところのコストを高めないようにしよう、という認識もあるのでしょう。
tenntenn : なるほど、インフラの側面や開発効率のところから Go の採用が増えてきていると。 だとすると、私の周りでも見たのですが、エンジニアとして Ruby から Go へのコンバートは大変そうに見えます。 このあたりはいかがでしょうか?
tomtwinkle : チームによって状況は違いますが、私のチームでは最初からある程度 Go を書ける人がプロダクトを開発しています。
tenntenn : 過去に在籍していた企業では、結構な人数のエンジニアが Go を書く仕事にコンバートしたので、てっきりそうだと思ったのですが、違ったのですね。
小島 : Go を書ける人を ANDPAD Vietnam も含めて採用しています。 ANDPAD Vietnam には新卒のメンバーも多くいて、学業ではなく実務の Go をほぼ 0 から学びつつ業務を行っているメンバーもいます。
tenntenn : なるほど、 ANDPAD Vietnam では Go を書ける新卒がいるのですね。 一方で国内の中途採用だと Go を書ける人を採用しているのですか?
小島 : Go と Ruby で募集もわかれていますので基本的にはある程度かける人を採用してます。
(オンライン対談中の tomtwinkle 。 オフラインの写真はすべて hsbt が撮影)
アンドパッドの Go らしさ tenntenn : もう少し開発に突っ込んだ話をするのですが、アンドパッドには社内ライブラリが沢山ある印象を受けますが、どういうものがあるのですか?
tomtwinkle : チームによって全然変わってくるのですが、よくあるのはエラー周りですかね。
小島 : あとは UUID v7 が入って、今は使う必要がなくなりましたが、 ULID の生成器は共通で使っていましたね。
tenntenn : プロジェクトごとに違うという話を Gopher 会(tenntenn さんも参加するアンドパッドの Go の社内勉強会)でよく聞きますが、コーディング規約とか使い方、レビューのポイントなどは統一されているのでしょうか?
小島 : golangci-lint を使うところまでは一緒ですが、有効にしている linter はプロダクト・プロジェクトのフェーズによって各チームが決めています。
tenntenn : では、ノウハウなどは Gopher 会で共有しているということですね。
tomtwinkle : ですね。 あとは Effective Go などの Go のドキュメントを参照しようね、ぐらいですね。
tenntenn : なるほど、プロジェクトをまたいだ決まったオンボーディングのようなものがあるという訳ではないのですね。
tomtwinkle : 一応、私のチームでは新卒を受け入れていますが、レビューで「こういう風に書くといいよ」などポイントを言っていたり、ペアプロしたり、という感じですね。
tenntenn : お二人は社外の勉強会やイベントにも参加されていますが、社外と比べてアンドパッドの Gopher や取り巻く環境で特徴的だなと思うところはありますか?
小島 : タイミング的なものですが、アンドパッドの Gopher は現状ではジュニアがほとんどいないので、 Go に限らずソフトウェア開発の勘所をわかっているというのが一つ目の特徴ですね。
もう一つは Gopher 会があるので、そこでだいたいみんなキャッチアップできていて、雑に投げても伝わるという状態です。 みんなが自然とアンテナを高く張っている、という印象です。
tomtwinkle : Gopher 会の存在は大きくて、次のバージョンで何が出るかとか、次の次のバージョンぐらいまでだいたいキャッチアップできています。 Gopher 会で tenntenn さんと話している恩恵ですね。
小島 : Go は年 2 回のリリースがあり、そこで新しい機能・変更が入るので、キャッチアップするのをサボると、知らないうちに定番の書き方が変わっているということになったり、年 1 回の GopherCon でキャッチアップするということになったりするかと思います。 アンドパッドではそういうことがないですね。
tenntenn : だいたい先回りしていますものね。 会に参加していて思うのが、アンドパッドの Gopher たちは自分が困っていることを、ほどよい例とかコードとかを作って、画面共有して説明してくれる人が多いですね。 課題を説明することは意外に難しいですが、アンドパッドメンバーは得意な人が多そうです。そこはアンドパッドのいい特徴です。
アンドパッドの Gopher 会は Go への proposal を追っかけている tenntenn : では、改めてというか、参加している私が聞くのも何ですが、アンドパッドの Gopher 会は何をやっているのか教えてください。
小島 : 現在は、基本 Go の proposal review meeting を追ってキャッチアップしています。 あとは最近だと、アンドパッドの中で起こった Go に関連する問題のうち、深掘りするのが大変なものを tenntenn さんに聞いたりしています。 たとえば、並行処理周りで実装が複雑な箇所について相談したり、という感じですね。
tomtwinkle : 技術顧問である tenntenn さんを上手く使う会というと、伝わるかも知れない(笑)。
tenntenn : アンドパッドは一番うまく使っている会社だと思います(笑)。 Gopher 会では歯ごたえのある話が多いですね。 この間の connect-go のバグらしきものも Gopher 会で 1 時間使ってようやく分かる、という感じのものでした。
(参考) 該当の Issue
あとはこの会で扱うのが、新機能ではなく、 "新機能の提案" なので、 Go に入るのに 1 ~ 2 年はかかります。 そんな代物を題材に継続開催できているのがすごいところですね。
小島 : この会のおかげで、カンファレンスやイベントで初めて知るということがありません。 それだけでなく、一度知っているという利点は大きくて、先日バッチ処理でイテレータを使ったのですが、「あのとき見たやつ」となって、スムーズに使えました。 こういう二周目の利点はいろいろなところに波及します。
tomtwinkle : 前回の会で出た //line
コメントなどなど、 Gopher 会で小ネタがいろいろ知れて便利ですね。 エラーのテストをいちいち行数を指定して書いてるけど変えられるな、など。
小島 : 昔は本体のライブラリとかもコードリーディングしていた時期がありましたよね。 もともと Go 本体は手を入れやすく、読むきっかけが得やすいのですが、そのコードリーディングでより抵抗がなくなりました。
tenntenn : たしかにやっていましたね。 あと、この会そのものを準備せずにできるので、参加コストが低いですよね。
tomtwinkle : "とりあえず参加する" がしやすいですね。
tenntenn : 一方で、初めて参加する人にはどうでしょうか?
tomtwinkle : いきなり proposal を眺めるところから入ると、ハードルが高いのかも。
小島 : でも、この前イテレータのハンズオンをやってもらいましたけど、あれは普段あまり参加していない人も参加していてよかったですね。 たまにそういうものを混ぜたり、初心者の人からも声が出れば色々やれそうかなと思います。
tenntenn : いきなりでもハンズオンはできるので、そういう声を挙げてもらうとよさそうです。 あとは参加コストが低いおかげで、初参加の人も podcast だと思って聴くという感じで始めるとよいですね。
小島 : 私も最初に参加したときは、 proposal review meeting のことも知らず、なんのこっちゃとなっていましたが、継続して参加するうちにわかってきました。
tenntenn : そう、 "なんのこっちゃ" から始めても、そのうち "Gopher 会で見たことある" になりますものね。
tomtwinkle : あとは深掘りしてもわからんとなりそうなものは飛ばして、好きなものを見る、というのもよい進行ですね。
小島 : そういうわからんこともあるので、 proposal を 1 人で見るというのはなかなかツラいのですが、みんなで見ると継続しやすいです。
(対談を終えてリラックスした小島)
アンドパッドにおける Go の伸びしろ tenntenn : アンドパッドの Gopher や Go の模様が伺えたところで、これからの話を聞きましょう。 まずはアンドパッドの Go における課題といったものはありますか?
tomtwinkle : コード生成はまだ手をつけられていないので、ここは伸びしろですね。
小島 : 確かにまだ時間をかけて出来ていなくて、やりたいところですね。
tenntenn : わかります。 ちなみに、アンドパッドは Go へのコントリビュートや OSS の公開についてはどうでしょうか?
tomtwinkle : go-utils という OSS を公開はしていますが、自分たちの業務で使うものだけなので、大規模なものではありません。 ただ、大きな規模の OSS を公開すると、自社で使う分には問題ないのに、他のところで起きたバグが出ると対応しないといけないので、それを fix する余裕はなさそうかなというのが現状です。
tenntenn : たしかに。 そこまでメンテできる余裕はなかなか難しいところですね。
tomtwinkle : アンドパッドそのものは OSS へのコントリビュートには積極的なので、そういう土台はあります。 プロダクトだけでなく OSS もやりたいよ、という方にはいい環境です。
tenntenn : OSS に対して積極的ですよ、とメッセージしているのはいいですね。 OSS とプロダクトで使う部分はハッキリ分かれているわけではないので、動きやすくなりそうです。 隙をみて業務後に OSS 開発をしないといけない会社も少なくないと思うので。
小島 : アンドパッドには Ruby や Rails のコミッタがいるので、 Go のコントリビュータも出てくるようにしたいですね。
tenntenn : いい話です。 あと課題というより伸びしろという点で、 Gopher 会をもとに新しい機能を広く深く知っている人が増えているので、それを活かせるといいですね。 国内のカンファレンスやイベントでの発表だけでなく、海外カンファレンスにプロポーザルを出すとか。
tomtwinkle : 会社として英語に力を入れているので、海外カンファレンスに登壇するというのは目標としてありかも知れません。
小島 : GopherCon に出るというのはよさそうですね。 個人としても行ってみたい。
tenntenn : ちょうどスピーカーが募集され始めたから、いいタイミングです。 GopherCon はいいですよ。 GopherCon には Contributor Summit という Contributor が集まる会議があって、それこそ Gopher 会で眺めた proposal を出しているような強い人ばかりがいるので、 Gopher 会の延長線で聴けて面白いですよ。
小島 : ANDPAD Vietnam には Go に強い人が多いので、そういった海外カンファレンスや社内勉強会やイベントに繋げられると、もっと伸びしろがありそうですね。
tenntenn : 日本国内だけでなく、ベトナムには日系企業が多いので、そういった企業の Gopher たちと一緒に何かするのも面白そうですね。
プロダクトにおける伸びしろ tenntenn : エンジニアからすると、プロダクトが成熟しすぎると、その環境を好まれにくいものですが、 ANDPAD の場合はチャレンジングなところはあるのでしょうか?
小島 : 沢山あります!
tenntenn : いいですね。 それは事業ドメインに起因するものですか?
tomtwinkle : アンドパッドの Go の使い方には二軸あり、小島がやっている、 "通知" のようなトラフィックの流量が半端ないところでの使い方と、私のような建築・建設業のドメイン知識を深く理解していないと作れないというプロダクトでの使い方です。
後者の場合はお客様との距離が近いです。基本は B to B なのですが、利用するのは職人さんたちが多く、ほぼ to C のような印象です。 それこそ一人親方と話す機会もあり、それをもとに開発すると、「今回のアップデート、めっちゃよかったよ」というような会話ができたりします。 建築・建設業全体をカバーする Vertical SaaS らしさでもあると思います。
tenntenn : 業界全体となると、ソフトウェアだけに収まらない事業もありますか?
小島 : ありますね。 LiDAR 点群から 3D マッピングとかするプロダクト「ANDPAD 3Dスキャン」や 「ANDPAD BIM」 などリアル世界のオブジェクトとソフトウェアを繋ぐプロダクトもあります。
tenntenn : 面白いですね。 リアルワールドが難しければ難しいほどモデリングが難しく、エンジニアにとっては楽しいですよね。
小島 : 楽しいですね。 先の一人親方もそうですが、一日だけくる職人さんのデータはどう扱うといいのかとか、特有で難しいですね。
tenntenn : たとえば、金融だと金額などは絶対間違えてはダメなので、毎日データ突合したりとか不正検知とか業界特有の処理がありますが、建築・建設業界固有の難しさには、どんなものがありますか?
小島 : わかりやすい例で言うと、職人さんによっては毎日同じ現場に行くのではなく、一日に何箇所も回る方もいます。 そこでわざわざアプリを見ずとも、今日の現場がわかるように毎朝 8 時にメール通知などをしているのですが、その流量がとてつもないです。 さらに、その通知を見て、職人さんが動くので、停められないし、遅延も出来ません。 それをクリティカルなバッチでやっていたりします。
tenntenn : おー、なるほど!
小島 : 朝早くにすると寝ていて、遅すぎると移動に間に合わないので、決まった時間に届けることが大事です。 つまり時間を分散させるのが難しいのです。
他には、まだ建造物がないので電波が届かない場所とか地図にない、もしくは曖昧だったりとか、そのあたりは建築・建築業界ならではですね。
tenntenn : 建てている最中ですものね。
tomtwinkle : なんなら住所もないです。 地番を入力して、 Google Map でピンを立てるケースもあります。
tenntenn : 難しいところですが、面白いところでもありますね。
tomtwinkle : 私が担当しているプロダクトはスモールビジネスでも利用されるプロダクトなのですが、もともとが Excel で作っていたようなものをリプレイスしたプロダクトなので、各社の使われ方がまったく違います。 それだけにカスタマイズ要望が多いのですが、個社対応すると、 SaaS ではなくなるので、ここもまた頭を使うポイントです。
tenntenn : それだとデータのインポートとかも大変そうですね。 紙ベースのものとかもあるでしょうし。
tomtwinkle : わりと大変ですね。 将来的には OCR で読み取り、 AI で分析などやらないといけないでしょうね。
tenntenn : そういう話を聞くと、やることはまだまだある感じですね。
小島 : 建築・建築業界で行われている業務全部が対象なので、金融業界と同じように、会計もあれば事業資金の調達とかも入ってきます。 入社して 3 年になりますけど、知らない機能もあります。 それぐらいドメインが広いというのが面白いところですね。
tenntenn : アンドパッドの伸びしろが掴めたところで、最後は応募者へのメッセージを伺いましょうか。
tomtwinkle : アンドパッドは Go を知っている人ばかりが多いと話したところですが、実は Go を使ってみたいという意欲と開発経験があれば、 Go を知らなくても OK です。 Java で経験 10 年といったキャリアの方でも大歓迎です。
小島 : そうなんですよね。 Go のいいところですが、一定レベルまで行くのはそれほど苦労しません。 Go で悩まない代わりに、愚直にマメに細かなところまでエラーチェックしたり、分散システム特有の難しさを考えるので、そこが好きだと、より楽しく活躍できそうです。
tenntenn : アーキテクチャとか分散システムとか考えられたりする人はマッチしそうということですね。
tomtwinkle : それはまさしく。 私もアーキテクチャが大好きです。
小島 : その上で Go が好きになれば、 Gopher 会で深掘りできます。
tenntenn : アンドパッドの Go のポジションに応募するには、何か一つでも強みがあるといいということですね。 いいメッセージです。
では、今日はありがとうございました !
小島・tomtwinkle : ありがとうございました !
アンドパッドの Go の技術顧問である tenntenn さんをお招きし、アンドパッドの小島、 tomtwinkle とともにアンドパッドの Go 状況について対談しました ! アンドパッドの中の Gopher の雰囲気や、 Go の使い方が伝わっているとうれしいです !
アンドパッドの Go 状況や伸びしろに興味を持たれたなら、ぜひカジュアル面談にお越しください。 Go はまだ未経験でも開発経験があれば大歓迎です !