Qiita Night〜これだけは伝えたい！Goのすごさとその将来性〜のイベントレポート

# 概要
- 2022年7月1日に開催された[Qiita Night〜これだけは伝えたい！Goのすごさとその将来性〜](https://increments.connpass.com/event/250648/)のイベントレポート
- Qiita社の中の人ですが、当日は主に視聴者として参加したので、LT及びトークセッションの視聴レポートをまとめてみました

# コンテンツ
- LT
    - 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」/ @bikun_bikun
    - スケールするGo / @tenntenn
    - Googleソフトウェアエンジニアリングに沿った開発をするためのGoの利便性 / @po3rin
- トークセッション / @tenntenn , @po3rin
    - Goはどんな風に使える？ここが便利！
    - Goを使う仲間をもっと増やしたい！Goの魅力と将来性

## LT
### 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」
- スピーカー：@bikun_bikun
- 所属：ディップ株式会社（2018/05〜）
- Go歴：
    - ディップ社入社後から触り始めた
    - Go製のプロダクトのチームビルディングやリード

#### メモ
- ディップ社のGoの広がり
    - 当時の振り返り
        1. みんな初心者
            - OSSのコード読んだり、勉強会に参加し知見をためていった
            - Goに明るい方の参画でチームナレッジがたまった
            - つまづきそうな部分を抜き出し、チュートリアルを作り、新メンバーに解いてもらうようにし、ソフトランディングしやすくした
        1. ”正しい”書き方がわからない
            - OSSのコードを読んでブラッシュアップ
            - 良いところを取り入れながら自分たちのスタイルを作っていく
            - 1からは辛い、ディレクトリ構成などは「golang-standards/project-layout」に寄せる対応など
        1. リリースして終わりじゃない
            - 制約下でCI/CDを組んで解決
                - オンプレ中心からAWS中心になってきたため、Jenkinsやdrone.ioからCodeBuild、CodePipeline、CodeDeployなどで自動化加速
        1. リリース時にバイナリ再起動が必要
            - オンプレ環境だったので、1台ずつLB outして対応
                - コンテナベースの仕組み利用っで課題はなくなってきた
    - 時系列
        - 2017初めにデータ連携バッチをGoで実装したのがディップ社のGo文明の始まり
        - 2018アプリ向けGatewayAPIリリース、プロモーション向けAPIリリース、Goプロダクトの広がり
        - 2018下旬スマートフォンアプリで認証機能サービスをGoで実装
        - 2019サブシステム周りでGoの利用が活発化
        - 2021新規プロダクトのコア部分にGoを採用
- 人員戦略
    - Goの採用が広がるにつれ、既存メンバーだけでは新規開発、運用が回らなくなってきた
        - 案①社内異動
            - 他チームでもやることがたくさんあり、非現実的
        - 案②採用
            - 正攻法だがすぐにどうかなるものでもない
        - 案③パートナーさんに頼る
            - Goできる人自体少ないので、一緒にGoやりたい、学びたいという人にも来てもらい一緒に高まった
                - パートナーさん含めみんなで高まる意識が増え、いい意識づくりもできたし、採用にもつながった
- Goの魅力
    - 標準で用意されているツール群
        - Formatter、テスト、パッケージ管理などが標準で用意されている
        - gofmt、goimportsはバラバラになりがちなものを統一してくれる
    - シンプルな言語（not Easy）
        - 触り始めでも理解しやすく書きやすい
        - throw-catchがないので基本的には上から読んでいける
            - 例外でジャンプではなく都度エラー処理を行う
    - 並行処理の書きやすさ
        - シンプルな並行処理は書きやすい
        - 途中からでも特定の箇所を並行処理に直す、みたいなことのしやすさ
    - ワンバイナリ
        - ポータブル性
        - ビルドのおかげで事前にバグがわかるケースがある
    - Goユーザーの愛情深さ
        - Tour of Goを始めとしたチュートリアルの日本語資料の充実
            - Gopher道場のみなさまに大感謝

### スケールするGo
- スピーカー：@tenntenn
- 所属：株式会社メルペイ
    - Google Developer Expert (Go)
    - 一般社団法人Gophers Japan代表
    - Go Conference主催者
- 資料

https://tenn.in/goscaling

https://qiita.com/tenntenn/items/0e33a4959250d1a55045

#### メモ
- Goが開発された背景
    - Google内の課題を解決するために開発された（C++のスピード感に課題感があった）
        - 開発のスケール
            - 開発が大規模になったときに開発スピードを落とさずに開発できるか
        - 製品のスケール
            - パフォーマンス面（速度などがきちんとでるか、など）
    - 参考
        - [Go at Google: Language Design in the Service of Software Engineering](https://go.dev/talks/2012/splash.article)
        - [The Go Programming Language and Environment](https://cacm.acm.org/magazines/2022/5/260357-the-go-programming-language-and-environment/fulltext)
- リリースサイクルと後方互換性
    - Goは毎年8月と2月にリリースされる
        - マイナーバージョンがアップされる
        - リリース3ヶ月前からDevelopment Freezeに
        - バグ修正とドキュメント修正以外は基本的に行われない
        - リリース2ヶ月前からベータ版が、1ヶ月前からRC版がリリースされる
    - Go1の間は言語の後方互換が保たれる
        - 言語仕様に破壊的変更が基本的にはない（例外もあり）
- Goが生み出したもの
    - Goとともに浸透した文化
        - コードフォーマット
            - gofmtによる書式（スタイル）の統一
        - インポートパス
            - ソースコードの中に依存関係が記述される
            - ホスティング場所もわかるので、ツールやライブラリを簡単に公開できる文化
    - GoチームとGoコミュニティの関係
        - コミュニティの意見を取り込んでくれる
            - プロポーザルの受け入れや、半年に1度のサーベイ
    - Goに入ってはGoに従え
        - ≠ Goに慣習に従いなさい
        - どの言語を学ぶ際にも必要な考え方
            - 自然言語でも同じ
        - なぜGoが開発されたのかを知ること
        - 1つ1つの言語機能には開発された背景がある
- これまでのアップデート（すべて互換性を保ったままという点がすごく良い）
    - コンパイラの改善
    - ランタイムの改善
    - 言語機能／標準パッケージ
    - ツール類
    - 参考：https://golang.design/history/
- キャッチアップするには？
    - Goを学ぶには？
        - 公式ドキュメント
            - https://go.dev
            - [Tutorials - The Go Programming Language](https://go.dev/doc/tutorial)
        - 書籍
            - [Books for Gophers - Go Conference 2022 Spring](https://miro.com/app/board/uXjVOFumO24=/)
            - 他、日本語の書籍が増加中
        - 教材
            - [プログラミング言語Go完全入門](https://tenn.in/go)
            - [Go の最初の手順 by Microsoft](https://docs.microsoft.com/ja-jp/learn/paths/go-first-steps/)
        - コミュニティ
            - 日本各地にコミュニティ
            - Go Conferenceも毎年開催
            - [Gopher道場](https://gopherdojo.org)
    - 新しい機能をキャッチアップ
        - プロポーザル、ドラフトデザインを見つける
        - Goチームの解説やソースコードを読む
        - 開発版を試す
            - 自分でインストールもできる
            - ブラウザで動くものもある
                - The Go Playground
        - リリースパーティもある

### Googleソフトウェアエンジニアリングに沿った開発をするためのGoの利便性
- スピーカー：@po3rin
- 所属：エムスリー株式会社 AI・機械学習チームのソフトウェアエンジニア
    - 検索基盤周りの担当

#### メモ
- エムスリーはGoを至るところで使っている
    - アプリケーション、検索、レコメンド、リランキングなど各種API
    - データ連携
    - Push通知基盤
    - 便利ツールの開発
- エムスリーではMLエンジニアもGoが書ける

https://www.oreilly.co.jp/books/9784873119656/

- コードの一貫性の重要性
    - 無駄な議論を減らせる
    - スケーリングを可能にする
    - 時間に対する強靭性
- Goの一貫性の例
    - インデントはタブに強制
    - スペースを入れるかどうか
    - セミコロン、ダブルコロン
    - 関数、テストファイル、テスト関数の命名規則
- 学習の容易性
    - formatで書き方を強制してくれるので手を動かしながら学べる
    - GoもGoで書かれているのでコードリーディングから学べる
    - Go製のOSSのコードから設計を学べるのも勉強になる
- 公式が提供していることの重要性
    - 複数のフォーマッターがあるとチームやプロジェクトごとにばらばらになる
        - Goはチームがスケールしやすい
- 意外な構文は避けよ
    - 複雑性を理解しないと意外な構文はバグを招きやすい
    - レビューで書式の論争の時間削減ができる
- ルールを適用する
    - コードレビュー
        - 読みやすいのでやりやすい
    - 自動化
- エムスリーではgoaを使っている
    - OpenAPI仕様のファイルの生成が行えるためドキュメンテーションのハードルが下がる


## トークセッション
### スピーカー
- @tenntenn
- @po3rin
- @mziyut （モデレーター）

### セッションテーマ
- Goはどんな風に使える？ここが便利！
- Goを使う仲間をもっと増やしたい！Goの魅力と将来性

#### Goはどんな風に使える？ここが便利！

初めてGoに触れたときのこと

- 触ったのは10年前、Googleが新しい言語作ったなという印象
- 研究等用に書いていた
- さわり心地よかった、型付言語触ったの初めて

逆に、「こんなこと困っていた」や「今困っている」ということ

- チームへの浸透
- 調べるのが大変、ソースコード読むしか無い
- 日本語ドキュメント少ない

情報収集の仕方

- 基本的には公式ドキュメント、ソースコード
- 公式が出すブログ
- Go Conference や golang.tokyo 等の勉強会

GoでAPI作りたいときに使うフレームワーク

- net/http自体が高機能なのでフレームワーク使わずともいける
    - 他のフレームワークはnet/httpのwrapperであることがほとんど
- gRPC、GraphQL

#### Goを使う仲間をもっと増やしたい！Goの魅力と将来性

Goの魅力

- 並列処理
- シンプルさ、扱いやすさ
- コミュニティが充実している

Goをキャッチアップしやすい人のバックグラウンド

- 基本的にはどんな人でもキャッチアップしやすいのでは？
- C言語とか（もともとGoを開発したメンバーがCを開発してたことはある）

初学者の学習の始め方

- Command Line toolとか
- 小さいツールを自作してみるとか

今後、Go言語に期待していること

- 後方互換を保っていて安定的に使えるのがいい、脆弱性DBに関してはより期待している
    - https://go.dev/security/vulndb/
- データ分析とか強くなると嬉しい（個人的に）