Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goを使いこなせる組織作りの取り組み / DeNA.go #1

Goを使いこなせる組織作りの取り組み / DeNA.go #1

Daisuke Suzuki

May 24, 2019
Tweet

More Decks by Daisuke Suzuki

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. ガイドライン
    5

    View Slide

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

    View Slide

  7. 環境構築
    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

    View Slide

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

    View Slide

  9. 9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. ツール・システム
    15

    View Slide

  16. 16

    View Slide

  17. コミュニティ
    17

    View Slide

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

    View Slide

  19. メンバー
    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

    View Slide

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

    View Slide

  21. 過去の風景
    21

    View Slide

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

    View Slide

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

    View Slide