Slide 1

Slide 1 text

Goを使いこなせる組織作りの取り組み 鈴木 大介 ゲーム・エンターテインメント事業本部 オープンプラットフォーム事業部 ゲームプラットフォーム部 技術第二グループ 株式会社ディー・エヌ・エー #1

Slide 2

Slide 2 text

自己紹介 2 鈴木 大介 ❖ AndAppのサーバサイドエンジニア ■ Go + GCP(App Engine) ❖ Goで作ってきたシステム多数 ■ APIサーバ ○ REST ○ gRPC ■ Webサーバ ■ コマンドラインツール ■ デーモン ❖ Vimmer ■ VimConf ■ ゴリラ.vim

Slide 3

Slide 3 text

Goを使いこなせる組織 3 Goを使いこなせる ➢ Goの良いところを引き出して生産性を最大化する ○ シンプルな言語仕様で学習コストが低い ○ 幅広いプラットフォームに対応している ○ 品質向上に役立つツールが充実している ➢ 適材適所で選択する ○ 各種サーバソフトウェアやコマンドラインツールに向いている ○ デスクトップアプリやモバイルアプリなどを無理にGoで作らない 組織 ➢ チーム、部署、企業 ○ NOT 個人

Slide 4

Slide 4 text

つくりたい! 4 ガイドライン ツール・システム コミュニティ

Slide 5

Slide 5 text

ガイドライン 5

Slide 6

Slide 6 text

なぜガイドラインが必要なのか ● スタートラインを揃えたい ● 環境構築などにハマって時間を無駄にしたくないはず ● うっかり古い資料を参考にしてハマるみたいなのを避けられるように ● 細かいノウハウを共有したい ● 一定コミュニティが成熟すると当たり前のノウハウは外にでなくなる ● 当たり前のベストプラクティスを参照しやすい場所に置き共有したい 6

Slide 7

Slide 7 text

環境構築 Go本体のセットアップ 1. 各OS向けのアーカイブをダウンロードして展開する ○ バージョンを固定するため ○ 異なるバージョンを使いたい時はシンボリックリンク or golang.org/dl/... 2. ワークスペースは$HOME/goにする 3. GitHub Enterpriseからgo getするためのGit設定を追加する 4. パッケージ管理ツールの使い方 Cloud SDKのセットアップ 1. 各OS向けのアーカイブをダウンロードして展開する ○ 以降はgcloud componentsコマンドを使う 2. App Engine用コマンドにパスを通し、実行権限を付与する ○ goappコマンドを使う際には$GOPATHを設定しておく 7

Slide 8

Slide 8 text

学習コンテンツ 公式ドキュメント • A Tour of Go • Package Documentation • Command Documentation • Language Specification • Frequently Asked Questions (FAQ) コードラボ • 公式ドキュメントの次のステップとして 社内ドキュメント • スタイルガイド • エラーハンドリング • テスト • など 8

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

スタイルガイド あまり細かい規定はない ● Goの標準に従うこと ○ 特殊な書き方は新規メンバーのキャッチアップを阻害してしまう ○ 他の言語のような書き方をしようとすると歪になってしまう ● Effective Go、Go Code Review Comments、Go Proverbsの内容を押さえること ● ツールによるチェックを行うこと ○ 必須 ■ gofmt or goimports ■ go vet ○ 推奨 ■ golint ■ staticcheck ● イディオムの紹介 ● テストはgotestsコマンドで雛形を生成してTable Driven Tests 10

Slide 11

Slide 11 text

チェックツール ● 3rd-party製linterの機能紹介 ○ staticcheck ○ golangci-lint ○ gsc ● reviewdogの使い方 ● CircleCIの設定方法 詳細はDeNA Testing Blogの reviewdogによるGoのコードレビュー 参照 11

Slide 12

Slide 12 text

イディオム ● 宣言のグルーピング ○ constやvarごとではなく、GoDoc単位でまとめる ○ ネストが深くなるのでstructやinterfaceはまとめない ● スライスの作成方法いろいろ ○ make() ○ nilスライス ○ 空スライス ● 引数の構造体は値で受け取る?それともポインタ? ○ 迷ったらポインタにしておく ■ フィールドが増えてもパフォーマンスが落ちない ■ 後からポインタに変更するのは改修が面倒 ● 構造体のポインタを初期化する時に使うのはnew()?それとも&? ○ 基本的には& ○ new()を使うのは初期化時にパラメータが不要なことを明示したい時など 12

Slide 13

Slide 13 text

エラーハンドリング ● パターンを紹介 ○ Don’t just check errors, handle them gracefullyで紹介されているもの ■ Sentinel errors ■ Error type ■ Opaque errors ○ Upspinの例 ○ など ● 注意点 ○ err.Error()を分岐に使わない ○ 呼び出し元と呼び出し先の両方で同じエラーログを出力しない ※ 必ずこうしなければならないというものを規定するわけではない 13

Slide 14

Slide 14 text

テスト ● パターンを紹介 1. 外部と接続するための設定を切り替える 2. 外部と接続するクライアントを切り替える 3. 外部と接続する処理自体を切り替える ※ 必ずこうしなければならないというものを規定するわけではない 14 1 2 3

Slide 15

Slide 15 text

ツール・システム 15

Slide 16

Slide 16 text

16

Slide 17

Slide 17 text

コミュニティ 17

Slide 18

Slide 18 text

Go言語委員会 18 ● Go言語で開発をする際のガイドラインを整備 ● Go言語の実践的なノウハウを共有

Slide 19

Slide 19 text

メンバー 19 ★ 委員長 ○ 田中 洋一郎(Yoichiro Tanaka) ★ 委員 ○ 鈴木 大介(Daisuke Suzuki) ○ 佐藤 健太(Kenta Sato) ○ 金子 淳貴(@Junki Kaneko) ■ a.k.a yoichiro ■ a.k.a daisuzu ■ a.k.a karupanerura ■ a.k.a theoden9014

Slide 20

Slide 20 text

Go Friday ● 社内向けのGoの勉強会 ● 資料を準備して発表するというより、参加者同士で雑談する会 ※ 某社にインスパイアされました 20

Slide 21

Slide 21 text

過去の風景 21

Slide 22

Slide 22 text

TODO 1) テストのカイゼン ○ 品質の可視化 ○ 面倒、ツラい、といったイメージの払拭 2) アウトプットを増やす ○ Blog ○ 登壇 ○ OSS 22

Slide 23

Slide 23 text

株式会社ディー・エヌ・エー まとめ 23 部署の垣根を超えた社内コミュニティを中心に、Go力を高めている。 ● Go言語委員会 ○ ガイドラインの整備 ○ ツール・システムの作成 ● Go Friday ○ ノウハウの共有・フィードバック