レポート

サイバーエージェントのエンジニアが「Go」言語を語る ~「オレシカナイト Vol.2」イベントレポート

この記事を読むのに必要な時間:およそ 4 分

APIサーバー開発に役立つgoaとは何か

広告関連システムのサーバーサイドエンジニアで,最近golangを始めたという渋江一晃氏は,マイクロサービスのためのフレームワークgoaのご紹介と題して発表しました。

メディアディベロップメント事業本部(MDH)⁠ 渋江一晃氏

メディアディベロップメント事業本部(MDH) 渋江一晃氏

渋江氏は冒頭で「APIサーバーを作ることになったが,ルーティングやバリデーション,ドキュメントなど考えることが数多くあり,⁠ガワ⁠を作るだけでも大変」と話し始め,最終的にマイクロサービスのためのフレームワークである「goa」を採用したと説明しました。

その選定理由の1つとして,goaではデフォルトでswaggerの生成ができると渋江氏は話します。同様にgolangで使えるswaggerを生成可能なツールとしてはgo-swaggerもあり,goaの採用を決定する前に両者が比較されたようです。その上でgoaを選定した理由として「go-swaggerは日本語のドキュメントがあまりなかったこと。DSLが読みやすかったこと。そしてドキュメントもgo-swaggerと比較して多かったこと」を挙げました。

実際にgoaを使う際に参考になると感じたのは,エラーハンドリングについての説明です。渋江氏はgoaのエラーハンドリングにおいて,自動生成されるエラーではなくアプリ独自のエラーで返したいという要望があったことから,goaの中の人に問い合わせたところ解決策が返ってきたと言います。

「たとえばパラメータの型がおかしいといった際は決まったエラーメッセージが返ってくるので,そのエラーメッセージを奪い取り,特定のメッセージが含まれていたらオリジナルのエラーを返してあげる,そういったことを教えてもらいました」⁠渋江氏)

golangのコミュニティは確実に広まっていますが,一方で周辺ツールやそれについてのドキュメントが十分に整備されているとは言い難い状況です。そうした中で,渋江氏によるgoaの解説はとても参考になったようで,参加者の注目度も高いセッションでした。

golangを使うときはコインの裏側も知っておくべき

Goにおけるテスト可能な設計 Javaとの比較というタイトルで発表したのは,広告配信システムのバックエンド開発を担当する大澤翔吾氏です。今回のオレシカナイトの中でも特に示唆に富んだセッションであり,参加者も真剣に耳を傾けていました。

メディアディベロップメント事業本部(MDH)⁠ 大澤翔吾氏

メディアディベロップメント事業本部(MDH) 大澤翔吾氏

冒頭,大澤氏は結論として「golangはJavaのような既存の歴史ある言語と比較すると,テストという観点においては制約や守るべきルールも多い。なので『なんかGoってイケてるじゃん,採用しよう』とかってやってしまうと,ちょっと後で痛い目を見るかもしれないです」と語り,さらに次のように続けました。

「たとえばJavaは古くて冗長で生産性が低い,しかしgolangは新しいし簡潔だし生産性が高い,こういう印象を持っている人はいるのではないかなと思っています。でも,こういう印象はそれぞれの言語のコインの片側しか見ていないわけです。golangは新興の言語としては異常にシンプルで機能も少ない。特異な思想を実現するために,何を犠牲にしたのか。そのコインの裏側をみなさんに知ってほしい」とセッションの目的を説明しました。

そこで大澤氏が持ち出したのはユニットテスト(単体テスト)です。これを実施する際,重要になるのが依存性の分離で,上位のユニットをテストする際,依存しているユニットは本番のものを使うのではなく,テスト専用の実装,いわゆるモックに置き換えるなどして依存性を分離します。何らかのエラーが生じたとき,その原因がテスト対象にあるのか,それとも依存しているユニットにあるのかの見極めを容易にすることが依存性の分離の目的です。

これを実現するためには,多態性(ポリモーフィズム)⁠依存性の注入,そしてモック実装の自動生成が必要であると大澤氏は話しました。Java,そしてgolangでこれらを実現する仕組みについて言及し,両者の違いを次のようにまとめました。

「このような依存性の分離はオブジェクト指向の世界で培われてきたプラクティスであり,Javaのようなリッチな言語と同じ方法論をgolangでも適用すると,やはりどうしてもボロが出ます。golangは新しいんだけど機能的には古い言語で,Javaのように歴史もあって機能も豊富でといった言語と同じ方法でやろうとすると,やれることとやるべきではないことの間に隙間が生まれるんです。そのため,設計の制約を理解し,制約に沿ったプログラミングを実践しなければなりません」⁠大澤氏)

最後に大澤氏が述べたのは,こうした課題をエンジニア自身が理解し,それを乗り越えるための意思を持つことの重要性です。

「golangのよさは機能の少なさみたいなところがポイントで,ただコインの裏には言語機能による設計意図の強制が効かないことがあります。そのため,テスト可能な設計という方法論への理解と,それをちゃんと実践するという意思力がgolangを使う上では求められます」⁠大澤氏)


今回実施されたオレシカナイト Vol.2では,golangをテーマとしてさまざまな⁠落とし穴⁠が語られました。昨今では,こうしたトピックをまとめた記事がインターネットに公開されることも少なくありません。ただ,実際に経験した人たちが目の前で語っているのを聞いたり,直接プレゼンテーションを行ったエンジニアに質問したりすることで,より深く理解することできると改めて実感しました。

またgolangについて,興味は持っているが実際にプロジェクトで使った経験はないというエンジニアも多いでしょう。そうした人たちにとって,パフォーマンス面で躓いた経験を紹介した片田氏と,golangにおけるテストについて突っ込んだ解説をした大澤氏のセッションは大いに参考になったのではないでしょうか。

なおサイバーエージェントでは,こうしたエンジニア向けのイベントを今後も随時実施していくとのことなので,興味があるテーマがあればぜひ参加してみてはいかがでしょうか。

著者プロフィール

川添貴生(かわぞえたかお)

株式会社インサイトイメージ代表取締役。企業サイトおよびオウンドメディアの構築及び運用支援のほか,エンタープライズ領域を中心に執筆活動を行っている。

バックナンバー

2017年

バックナンバー一覧

コメント

コメントの記入