PHPカンファレンス2020 レポート

PHPカンファレンス2020 レポート[前編]

この記事を読むのに必要な時間:およそ 3 分

髙野祐輝さん「長期運用を目指す『Shadowverse』におけるリファクタ事例の紹介 〜テストの導入とメンバーへの普及法〜」

Cygamesの髙野祐輝さんは,サービス5年目を迎えたShadowverseがこれから10年,20年と続くコンテンツへと成長させていくためのテストを活用したリファクタについて話しました

画像

Shadowverseにおける開発と,そこから生じた課題

Cygamesでは「最高のコンテンツ」を作る会社として,プリンセスコネクトRe:Dive,Shadowverse,グランブルーファンタジーなどのゲームを企画・開発・運営しています。

Shadowverseはサービス5年目を迎えたカードイラストの対戦型DCGで,eスポーツイベントも行われています。現在でも3ヶ月に一度大型アップデートを行っており,新規機能の追加や既存機能の改修,不具合の修正などをしています。サーバー側では実に1,400コミット,約4万行の変更を行っています。髙野さんは「限られた時間の中で最高のコンテンツを届けられるよう各メンバーが心がけている」と話しました。

画像

限られた時間でアップデートを行うため,様々な問題が発生します。たとえば,コードの綺麗さだけでなくスケジュール等を意識した結果,コードの可読性が低下することや,機能の追加実装を効率重視で元の担当者に依頼する事が続き,コードの属人化が進むことなどが挙げられます。

ユーザーが特定の条件を満たした際,ユーザーにカードパックやゲーム内通貨などのインセンティブが発生する「ミッション」という機能があります。リリース初期のミッションはストーリー,デッキ編集,バトル系,アカウント連携など,種類が少なく管理も簡単でした。それが増改築を繰り返し,現在ではバトル系のミッションが特に増加し,その数が350種類を超えました。そこで,新規ミッションの追加が容易で,デバッグ工数が低いコードにしたいと考えるようになったそうです。

しかし,こういった大規模な機能のリファクタリングは,リスクとデバッグコストの懸念があり,なかなか着手できない状態にありました。

課題解決のためにテストを導入

転機となったのは,社内で開かれた勉強会で,外部講師を招きテストについて学ぶことができたそうです。

テストとは書いたコードが正しく動作しているかを確認するためのプログラムのことです。テストが失敗していたらコードを修正し,テストがすべて成功なら実装完了となります。また,入力と出力が明確であるほどテストが書きやすくなるので,テストの書きやすさを意識する事は良いコードを書くことに繋がります。

テストを導入することによって期待できることは,不正操作による異常系,通信のタイミングによって発生する異常系などの動作確認が容易になることです。他にも,イベント開催処理を変更したあとの動作確認時、テストコードを書いていれば,実機での動作確認に比べ素早く挙動確認がとれることなどを挙げていました。ミッション機能をリファクタしたいという思いと,テストの社内勉強会というきっかけから,テストを活用してミッション機能をリファクタしようと動き出すことになったそうです。

テストを用いた,ミッション機能のリファクタ

今回リファクタにおいて気をつけたいのは,テストが,リファクタの成否を担保するためのツールだということです。in/outを確認できるテストを書き,リファクタを行い,in/outの結果が変わってなければリファクタ成功という流れになります。

では,どれだけテストを書くといいのでしょうか? すべてのミッションについてテストを書くのが理想ですが,その数は膨大なため,ある程度の粒度でミッションを絞ったり,テストが必要な要素を抜き出したりして,一部のミッションについてテストを書いていったそうです。大きなスコープでテストを書いてからテストを細分化していくのが重要だということです。

ミッション機能のリファクタの結果,巨大になっていた処理を細分化できたこと,またテストによってコードが単一責任原則に立ち返ることでコードの品質が向上したと言います。他にも,大規模リファクタにも関わらずバグがほとんどでなかったことを挙げていました。しかしテストで想定できていない箇所にバグがあることもあったそうです。テストを書いていてもきちんとデバッグが必要だと述べていました。

プロジェクトにテスト文化を根づかせる

Shadowverseは10年,20年の運用を目標としており,その間に多くのリファクタが必要になります。そのため,メンバーの多くがテストをかけるようになるとよりよいと考えているそうです。しかし,いきなりテストを書いてと言ってもなかなか普及しません。テストを書く文化を根付かせるため,テストが普及しづらい原因を探ったところ,テストを書く環境がないことや書き方がわからないなど,テスト初心者に立ちはだかる壁が存在していることがわかったそうです。

そこでこのハードルを徹底して下げることが重要だと考え,支援することにしました。まず,テストを行う環境構築は手順書やスクリプトの作成をしました。テスト作成についてはテストコードのレビュー,リファクタ案件をテストを書いてリファクタする案件にしました。また,CIツールによる自動テストを行い,テスト結果を社内ツールに通知するようにしました。

テストのハードル下げにこだわった理由は,テストに触れてみようと思ってもらうことと,カスタマーサポート最優先にしてユーザーのことを最優先に考えているため,不具合対応を素早くおこなえるようになるためだと言います。テスト駆動開発をするようになって,高速に実装でき,可読性の高いコードを書くことができるようになったと話していました。コードの属人化に解消の兆しもみえるようになりました。

そしてテストコードを整備することで,保守コストに図に挙げる変化がみられるようになったと紹介しました。

画像

まとめ

髙野さんは,長期運用中の大規模プロジェクトコードに対しテストを導入したことと,プロジェクトにテスト文化を根付かせるプロセスについて説明しました。⁠最高のコンテンツを目指してテストを導入し,成果を挙げることができた」と述べていました。

著者プロフィール

田添春樹(たぞえはるき)

広島工業大学所属。PHPは大学一年生の頃に触り始めて,いまではLaravelなどのフレームワークを使い個人開発を行っている。

Twitter:@jdkfx

バックナンバー

PHPカンファレンス2020 レポート