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

ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを実現するために~

Cygames
September 15, 2017

ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを実現するために~

2017/08/30 CEDEC 2017

Cygames

September 15, 2017
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ • 社内プロジェクトにおける実例を踏まえて 運⽤フロー改善に関するノウハウを紹介 • DSLを導⼊することで実現したテストの効率化、 コード⾃動⽣成のシステムを紹介 • 構築したシステムを普及させ、 適切に運⽤する為のノウハウを紹介 2 サマリ
  2. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 4
  3. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 5 導⼊ DSLによる 検証システム
  4. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 6 CPU対戦 育成 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
  5. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 7 CPU対戦 育成 追加 新機能 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈ 対⼈戦
  6. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 8 CPU対戦 育成 対⼈戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
  7. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 9 CPU対戦 育成 対⼈戦 追加 新機能 チーム戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
  8. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは 10 育成 チーム戦 • ゲームにコンテンツを追加して拡張していくこと 対⼈戦 CPU対戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
  9. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 11 育成 対⼈戦 チーム戦 CPU対戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈ 追加 新キャラクター
  10. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 12 育成 対⼈戦 チーム戦 CPU対戦 この様に運⽤によって 機能やリソースを追加し ゲームを成⻑させていく
  11. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームを飽きずに楽しんでもらうために 13 ゲームの ⾯⽩さ 定期的な 更新 両⽅の要素が重要 育成 対⼈戦 チーム戦 CPU対戦
  12. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesにおける運⽤ 最⾼のコンテンツを作る会社 14
  13. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesにおける運⽤ 最⾼の コンテンツ = 最⾼の ゲーム 最⾼の 運⽤ + 最⾼の運⽤は 最⾼のコンテンツに⽋かせない要素 15 運⽤という⽬線で考えると
  14. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 最⾼の運⽤とは ユーザーを 楽しませる より快適に 想像の上をいく クオリティとスピード感 不具合を出さない 常に安定稼働 ⾼頻度更新かつ不具合ゼロを⽬標 16
  15. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新によるメリット 企画 求められていないものを開発等の ロスも少ない 開発 更新 反響 17 ⾼速なイテレーションを実現 コンテンツの⾼速な成⻑
  16. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesでの運⽤例 神撃のバハムート、グランブルーファンタジー、 シャドウバースや他社との共同開発タイトルを運⽤中 更新頻度はタイトルによるが週に2〜4回程度 1⽇に2回実施する場合も 18
  17. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ①開発できるのか? ②テストできるのか? ③リリースできるのか? 19 各⼯程でスピードと効率が求められる
  18. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ①開発できるのか? ・開発⽤ツールを準備する ・拡張しやすい設計で作る ③リリースできるのか? ・⾼速ビルド、⾼速転送の整備 課題が明確で解決策やノウハウも豊富 20
  19. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ②テストできるのか? ・⾼頻度更新におけるテストで有効な⼿法とは? ・不具合を出さないためには重要 21 テストを効率化するシステムを構築する
  20. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ テスト効率化のターゲット選定 9⽉1⽇ 新ストーリー 9⽉2⽇ 新イベント 新キャラ 9⽉4⽇ 機能追加 9⽉5⽇ イベント拡張 •‥‥デザイン素材 ★‥‥パラメータ ▲‥‥プログラム •★ •★ •★ 22 •★▲ •★ 更新内容は主にデザイン素材とパラメータ 更新スケジュール例
  21. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ デザイン素材の検証 表⽰崩れが ないか? アニメーションが 適切か? 品質が適切か? 劣っていないか? 23 ⾃動検証で結果を担保するのは難しい 表⽰内容 挙動 クオリティ
  22. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ パラメータの検証 24 おかしな値に なっていないか バランスが 崩れていないか? データ間での 参照が適切か? ⾃動でも⼗分な検証が可能 (というよりも⾃動で検証すべき内容) 設定値 バランス 参照エラー
  23. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(よくある設定例) 25 クエストA 称号A クエストA 獲得条件 クリア報酬 アイテムA
  24. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(よくある設定例) 26 クエストA 称号A クエストA 獲得条件 クリア報酬 存在しないと問題発⽣ アイテムA
  25. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(データ構成) id name reward_id 1 クエストA 1 id name 1 アイテムA 2 アイテムB 27 クエストA クリア報酬 アイテムA Quest.csv Item.csv item.csvのidを reward_idで指定
  26. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(データ構成) 28 id name reward_id 1 クエストA 2 id name 1 アイテムA 2 アイテムB クエストA クリア報酬 アイテムB Quest.csv Item.csv item.csvのidを reward_idで指定
  27. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(データ構成) × 参照エラー 29 Quest.csv Item.csv id name 1 アイテムA 2 アイテムB id name reward_id 1 クエストA 3 クエストA ???? クリア報酬 item.csvのidを reward_idで指定
  28. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー 30 最初は各機能が独⽴して存在 クエスト アイテム
  29. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー 31 クエスト アイテム クエスト報酬がアイテム クエスト開始にアイテムが必要 という仕様で参照関係に
  30. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー マスタデータとテストケースも 肥⼤化 ⾃動検証が必要 クエスト アイテム 称号 32 新機能追加でデータ追加 同時に参照関係も追加
  31. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ データ検証の⾃動化 参照エラー検出も含めた検証システムを DSLによるメタプログラミングで構築 データ検証⽤の⾔語を独⾃設計して 簡単な記述で検証を実現できるように 33
  32. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 34
  33. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSL(ドメイン固有⾔語) 特定の問題を解決することに特化した⾔語 今回のケースではデータ検証に特化 DSL Ruby側から提供された構⽂を利⽤して データ検証のための制約を作成 Ruby DSLの記載に必要な構⽂を提供 検証システム全体を設計 35
  34. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ なぜDSLを採⽤したのか? ・データ制約の記述が簡潔(普及しやすい) ・制約反映のフローが適切(正当性) ・検証以外の機能拡張(将来性) 36 Excelの⼊⼒規則やVBA、他の簡易ツールで より簡単に実現できるのでは? 総合⼒でDSLを採⽤
  35. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLの基本フォーマット id name reward_id 1 クエストA 1 Quest.csv Quest.dsl 37
  36. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLの基本フォーマット id name reward_id 1 クエストA 1 Quest.csv master(quest) { } Quest.dsl ①グループ名を決める 38
  37. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLの基本フォーマット id name reward_id 1 クエストA 1 Quest.csv master(quest) { integer id; text name; integer reward_id; } Quest.dsl ①グループ名を決める ②メンバー変数と型定義 これで完了! 39
  38. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 id name 1 アイテムA 2 アイテムB Item.csv master(item) { integer id; text name; } 参照チェック 40 master(quest) { integer id; text name; integer reward_id; } id name reward_id 1 クエストA 1 Quest.csv
  39. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 id name 1 アイテムA 2 アイテムB Item.csv master(item) { integer id; text name; } master(quest) { integer id; text name; integer reward_id; } >> where { unique_ref reward_id => item.id; } この記述のみでOK 41 参照チェック id name reward_id 1 クエストA 1 Quest.csv
  40. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv 42 id name reward_id 1 クエストA 1 master(quest) { integer id; text name; integer reward_id; }
  41. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv ①reward_idの参照チェック 43 master(quest) { integer id; text name; integer reward_id; } >> where { unique_ref reward_id => item.id; } id name reward_id 1 クエストA 1
  42. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv ①reward_idの参照チェック ②プライマリーキーはid 44 id name reward_id 1 クエストA 1 master(quest) { integer id; text name; integer reward_id; primary id; } >> where { unique_ref reward_id => item.id; }
  43. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv ①reward_idの参照チェック ②プライマリーキーはid ③reward_idはユニーク 45 id name reward_id 1 クエストA 1 master(quest) { integer id; text name; integer reward_id; primary id; unique reward_id; } >> where { unique_ref reward_id => item.id; }
  44. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ id name reward_id cost 1 クエストA 1 10 DSLによる制約記述例 Quest.csv ①reward_idの参照チェック ②プライマリーキーはid ③reward_idはユニーク ④costは10以上20以下 master(quest) { integer id; text name; integer reward_id; primary id; unique reward_id; } >> where { unique_ref reward_id => item.id; assert{ cost >= 10 } assert{ cost <= 20 } } 46
  45. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv reward_idの参照チェック ※ただし、報酬なしは許容 47 master(quest) { integer id; text name; integer reward_id; } >> where { unique_ref reward_id => item.id; } id name reward_id 1 クエストA 0 reward_id が0 Item.csvにid=0がないとエラー
  46. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによる制約記述例 Quest.csv reward_idの参照チェック ※ただし、報酬なしは許容 48 master(quest) { integer id; text name; integer reward_id; } >> where { if reward_id > 0 unique_ref reward_id => item.id; end } id name reward_id 1 クエストA 0 reward_id が0 If⽂で容易に記述可能 Item.csvにid=0がないとエラー
  47. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ エラーが発⽣したら 報告する情報 ・担当者(ビルド実⾏者) ・ビルドパラメータ ・エラー詳細(HTML)へのリンク 検証結果の報告までが検証システムの仕事 社内の連絡⽤ツールに⾃動投稿 49
  48. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ エラー報告の詳細 エラー詳細(HTML) 報告内容 対象ファイル エラー内容 該当箇所 わかりやすい形で報告!! 50
  49. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊前後のフローの変化 導⼊前のフロー(VBA、Excel主体) Excelで⼊⼒ VBAでcsv⽣成 Excelの⼊⼒規則とVBAで検証 (個⼈環境での検証) ビルドと反映 テスト テスト段階でエラー検出されると ビルドから再度やり直し 制約反映が漏れる可能性があり 51
  50. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊前後のフローの変化 導⼊後のフロー(DSL主体) エラー検出タイミングが早い ビルド前に検出・解消できる 制約反映漏れがない Excelで⼊⼒ VBAでcsv⽣成 ビルドと反映 DSLデータ検証 テスト 52 Excelの⼊⼒規則とVBAで検証 (個⼈環境での検証)
  51. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 データ検証を普及させるために ・検証が独⽴していると拡張漏れが出る懸念 忙しい、対応漏れでシステムが衰退していく ・開発フローで⾃然にDSLを記載するフローが必要 DSLを利⽤して csvデータのDB化とコード⾃動⽣成も実現 53
  52. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ データのDB化とコード⽣成 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 他タイトルへの展開 まとめ 54
  53. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ master(quest) { integer id; text name; integer reward_id; primary id; } DSLによるcsvデータのDB化の概要 id name reward_id 1 クエストA 1 Quest.csv マスタデータDB ⽣成 プログラム (Ruby) Quest.dsl quest 55
  54. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DB⽣成プログラムの流れ csv 56 マスタデータDB quest DSL形式がSQLに近い master(quest) { integer id; text name; integer reward_id; primary id; } >> where { unique_ref reward_id => item.id; } テーブル⽣成 SQL ①合成 ②テーブル作成 ③インポート
  55. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLで設定可能な項⽬(DB関連) SQL同様の記載⽅法で設定可能 57 プリマリーキー 単体キー 複合キー インデックス 単体インデックス 複合インデックス 各種データ型 int long text bool 各 unsigned
  56. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ プライマリーキーの設定 master(quest) { integer id; text name; integer reward_id; primary id; } id name reward_id 1 クエストA 1 master(quest) { integer group; integer no; text name; integer reward_id; primary group, no; } group no name reward_id 1 1 クエスト1-1 1 58 単体 複合
  57. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ インデックスの設定(単体) 通常クエストのリストが欲しい 59 id quest_type name reward_id 1 1 クエストA 1 master(quest) { integer id; integer quest_type; text name; integer reward_id; primary id; index quest_type; } クエストの種類 1は通常、2は特殊
  58. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ インデックスの設定(複合) master(quest) { integer id; integer quest_type; text name; integer reward_id; primary id; index quest_type, reward_id; } 特定報酬が⼊⼿可能な 通常クエストのリストが欲しい id quest_type name reward_id 1 1 クエストA 1 60 クエストの種類 1は通常、2は特殊
  59. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DB化によるメリット ・起動時処理が⾼速化 起動時に⾏っていたcsvデータの展開処理が不要 ・データの検索機能が⼤幅に強化 61
  60. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ master(quest) { integer id; text name; integer reward_id; primary id; } DSLによるコード⾃動⽣成の概要 ⽣成 プログラム (Ruby) Quest.dsl マスタデータ⽤ プログラム⼀式 マスターデータDBからのデータ取得や 各カラム値取得に必要なコードを全て⽣成 62
  61. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ プロジェクトのプログラム構成例 CSV CSV データ管理クラス(各csv) DBを検索してデータクラスを取得 統合管理クラス(全csv) 各データ管理クラスへのアクセサ id name reward_id 1 クエストA 1 2 クエストB 3 データクラス(各レコード) 各カラムをメンバ変数として保持 63
  62. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ コード⽣成の流れ master(quest) { integer id; text name; integer reward_id; primary id; } Quest.dsl 64 データクラス メンバ変数にid, name, reward_id データ管理クラス 統合管理クラス データ管理クラスへのアクセス 単体取得:idをキー 複数取得:なし
  63. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ コード⽣成の流れ データクラス メンバ変数にid, name, reward_id データ管理クラス 統合管理クラス データ管理クラスへのアクセス master(quest) { integer id; text name; integer reward_id; primary id; index reward_id; } 単体取得:idをキー 複数取得:reward_idをキー indexを追加すると ⽣成コードも変化! Quest.dsl 65
  64. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾃動⽣成の懸念点 特殊なケースへの対応 ・特殊な検索⽅法 クエストに解放期間が設定されている id name reward_id start_time end_time 1 クエストA 1 2017-01-01 00:00:00 2030-01-01 00:00:00 2 クエストB 3 2017-08-31 00:00:00 2017-08-31 23:59:59 開催中のクエストだけ取得したい 66
  65. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⼿動作成?⾃動⽣成? 特殊なケースへの対応 ・⼿動作成と⾃動⽣成どちらが便利か? ⼿動 特例への対応に強い パフォーマンスが追求可 共通処理は⾃動化に劣る 共通部分の構築は強い 個別カスタマイズには弱い 状況次第では⼿動以上のコスト ⾃動 動作上のパフォーマンスを優先すると ⼿動に軍配があがることも 67
  66. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 解決策(⼿動化と⾃動化の共存) ⼿動作成⽤ フォルダ プロジェクト ⾃動⽣成⽤ フォルダ 同名クラスが partialで存在 ⾃動と⼿動の両⽅を活かす 68
  67. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⼿動化と⾃動化の共存(具体例) ⾃動⽣成 69 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ id name reward_id start_time end_time 1 クエストA 1 2017-01-01 00:00:00 2030-01-01 00:00:00 ⾃動⽣成コードのみの機能で ⼗分であれば⼿動作成は不要
  68. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⼿動化と⾃動化の共存(具体例) ⾃動⽣成 70 id name reward_id start_time end_time 1 クエストA 1 2017-01-01 00:00:00 2030-01-01 00:00:00 ⼿動作成 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ 開催中のリストが欲しい データ管理クラスに 特殊検索⽤メソッドを追加
  69. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⼿動化と⾃動化の共存(具体例) ⾃動⽣成 71 id name reward_id start_time end_time 1 クエストA 1 2017-01-01 00:00:00 2030-01-01 00:00:00 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ ⼿動作成 開催期間⽤テキストが欲しい (◦◦〜◦◦まで) データクラスに複数メンバ 複合での取得メソッド追加
  70. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 起動⾼速化と開発⼯数の⼤幅削減を実現 DB⽣成とコード⽣成まとめ DSL csv DB DB⽣成 コード コード⽣成 検証で使⽤するDSLで両機能に対応 csv 72 DSL DSL
  71. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 データ検証 システム 普及させるため コード⽣成 DB⽣成 追加機能 データ検証以外に 開発⾯でも恩恵 73 ビルド時に検証実⾏ エラー発⽣でビルド中断 DSL対応しないデータ追加は不可
  72. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 まとめ 74
  73. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開 検証システムの構築は実現 ・タイトル内で完結させるには惜しい ・他タイトルへ横展開して流⽤したい 他タイトルへの展開は⾮常に容易な構成 (実際に社内でも横展開しています) 75
  74. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開(システムの構成) データ定義(DSL) 基盤部分(Ruby) ・DSL⽤構⽂定義 ・データ検証、エラー報告 ・DB⽣成 ・コード⽣成 ・データ構造 ・データ制約 タイトルに依存 タイトル依存なし 76 基盤を複製しcsvからDSLを新規作成するだけ
  75. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ〜⾼頻度更新を実現するために〜 DB⽣成 開発 テスト リリース DSLによる データ検証 コード⽣成 対策 課題 +α 77
  76. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ 78 • 社内プロジェクトにおける実例を踏まえて 運⽤フロー改善に関するノウハウを紹介 • DSLを導⼊することで実現したテストの効率化、 コード⾃動⽣成のシステムを紹介 • 構築したシステムを普及させ、 適切に運⽤する為のノウハウを紹介
  77. ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ

    ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ〜なぜ⾼頻度更新を⽬指したのか〜 全ては最⾼のコンテンツを作るために 79