https://dena.connpass.com/event/128034/
Goを使いこなせる組織作りの取り組み鈴木 大介ゲーム・エンターテインメント事業本部 オープンプラットフォーム事業部 ゲームプラットフォーム部 技術第二グループ株式会社ディー・エヌ・エー#1
View Slide
自己紹介2鈴木 大介❖ AndAppのサーバサイドエンジニア■ Go + GCP(App Engine)❖ Goで作ってきたシステム多数■ APIサーバ○ REST○ gRPC■ Webサーバ■ コマンドラインツール■ デーモン❖ Vimmer■ VimConf■ ゴリラ.vim
Goを使いこなせる組織3Goを使いこなせる➢ Goの良いところを引き出して生産性を最大化する○ シンプルな言語仕様で学習コストが低い○ 幅広いプラットフォームに対応している○ 品質向上に役立つツールが充実している➢ 適材適所で選択する○ 各種サーバソフトウェアやコマンドラインツールに向いている○ デスクトップアプリやモバイルアプリなどを無理にGoで作らない組織➢ チーム、部署、企業○ NOT 個人
つくりたい!4ガイドラインツール・システムコミュニティ
ガイドライン5
なぜガイドラインが必要なのか● スタートラインを揃えたい● 環境構築などにハマって時間を無駄にしたくないはず● うっかり古い資料を参考にしてハマるみたいなのを避けられるように● 細かいノウハウを共有したい● 一定コミュニティが成熟すると当たり前のノウハウは外にでなくなる● 当たり前のベストプラクティスを参照しやすい場所に置き共有したい6
環境構築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
学習コンテンツ公式ドキュメント• A Tour of Go• Package Documentation• Command Documentation• Language Specification• Frequently Asked Questions (FAQ)コードラボ• 公式ドキュメントの次のステップとして社内ドキュメント• スタイルガイド• エラーハンドリング• テスト• など8
9
スタイルガイドあまり細かい規定はない● Goの標準に従うこと○ 特殊な書き方は新規メンバーのキャッチアップを阻害してしまう○ 他の言語のような書き方をしようとすると歪になってしまう● Effective Go、Go Code Review Comments、Go Proverbsの内容を押さえること● ツールによるチェックを行うこと○ 必須■ gofmt or goimports■ go vet○ 推奨■ golint■ staticcheck● イディオムの紹介● テストはgotestsコマンドで雛形を生成してTable Driven Tests10
チェックツール● 3rd-party製linterの機能紹介○ staticcheck○ golangci-lint○ gsc● reviewdogの使い方● CircleCIの設定方法詳細はDeNA Testing Blogの reviewdogによるGoのコードレビュー 参照11
イディオム● 宣言のグルーピング○ constやvarごとではなく、GoDoc単位でまとめる○ ネストが深くなるのでstructやinterfaceはまとめない● スライスの作成方法いろいろ○ make()○ nilスライス○ 空スライス● 引数の構造体は値で受け取る?それともポインタ?○ 迷ったらポインタにしておく■ フィールドが増えてもパフォーマンスが落ちない■ 後からポインタに変更するのは改修が面倒● 構造体のポインタを初期化する時に使うのはnew()?それとも&?○ 基本的には&○ new()を使うのは初期化時にパラメータが不要なことを明示したい時など12
エラーハンドリング● パターンを紹介○ Don’t just check errors, handle them gracefullyで紹介されているもの■ Sentinel errors■ Error type■ Opaque errors○ Upspinの例○ など● 注意点○ err.Error()を分岐に使わない○ 呼び出し元と呼び出し先の両方で同じエラーログを出力しない※ 必ずこうしなければならないというものを規定するわけではない13
テスト● パターンを紹介1. 外部と接続するための設定を切り替える2. 外部と接続するクライアントを切り替える3. 外部と接続する処理自体を切り替える※ 必ずこうしなければならないというものを規定するわけではない 14123
ツール・システム15
16
コミュニティ17
Go言語委員会18● Go言語で開発をする際のガイドラインを整備● Go言語の実践的なノウハウを共有
メンバー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
Go Friday● 社内向けのGoの勉強会● 資料を準備して発表するというより、参加者同士で雑談する会※ 某社にインスパイアされました20
過去の風景21
TODO1) テストのカイゼン○ 品質の可視化○ 面倒、ツラい、といったイメージの払拭2) アウトプットを増やす○ Blog○ 登壇○ OSS22
株式会社ディー・エヌ・エーまとめ23部署の垣根を超えた社内コミュニティを中心に、Go力を高めている。● Go言語委員会○ ガイドラインの整備○ ツール・システムの作成● Go Friday○ ノウハウの共有・フィードバック