これは ドリコム Advent Calendar 2019の7日目です。

6日目はてらこさんによる、ゲーム企画メンはプラットフォーム企画メンに転生できるのか です。

はじめに

ゲーム事業本部開発部のondaです。普段の業務はゲームアプリの運用開発を行っています。


アプリもリリースしてからしばらく経つと、いろいろ作業的に無駄に見えるところや、リリース時に手が回らなくて暫定対処のまま来てしまったところを改善したいなーとか思うところが出てきます。
今回はそういった中から、わざわざ人手を使ってしたくない作業を効率化しようというお話です。

人間がすべきでない!

というと過激に聞こえるかも知れませんが、つまり
  • コマンド打つだけとかの単純な作業
  • 反復的に何度も行われる作業
  • 誰がやっても同じ結果になる作業
は人手で行わず、その分の手間や時間をクリエイティブな作業に当てられるようにしよう、ということです。

自動化するとこんなメリットが

無駄な手間が削減できる

もちろんこれが一番の目的です。反復実行される頻度の高いタスクほど効果が高いですが、頻度が低くても単純作業であれば自動化すべきだと思います。

人為的ミスが減る

手間のかかる作業になるほど人間はミスをするものです。機械にやらせることで少なくともコマンドの打ち間違いなどオペレーションのミスを無くすことができます。

ボトルネックの解消

作業自動化はエンジニア以外の職種のメンバーにも恩恵をもたらします。手順の単純化をしたり、Webやチャットボットをインターフェースにすればエンジニアでなくても作業を実行することができます。エンジニアに作業を依頼する必要がなくなり、エンジニアもそれによって作業を止められることがなくなります。チームのみんなに感謝されることうけあいです。

空いた時間を有効に使える

こうして空いた時間は開発作業、クリエイティブな作業に当てられます。プロダクトの品質向上になります。

どんな作業を自動化できる?

単純な作業の反復

データ更新などで大体いつも決まったコマンドを打っているような作業はどんどん自動化すべきです。毎回同じことをやっているな?と少しでも思ったら、自動化を検討したいところです。

頻度の高い作業

開発中のテストビルドなどは頻度が高く工数もかかるので、手作業で行うのは避けたいです。jenkinsなどのCI環境が最大限に効果を発揮できます。

属人性の低い作業

誰がやっても同じ結果になる作業でしたら、自動化すべきです。何か属人化している作業があったら他のメンバーに一度振ってみると、これ自動化やれそうだな?と気づくことがあります。(知見の共有にもなります)

どうやって自動化する?

例えば、単純なコマンドの羅列であればシェルスクリプトやバッチコマンドにしてしまうだけでも十分効果があります。シェルスクリプトでできることであれば、大抵はjenkinsなどのCI環境によってより簡便なインターフェースにすることができ、反復実行にも対応できます。シェルだとちょっと面倒な場合はPythonやRubyも使えます。

筆者の所属プロダクトでは、アプリのUIで表示するテキストの更新作業に以下のような手順が必要でした。
  • テキストがまとめられているGoogle Drive上のスプレッドシートを編集
  • スプレッドシートをxlsxファイルとしてダウンロードし所定のフォルダ内に入れる
  • Pythonスクリプトを実行し、日本語用のリソースファイルを生成
  • リソースファイルを別の所定フォルダにリネームしてコピー
  • 多言語対応のミドルウェアで出力処理
  • 作成されたファイルをコミット、マージ

これを改めて自分で担当した時、スプレッドシートの編集だけは人手になってしまいますが、それ以外の作業は単純な手順なので自動化できると思い、提案・実行しました。
  • スプレッドシートのダウンロードはRubyスクリプトで行う
#!/usr/bin/ruby
require "google_drive"

# セッション情報のロード
session = GoogleDrive::Session.from_config("google_drive_config.json")

# 翻訳シート取得
spreadsheet = session.file_by_id("XXXX")

