mercari.go #10 に参加して
久々になってしまいましたが、こちらの勉強会に参加してきました
以前からGoの勉強会はたまにチェックしていたんですが、最近は社内の勉強会でもGoが取り上げられたり、Goのお仕事もしてみたい気持ちがあったりで、ちょっと真面目に取り組んでいます。
といってもやっとチュートリアルを走破したぐらいですが…
C系の経験はかなり昔にObjective-CでiOSアプリを1年ぐらい作っていたぐらいで、ポインタに苦しんでいます
今後はいくつかアルゴリズムやパターンの実装を練習がてらやって、Webアプリを作っていきたいなと思っています
(AWSで遊ぶのが忙しくてあまりリソースを割けてないですが…)
今回の勉強会では先日サンディエゴで行われたGopherCon 2019の報告会ということで、実際にGopherConに参加されたメルカリの方がセッションやワークショップの紹介をしてくれました
全て面白かったのですが、個人的に特に興味深かったのはUberのマイクロサービスの事例でした
Mercari BOLD Scholarshipという学生向けの支援制度で参加された、大学生の方が紹介してくれました
約1,500のGoのマイクロサービスをMono-Repo(モノレポ)で管理してBazelでビルドしてるそうです(あってるかな?)
Mono-Repo / Poly(Multi)-Repoというワードは初めて聞いたんですが、マイクロサービスっていうとどちらかというと後者なイメージが強かったので印象的でした
poly(multi) repo/mono repoって初めて聞いた
— ごましお (@halnique) August 20, 2019
マイクロサービスならpoly repoなのかなって印象だったし実際にpoly repoなマイクロサービス群を触ることあるけど、たしかにmono repoのほうが環境構築とかリファクタとかIDEとかで都合がいいことも多いなぁとおもた #mercarigo
Goなマイクロサービス界隈ではこのGo + モノレポ + Bazelな構成は、けっこう定番なのかもしれないです
(mixiさんもやっていたり?)
Go言語だけとかパラダイムが揃っているとより一層効果的な感じがします
というかこの大学生の方も非常に技術力高くて、すごいなと思いつつ自分も頑張ろうと思いました
もう一人の大学生は文系のGo歴半年でドローン飛ばして撮影してました
ドローン動かしてビデオ撮ってる!すごい!
— ごましお (@halnique) August 20, 2019
TinyGoでドローンを飛ばす。
— みずりゅ(技術書典7サークル参加:しがないラジオsp65出演しました。) (@MzRyuKa) August 20, 2019
ぶっつ本番?
うまく飛んでました。
#mercarigo pic.twitter.com/lcYV9UsYyl
なんかすごかったです
他には全編英語で紹介してくれた方もいて、聞き取りやすい英語とわかりやすいスライドで非常に勉強になりました
以下当日のメモ
mercari.go #10
2019/8/20
GopherCon 2019報告会
GopherCon 2019
@morikuni さん
Mercari x GopherCon
Silver Sponsor
mercariからは社員11人+学生2人の参加(すごい)
GopherCon 2019の話題
why don't you Go?
Generics
正式名称(?): Contracts
他の言語でいうGenericsと似てるが同じではない
直和型
Workshop: Go-Beginner Training
@mark.hahn さん
英語!でも聞きやすい
background
Goはポピュラーになった
-> 初心者のトレーニングが重要性を増している
A Tour of Go
の内容は結構網羅的でいいのかもしれない(もう一周するか)
type(value)
でキャストできる
int(hoge)
とかstring(hoge)
とか
Make things in Go!
Q:C言語やってたほうがいい?
A:あるにこしたことはないけどプライオリティ次第かな?
A2:C作った人たちはCの課題も認識してたから、それをGoで解決したかった ガベージコレクションとか、大規模開発に不向きとか そういう意味では、Cの背景がなくてもいいっちゃいいのでは?
How Uber Goes
@micnnicim さん
GopherCon BOLD Scholarship
の参加者の学生
大学4年生!
Problems with Go
Solutions
DI uber-go/fx
Google製の Wire
ってのも https://github.com/google/wire
DIライブラリというより薄いアプリケーションフレームワーク
Transport Layer/Bisiness Layerの混合
glue
Clean Architectureにインスパイア
$ glue new service
Polyrepo -> Monorepo
マイクロサービスはサービスごとにリポジトリ作るもんだと思ってたけど、モノレポって考え方もあるのか〜
How I Write HTTP Web Services After Eight Years
https://speakerdeck.com/upamune/gophercon-2019-report
@upamune さん
GoでHTTP
Maintenability
- 最初から考慮する
Glaceability
- 視認性
- コードだけでなく構造的にも
Gode should be boring
- 他の人が理解できるように書く
- 経験の殆どない人が利用する可能性
Self Similar code
- コードベース内で似たコードがあると親しみやすくなる?
Tips
- グローバル変数は使わない
- ルーティングは一箇所で管理
- request/responseはラップして抽象化する
- request/responseの構造体をハンドラーの関数内に閉じ込める テストがちょっと煩雑になるが、明示的にもなるのでむしろいい
stretchr/testifyのパワーダウン版
TinyGo
@taqboz さん
英語不安 -> GopherのコミュニティSlackで結構情報拾える
とはいえ、できたほうがもっと理解できて楽しめそう
TinyGo
https://github.com/tinygo-org/tinygo
通常のgo build
したものの1/20のバイナリサイズ!
コードにもよるが、~1/10ぐらいのサイズにはなるらしい
デメリット
- goroutineのサポートが完璧じゃない
- GCは一部対応
- 使えない標準パッケージが多い(net/httpとか)
usecase
IoTデバイス、マイクロコントローラでの利用とか?
デモ
PKI for Gophers
@hunter さん
英語!むずかしい…
PKI
いわゆるデジタルサインというやつ
generate key -> hash -> sign -> verify
math/rand
じゃなくてcrypt/rand
をつかうこと
Goの標準パッケージ X509
Goの標準パッケージ TLS
server/client同じプロセス
generate key -> create request -> send request
parse request -> check sign -> create cert -> send cert
Go does not support encryptes SNIs.
Golang supports hardware keys.
Workshop: Observability in Go & Socket to me: Where do Sockets live in Go?
@yuki.ito さん
https://speakerdeck.com/110y/my-favorite-talks-at-gophercon-2019
Observability in Go
Log/Metrics/Trace
Log
標準パッケージlog
logrus使って構造化しましょう
MetricsとTraceがない場合はすべてログに出すしかない
MetricsとTraceがある場合はログは人間のために出す
Metrics
標準パッケージexpvar
今システムがどういう状態か、はわかる
Prometheusと合わせて振り返りができるように
Trace
datadogはいいぞ
Socket in Go
ローレイヤー過ぎてついていけない…
以上でした
転職して2ヶ月近く経って少し気持ち的にも落ち着いてきたので、またどんどん外部の勉強会にも参加していきます