はじめまして、DXビジネス開発部フィールドソリューションユニットの鈴木です。
7月2日(火)にオプティム東京本社でオプティムと 株式会社every の合同勉強会 OPTiM x every Golang Developer Night が開催されましたので、その内容をお届けします!
every さん視点の記事もありますのでぜひご覧ください。 tech.every.tv
はじめに

OPTiM x every Golang Developer Night ではオプティムと 株式会社every の開発者それぞれ2名が登壇し Golang を利用したプロジェクトでの成功事例や課題克服のエピソードを共有しました。Go と今話題のあの技術をコラボレーションさせてみたり、Go の便利なパッケージを活用して情報解析させてみたりと、みなさん Go 愛をたっぷり披露されていました。今回はオフライン限定でしたが、社外からの参加者21名を含む合計35名もの方がオプティムまでお越しくださり、会場はかつてない盛り上がりでした。
[LT1] Go x LLMで 新たなコード生成の可能性を探る (OPTiM 今枝)
最初は Go と LLM 利用してアプリコードを自動生成する取り組みの紹介がありました。まず、LLM が登場するまでのコード生成はあらかじめ決められたパターンのコードを生成する形式が主であり、プログラムが知らないパターンの生成はできないなど柔軟性に欠ける部分がありました。そこで不確実性が得意な LLM の登場により多様なコードを事前の準備なく生成でき、加えて生成後に人が注文を付け加えて修正してもらうなんてこともできるようになりました。しかしながら LLM のコード生成は既存に比べると時間とコストがかかるデメリットがあるため、今回は既存と LLM の両者を組み合わせて良いとこ取りを試みた生成方法が実装されました。実装にあたっては Go に標準で存在するテンプレート記法やツール gomplate、Go で書かれた LLM ツール plandex が利用され、品質の良い結果を比較的容易に出せることがわかりました。開発を効率化するために、活用しやすい言語やツールを絶えず追求していくことは重要ですね。
[LT2] Go言語で行うメール解析 (every きょー。)
次は Go を利用したメール解析の取り組みです。誰もが使ったことのある(はずの)メールですが、利用されているプロトコルや構成をちゃんと理解しているという人はエンジニアでも多くはないのかなと思います。メール本体は RFC2822 などで規定されたプロトコルで構成されており、そこでは文字コードや各要素の記述方法、終了文字などが細かく指定されていて可読性が高いとは言えません。そんなメールの解析ですが、なんと Go にはメール解析専用のパッケージ mail があります。このパッケージを利用すれば呪文のような文字列からヘッダやボディなど必要な情報を容易に抜き出し、文書分類からなりすまし対策まで応用可能となっています。これは例えばお客さんから送られてきたメールの転送や返信、要約など多くの機能に利用できますので、メールの管理に多大な時間が割かれて本来の業務が進まない...という方は業務効率化のためにぜひチェックしておきたいところですね。
[LT3] プロダクトでどれくらいMELTしてますか? (OPTiM 坂井)
次は異常検知に用いられるモニタリングとオブザーバビリティの要素 MELT (Metrics、Events、Logs、Traces) の観測を Go で実現してみるお話です。OPTiM AI Camera ではカメラ映像の推論結果をフレームという細かい単位で解析するため、想定通りの速度で実行されなかった場合に検出したい状態を見逃すなどクリティカルな問題に繋がります。そこで、システムが想定通り動いていることを MELT を通して観測するために JAEGER、OpenTelemetry などのツールを用いていますが、今回はこれらを Go と共に利用しアプリに計装する方法が説明されました。OpenTelemetry は Go を含む複数言語に対応しており、コードを変更することなく Go アプリに計装できる Go zero-code instrumentation などの興味深い機能があります。現在は作るだけでなく高い品質を維持することが大切な時代ですからこのようなノウハウは非常にありがたいですね。
[LT4] slices/maps pkgを活用してオレオレ実装を撲滅したい (every ayaka.yoshida)
最後は Go の新しいパッケージ slices、maps の紹介です。例えば、これまで map の key または value の一覧を欲しいときはループにより key-value を1つ1つ取得して一覧に格納していくという処理を自分で実装する必要がありましたが、maps パッケージの Keys() や Values() を用いることで簡潔な1行で取得することができるようになりました。これは明らかによく使いそうなメソッドですが、それだけでなく slice の中で最初に特定のオブジェクトが登場するインデックスを取得する Index() 等、かゆいところに手が届くラインナップとなっています。自分は早いけど自前実装だらけの C や C++ に苦しみながらも長らく親しんでいたので、それらに似ているという話なのに見やすく早く豊富なパッケージで簡潔になる Go の魅力をよく感じることができました。実際に運用しているコードで 10 行以上合ったコードが数行に縮むのは最高に気持ちいいですね。

全員の発表が終わったら質疑応答です。登壇者一同がラフに腰掛け、slido を利用して集めたたくさんの質問に対し回答していきました。個々の発表後も時間を取っていましたが、人が増えると「それはどういうことか?」「このほうがいいんじゃないか?」と次々に意見が上がって議論も深まりますね。
おわりに


勉強会の後は懇親会が行われ、Go のことを中心に日々の業務での経験や想いを思い思いに語り合いました(中には深夜まで白熱した方も...!?)。オプティム自慢のスマート米は大釜いっぱいに用意されたのですが、それでも足りず追加で炊かれたほど好評で感無量です。さらに会場には Go Conference 2024 でも披露した Go package guessr ができるスペースも設置され、少しでもスコアを上げようと Go 魂を燃やした勇士たちが競い合っていました。
このように良いイベントを開催することができたのもお越しいただいた参加者の皆様、協賛くださった 株式会社every の皆様のご協力のおかげです。オプティムが開催する勉強会は今後も Conpass で適宜告知していきますので、内容に興味がある方はもちろん、オプティムそのものに興味がある方もぜひご参加ください!オプティムのスタッフは皆様とお話できることを心よりお待ちしています。