Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを...
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.
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
27k
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
1.2k
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
3
1.3k
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
2
2.1k
【CEDEC2026】派手さと見やすさは両立できる!『Shadowverse: Worlds Beyond』エフェクト・3D背景の超進化したビジュアル設計
cygames
PRO
1
1.9k
【CEDEC2026】『Shadowverse: Worlds Beyond』続編開発におけるUIデザイン・アニメーション演出の「超進化」 ~継承と挑戦を両立するデザイン手法~
cygames
PRO
3
5.2k
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
1
280
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
2
490
【CEDEC2026】アートとゲームデザインをつなぐVFX設計『GRANBLUE FANTASY: Relink - Endless Ragnarok』における表現と可読性の両立
cygames
PRO
1
1.3k
Other Decks in Technology
See All in Technology
映像変換サーバーなしで端末内でHLSを生成してライブ配信
hikarusato
0
110
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
260
beyond jj: config & tools ecosystem
indirect
0
440
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
3k
iOSDC Japan 2026 day1 TrackC 10:50
feedtailor
1
160
GoにおけるFFIのこれまでとこれから
goccy
5
3.4k
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
740
AI de Idea
kawaguti
PRO
2
110
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
320
おい、エージェントを使って終わらせろ
nwiizo
0
260
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
730
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
Evolving SEO for Evolving Search Engines
ryanjones
0
290
So, you think you're a good person
axbom
PRO
2
2.2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Practical Orchestrator
shlominoach
192
12k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
650
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Embracing the Ebb and Flow
colly
88
5.2k
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