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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. ガイドライン
    5

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. ツール・システム
    15

    View full-size slide

  15. コミュニティ
    17

    View full-size slide

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

    View full-size slide

  17. メンバー
    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 full-size slide

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

    View full-size slide

  19. 過去の風景
    21

    View full-size slide

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

    View full-size slide

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

    View full-size slide