GoConference 2019 Autumn に参加してきたので学んだことをまとめました

はじめに

先日Go Conference 2019 Autumnに参加してきました。また、Goは半年前程から使い始めたので、Goのカンファレンスに参加したのは初めてでした。

セッションはテスト、エラーハンドリング、機械学習、ライブラリなどからエミュレータコンパイラなどの幅広いトピックがありました。 日本語のセッションだけでなく、英語のセッションも少数ありました。

本記事では自分が聴講したセッションのいくつかをまとめています。

API scenario testing tool with plugin package by Kenta Mori

GUIでのE2Eテストを楽にするためのツールを作成した話でした。
E2Eテストのペインを複雑性、再利用性、拡張性などの観点から解決しているのは印象的でした。 後半はLanguage serverで補完機能を実装するという内容ででなかなか骨が折れそうな話でした。

なぜ作ったのか

  • PostmanでE2Eテストをすると色々不便な点がある
    • GUIでないと使えないため、好みのエディタが使えない
    • E2Eテストのシナリオ定義のJSONファイルが複雑になってしまう
    • gRPCが直接使えないため、マイクロサービスのE2Eテストが面倒

E2Eテストツールの内容

  • JSONの複雑さに対処する
    • シナリオ定義にYAMLを利用し、JSONより人間が読み書きしやすいようになっている
  • YAML以外でも機能を拡張できるようにする
    • Goの標準パッケージのpluginを利用して、YAML内からpluginを呼び出すことで機能の拡張を実現している
  • すでに作成したシナリオを再利用する
    • シナリオを組み込めるようになっており、変数として結果の値を保持できるため、他のステップで任意のシナリオの出力値を利用することができる

docs.google.com

Accelerate Go development with Bazel by micnncim

GoでBazelというGoogleのビルドツールを試した話でした。
一部の会社ではBazelを採用していますが、go buildに戻した会社もあるということで、ユースケースで慎重に検討することを強調していました。なんのツールや仕組みでも銀の弾丸ではないので、ちゃんと考えて使いましょう。

Goのビルドのペイン

  • マイクロサービスをMonorepoで運用する場合、数百のサービスを一度にビルドする必要がある
  • KubernetesやIstioとかの巨大なコードベースの場合go buildではビルド時間が長い

Bazelによって解決される事柄

  • Go, Docker, protobufなどの複数のビルドをBazelでまとめてビルドできる
  • サンドボックス環境でビルドを行うため、ビルドの再現性が高い
    • 各人の開発環境や本番環境などの環境に依存しない
  • ツールが豊富
    • rules_xxx
      • GoやDockerなどのBazelルールがあり、利用することでビルドが可能になる
    • Gazelle
      • Goのファイルの依存関係をみて、自動でビルドの設定を生成してくれる
    • .bazelrc
      • Bazelのオプションを記述でき手間が省ける
    • Bazelisk
      • Bazelのバージョン管理

個人的に参考になった記事

Goで"超高速"な経路探索エンジンをつくる by imoty

最短経路を求めるにあたって、地図のデータ化、ダイクストラ法などの基本的なところを中心に説明していました。
高速化をするためにGoのsliceやmapの実装構造から説明されており、Goビギナーの方でも理解しやすい内容だと思いました。

ベンチマークするとき

  • pprofとbenchmarkオプションを使う

Sliceによる高速化

  • sliceの基礎
    • arrayは固定長、sliceは可変長でサイズを実行の途中で変更できる
    • sliceは内部にarrayのポインタを持っている
      • arrayのcapacityを超える場合、新しいarrayをアロケートし、コピーと切り替えを行う
  • 高速化のポイント
    • lengthやcapacityを指定してsliceを作成する
      • メモリアロケートには時間がかかるため、予め必要なメモリ(capacity)を確保する

Mapによる高速化

  • mapの基礎
    • Goにおけるmapはハッシュテーブルとなっている
    • 内部ではBucketと呼ばれる配列があり、そこにキーと値のペアを保存している
  • 高速化のポイント
    • capacity hintを指定してmapの拡張を抑える
    • ユースケースによってはsliceで代用することも考える

Mapの仕組みに関する記事

まとめ

GoConferenceでの個人的な学びをまとめると以下になります。

  • Scenarigo使ってE2Eテストを楽に書く
  • Bazelのビルドを試す
  • SliceとMapのメモリ管理をする
  • パフォーマンス計測する

Goを使い始めて間もないので、こういうカンファレンスに参加して基本的なことでも知らなかったことを知れることができたので良かったです。色々なコミュニティが活発になればエンジニア同士の交流も増え、知識の共有が組織間で行われるようになるため良いなと感じました!