Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

ϦϨʔγϣϯγοϓ 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で指定

Slide 28

Slide 28 text

ϦϨʔγϣϯγοϓ 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で指定

Slide 29

Slide 29 text

ϦϨʔγϣϯγοϓ 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で指定

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

ϦϨʔγϣϯγοϓ 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

Slide 40

Slide 40 text

ϦϨʔγϣϯγοϓ 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

Slide 41

Slide 41 text

ϦϨʔγϣϯγοϓ 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

Slide 42

Slide 42 text

ϦϨʔγϣϯγοϓ 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; }

Slide 43

Slide 43 text

ϦϨʔγϣϯγοϓ 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

Slide 44

Slide 44 text

ϦϨʔγϣϯγοϓ 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; }

Slide 45

Slide 45 text

ϦϨʔγϣϯγοϓ 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; }

Slide 46

Slide 46 text

ϦϨʔγϣϯγοϓ 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

Slide 47

Slide 47 text

ϦϨʔγϣϯγοϓ 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がないとエラー

Slide 48

Slide 48 text

ϦϨʔγϣϯγοϓ 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がないとエラー

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

ϦϨʔγϣϯγοϓ 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

Slide 56

Slide 56 text

ϦϨʔγϣϯγοϓ 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 ①合成 ②テーブル作成 ③インポート

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

ϦϨʔγϣϯγοϓ 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 単体 複合

Slide 59

Slide 59 text

ϦϨʔγϣϯγοϓ 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は特殊

Slide 60

Slide 60 text

ϦϨʔγϣϯγοϓ 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は特殊

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

ϦϨʔγϣϯγοϓ 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をキー 複数取得:なし

Slide 65

Slide 65 text

ϦϨʔγϣϯγοϓ 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

Slide 66

Slide 66 text

ϦϨʔγϣϯγοϓ 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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

ϦϨʔγϣϯγοϓ 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 ⾃動⽣成コードのみの機能で ⼗分であれば⼿動作成は不要

Slide 70

Slide 70 text

ϦϨʔγϣϯγοϓ 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 ⼿動作成 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ 開催中のリストが欲しい データ管理クラスに 特殊検索⽤メソッドを追加

Slide 71

Slide 71 text

ϦϨʔγϣϯγοϓ 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 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ ⼿動作成 開催期間⽤テキストが欲しい (○○〜○○まで) データクラスに複数メンバ 複合での取得メソッド追加

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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