マスターデータ管理を優しくExcelから解き放つ (ドリコムアドベントカレンダー9日目)
-- 2017/12/09 00:01
ドリコムアドベントカレンダー9日目
前日は@onkさんの「ドリコムの Gemfile 記述スタイル」です。
自己紹介
奈良阪です。
こんなアイコン
株式会社ドリコムに新卒で入って3年目、スマホゲームサーバーのRailsとか、新規サービスのTypeScriptとか、Elixirとか、少しPythonとか、なんかよくわかんない組み合わせですがどれも並行してざくざく書いてます。
なお弊社最近JavaScript開発知見がなかったので、むしろしがらみなしに趣味でやってた自分好みのTypeScript開発体制をスッと入れられてほくほくしています。有識者目指していく。
最近github.com/Narazakaの上の方に上がってきたswagger云々とかのTypeScriptのプロジェクトは、仕事で環境整備しているのの切れ端だったりします。
趣味では伺かというデスクトップマスコットのWeb移植版を作ってたけど時間が取れずに停滞してたり、RPGツクールで同人ゲーを細々ツクってたり、漫画を読んだり描いたり、鉄道に乗ったり、アニメやギャルゲのオープニングムービーを愛でたりしてます。
マスターデータ管理を優しくExcelから解き放つ
これは筆者が新卒でスマホゲームの運営に入って感じた「マスターデータのExcel運用」のしんどさを解消するために開発・導入した、ドリコムにおける新しいマスターデータ管理方法(2プロジェクトで運用中)を紹介する記事になります。
(地味に社内向け紹介記事も兼ねていたり)
以下スマホゲーム運営関係ない人向けの前振りが長いので、そんなことはいいからどんな手法か知りたいという方は「YAMLをExcelファイルに逆変換できるツール、作りました。」とか「seedtableでの運用方法サンプル」の章から読んでください。
マスターデータとは
さて弊社、スマホゲームを主要事業の一つとしています。
スマホゲーム業界において特徴的に見られて、かつ聞くところによると近隣他業種にはあまり見られないらしい問題として、「マスターデータ管理」というものが存在します。
よくあるスマホゲームでは、ユーザーに関係なくあらかじめ運営者が設定しておくべきデータ(例えばキャラクターのパラメーターなど)があります。これをマスターデータと呼びます。
多くのスマホゲームは出して終わりではなく継続的にイベントなどをリリースして行く運営スタイルであるため、そのマスターデータの更新操作や新たなデータ形式の追加が頻繁に発生します。
その頻繁さたるや、最終的にユーザーに公開するタイミング以外にも、その前段に入るゲーム特有の「バランス調整」という作業により、開発環境では数分に一回ペースで更新が走ることもあります。
(最近のコンシューマゲームなどではDLCなど継続更新運用っぽいことをしている場合もあるので、同じ悩みを抱えていたりするのでしょうかね……?)
さて、そんな無茶苦茶な頻度で更新されるゲームデータをゲームプランナー(企画)さんが入力するツールはというと?
みなさんおなじみ、Excelです。
Excelは使いやすい
Excel、特にプログラマ中心に人によっては複雑な感情を持っていたり、または忌み嫌っていたりするツールだと思います。しかしそんな人が出るほどにあらゆるところで使われている所以、「誰でも使えてカスタマイズしやすい多機能な表計算ソフト」として確立された性能は優秀の一言に尽きます。
プランナーさんがデータ入力する時、同じデータや連番IDをジャッと一発で入力したり、数式でいろんなパラメーターを体系的に弾き出したり、いい感じにメモしたり、セルに色つけて注意を促したり、VLOOKUPでまとめシート参照して定型値ブチ込んだり、まあ我々横から眺めているプログラマーたちからするとよくそんなに色々やるなというレベルでいろいろされます。
それもこれも効率の良いデータ作成のため。
Excel並に使いやすい(←これハードル高い)専用ツールがあれば一番良いのでしょうが、大抵はデータベースのテーブルにそのまま値を突っ込む作業になりますし、(慣れもあるでしょうけど)がっつりツールを作りたいっていう企画の人は今の所弊社にはいないようです。
近い他社の人に聞いてみても今の所みなExcelで、専用のツールがあるという話はまだ聞いていません。(あったら教えてください)
Excel(.xlsx)の管理はしんどい
そんな使いやすいExcelにも適用範囲が存在します。
Excel上で一人で表形式データの編集をする時のみがExcelが使いやすい利用ケースです。
それ以外の
- プログラムで扱う
- 複数人で同一テーブルを編集する
- 編集差分を取る
- 自動化する(詳しくは、拙作スライド「VBAナメてた」をご覧ください)
- バージョン管理をする
などのマスターデータ運用においてよく出てくるユースケースについては軒並み激烈に相性が悪いです。
つまるところ
- プログラムで扱うために変換するのに(Rubyとかだと特に)時間がかかり、データ反映イテレーションが遅い
- Excelと変換後データが時々ずれたりする- 複数人で同時にテーブルをいじると、自動マージできないのでたびたび関係者で話し合って手作業マージすることになる
- Excelの中身をアプリに入っているデータと簡単に突き合わせられないので、ある時点でのデータを修正したいという場合にExcelマスターのリビジョンを探すのが面倒
- gitリポジトリ容量がめちゃくちゃ膨れる
などの現象が起こります。
基本的にExcelの保存形式(.xlsx)が妨げになっている感じはあります……。
逆にこれらと相性が良いのはテキスト形式です。
CSVやJSONやYAMLなら「複数人でいじるためにgit管理して差分を見たりマージしたりする」「プログラムで自動化する」なんてのは朝飯前でしょう。
しかしJSONやYAML形式をそのまま編集するのは苦痛の極みだと思います。
CSVにしたって、Excelの式とか色とかメモとかマクロとかが軒並み使えないので編集しやすさには雲泥の差があります。
なおこの中で一番git差分が見やすいのはYAMLだと思います。カラム値が変わるのがちょうど1行差分になるのでCSVとかと比べてごっつ見やすいです。
ExcelのUIでYAMLをいじれれば最高なのでは?
思った。
「使いやすい編集UIであるExcel」で「使いやすいデータ形式であるYAML」を編集できれば最強なのでは……と。
でも現実的にはExcelファイルをYAMLに変換はできるけれど、YAMLをExcelファイルに逆変換することは不可能なので、この構想は実現できない……。
YAMLをExcelファイルに逆変換できるツール、作りました。
そう、できなかったので自分で作りました!
seed-ui/seedtable と言います。
Readmeに書いてある通り、
というExcelファイルと
data1:
id: 1
name: さくら
description: F.I.R.S.T
data2:
id: 2
name: アルル
description: ボク
data3:
id: 3
name: さっちゃんさん
description: 髪が長い
というYAMLが相互変換できます。
YAMLのデータをxlsxファイルにほぼ安全に書き戻せます。
・書き戻しても数式もマクロもそのまま!
・書式設定や入力規則も(列ごと限定ですが)大体残ります。
・(条件付き書式は怪しいところがあるらしい……。あとマスターデータのシート自体にそんなに入れないのではないかと思いますが、グラフとかOLEオブジェクトは無理です。)
Excelの便利な機能を大筋損なうことなく変換を可能にしました。(EPPlusライブラリ様様です)
CUI版もGUI版(設定してからxlsxファイルをD&Dするだけ!)もありユーザビリティも十分。monoを使えばLinuxやMacでも動作するのでCIとかにも入れられます。
というわけで、このツールによって、「使いやすい編集UIであるExcel」で「使いやすいデータ形式であるYAML」を編集することができ、新たなマスターデータ管理の可能性が拓けるはずです。
seedtableでの運用方法サンプル
説明用に下記のようなサンプルリポジトリを作りました。
seedtableを利用し「使いやすい編集UIであるExcel」で「使いやすいデータ形式であるYAML」を編集する、弊社における新しいマスターデータ運用方式の例です。
これは実際にseedtableを導入した新規スマホゲーム2プロジェクトでのマスターデータリポジトリを、雰囲気でサンプル用に再現したものです。
master_dataがアプリケーションのDBに入れるマスターデータです。
gitで差分がわかりやすいように、IDごとに分割されたYAMLファイルになっています。
これをてきとうなスクリプトで不要カラムを消し、テーブルごとの1ファイルYAMLにまとめるなどして、最終的なDB投入コマンドにかけます。
マスターデータをExcelで編集する時は、Readmeの「Excelでデータを編集するときの手順」にあるように、
1. ゲームプランナーなどが自分のPC上で、master_data内のデータが入ったExcelファイルをExcelテンプレートファイルから生成(seedtable-guiにD&D)
2. 適当に編集
3. 編集後データが入ったExcelファイルからmaster_dataへとデータを書き出し(同じくseedtable-guiにD&D)
という手順で行います。
単純なExcel編集の前後に操作が増えていますが、ごく簡単な作業なので、得られるメリットに対して許容できる範囲ではないかと思います。(弊社では実際これで回りました)
Excelテンプレートは基本的にアプリケーションにテーブルを作るエンジニアなどが最初にExcelで作り、適宜カラム追加や式が必要な時などにメンテしていく感じです。
・1行目にカラム名の説明(ID、名前、等)
・2行目にカラム名(id、name、等)
・3行目にID=1のデータを作って数式や書式を設定します。
Excelテンプレートに数式や書式設定をいれておくと変換後のExcelにも反映されるので、便利に編集が行えます。
seedtableが担う部分はExcelとYAMLの相互変換の部分のみなので説明としてはこれだけですが、こうすることによって、Excelファイルがほとんどプログラム側に出てこないようになります。
gitリポジトリからして単にYAMLの差分を見る場所になりますし、実質Excelが登場するのはほぼプランナーPC上のみです。
中央集権で変換することもなくなるのでデータ反映もはやくなります。
これまで大元がxlsxファイルであったマスターデータが本質的に大元YAMLファイル形式になることによって、マスターデータはマージできて、差分が見られて、本来のバージョン管理ができるものになります。
これ以外の.xlsxな差分はナシ!
seedtableと今後
これによってプランナーPC上でExcelからYAMLファイルが生成できるようになったということは、Excelの機能性の恩恵を受けつつ、かつその上で十分簡単にほかのプログラムもマスターデータを扱えるようになるということです。
というわけで試しに activehashie-validation というデータチェックツールを作ってみました。
プランナー手元でデータをExcelからYAMLに書き戻した後にバッチファイルを叩くことで、PC上ですぐにデータチェックが完結します。(導入したてなのでバッチファイルですが、需要があればファイルのwatchなんかもしたいです)
データ不整合チェックはもちろん、全マスターデータを読み込む任意のチェックがかけるので、「運用上こうするべき」といったようなゲームに密着したチェックも書けるはずです。
こんな感じのHTMLが出力されます(リポジトリにあるexample)
特徴としては、TypeScript製でありながらActiveRecord/ActiveModelっぽいAPIなライブラリになっています。(弊社サーバーが主にRuby on Railsなので学習コストを鑑みた結果)
TypeScript、つまるところJavaScriptなのは、プランナーPCにnode.jsやelectronなzipをダウンロードさせるだけでほかのインストールなしに使えることを重視したからです(Rubyなどだとランタイムセットアップの手間と維持コストがある)。
ただ、アプリサーバーと言語が違う(RubyとTypeScript)こと、アプリサーバーと別プログラムであるためテーブル定義は実質同じことを2回書くことになるなど、ややメンテナンス性に課題はあります。(テーブル定義についてはスキーマから自動生成とかしたいですね……)
しかしともかくこういった手元チェックツールを同時に導入することで、Excelを使った快適なデータ編集とこれ以上なく素早いデータチェックが実現し、本質的なゲームの価値担保のみに注力するための土台が整うのではないかと思います。
まとめ
・弊社ではExcelをスマホゲームデータ入力に使っていたがつらみがありました。
・ExcelでYAMLを編集できればいいのではという着想から seed-ui/seedtable というツールを作りました。
・新規プロジェクト2つにseedtableを使った新しいマスターデータ管理方式を導入し、運用しています。
・新しいマスターデータ管理では
・マスターデータの手元変換、手元差分チェック、手元データチェックによる素早いイテレーション
・ほとんどの複数人編集コンフリクトの解消
・リポジトリ軽量化
などが見込め、マスターデータ管理がプログラマーにもプランナーにも優しくなります。
・seed-ui/seedtable はオープンソースなので、ぜひ同業他社などで悩んでいる方がいればお気軽に使っていただき、またわからないことがあれば @narazaka までお問い合わせください(Twitterとかissueとかなんでもどうぞ)。
・手元データチェックツールとして activehashie-validation というのも作ってみて試験運用しています。こちらも何かあればどうぞ。
いつともしれない未来に理想のツールができるまで、Excelとの付き合いは続きます。
どうせ付き合うならExcelユーザーとプログラマー、お互い幸せな付き合い方をしてゆきたいですね。
参考: Google Spreadsheet
Excelの代替ツールとしてGoogle Spreadsheetがよく挙げられると思います。
しかし、Excelの多機能さやある程度の軽快さをGSが持っていないこと(というかGSが重い)、慣れ親しんだ操作感との違いなどの要因からか、比較した時の評判はあまり芳しくないようです。
またGSは同時編集も大きな特徴としていますが、実際途中まで使ってからこのExcel+YAML新方式に切り替えたチームに聞いたところ
・同時編集できても、反映タイミングは人によって違うのでメリットになっていない
・同時編集"できちゃう"ので予期せぬデータ変更起きそうな気がした
という意見が聞かれて、必ずしもマスターデータ運用に対して有利に働くものではないようです。
弊社でも1プロジェクトがGoogle Spreadsheetを使っているので普通に運用可能と思いますが、GSと上記方式それぞれ一長一短があるという印象です。
- 関連記事
-
- マスターデータ管理を優しくExcelから解き放つ (ドリコムアドベントカレンダー9日目) 2017/12/09
- TypeScriptでのツクールMVプラグイン制作+α (RPGツクールMV Advent Calendar 4日目) 2017/12/04
- DBD::SQLiteがコアダンプはいてたのなおした 2016/05/15
- 研修で新規ゲームアプリをモデルとビューに分けて作ったり色々したら捗った話 2015/12/20
- Webでいまいちくすぶっている技術をElectronにのせると格段に便利になることがある気がする 2015/12/07
コメント