Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを...
Search
Cygames, Inc.
PRO
September 15, 2017
Technology
11k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを実現するために~
2017/08/30 CEDEC 2017
Cygames, Inc.
PRO
September 15, 2017
More Decks by Cygames, Inc.
See All by Cygames, Inc.
【U/Day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
4
15k
【CEDEC+KYUSHU2025】学生・若手必見!テクニカルアーティスト 大全 ~仕事・スキル・キャリアパス、TAの「わからない」を徹底解剖~
cygames
PRO
1
1.2k
【TiDB User Day2025】リリース時のアクセス急増をいかにしてノーメンテで乗り越えたか 〜『Shadowverse: Worlds Beyond』におけるTiDB採用のゲームサーバー設計〜
cygames
PRO
1
2.8k
【CEDEC2025】『Shadowverse: Worlds Beyond』二度目のDCG開発でゲームをリデザインする~遊びやすさと競技性の両立~
cygames
PRO
2
850
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
2
2.5k
【CEDEC2025】現場を理解して実現!ゲーム開発を効率化するWebサービスの開発と、利用促進のための継続的な改善
cygames
PRO
0
1.8k
【CEDEC2025】ブランド力アップのためのコンテンツマーケティング~ゲーム会社における情報資産の活かし方~
cygames
PRO
0
1.9k
【CEDEC2025】『ウマ娘 プリティーダービー』における映像制作のさらなる高品質化へ!~ 豊富な素材出力と制作フローの改善を実現するツールについて~
cygames
PRO
0
680
【CEDEC2025】LLMを活用したゲーム開発支援と、生成AIの利活用を進める組織的な取り組み
cygames
PRO
1
5k
Other Decks in Technology
See All in Technology
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
140
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
970
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
980
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
140
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
360
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
1k
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
130
MCP Appsを作ってみよう
iwamot
PRO
4
610
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
200
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
170
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
970
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
360
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
WENDY [Excerpt]
tessaabrams
11
38k
WCS-LA-2024
lcolladotor
0
630
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Google's AI Overviews - The New Search
badams
0
1k
The browser strikes back
jonoalderson
0
1.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Mobile First: as difficult as doing things right
swwweet
225
10k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Designing for Performance
lara
611
70k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Transcript
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 1
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ • 社内プロジェクトにおける実例を踏まえて 運⽤フロー改善に関するノウハウを紹介 • DSLを導⼊することで実現したテストの効率化、 コード⾃動⽣成のシステムを紹介 • 構築したシステムを普及させ、 適切に運⽤する為のノウハウを紹介 2 サマリ
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 3
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 4
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 5 導⼊ DSLによる 検証システム
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 6 CPU対戦 育成 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 7 CPU対戦 育成 追加 新機能 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈ 対⼈戦
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 8 CPU対戦 育成 対⼈戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 9 CPU対戦 育成 対⼈戦 追加 新機能 チーム戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは 10 育成 チーム戦 • ゲームにコンテンツを追加して拡張していくこと 対⼈戦 CPU対戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 11 育成 対⼈戦 チーム戦 CPU対戦 例えばこの様なゲーム 機能はCPU対戦と育成のみ キャラクターが数⼈ 追加 新キャラクター
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームにおける運⽤とは • ゲームにコンテンツを追加して拡張していくこと 12 育成 対⼈戦 チーム戦 CPU対戦 この様に運⽤によって 機能やリソースを追加し ゲームを成⻑させていく
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ゲームを飽きずに楽しんでもらうために 13 ゲームの ⾯⽩さ 定期的な 更新 両⽅の要素が重要 育成 対⼈戦 チーム戦 CPU対戦
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesにおける運⽤ 最⾼のコンテンツを作る会社 14
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesにおける運⽤ 最⾼の コンテンツ = 最⾼の ゲーム 最⾼の 運⽤ + 最⾼の運⽤は 最⾼のコンテンツに⽋かせない要素 15 運⽤という⽬線で考えると
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 最⾼の運⽤とは ユーザーを 楽しませる より快適に 想像の上をいく クオリティとスピード感 不具合を出さない 常に安定稼働 ⾼頻度更新かつ不具合ゼロを⽬標 16
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新によるメリット 企画 求められていないものを開発等の ロスも少ない 開発 更新 反響 17 ⾼速なイテレーションを実現 コンテンツの⾼速な成⻑
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ Cygamesでの運⽤例 神撃のバハムート、グランブルーファンタジー、 シャドウバースや他社との共同開発タイトルを運⽤中 更新頻度はタイトルによるが週に2〜4回程度 1⽇に2回実施する場合も 18
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ①開発できるのか? ②テストできるのか? ③リリースできるのか? 19 各⼯程でスピードと効率が求められる
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ①開発できるのか? ・開発⽤ツールを準備する ・拡張しやすい設計で作る ③リリースできるのか? ・⾼速ビルド、⾼速転送の整備 課題が明確で解決策やノウハウも豊富 20
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⾼頻度更新における課題 ②テストできるのか? ・⾼頻度更新におけるテストで有効な⼿法とは? ・不具合を出さないためには重要 21 テストを効率化するシステムを構築する
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ テスト効率化のターゲット選定 9⽉1⽇ 新ストーリー 9⽉2⽇ 新イベント 新キャラ 9⽉4⽇ 機能追加 9⽉5⽇ イベント拡張 •‥‥デザイン素材 ★‥‥パラメータ ▲‥‥プログラム •★ •★ •★ 22 •★▲ •★ 更新内容は主にデザイン素材とパラメータ 更新スケジュール例
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ デザイン素材の検証 表⽰崩れが ないか? アニメーションが 適切か? 品質が適切か? 劣っていないか? 23 ⾃動検証で結果を担保するのは難しい 表⽰内容 挙動 クオリティ
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ パラメータの検証 24 おかしな値に なっていないか バランスが 崩れていないか? データ間での 参照が適切か? ⾃動でも⼗分な検証が可能 (というよりも⾃動で検証すべき内容) 設定値 バランス 参照エラー
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(よくある設定例) 25 クエストA 称号A クエストA 獲得条件 クリア報酬 アイテムA
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 参照エラー(よくある設定例) 26 クエストA 称号A クエストA 獲得条件 クリア報酬 存在しないと問題発⽣ アイテムA
ϦϨʔγϣϯγοϓ 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で指定
ϦϨʔγϣϯγοϓ 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で指定
ϦϨʔγϣϯγοϓ 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で指定
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー 30 最初は各機能が独⽴して存在 クエスト アイテム
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー 31 クエスト アイテム クエスト報酬がアイテム クエスト開始にアイテムが必要 という仕様で参照関係に
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 機能追加と参照エラー マスタデータとテストケースも 肥⼤化 ⾃動検証が必要 クエスト アイテム 称号 32 新機能追加でデータ追加 同時に参照関係も追加
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ データ検証の⾃動化 参照エラー検出も含めた検証システムを DSLによるメタプログラミングで構築 データ検証⽤の⾔語を独⾃設計して 簡単な記述で検証を実現できるように 33
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 他タイトルへの展開 まとめ 34
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSL(ドメイン固有⾔語) 特定の問題を解決することに特化した⾔語 今回のケースではデータ検証に特化 DSL Ruby側から提供された構⽂を利⽤して データ検証のための制約を作成 Ruby DSLの記載に必要な構⽂を提供 検証システム全体を設計 35
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ なぜDSLを採⽤したのか? ・データ制約の記述が簡潔(普及しやすい) ・制約反映のフローが適切(正当性) ・検証以外の機能拡張(将来性) 36 Excelの⼊⼒規則やVBA、他の簡易ツールで より簡単に実現できるのでは? 総合⼒でDSLを採⽤
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLの基本フォーマット id name reward_id 1 クエストA 1 Quest.csv Quest.dsl 37
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLの基本フォーマット id name reward_id 1 クエストA 1 Quest.csv master(quest) { } Quest.dsl ①グループ名を決める 38
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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; }
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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; }
ϦϨʔγϣϯγοϓ 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; }
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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がないとエラー
ϦϨʔγϣϯγοϓ 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がないとエラー
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ エラーが発⽣したら 報告する情報 ・担当者(ビルド実⾏者) ・ビルドパラメータ ・エラー詳細(HTML)へのリンク 検証結果の報告までが検証システムの仕事 社内の連絡⽤ツールに⾃動投稿 49
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ エラー報告の詳細 エラー詳細(HTML) 報告内容 対象ファイル エラー内容 該当箇所 わかりやすい形で報告!! 50
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊前後のフローの変化 導⼊前のフロー(VBA、Excel主体) Excelで⼊⼒ VBAでcsv⽣成 Excelの⼊⼒規則とVBAで検証 (個⼈環境での検証) ビルドと反映 テスト テスト段階でエラー検出されると ビルドから再度やり直し 制約反映が漏れる可能性があり 51
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 導⼊前後のフローの変化 導⼊後のフロー(DSL主体) エラー検出タイミングが早い ビルド前に検出・解消できる 制約反映漏れがない Excelで⼊⼒ VBAでcsv⽣成 ビルドと反映 DSLデータ検証 テスト 52 Excelの⼊⼒規則とVBAで検証 (個⼈環境での検証)
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 データ検証を普及させるために ・検証が独⽴していると拡張漏れが出る懸念 忙しい、対応漏れでシステムが衰退していく ・開発フローで⾃然にDSLを記載するフローが必要 DSLを利⽤して csvデータのDB化とコード⾃動⽣成も実現 53
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ データのDB化とコード⽣成 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 他タイトルへの展開 まとめ 54
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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 ①合成 ②テーブル作成 ③インポート
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLで設定可能な項⽬(DB関連) SQL同様の記載⽅法で設定可能 57 プリマリーキー 単体キー 複合キー インデックス 単体インデックス 複合インデックス 各種データ型 int long text bool 各 unsigned
ϦϨʔγϣϯγοϓ 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 単体 複合
ϦϨʔγϣϯγοϓ 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は特殊
ϦϨʔγϣϯγοϓ 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は特殊
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DB化によるメリット ・起動時処理が⾼速化 起動時に⾏っていたcsvデータの展開処理が不要 ・データの検索機能が⼤幅に強化 61
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ master(quest) { integer id; text name; integer reward_id; primary id; } DSLによるコード⾃動⽣成の概要 ⽣成 プログラム (Ruby) Quest.dsl マスタデータ⽤ プログラム⼀式 マスターデータDBからのデータ取得や 各カラム値取得に必要なコードを全て⽣成 62
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ プロジェクトのプログラム構成例 CSV CSV データ管理クラス(各csv) DBを検索してデータクラスを取得 統合管理クラス(全csv) 各データ管理クラスへのアクセサ id name reward_id 1 クエストA 1 2 クエストB 3 データクラス(各レコード) 各カラムをメンバ変数として保持 63
ϦϨʔγϣϯγοϓ 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をキー 複数取得:なし
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ 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
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ ⼿動作成?⾃動⽣成? 特殊なケースへの対応 ・⼿動作成と⾃動⽣成どちらが便利か? ⼿動 特例への対応に強い パフォーマンスが追求可 共通処理は⾃動化に劣る 共通部分の構築は強い 個別カスタマイズには弱い 状況次第では⼿動以上のコスト ⾃動 動作上のパフォーマンスを優先すると ⼿動に軍配があがることも 67
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 解決策(⼿動化と⾃動化の共存) ⼿動作成⽤ フォルダ プロジェクト ⾃動⽣成⽤ フォルダ 同名クラスが partialで存在 ⾃動と⼿動の両⽅を活かす 68
ϦϨʔγϣϯγοϓ 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 ⾃動⽣成コードのみの機能で ⼗分であれば⼿動作成は不要
ϦϨʔγϣϯγοϓ 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 ⼿動作成 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ 開催中のリストが欲しい データ管理クラスに 特殊検索⽤メソッドを追加
ϦϨʔγϣϯγοϓ 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 データクラス メンバー変数定義 データ管理クラス 検索(キー、インデックス) 統合管理クラス データ管理クラスへのアクセサ ⼿動作成 開催期間⽤テキストが欲しい (◦◦〜◦◦まで) データクラスに複数メンバ 複合での取得メソッド追加
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 起動⾼速化と開発⼯数の⼤幅削減を実現 DB⽣成とコード⽣成まとめ DSL csv DB DB⽣成 コード コード⽣成 検証で使⽤するDSLで両機能に対応 csv 72 DSL DSL
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ DSLによるデータ検証 データ検証 システム 普及させるため コード⽣成 DB⽣成 追加機能 データ検証以外に 開発⾯でも恩恵 73 ビルド時に検証実⾏ エラー発⽣でビルド中断 DSL対応しないデータ追加は不可
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開 導⼊ DSLによる 検証システム 本⽇の流れ ゲームにおける運⽤ ⾼頻度更新における課題 データ検証 データのDB化とコード⽣成 まとめ 74
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開 検証システムの構築は実現 ・タイトル内で完結させるには惜しい ・他タイトルへ横展開して流⽤したい 他タイトルへの展開は⾮常に容易な構成 (実際に社内でも横展開しています) 75
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ 他タイトルへの展開(システムの構成) データ定義(DSL) 基盤部分(Ruby) ・DSL⽤構⽂定義 ・データ検証、エラー報告 ・DB⽣成 ・コード⽣成 ・データ構造 ・データ制約 タイトルに依存 タイトル依存なし 76 基盤を複製しcsvからDSLを新規作成するだけ
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ〜⾼頻度更新を実現するために〜 DB⽣成 開発 テスト リリース DSLによる データ検証 コード⽣成 対策 課題 +α 77
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ 78 • 社内プロジェクトにおける実例を踏まえて 運⽤フロー改善に関するノウハウを紹介 • DSLを導⼊することで実現したテストの効率化、 コード⾃動⽣成のシステムを紹介 • 構築したシステムを普及させ、 適切に運⽤する為のノウハウを紹介
ϦϨʔγϣϯγοϓ ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ © Cygames, Inc. ϦϨʔγϣϯγοϓ
ID rId11 ͷΠϝʔδ ύʔ π͕ϑΝΠϧʹ͋Γ·ͤΜͰͨ͠ɻ まとめ〜なぜ⾼頻度更新を⽬指したのか〜 全ては最⾼のコンテンツを作るために 79