# xlsxで保存
spreadsheet.export_as_file("XXXX.xlsx")
  • ミドルウェア作業はUnityEditor上のものだったのを、コマンドライン(バッチビルド)で実行できるように修正
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -logFile ./build.log -projectPath ${WORKSPACE} -executeMethod ClientString.ScriptRunner.Run
  • 上記のように手順を全てシェルで行えるようにし、jenkinsジョブ化
  • コミット・マージ(プルリクエスト作成)まで、GitおよびHubコマンドで対応
# ブランチ作成
UPDATE_DATE=date '+%Y%m%d%H%M%S'
BRANCH_NAME='feature/language_update_'$UPDATE_DATE
git checkout -b $BRANCH_NAME

git add Language_ja.txt

COMMIT_MESSAGE='テキスト更新'$UPDATE_DATE
git commit -m $COMMIT_MESSAGE
git push -u origin $BRANCH_NAME

# PR作成
RESULT=hub pull-request --no-edit -b ${target_branch}

if [ -n ”$RESULT” ]; then
  echo -e "PULL_REQUEST_URL=$RESULT"
  git checkout ${target_branch}
  git branch -D $BRANCH_NAME
else
  echo 'PR作成失敗'
  exit 1
fi

exit 0 
さらに、プルリクエストが生成されると、Chatworkにbotが知らせてくれます。
このURLをクリックしてマージすれば作業完了、とても簡単になりました。
これで、頻度としては手動だと1回に10~20分はかかっていた作業時間が自動化で5分以内で完了できるようになり、週に1~2時間程度の作業時間削減になりました。

その他の事例

他にも効率化の一環でこんな作業を自動化し、効果をあげてきました。
  • 画像インポーター
    • 2Dのバナー素材などのインポート設定をデザイナーさんが手作業で行っていたものを自動で行うようにして、手間・設定ミス削減
  • ビルド内容の自動通知
    • 提出ビルドの確認をするのに、エンジニアが手作業でビルドパッケージを解凍し目視で設定確認していたのを、ビルド完了時に自動で内容をダンプしChatworkにポスト。確認はポストの内容を見るだけでよくなった
  • アセット用Gitブランチの作成
    • イベント施策で公開するバナー画像などのアセットはリリース日ごとにGitブランチを作成して管理しているが、他に細かい設定が必要で、これを毎回エンジニアが依頼を受けて手作業で作成していたが、jenkinsを使ってジョブ実行するだけでエンジニア以外の人でも簡単に作れるようにした。デザイナーさんは毎回エンジニアに依頼して待つ必要がなくなり、エンジニアは差し込み依頼を減らせた。また、本番反映したブランチは手作業で削除していたが、これも自動でタグを打ち定期的に削除できるようにした
  • アセットのエラーチェック
    • 設定が間違っていたりするアセットがあった時、テストで発見されると毎回目視で設定が間違っているものを探していたりしたが、エラーチェックを作成し毎日実行することで簡単に検出できるようになった。(ただし上記の自動設定が効いていればエラー自体がほとんどなくなりますが)

自動化を推進しよう

こうした改善施策は通常の開発業務に比べると優先順位が下がりがちで、なかなか着手できないのが運用プロダクトの常です。自動化の開発自体もノウハウがないと(効果が高いとわかっていても)面倒だったりもします。
チームの誰かが強い意志を持って推し進めることが必要です。チームの理解を得ること、ここをこうするとこれだけの効果が期待できます、などなるべく具体的な提案をすること、タスク (スクラム開発であればストーリー)を動かすための余地を作っておくこと、などができているとやりやすくなると思います。

まとめ

  • 単純作業は自動化しよう。自動化により時間の削減、ミスの防止、プロダクトに対する貢献につながる。
  • 空いた時間をクリエイティブな作業に当てれば品質向上につながる。
  • 強い意志を持って自動化を進めよう。

ちなみに、たまにこうした単純作業が気晴らしや頭休めになるという理由で人力で行いたがる人もいます(例えば自分とか)が、休憩が必要なら素直に休むべきですね。そうした時間を作ることができるのも実は最大の恩恵かも知れません。

さいごに

明日は尾﨑さんの記事です。
ドリコムでは一緒に働くメンバーを募集しています!募集一覧はコチラを御覧ください!