Go Conference 2024参加レポ
はじめに
先日、オフラインで開催された Go Conference 2024 に参加してきました。
Go Conference で登壇デビューできた感想と、リアタイできた発表のレポートをしていきます。
発表レポ(というか感想)は、リアタイできた発表をご参照ください。(しばらくポエムになります)
発表緊張した…
当日の発表スライドはこちらです
https://gocon.jp/2024/sessions/21/
まずは、発表のためにフィードバックをいただいた皆さんほんとにありがとうございました!!
また、激励してくれた同僚&元同僚にもほんとに感謝です 🙏
どうしても発表は緊張するものなのですが、スライドはみんなに見てもらって恥ずかしくないものを持ってきた、というのが心の支えになりました。
おかげで、当日は気持ちよく発表することができました。
会場からの反応もいただくことができて、発表後のエゴサが止まりませんでした笑
こちらもありがとうございます👋
足向けて寝られないぐらいお世話になってる oapi-codegen#gocon
— RADISH (@ruby_engineer) June 8, 2024
oapi-codegenの生成コードを使うと、endpointごとに個別のミドルウェアを差し込めない課題がある。
— 鹿 (@mizushika1) June 8, 2024
わかる!そうだよそこだよ!
#gocon
oapi-codegenメインで使ってるから助かる#gocon
— パンダム/rymiyamoto (@rymiyamoto129) June 8, 2024
ちょうど oapi-codegen で chi のサーバーボイラープレートを試してたけど、パスごとのカスタムミドルウェア周り課題あるなあというのを思ってた #gocon
— なかりょー / giftee エンジニア (@nakaryo79) June 8, 2024
同じような面白実装作っていた(パスベースではなくリクエストベース)https://t.co/i6QKnMimh2#gocon
— k1LoW (@k1LoW) June 8, 2024
oapi-codegenもechoも今使ってる!
— YagiGnu/やぎぬ😇技術顧問 (@yagi_eng) June 8, 2024
気が合いそうだ
フロントでもバックエンドでもスキーマ駆動すると、OpenAPIが神様になるので良い#gocon
#gocon OpenAPI仕様からGoコードを生成するが、エンドポイントごとにミドルウェアを設定したいときにそのままではできないという問題をクリアしたい
— のびしー (@shino_nobishii) June 8, 2024
ServeMuxから流れるような流れw#gocon
— mekka (@melpo_mel) June 8, 2024
このミドルウェア挿入の話は上手く使うと便利そう。 #gocon
— チェシャ猫 (@y_taka_23) June 8, 2024
発表までの経緯
登壇のモチベーションとしては、対外的なプレゼンへの興味と、今回の発表内容に関する問題についてみんなどうやってるんだろと思ったからでした
CfP については 1on1 でもコツを相談していて、採択者に刺さりそう、みんな知りたいはず、という観点で書くといいよとアドバイスをもらっていたので、それに沿って作成しました。
発表されたときはほんとに嬉しかったです。
わーい✨たのしみにしてます pic.twitter.com/omTFSHPMaW
— reo (@_uhzz_) April 4, 2024
それから、ゴールデンウィークに v0.1 となるスライドを作り、
スライド作り終えた...
— reo (@_uhzz_) May 9, 2024
のびしーさんが開催してくれた発表練習会でフィードバックをもらったりしました。
#gocon 参加記...と見せかけて参加より前に行った発表練習会の振り返りです。参加記は別で書くはず...!https://t.co/WCAQUu6Bhv
— のびしー (@shino_nobishii) June 10, 2024
この会でのフィードバックをもとに、v1.0 となるスライドを引っ提げて、社内でも発表練習会を開催しました。
社内の練習会では、自分でも引くほどグダってしまったのですが、それを踏まえた内容のレビューに加え、原稿作っていくといいかもなど、様々なアドバイスをしてくれました。
なにより、20 - 30 人ほどのエンジニアがオンライン+オフラインで集まってくれたのはほんとに感動しました(足を向けて寝られません)
そんなこんながあり、さらなるフィードバックを盛り込んで v2.0 としたスライドが当日使ったものになります。
オフラインで参加してみて
オフラインでの参加は初めてで、とにかく緊張の一日になると腹を括っていたのですが、受付け後すぐ元同僚の @k_omotani さんと @ShuheiTakeuchi さんにばったり会ってお話することができ、緊張が解けました
@k_omotani さんと @ShuheiTakeuchi さんに会えてちょっと緊張ほぐれた#gocon
— reo (@_uhzz_) June 8, 2024
その後はほんとに緊張することなく、LT の時間まで安心して発表を見れました。(リラックスのせいか、Post うるさくなってたかもです)
途中、各社ブースにも遊びに行って、ノベルティをいただいたりゲームしたり楽しみました
My Go package Guessr score is 769!
— reo (@_uhzz_) June 8, 2024
✅: gin-gonic/gin
✅: go-gorm/gorm
✅: google/uuid
✅: golangci/golangci-lint
🥺: go-sql-driver/mysql
✅: golang/go
✅: kubernetes/kubernetes
✅: redis/go-redis
#gocon #GoModuleGuessr #OPTiM
コード片を見て、どの Go プロジェクトか当てるゲーム
スコアは置いといて、go-sql-driver/mysql
まで当てたかったです笑
運営の方、優しく合いの手入れてくれてありがとうございました👍
また、懇親会では @convto さんとも久々にお話できて楽しかったです。
今回のもう1つの収穫は、Conference のテーマでもある「一期一会」のとおり、初めましての方とたくさんお話する機会ができたことでした!
お話できなかった方もいたのですが、X で反応してくれたりして、次会うときは挨拶できそう、という気持ちになれたのが大きいです
リアタイできた発表
イテレータによって Go はどう変わるのか
https://audience.ahaslides.com/cl965inb88/review?lookback-tab=slides
イテレータは、Go1.23 でリリース予定とのこと
個人的には、シーケンシャルアクセスを言語側が提供してくれる、だけの理解だったのが、この発表のサンプルコードを見てて、早く試したい!という気持ちになりました。
(*sql.Rows).Scan
の予想サンプルは、とくに刺さってこう書けたら気持ちいいだろうなという感想をもちました。
ループするたびに、イテレータがオブジェクトを返してくれる例
seq := sql.RowsAll[*User](*db.QueryContext(ctx, `SELECT * FROM users LIMIT 100`))
for user, err := range seq {
if err != nil {
return err
}
fmt.Println(user)
}
Dive into gomock / Go Conference 2024
gomock は普段の開発でも使っているものの、まだまだ知らないメソッドや機能があることを知ることができた。
reflect mode は他ライブラリの interface からも対象にできるみたい。
組み込み関数の Cond(fn func(x any)bool)
は任意の条件を渡せるらしくて、黒魔術みを感じることができた。
隠蔽された実装は限りなく魔法に近い
いざというときに実装が読めないと、手が出なくなる
普段からライブラリの実装を読んでおく
いい話
Cleanup handling in Go / Go Conference 2024
各方面のクリーンアップ関数の比較をしてくださっていて、改めて defer
って賢いんだなと思った。
個人的にも、登録された関数が実行完了するまでは待ってくれ〜いうのが優先度高い自覚がある。
また、発表内で提案されていたパッケージをまたいだクリーンアップのアプローチは面白いな〜と聞いていた。
私の発表にも通ずる(と勝手に自負していますが)ところもあるからか、context.Context
の Tips は聞いて楽しいです。
Go に const 型修飾を期待しなくてよい理由
発表練習会でもご一緒して聞いていたのですが、const 修飾子の前知識がなくてもわかりやすく説明しててすごいなと思いました。
const 修飾を導入できても安全性は限定的になってしまう。
対して、Go はその安全性をプログラマの責務とする代わりに、セマンティクスがわかりやすく、データ競合は Race Detector でカバーするという整理がされている。
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
gob に関しては転送効率が良い、という浅い知識しかなかったので、この発表はさらに踏み込んだ内容で面白かったです。
バイナリを読むパートに、0 と 1 のスライドを見ていて、眼力で item
と読めますね、とスラスラ発表が進んでいくので、ふむふむと受け入れつつある自分に気づきました(?)
と、バイナリリーディングを経てみると、gob が型定義を最初に送って、あとは値となるデータを送るから、JSON よりも安く転送できる(ただし単体は JSON のが安い)というのが心で理解できました。
個人的に、gob に関しては用途に合わせてつかってね、絶対使えってことではないよ、という趣旨で発表されていたのがいいなと思いました。
試してわかる Go Modules と Minimal Version Selection
https://docs.google.com/presentation/d/1X5dXShWTmjhQbXH7vXHnTLJ5Tca7QhU4Pq1YugGiIHs/edit#slide=id.p
デモと一緒に見ることで、Go Modules がどういう動作をするかについてこれも心で理解できた気がしました。
MVSは最小のバージョンを指定するけど、依存しなくなったらダウングレードはしない、わかりよい#gocon
— reo (@_uhzz_) June 8, 2024
go.sumが雰囲気ロックファイルだと思ってた人ー🖐️ #gocon #gocon2
— k1LoW (@k1LoW) June 8, 2024
MVS について、どこかで調べたことがあったので半信半疑だったが、雰囲気ロックファイルじゃねと思ってた自分がいることを自覚しました笑
スライドだけでなく、デモを挟むと実体験できる発表いいなと思いました。(いつかやってみたい)
まとめ
オフラインいいなと思える機会でした。
もちろん、Goの濃縮されたキャッチアップの機会でもありますが、発表を通して会場と知識を共有している感じが、オフラインのいいところだなんだなと認識しました。
改めて、運営メンバーのみなさんありがとうございました 🙏
来年の Go Conference も楽しみにしてます 👋
備考
表紙イラスト:Loose Drawing