ISUCON8予選に参加した

はじめに

ISUCON8の予選にチーム名「GrilledMeat」で参加しました。
結果はfailのまま終了するという残念な結果でした。
その後延長期間として1週間ISUCON予選の環境を提供していただいたので当日できなかったことを試しました。
延長期間で試したことを含めて振り返ります。

実力不足を痛感させられるような素敵な問題を出してくださっただけでなく、このような振り返りの機会を用意してくださった運営の皆さま、本当にありがとうございます。

事前準備

  • 使用言語をGoにするということで入門書を読む。
  • プロファイラをいち早く揃えられるように Ansibleを用意した。
    • 内容としてはalp, slackcatをダウンロードしつつミドルウェア(MySQL,nginx)のconfigを基本的なものに置き換えるもの。
    • configの置き換えについてはプロファイラ向けの記述を省略する意味では便利だったが、既に動作しているアプリケーションがあるのにとりあえず書き換えておくというのはあまりよくなかった。

当日

  • サーバーに入ってミドルウェア構成を見たり、ブラウザからサービスを閲覧して調査を行う。
  • h2oに対する知見はなかったが、当初はh2oをうまく使いたいと思いnginxへの置き換えを考えていなかった。
  • h2oのconfへalp向けにtsv形式でのログ出力を追加し、slow-queryの出力をするように設定変更。webapp動作言語もGoに切り替えてベンチマークを回す。
  • ベンチマークの結果に基づいてindexを適当に追加してみるなどしてみたがスコアに変化はなかった。
  • pprofも入れて再度ベンチマークを回す。getEvent、getEventsを改善するのが効果的だと判断し、そのあたりのコードを読むことに。
  • getEventsのselectをまとめてアプリケーションで処理するように修正。スコアは22000くらいになる。
  • 引き続きクエリをまとめたり処理の効率化を図ったが改善せずfailを繰り返すようになった。
  • sheetsをハードコードしたり、いらない処理を消していった。継続的にベンチマークを回し、failしないパターンに当たり最高点である約26000を記録する。
  • failを止めようにも止め方がよくわからなかったため、h2oを使って複数台構成を試みたが、failが頻発したまま終了した。

反省

  • failせず安定してスコアを出し続けられるように対応する必要があった。他の細かな実装の改善よりもこちらの方が重要だったと思う。
  • h2oからnginxに切り替えるべきだった。h2oをうまく利用するべきだと思っていろいろ調べていたが、その調べる時間でアプリケーションをより良くすることもできたと思う。
  • 役割分担について明確にできていなかった。本番をイメージして時間を区切って過去問を解くといった準備が足りなかった。

感想戦

  • 本番ではgetEventの改善やindexの修正が不十分だったため、それらを感想戦で試した。
  • failが頻発する問題についてはロックなども試したがうまくいかなかった。結果としてreportのところにsleepを入れる方法でベンチマークは安定した。
  • 複数台構成、Redis利用は試すことができなかったが、アプリケーションとインデックスの改善のみで最終的に以下のスコアになった。 f:id:shintaro-watanabe1226:20181002091954p:plain

全体振り返り

  • 結果論ではあるがアプリケーションコードとDBの改善のみで一定以上のスコアになった。
  • あれこれ試してみたいと思い当日の限られた時間を有効活用できなかったことが良くなかった。
  • 安定的にアプリケーションを動作させるということはISUCONでスコアを稼ぐことだけでなく、普段でも重要なことなので、そのための知識や経験を得ていきたい。
  • 次回は時間の使い方を意識して、自分のやることのスコープを絞ってより良い結果を出せるようにしたい。

LINE Developer Meetup in Tokyo #39 Testing & Engineering

line.connpass.com

LINE Developer Meetup in Tokyo #39 Testing & Engineeringのレポート。

イマドキのソフトウェアのテストやQAの考え方

www.slideshare.net

スライドの中身が非常に多く、以下に抜粋して説明された内容のメモをまとめる。

労働のスケールアップから知のスケールアウトへ

目的なくテストを厚くするために人的コストの投入量を増やす「労働のスケールアップ」ではなく、
プロダクトの価値の最大化のために技術を活用して効率的に品質保証を行う「知のスケールアウト」をしようという話。

知のスケールアウトを促進するような品質保証戦略を立てる

  • 技術を活用するといっても流行りの手法を闇雲につぎ込めばいいという話ではない。
  • バズワードに振り回された戦略は必ず失敗する。
  • 大事なことは事業や開発力といった組織全体のコンテキストに合わせた品質保証戦略を立て、それに基づいたフローや自動化を導入すること。

品質保証戦略を立てる際に考えるべきパラダイム

  • 品質保証とは納得のマネジメント、価値の最大化に自信を持つ行為。
  • ソフトウェアという目安となる指標を算出できても測ることはできないものを無理に測ろうとしない。
  • デベロッパーとQAでミッションをシェアし、違和感があれば進捗を止めて納得感を上げる活動をQAが促進する。
  • その中で単純作業を自動化し、自動化によって思考に使える時間が増加した割合、納得度に対して自動化の価値を見出す。

テストにもエンジニアリングアプローチが必要

  • 測定や手順による品質の保証はできない、テストは3 × 5 × 3=45種類の保証動作の重ね合わせ価値の最大化に自信を持つ行為。
  • テストアーキテクチャは設計における責務の分担と配置と同様である。
  • テストアーキテクチャはすでに様々なものが存在するが、組織に合ったものを考える。

テストの自動化

Fully-automated VSTeP
テストの要求分析、アーキテクチャ設計、詳細設計を自動化する。
テスト、QAにも投資が必要。

感想

単純にテストをこなすのではなく、何のために品質保証をするのかを考え組み立てていく上で、フレームワークや自動化を取り入れていくということを意識させられる話だった。 盲目的にテストを継ぎ足していくということではなく、新しいテストを追加する目的とそれで得られる価値をより深く考えていきたい。

LINE のUI自動テスト事例

www.slideshare.net

LINEのテスト自動化事情

  • グループ全体
    • 各開発拠点でそれぞれにQAチーム、自動テストチームを持っている。
    • 拠点ごとに見ているプロジェクトが違う、テストの粒度ややり方も違う。
  • LINE Fukuoka
    • かつてQA組織はあったが自動化に特化したチームはなかった。 今回はLINE Fukuokaの自動化特化チームが作ったE2E UIテスト(for iOS,Android,Browser)の話。

ツール選定

  • ツールとしてはオーソドックスなものを使っている。
    • 傾向としてはJava系のツールをよく使っている。
    • Javaで書かれたプロダクトが多く、ライブラリも多く、とっつきやすいため。
    • 代表的なものではSelenium,Appium,Jenkinsなど。

テスト自動化で気をつけていること

  • Stability
    • 基本に忠実に。
    • 不安定な実行環境を作らない。
  • Maintainability
    • UI変更に対して強く。
    • テストをしやすいプロダクトを作る。
  • Readability of the test result
    • テスト結果を全員にとって見やすいものにする。
    • 非エンジニアがログを生で見ても的確な情報は得られない。
    • わかりやすい可視化をするためのレポートツールを作成。

LINE STOREでの事例

  • リリースサイクルが早い。
    • リグレッションテストの需要が大きい。
  • 既存機能に対するテストは自動、新機能に対しては自動テストの準備が間に合わないという都合もあってManual QAも入るハイブリット。
  • 大規模な更新の場合、Manual QAでのバグ発見件数が多くなる。
  • 自動テストは実装したことしかテストしてくれないのでテスト選定が重要。
  • 自動テストの導入は人的コストの削減には至らない。(狙っていない)
    • 自動化にもコストがかかる、テストを増やしてもメンテナンスコストもかかる。
  • 全てを自動化することが善ではない。

チームの指針

  • E2Eのテストを全てQAチームで作るのは無理。
    • Engineerと積極的に協業する。
  • 全てをE2Eで解決しようとはしない。
    • コストも膨大になる。
    • テストを作ることが目的化するとメンテナンスできずにテストが腐っていく。
  • 開発チームが仕事しやすくならなければ意味がない。
    • リファクタに対する躊躇など、やりたいことを阻害する要因をカバーする。
  • テストを書くことが辛いことになってしまっては意味ない。
    • テストがあることで楽に開発できると思ってもらえるようにしていく。

感想

全てをただ自動化しようとするのではなく、人によるQAと自動テストの役割・価値を考えてコントロールされている良い事例だと思った。
E2Eテストや可視化ツールなど揃えておきたいものを揃えつつ、自動化やツールで全てを解決できると考えないことが品質を保ち続けるために必要な考え方だと思った。

An Agile Way As an SET at LINE

www.slideshare.net

SETとしての活動

  • SET部隊の立ち上げとテスト自動化の推進がミッション
    • SETに対する共通認識がない、そもそも問題の言語化ができていない。
    • 遭遇した課題
      • 何を為すべきかわからなかった
      • テスト対象システムの詳細を知らなかった
      • 幅広い関係者の支持・協力が必要だった
    • 解決方法
      • 何を為すべきなのかを見つけ出す
      • トライアル&エラーで高速に学習する
      • 定期的に進捗と成果を見せる

何を為すべきなのかを見つけ出す

SETに対する共通認識がない、そもそも問題の言語化ができていない。

  • アジャイルの要素

    • プロダクトディスカバリー
      仕様は絶対的ではない、仕様は仮説、SETがやるべきことも仮説設定
  • 共通認識づくり

  • 施策、目標の策定
  • 継続的合意形成 ビジネスの3KPI(売上・利益・従業員満足度)に基づいて施策の優先順位づけ、効果測定を行なった。

現状把握・課題発見・言語化

  • テスト対象システムの解析
    • 静的コード解析によって技術的負債を見える化、共通認識を作る。
  • 障害報告はヒントの山
    • 障害報告から情報をかき集めてくる。
  • 困っている人と直接対話して言語化する

施策・目標案の策定

  • 障害の頻度と金銭的被害の大きさをKPIとする。
  • 障害検知速度の向上とMTTRの短縮に絞った。
  • デベロッパーの自律的テスト作成の土壌づくりをする。

共通認識を作る視点はビジネスKPIに基づく。
プランは必要ないがプランニング(ゴールと施策の定期的な見直し)は必要。

トライアル&エラーで高速に学習する

自動テストを活用したプロダクトの仕様・設計の把握。

  • アジャイルの要素

    • Extreme Programingを活用した高速な学習の仕組み
  • 動かしてみてわかることが多い。

  • 動かしても壊れないことが理想。
    • プロダクトとテストスクリプトを適切に作っていればプロダクトを壊さない。 = 安心して失敗できる、心理的安全性につながる。

定期的に進捗と成果を見せる

多くの人と協力関係を築く必要がある。

  • アジャイルの要素

  • ビジネスの3KPIの活用

    • 売上・利益
    • 従業員満足
      • 役員・マネージャー
        • ソフトウェアの負債・不安の発見
        • 数値的な報告が必要
          テストのレポーティングを活用、わかりやすい指標を提供する。
      • デベロッパ
        • 知識欲の刺激
          興味を持ってもらえるように刺激を与える。
  • 例:本番APIのSmoke Test

    • 各環境でSmoke Testを動かしている。
    • 絶えず数値をチームに対して送ることで開発チームのMTTRを短縮することが狙い。
      • 負荷に対するインフラの障害や脆弱性も検知できた。

今後の課題

ビジネスに絡めたインパクトを出し続けて、より受け入れたいと思わせる。

まとめ

  • 課題を見つけて言語化
  • 協力者を得る
  • 全てのビジネスは3KPIに基づいている
    ビジネスに貢献しよう

感想

定期的に進捗と成果を見せるということが特に良い取り組みだと思った。 品質という概念やテスト自動化の推進による成果というものは、指標はあってもインパクトを測ることが難しいものである。
ビジネスの3KPIに基づいて優先度付けをし、効果測定と事業貢献を念頭に置いて取り組むということが、テストや品質保証に対して前向きな文化の醸成を推進する上で効果的な手段だと思った。
アジャイルの考え方も含めて様々なアプローチでSETの役割・働きを定義して推進しているのはすごいと思った。

全体の感想

とにかく目的を見出してテストを導入するという話が多かったと思う。
世の中には便利なツールも多く存在するが、まず導入するよりも何がプロダクトの品質面で不足しているのか、新しいツールを導入することでどういった価値を生み出せるかを自分の頭で考えて取り組むことではじめて効果が得られるのだと思った。
また品質保証チームから組織の考え方、間違った当たり前を正していくという話も多かった。
自分は開発者という立場で仕事をしているが、テストコードを書いたり品質を保つための改善をし続けることに変わりはないので、今回聞いた話も参考にしつつより明確な自分の考えを持って開発に取り組んでいきたい。

IoT勉強会に行ってきた

先日、IoT勉強会に行ってきた。

connpass.com

内容や感想についてまとめる。

背景

最近スマートホームに関心を持ち始めたこともあって趣味として電子工作に取り組んでいる。
取り組んでいると言っても入門書として有名なこちらの本と
それ用のパーツを買ってちまちま進めているくらいだが。。。

仕事ではサーバサイドエンジニアとして働いていて、
IoTという分野に対して実践的な知識は持ち合わせておらず、
ただプログラミング経験があるくらいである。

今回はイベント名からして自分にぴったりな雰囲気の勉強会だったので参加した。

内容

内容としては加速度センサーが自立! モーション起動スイッチで低消費電力IoTを作ろう!に、
ブレッドボードでの回路の組み方、MOSFETのスイッチング、レジスタやSPI通信の概要
といった話を肉付けしたハンズオン形式の講座だった。

自分としては - FlashAirをマイコンとして利用する - MOSFETのスイッチング - SPI通信 の3点が初めて知る話だった。

今回作ったシステムはデバイスが動作を検知してからスクリプトを動作させるというもので、
制御をハード側に寄せているというのも面白いポイントだった。

感想

今の仕事に関係なく新しい知識を得る、原理を知るということは面白いことだし、
加えてパーツ込みで3,000円という価格だったのはとてもお得に感じた。

IoTの面白みはあれもこれもスクリプトで制御するのではなく様々なモジュールも含めて
何にどのような役割を持たせるかという設計を考えて開発できることだと思った。

これからの課題としてはまだまだどのようなモジュールがあるのかを知らないことにあって、
様々な実装パターンを学び、こういうものを作るならこのモジュールを使う、
という自分としての鉄板構成を持っておくことが必要になると思った。
(この辺はWebアプリケーション開発と変わらないかもしれない。)

引き続き普段の開発とは違った、ある種の頭の体操としての楽しみが得られるものとして触れていきたいと思う。

。。。と思って帰宅したのだが、その後Amazonからのレコメンドで以下の本を見つけた。

電子工作入門以前

確かに電子工作において遭遇する言葉の一つ一つをなんとなくわかった気になって、
お手本通りに作った結果動くものができたという状態から、
まず網羅的に基礎知識を把握してから電子工作における様々な作り方を理解したいと思うので、
次はこの本を読んでみたいと思う。

MANABIYA1日目に行ってきた

3/23,24に開催されたMANABIYA(https://manabiya.tech/)の1日目に行き、
機械学習ハンズオンとインフラ系セッションに参加してきました。

普段はネイティブアプリのサーバーサイドエンジニアとして働いており、
業務で機械学習を活用したりインフラ領域に深く携わることはありませんが、
今後理解を深めていきたい分野のためせっかくの機会と思い参加しました。

Python + Keras + TensorFlowによるディープラーニング実践(入門)

aidemy.net

AidemyのCEO石川氏によるハンズオン形式のセミナー

内容としてはAidemyの機械学習概論(https://aidemy.net/courses/2010)とディープラーニング基礎(https://aidemy.net/courses/5090)に基づいたもので、機械学習に関する解説と深層学習による手書き文字認識、画像認識についてKerasを用いてJupyter Notebook上で実際に動かすといったものでした。

解説がわかりやすくハンズオンでも実際に動かすイメージを持つことができて非常に良かったので、今後Aidemyの各コースも一通り受けてみようと思います。


本気で機械学習やる人のためのハンズオン ~教師データ作成から学習・性能評価まで~

www.slideshare.net

来栖川電算の方々によるハンズオン形式のセミナー

はじめに機械学習の概要と向き不向き、機械学習プロジェクトの進め方について解説がありました。

以下解説メモ

  • 機械学習とは
    • 人間の学習能力や推論能力を機械に模倣させる手法(自動プログラミングの一種)
  • プログラミングとの対比

    • プログラミング:推論のプロセスを人間が考えて記述。実装仕様が明らか。
    • 機械学習:具体的な実装仕様がわからなくても適用可能。ただし膨大なデータが必要
  • 機械学習プロジェクトについて

    • タスク設計とデータ収集・アノテーションが重要
    • タスク設計
      • 機械学習に向いているタスクに落とし込み適用できるか
        • 経験によって精度が上がるものか、データは十分に用意できるか、etc...
    • モデルやデータパイプラインの工夫よりもデータを揃える方が先
      • 認識できるデータか、そのデータから推論できるか
    • サービス運営では溜まっていくデータを活用してより精度を高めていく
  • 機械学習プロジェクトの進め方

    • 仮説検証の繰り返し
    • AIエンジニアとデータ管理エンジニアが協力してルールを考案し、よりよいタスクへ再定義していく
    • 精度評価においてもタスクに応じて見るべき指標が異なってくるため、タスクを確定させていきながら見るべき指標を絞っていく

ハンズオン資料 github.com

ハンズオンはAWS SageMakerを使ってJupyter Notebook上で花札の画像認識の実装を体験するというものでした。

AnnotationFactoryという来栖川電算のプロダクトを用いて作成された教師用花札画像データをSSD (Single Shot Multibox Detector) モデルで学習させる転移学習です。

AWS SageMakerについては日本リージョンではまだ利用不可であり活用事例は少なく費用面も高めなので実務想定の話ではありませんでしたが、Jupyter Notebookの含まれた機械学習を容易に試せる環境として選択したとのことでした。


マイクロサービスアーキテクチャとサーバレスからDevOpsへ

アマゾン ウェブ サービス ジャパン株式会社 プロダクトマーケティングエバンジェリストの亀田氏による講演

AWSの歴史の紹介と設計思想やインフラ技術、開発手法など幅広い解説がされていました。

以下講演メモ

  • AWSの由来

    • cloudではなくweb service
    • web serviceとAPI
      • 2000年初期web技術が進化し基幹系や複雑な業務もweb化
      • 異なるシステムをAPI経由で接続するように
  • Amazon

    • 最初はモノリシックアーキテクチャ
    • SOA(Service Oriented Architecture)
      • システム間のコンポーネント接続はhttpsAPIのみ
      • 互いがブラックボックスとなり、開発効率が向上した
      • マイクロサービスの概念
      • サービスの集中型のマネジメントを最小化(ゼロになるものではない)
    • Two-pizza teams
      • チーム内部は密結合になることもある
        • この規則を超える人数のチームは作らない(コミュニケーションコストが肥大化することを防ぐ)
      • DevOpsの概念
      • 厳密にインターフェースを保つ
        • 保つことができなければデグレが生じる
    • 数千のチーム × マイクロサービスアーキテクチャ × 継続的デリバリ × Infrastructure as a code = 年間5000万回のデプロイ
    • Infrastructure as a codeの内部分解
      • Dev側のインフラ管理コストを極小化
    • DevOps
      • 文化
        • Dev,Opsの中間プロセスの壁を取り払うものであり、一緒にすべきということではない
      • 実践
        • アジャイルが必須というわけではない、ただ相性がいい
      • ツール
  • AWSのサービスから見る変遷

    • 初期
      • Auto Scaling
      • セッション情報共有Pool
      • 最新アプリケーションデプロイ
        • AMI再生成パターン
          • 緊急時の対応などに対しては重い
        • Bootstrapパターン
          • OSの新規立ち上げの時間がかかる
        • Loadingデプロイ
          • 一台ずつ切り替えていく
    • コンテナ、サーバレス
      • ECSの基本構成パターン
        • OSが新規で立ち上がるなどの時間は減らせる
        • 常駐しているインスタンスの費用はかかる
      • AWS Lambda
        • セキュリティは関数単位でかける
        • イベント単位でコンテナが立ち上がる
        • 実行は最大300秒
        • 再利用されることもあるがその条件をAWSは公開していない
          • ステートレスが求められる、またDBへのコネクションプールがないので基本的にはNoSQL(DynamoDBなど)を利用する
        • 初期起動に時間がかかるコンパイラ言語(Java,Goなど)よりもPythonなどのスクリプト言語との相性がいい
    • EKS,Fargate
      • EKS
        • ハイブリットクラウド対応
        • kubernetesは世の中に展開されているライブラリが豊富、それをAWS上で使える
      • Fargate
        • Lambdaの拡張
        • オートスケーリングよりも早くスケールする

ソフトウェアの設計においてもインフラのリソース管理においても開発組織の形成においても、構成要素を必要最小限の粒度まで落とし込んでインターフェースを厳密に管理し疎結合にすることで効率とスケーラビリティが得られるということがよくわかった。

小さくすることはあくまで手段であり、解決したい課題が先にあってこそなので、その課題を正しく見出すことも大事だと思った。

その意味でもインフラ面について単に実装に必要なサービスを知るだけではなく、コスト面やリソースの最適な活用、あるいは継続的なデプロイのためのパイプラインをいかに整備するかということにも意識を向けて様々なプラクティスを知りたいと思った。


マイクロサービス on マルチクラウド

株式会社メルカリ SRE/プリンシパルエンジニア 長野氏による講演

メルカリのインフラの歴史やマイクロサービスとマルチクラウドの運用事例とマルチクラウドの課題についての紹介

以下講演メモ

  • メルカリのシステム概要

    • 大量のリクエス
      • 出品における画像アップロード、DB書き込み、Search反映、AIによる価格レコメンド、TL反映
      • 購入処理
    • 高速に並行して大量のトランザクション処理を行っている
  • マルチクラウドの構成

    • JP : さくら
    • US : AWS
    • UK : GCP
    • これらに加え最近は各リージョンでGCPと組み合わせられ始めた
  • インフラの歴史

    • 2013
      • JPでさくらのサーバー1台からサービス開始
      • 開発者に身近だったのがさくらだった
      • 2ヶ月くらいでさくらのクラウド、専用サーバに移行
      • さくらの専用サーバ
        • Metal as a Service
        • コストパフォーマンスが良い
    • 2014
      • USでAWS(オレゴン)にてサービス開始
      • 背景として開発者にAWS経験者が増加
      • インフラ専任者が少なかったのでマネージドサービスもよく使った
      • MaaSも検討したがサービス成長が読めず、柔軟なクラウドに寄せた
    • 2015
      • SREチーム発足
    • 2016
      • UKでGCPにてサービス開始
  • IaaSを中心としたマルチクラウド

  • オペレーションの共通化・少人数運用の実現

  • シンプルな三層構成

    • EC2/GCEを主に利用
  • internal DNS

    • 全てのサーバにunboundを導入
    • ローカルキャッシュによるパフォーマンス向上
    • resolv.confより障害に強い
  • サービスの可溶性と柔軟性を確保

    • アプリケーションはIPアドレスではなくホスト名を利用
      • アプリケーションコードの変更とそのデプロイなしに構成変更が可能
    • internal LB代替としてconsulを使った冗長化と負荷分散
  • マイクロサービス

    • サービスのレジリエンス向上
      • 細かいスケーリングと障害の分離
    • チーム、組織のスケーラビリティを高める
      • 1000人以上のエンジニア組織を志向
      • サービスの開発速度の向上
  • USリアーキテクチャ

    • USマーケットへの最適化のためクライアントをフルリニューアル
    • APIゲートウェイをGoで実装
    • 緩やかな移行を実現
  • APIゲートウェイ in JP

    • マイクロサービスを進めるため
  • Kubernetes

    • AWS EKS, Fargateの検証
    • k8s on Metalの検証
  • Spinnakerhttps://www.spinnaker.io/の採用

    • デプロイパイプラインを定義、自動実行
  • マルチクラウドの課題

  • 今後について
    • 引き続きマイクロサービス化を進めて特定のサービスが落ちても全体に影響させない
    • 高可用性が求められるサービスはマルチクラウド化、土台となるサービスは一つのクラウドのサービスに絞る、など

調べてみると以前からメルカリのマイクロサービス化が進められている話やマルチクラウドの話について、技術的にはchoconやSpinnakerを実用している話について発信していたみたいだが、自分にとっては初めての話で面白かった。

一つのクラウドサービス(自分はAWS)でどのようにサービスを構築するか、新しいサービスの使い道をどうするかということについ捉われがちになっていて、それでもちゃんとしたサービスを構築して開発運用できていれば問題ないのかもしれないが、よりサービスの質を高めるためにはいくつかの主要なクラウドサービスのpro/conを知った上で活用する手法を考えるべきだと感じた。

DeNA TechCon 2018に行ってきました

DeNA TechCon 2018に行ってきました。
聴講したセッションは以下の通りです。

内容を改めて振り返りつつ、レポートとしてまとめていきたいと思います。
※あくまで自分がメモした内容を書き連ねているものであり、 各タイトル下のリンクにあるスライドの内容が正しいものとなります。

Keynote - エンジニアが引っ張るDeNAの"モノづくり"

エンジニアが引っ張るDeNAの"モノづくり"

概要

DeNAの歴史を振り返り、それぞれのシーンでエンジニアがどのような挑戦をしてきたかという話。
また、掲げているミッション・ビジョンに合せてエンジニアのあり方、モノづくりをどう捉えているか語られていた。

  • ミッション
    • Delight & Impact the World 世界に喜びと驚きを
  • ビジョン
    • インターネットやAIを活用し、永久ベンチャーとして世の中にデライトを届ける

DeNAの歴史を大きく分けると以下の3つ

  1. 1999~ : EC, SNS
  2. 2009~ : モバイルゲーム,ゲームPF
  3. 2013~ : 事業多角化

EC, SNS

  • ビッターズ、モバオクの開発
    • ネットオークションに参入するもヤフオクが先行していたため苦戦
    • ヤフー以外のポータルサイトと協業し、流入を確保する
    • そしてモバイルが次に来るということでモバイルオークションへ参入

モバイルゲーム,ゲームPF

  • Mobageの開発

    • エンジニアがサービス設計を主導
    • 使いやすさに拘り抜いて開発
    • 川崎氏が1人で3ヶ月で開発
      • 1人のエンジニアがサービスを考え抜いて開発をしていくことが理にかなっている
      • 要件定義から実装まで、1人で考えながら手を動かすことでスピードも出る
      • もちろんサービスの規模が大きくなれば1人ではカバーしきれなくなるが、
        最初に動くものを作る上では1人で考え抜く方が早くちゃんとしたものが作れる
  • Mobageの負荷分散

  • グラブル

事業多角化

  • タクベルの開発

    • タクシー配車システムを支えるハードウェアの開発
    • コネクテッドカー向けの新しいアーキテクチャ
      • 車載端末からユーザー向けアプリまで幅広く開発
    • AIを駆使した移動需要予測と供給の最適化
      • 配車の指示に関係なく、通常運行において乗車時間・客数のアップを図る
  • 自動車事故削減に向けたCV技術を活用

    • Deep LearningベースのCV技術
      • CVをエッジ(車載端末)で動作させる組み込み
    • 運転行動指標を算出するデータサイエンス

まとめ

  • サービスづくりをエンジニアが引っ張る
    • いいモノづくり = Delight につながる
  • サービスの課題を高い技術力で解決
    • サービスの拡大 = Impact につながる

感想

  • 市場において先行する、あるいは他にない規模のサービスを展開する上で技術的な挑戦は不可欠。
  • いかなるサービスも最初はプロトタイプ開発からであり、エンジニアが主体となりスピード感とこだわりを持って開発するべき。
  • サービスの種類やフェーズによって問われる技術やエンジニアとしてのスタンスは少し異なるが、
    いずれにしても技術によって課題解決を図ること、サービスを考えながら開発に取り組むことが重要なのだと思った。

SWETの取り組むImage Based Testing

SWETの取り組むImage Based Testing

概要

DeNA社内でテストの自動化やエンジニアの生産性向上のためのツールの開発・導入などを行うチームであるSWETが、 どのような技術開発を行ったかについての事例紹介。 以前からDeNA TechConなど社外発表の場において技術開発事例紹介をしてきたが、 今回はWeb ApplicationとMobile Game(Native Game)におけるImage Based Testingについての紹介。

SWETのミッション

  • DeNAのサービス全般の品質向上
  • エンジニアの開発生産性向上

Web Applicationにおける事例紹介

  • WebApplicationにおけるVisual Regression Testingの紹介

    • Visual Regression Testingとは
      • Web Applicationのキャプチャを取得し、見た目のデグレーションを検出する自動テストの手法
      • 正しいキャプチャ画像と現在のサイトの差分比較
        • レンダリング結果の崩れ
          • 表示されない、文字化け、レイアウト崩れ
  • 既存のVisual Regression Testingに関するサービス

  • Visual Regression Testingの課題

    • キャプチャ取得ロジックの実装コスト
      • Seleniumの学習コスト
      • 非同期処理・リトライ処理の扱い
      • テスト対象ページに関する知識
    • 管理コストが高い
    • サービス側にUIテストへの理解がある人がいないと厳しい
      →汎化するためにスクリーンショットクローラを活用
  • スクリーンショットクローラ

    • 自律的にサイト内を巡回・テスト対象ページを見つけ出す
  • モチベーション
    • UIテストに詳しくなくても自動テスト管理できるようにしたい
  • クローラ利用の流れ

    1. 設定ファイルの設定 (対象ドメイン、キャプチャに関するパラメータ、ブラウザの指定)
    2. 自動キャプチャ、スクリーンショットをストレージに保存
    3. テスト
  • 並列化

    • スクリーンショットを撮るのは時間がかかる
    • 幅優先検索 + グローバルなタスクキューで並列化の実装
      • 排他ロックはとらず、たまにある重複は許容する
  • クローラ部分のシステム構成

  • 画像差分の確認

    • githubの利用
    • masterブランチに正解データを入れ、masterとの差分を目視で確認
  • まとめ

  • 課題

    • フォーム入力
      • サイトごとにカスタムロジックをかく→最初の問題に逆戻り
      • フォームを検出して自動で埋める技術が必要
    • 同一ページ内の状態変化
      • 取得したいキャプチャは1ページ1枚とは限らない
      • レンダリング結果の違いを自動で検出する
  • 展望
    • 機械学習によるUIの意味認識

      • 意味に基づくエレメント取得
    • Webページの意味解析技術

      • 先行研究 Using Semantic Similarity in crawling-based web application testing
      • HTMLをパターン認識して、UIエレメントの意味やページ状態を推定する
    • 会員登録フォーム意味推定

      • 精度としては大体100%近くから50%くらいまで
      • 全結合三層のNN
        • 深層学習ではない
      • トピックごとに精度の差があり
        • 生年月日はselect boxなので判別しやすい
        • userIDはサービスの名前が入ってきたりもして判別しづらい、など
      • ポップアップなどのパーツへの拡張
      • 学習データの拡張と深層学習の適用予定

Mobile Gameにおける事例紹介

※ ゲームアプリ = Mobile Game(Native Game)

  • ゲームアプリのUIテスト自動化の現状

    • web/ネイティブアプリはテスティングツール・ライブラリやノウハウが整備されており、UIテストの実装を行いやすい
    • ゲームアプリに対してはそういったデファクトのツールやプラクティスが整っていない
  • ゲームアプリのUIテスト自動化の難しさ

    • web/ネイティブアプリでは画面の構成情報をxmlやhtmlから取得可能
    • ゲームアプリだとOpenGLなどで描画されるため、構成要素の情報をセマンティックな形で取得できない →画像情報のみで状態や構成要素の情報を取らなければならない
  • 画像処理技術を使って自動化

    • Open CVのテンプレートマッチング
  • テンプレートマッチングとは

    • 特定の画像パターン(テンプレート)が存在するかを判定
  • 画像処理を使った自動化へのハードル

    • 画像処理および画像処理ライブラリに関する知識の習得
    • 画像処理に向いた言語の習得
    • イメージアセットの管理
    • 閾値のチューニング →これらの面倒なところを省力化するためExMachinaを開発
  • Exmachina

    • テスト用イメージアセットの管理
      • ページ単位、ページ情報という形で管理する
      • 識別子(Identifier)とどのような操作が可能か(Action)を管理
    • ページの判定機能
      • 画像データをインプットとしてそれがどのページに該当するのかを判定
      • セマンティックな情報を使ったテストが可能
    • ページ判定機能を使ったテストシナリオの自動化
      • テストシナリオは簡易に記述できるようにしてある
      • 画像処理やAction実行といった複雑な処理はバックエンドで吸収
  • シナリオテストの自動化からクローラへの応用

    • テスト用イメージアセットの管理(Identifier, Action)から、現在どのページにいるか、どのようなアクションが行えるかを取得可能
    • クローリング結果の比較
      • 画面遷移の差分と、ページの画像的な差分を取れる
    • 意図せぬUIの変更や、エラークラッシュの検出が容易になる
  • まとめ

    • アプリのページ情報を管理する
    • セマンティックな情報に基づいたテストを実現
    • バックエンドで画像処理など複雑な処理を吸収するため、画像処理を意識せずにテストプログラムを組める
    • ゲームアプリに対してもVisual Regression Testができる
  • 課題

    • ページ登録作業(テスト用イメージアセットの情報登録作業)の省力化
    • 複数解像度への対応
  • 対応

全体まとめ

  • Web ApplicationとMobile GameそれぞれにおいてImage Based TestingによるUIテストの自動化を行った
  • 今後、さらなる自動化・省力化のために機械学習を活用していく

感想

  • それぞれの事例において個別のプロダクトに依存しない汎用的な形、かつ利用者にとって導入コストが低くなるように作られていて素晴らしかった
  • 品質・生産性の向上を図る上で自動テストの存在はもはや欠かせないものだが、その維持コストを極小化するために機械学習の導入というアプローチが取られるのは手段としても技術的にも興味深い話だと思った

大規模ゲーム開発におけるBuild高速化と安定化

大規模ゲーム開発における build 高速化と安定化

概要

大規模化するゲーム開発においてビルドの高速化、安定化には大きな価値がある。 ビルドの高速化、安定化のためのUnity、Jenkinsにおけるプラクティスの紹介と、 その他自動化、ワークフロー改善事例の紹介。

大規模複雑化するスマートフォンゲーム開発の課題

  • 高品質かつ多機能
  • 短いスパンでの機能、イベントの提供
  • 特にアセットの容量が肥大化、ビルド時間が膨大に
  • ライトからコアユーザーも遊べる複雑なゲームスキーム
  • グラフィックスも2Dから3Dへより高品質へ
  • 複数のGameイベントを週替わりでリリース →お客様を飽きさせないために様々な取り組みを並行で走らせなければならない

  • 生じる問題

    • コンテンツ・Asset大容量化→ビルド時間が膨大→毎日QAを回せない→品質が悪い→お客様に満足してゲームをPlayしてもらえない
  • Build高速化は非常に価値がある

    • try and errorを回しやすくする
    • QAを回しやすくする

Buildを高速化して課題を解決(Unity・Jenkins)

  1. Unityプロジェクトのリポジトリをキャッシュ
  2. AssetBundleの差分Build
  3. 分散・並列Build(プラットフォーム、開発案件ごと)
  4. その他

    • スペックが高いマシンでbuildしているか
    • 対象ノードでウィルススキャンが実行されていないか
      2,3についてUnity/Jenkinsの実践を交えて紹介
  5. 最大のボトルネックはUnity AssetBundle Build 差分buildで高速化しよう

    • Unity AssetBundle Build高速化方法
      1. 一度buildしたAssetBundleファイルと同時に生成されるManifestファイルをgitで管理する
        Unity側でManifestファイルをみて高速化してくれる
      2. Assetは更新すべきファイルだけ、差分でbuildする
      3. フォルダの差分を検出するのは単純ではない
        フォルダに含まれるアセットが別フォルダの共有アセットへ依存している
      4. 共有アセットを含めフォルダの差分を検出したい
  6. EditorUtility.CollectDependencies()を使うことで共有Assetも差分検出できる
    (AssetBundle 対象のフォルダついて、Asset の依存関係も含めて実ファイルのハッシュ値を計算する · GitHub)

    • AssetBundle対象フォルダは以下の各種Asset + Assetが依存するすべてのアセットファイル → フォルダ内のすべての実ファイルハッシュ値が計算できる
  7. このようにあらゆる高速化を組み合わせる必要がある

  8. Jenkinsを活用した分散・並列Build

    • Jenkins Master/Slave全体構成
      1. Jenkins masterへの命令通知
      2. 各Slaveでの処理
        Client Build, AssetBundle Build, Master validation, preprocess, migration, deploy, etc...
      3. アプリのupload, githubへの自動コミット, BaaSのデプロイ
    • 並列開発をしていると、キューが詰まるため、案件・ブランチごとにslave nodeを分ける
  9. Jenkins - Platformごとに分散Build

    • Build Flow pluginのparallelブロックを使うことでノードごとに分散・並列実行できる NodeLabel Parameter Pluginを利用
    • Nodeごとに同じJobは同時に一つだけ実行できるようにしたい場合はThrottle Concurrent Builds Pluginが使える
  10. Jenkins - 同一開発ブランチで排他制御

DeNAのゲーム開発はSakashoを使いサーバレスアーキテクチャが主流に

  • Baasを用いると開発効率は上がるが、migrationについては別アプローチが必要

    • 手動オペレーションが入ると障害が発生する
    • データマイグレーションの最適化・徹底した自動化が必要
      • 4つのフェーズでマイグレーションを最適化、自動化を徹底
        merge → validation/build → migration → deploy
    • 手動でmergeコンフリクト解消も大変
      • merge祭りjob導入
        • merge作業を自動化、人為的なコンフリクト以外は自動的に解消
        • ほぼコンフリクトの内容は自動で解消できる、現在のブランチを正とする
    • 手動でデータ更新は不整合が起こる
      • データMigrationを徹底して自動化
      • 先々起きるわからない問題は考えず、手動が入ることでの事故を防止するために徹底的に自動化
        • 極力シンプルなJobで設計する必要がある
  • マイグレーションを自動化するJobインターフェース

    • Configuration / Run に分離
    • パラメータを設定するだけで使い回せるよう共通化
    • コケたjobから容易に再実行
      その際に省略可能なjobのチェックを外す
    • cronで時間起動する

大規模開発に適したgitワークフロー 1. エンジニア以外も全員gitを使う 2. エンジニアを介さずにpull requestをmerge出来るまでワークフローを熟考する
危険なデータがマージされない仕組みを考え抜く
すべてのAssetはimportする際にチェックして所定の場所に配置
キャラクタ、マップ、クエストはパラメータから自動生成
MasterはJenkins JOBでスプレッドシートから自動pull request 3. 事故が起きたらエンジニアが責任を持って振り返る覚悟でやる

まとめ

  • 大規模化されていくゲーム開発に対して改善を積み重ねていくことが大事、絶えず改善することで安定化できる
  • 様々な改善策は毎日考え続けることである日パッと思い浮かぶ
  • スマートフォンゲームはまだまだ大規模化する

感想

  • ゲーム全体のアーキテクチャや更新データ入稿の頻度などによって具体的なプラクティスは異なりそうだが、どのような環境においても通じる考え方を聞くことができてよかった
  • 特に並列開発におけるフロー整備やJobの切り分けについては最初から完璧にできるものではないが、常に改善を続けることでやがて品質の底上げにつながるということを実感しているので、非常に参考になり面白かった

DeNA TechCon2018 ゲーム体験を支えるための強化学習

DeNA TechCon2018 ゲーム体験を支えるための強化学習

概要

逆転オセロニアにおけるAI開発の取り組みについて現状の開発事例と今後の展望についての紹介

ゲーム領域におけるAI開発の背景

  • 逆転オセロニアについて
    • 戦略に応じてバランスよくデッキを構築する必要がある
    • ルールはシンプル、戦い方は多様で奥深い
    • キャラクタースキルの微妙なバランスや流行によってゲーム環境が日々変化している
  • キャラクタースキルのバランス調整をミスなく、効率的に行いたい
    • 絶妙なバランスを保つ難易度が高い
    • ゲーム環境はどんどん複雑になるので調整コストも爆発していく
    • ミスをするとゲームの品質を落とす、ゲームバランスの毀損
  • 解決したい運用課題
    • 新しいスキルの評価が正確にできない
    • キャラクターの性能テストにかかる工数が大きい
    • チューニングを続けても見落としリスクがある
      • すべてのユーザーセグメントの体感を検証するのは難しい
  • 実現できたら嬉しいこと
    1. リリース前の新しいスキルでも検証ができること
      自律的なキャラクター運用の学習
    2. 大量の検証によって性能を評価できること
      シミュレータを使った大量の自己対戦の実現
    3. 壊れケースを効率的に検知できること
      人間のようなリテラシーで合理的に探索する方法の実現
  • 新環境でも柔軟に運用方法を獲得する強いAIの実現

  • 強化学習を使ったアプローチ
    強化学習とは
    ある環境下で、目的とする利益を最大化するための戦略(行動系列)を獲得する機械学習の一種

    • 未知の環境(新しいゲーム環境)に対しても学習が可能
    • 試行錯誤を繰り返しながら自律的に学習ができる
  • 強化学習とゲームタスク

    • 近年の強化学習技術の進展によって様々なゲームにおいて高いパフォーマンスを出した研究が報告されている
    • オセロニアではランダム性や不完全情報も取り扱うためチャレンジング
  • 研究開発ロードマップ
    4つの技術を組み合わせ環境に柔軟に対応する強いAIを作る

    1. 教師あり学習
      そもそも学習ができるのか検証(プレイヤーの対戦ログを使用)
      大量の棋譜ログを活用し人間が実際に打つような打ち手を学習
    2. 表現学習
      キャラクター運用の特徴を学習
      キャラを拡張できるか検証
    3. 強化学習
      自己対戦による自律的な学習
    4. 先読み機能
      数手先を読むことによる推論的な学習、強化学習時の学習サポート

AI技術の紹介

  • 教師あり学習

    • 上位プレイヤーの対戦棋譜を用いて作成
      • 入力データ(特徴量)
        • ステータス
        • 手駒・デッキ情報
        • 選択可能な行動
        • 盤面情報
      • 出力データ(教師信号)
        • プレイヤーが選択したかいなかのバイナリ変数
  • アーキテクチャ概要

  • 実験結果

    • 既存NPC(ルールベースAI)に対して高い勝率が出せている
    • AIはチューニングによって既存ルールベースAIより大幅に強くなる
      • 意味のある戦術を学んでいることが示唆できる
  • 設定と工夫点

    • 選択・非選択を教師信号として再利用
      • 人間のようにプレイするAIを獲得したい
      • 上位プレイヤーの負けた情報も有効活用
    • ネットワーク・学習の詳細
      • Batch Normalizationは有効、Dropoutは弱め
      • 活性化情報:ELU(ReLUよりも有効だった)
      • 損失関数:Cross Entropy
    • 大量の棋譜があるためデータ読み込みを効率化
      • 並列化、キューなどを駆使してデータ読み込みを効率化
  • 表現学習

    • 何ができるのか
      • キャラクターを低次元のベクトルで表現できる
        • キャラクター数分の次元から固定次元に削減できる
        • モデルサイズ削減、学習速度向上が期待できる
      • 運用方法が似たキャラクターは同じような表現になる
  • アーキテクチャ

    • 低次元ベクトルを獲得する埋め込み層を行動入力の後に導入
    • マルチタスク学習としてモデルを訓練する
  • 獲得した表現の可視化

    • キャラ表現を2次元に削減しプロット
      • 戦略に応じた表現が得られる
    • 低次元ベクトルを活用して教師あり学習・強化学習を効率化
  • 強化学習

    • 自己対戦による自律的な学習
  • アーキテクチャ

    • 通常のDQNは出力が前もって行動の数だけ固定されている
      • オセロニアでは潜在的な行動空間が膨大なため現実的ではない
    • 動的に変わる行動を扱えるネットワーク構造を採用
  • 自己対戦による成長

    • 強化学習エージェントは自分自身と対戦して自律的に戦略を学ぶ
      • 対戦相手も自分と同様に成長
    • 過去バージョンを使用
      • 実際は様々なAIエージェントを相手として用いる(教師あり学習エージェント、ルールベースAI、etc...)
        • いろんな対戦相手に対応するため
  • 実験結果

    • ある特定の状況ではゼロからミドルレベルのプレイヤー並みまで成長することが確認できている
  • 難しさと対策
    オセロニアへの強化学習の適用には複数の難しさがある

    • 毎ターン取れる行動の種類が変わる(可変長行動)
      • 可変長行動を扱うネットワーク構造の使用+表現学習
    • 豊富な計算資源を使っても実験に時間がかかる
      • 教師あり学習の結果を強化学習の初期化に一部使用した効率化
    • いろんな戦術の相手 + 不完全情報
      • 様々な戦略を持つAIエージェントとの自己対戦
  • 先読み機能

    • 先読みを行いながら木構造としていろんなの系盤面の系列を表現
      • 大量のシミュレーションを行い、ある局面での最善手を決定
      • モンテカルロ木探索を使用
    • 現在の局面から次にとりうる行動を試す
    • 行動後は敵ターン含めてバトル終了までランダムなプレイを行う
    • 終了時の勝敗を行動の評価値とする、これを大量に繰り返し取るべき行動を決める
  • オセロニアでの活用案

    • 強化学習との組み合わせによるAIの強化
      • 推論サポート
      • ミスが許されない勝ち筋を見つけやすくなる
    • 先読み機能だけでも教師あり学習・強化学習と同じような強さが確認できている
      • 不利なデッキ同士の対戦でも高い勝率
      • シミュレータの計算速度に依存した課題も存在
  • まとめ

    • オセロニアにおけるAI開発では課題を細かく分解し、柔軟に既存技術の改造と新規技術の発案をしている
      • ドメインごとに異なる性質を深く理解する事が大事
      • 複雑なゲームに既存技術を単純に適用するだけではうまくいかない
    • 今後の見通し
  • Webツールを活用したチューニング

    • AIの戦いを可視化するWebツールを使用してチューニングをサポート
      • 統計量の可視化
      • AIの人間らしさを検証

今後に向けて

  • プロジェクト観点で難しい点、嬉しい点

    • 学習環境をゼロベースで作る必要がある
      • 強化学習研究で使われるゲームは扱いやすい学習環境が既に存在
    • シミュレータ速度がボトルネックになる
      • 多くの試行をするために、応答をどれだけ高速化できるかが鍵
    • ドメイン固有の情報を扱うため特徴両エンジニアリングが複雑
    • ゲームの構造に応じたアルゴリズムの開発が必要
      • 最新研究を実装するだけではうまくいかない
    • ユースケースの要件定義
      • 成果をどのような形で実現させるかは自明ではない
      • ゲームにとって必要なこと、ユーザーのニーズを論理的に分解して明示する事が必要
  • AI活用を見越してやっておいたほうがいいこと

    • 高速なシミュレータ開発
      • 描画ロジックとバトルロジックを切り離しやすいような設計
    • AIの学習を念頭に置いたログ設計
      • プレイヤー分析のためのログ以外にもAI学習用のログ設計が必要
    • 最新技術に追従する体制づくり
    • 現場との密なコミュニケーション
      • 課題を適切に定義する、企画提案するためのサービス理解
      • どれほどの成果が出るかがわからない、期待値のすり合わせが必要
  • 研究開発観点のやりがい

  • 今後の可能性

    • 今後ゲーム業界全体においてAI活用が活発化してくるのではないか
    • 実用化を加速させるために会社の枠を超えた知見共有を行いたい

感想

  • 様々な事例が紹介され、特に表現学習における獲得した表現の可視化の部分が良かったと思った
  • ゲームの運用面から考えると人による判断が最終的に方向性を決定しているため、ゲームにおけるAI活用の取り組みとは何か奇抜な新しいゲームの仕組みを作り出すためのものではなく、人が参照できる情報とその分析の幅を広げ、多角的にゲームの状態を判断するための取り組みだと再認識させられる
    (ユーザーが自らAIクライアントを育てて何かするようなゲームにおけるAI活用、みたいなものは除く)
  • 運用されているゲームにとってバランス調整は肝でありそれを補助するという時点ですでに成果を出していると個人的には思うが、さらなる成果を追求していった結果として運用タイトルを遊ぶユーザーの未来の行動全体を予測する仕組みができて、ゲームバランスだけでなく事業面に対しても優位な示唆が得られるものが出来上がるのではないかと思った

世界へ向けたゲーム開発 ローカライズ支援ツールLION

世界へ向けたゲーム開発 〜ローカライズ支援ツール『LION』〜

概要

モバイルゲームの海外同時配信・運用におけるローカライズ支援ツールとして開発されたLIONが実際にどのような課題を解決しているかについての紹介

モバイルアプリ運用時代のローカライズ事情

  • ゲーム事業部が目指している事

    • 日本で評価されているゲームを世界中に発信する事
    • そのために
  • ゲームのローカライズとは

    • ゲーム内外で使用するすべての言語に関するコンテンツを多言語化する
      • ゲーム内、公式サイト、SNSWiki、Store文言、etc...
  • 多言語化のフロー

    • ローカライズすべき文字列のすべてに対してユニークなIDラベルをつける
    • すべてのIDに対し日本語でデータ作成後、それを元に各言語へ翻訳していく
      • 言語によってはどの言語からどの言語に翻訳できるかに制約があるため、2段階に分けて翻訳を進める必要がある
        ex)日本語→英語→フランス語、イタリア語、etc...
  • ローカライズタイトルのスケジュール

    • 企画が決まり、日本語テキストが準備できたら翻訳開始
    • 翻訳完了後は、テキストバグがなくなるまで修正、反映を繰り返す
  • 運用フェーズに入ると

    • データ更新の際にテキストの追加や更新も同時に発生
    • それぞれの開発で同じフローを繰り返し実施
      →運用を考慮したローカライズフロー構築が重要となる
  • 翻訳開始から完了までの作業と役割

    • 翻訳のために必要な作業
      • 翻訳ファイル準備
      • 各種スケジュール調整
      • 翻訳者への翻訳ファイル発注
      • 翻訳ファイルの納品確認
        ここまではコーディネーターの作業
      • 翻訳作業(間違い修正含む)
        翻訳者の作業
  • コーディネーターの作業詳細

    • 翻訳対象の抽出
      • 新規翻訳及び更新などによる変更部分に判別して翻訳依頼する
    • 補足情報の追加
    • 重複している文字列の排除
    • 文字カウント
      • スケジュール、費用検討
    • 翻訳依頼ファイルを作成する
    • 翻訳の進捗管理
  • 翻訳者の作業詳細

    • 翻訳者は依頼ファイル内のテキストを翻訳
    • コーディネーターが準備した補助情報が正確な翻訳の鍵となる
  • これらが手作業だと何が起きるか

    • 翻訳発注ファイル作成の準備効率低下
      • 作業時間を要する
      • ミスが発生しやすい
    • 用語統一の困難が発生
      • 適切な管理をしないと多大な時間を要する
  • 運用タイトルにおけるローカライズの課題

    • 手作業を可能な限り自動化し、効率化して困難をなくすと運用タイトルの同時ローカライズでも品質を高くできる

ローカライズ支援ツールLION

  • ローカライズで発生する様々な手作業
    →システムに落とし効率化、標準化する

  • LIONとは

    • Webアプリケーションベースのローカライズ支援ツール
    • 開発要件
      • テキストの追加、途中変更機能は運用を想定したものとする
        • 複数の文字列がバラバラの翻訳ラインに乗る
      • 無駄な翻訳作業を発生させない
      • テキストのコンテキスト情報をシェアする
      • 役割に従ったアクセスコントロールが適切に行われる
  • LIONの機能

  • プロジェクト設定
    • 複数タイトルで同時利用
      • 他のタイトルに関する情報は見れてはいけない
    • ローカライズフローでは様々な役割のメンバーが作業
    • 各役割に最適化したUIが必要

→適切なアクセスコントロール
→プロジェクトごと、アカウントごとのロール設定

  • 翻訳テキストの依存関係を考慮した適切なバージョニングが必要
  • 翻訳者ごとに表示すべき翻訳元言語が違う

  • 文字列ID/ラベル管理

    • 各テキストをユニークなID/ラベルで管理
    • 言語ごとのバージョン管理
    • どのバージョンのテキストをどの言語に翻訳したのか正しく追跡できるようにする
  • xlsxによるアップロード

    • 慣れたアプリケーションを使用してデータ作成したい
      • webのUIを使って一つずつ入力するのはとても面倒
      • 更新内容は目視しやすくしたい
        →xlsxファイル形式での一括入力をサポート →アップロード時の差分自動抽出
  • 柔軟な文字列検索

    • 様々なケースで検索が必要
      • ソース言語の更新が反映されていない文字列
      • 単語自体が間違っていた文字列
    • データベース化によって各検索用途に対応
  • 検索結果に対して一括操作

    • 大量データの更新を一括で行えるように作り込み
  • リリース制御

    • 運用においてデータ更新は何度もある
      • 更新タイミング
        • イベント、機能追加、UI改修、etc...
      • 並行して開発されているデータに同じ文字列が含まれることもある
    • リリーススケジュール設定管理
      • リリース名
      • 公開順を決める通し番号
    • ID/言語/バージョン単位でスケジュール設定可能
    • これらによりリリース時の事故を防止している
  • 翻訳サポート

    • 翻訳対象の選定時・翻訳時に必要な情報
    • 翻訳メモリ
      • 翻訳済みデータとの類似率表示
      • 含有文字列
      • 用語集
      • コメント・ファイル添付
  • 発注フローのシステム化

    • 複数の発注が同時並行で処理される
      • コーディネーターの役割である発注管理の負担大
    • 一つの発注に関連する情報を保持するオーダー
      • ピックアップした文字列のリスト
      • 文字カウント
      • スケジュール
      • アサイ
    • LIONがオーダー管理をサポート
  • バックエンドのAPI

    • 使いやすいUI→SPA化
      • SPA化のためにAPIが必要
    • アプリのビルド環境への組み込みにも必要
      • Jenkinsなど

LIONの技術コンポーネント * サーバー * Ruby on Rails + MySQL + Elasticsearch * API

  • フロント

    • Mithril.js, Handsontable
    • SPA
  • CI

    • サーバ、フロントの自動テスト/ビルド
    • 開発環境への自動デプロイ
  • LIONの運用

    • 運用タイトル、開発タイトルそれぞれで使い始めるための準備中
    • 運用からの組み込みと開発時からの組み込み→大きく違う
    • 組み込みに当たって見えてくる課題は今後解消・最適化していく予定
  • 今後の展開

    • 便利機能
      • 各操作手順をできるだけ減らすための最適化
      • UI情報の保持
        • 文字数/行数制限
      • 通知の最適化
    • タイトル側で使うためのコンポーネント
      • コンバータやランタイム提供
    • 自動翻訳?
      • 没入感を損なわないレベルの自動翻訳が前提

まとめ

  • ローカライズ作業には様々な手作業や課題が存在
  • 運用も合わさるとさらに複雑化
  • 高品質・効率的に行う必要
    →各手作業・課題を克服するためにローカライズツールLIONを開発し機能を提供

感想

  • ゲームタイトルの運用において煩雑な手作業の数々を一つのシステムにまとめるというのは、作業リソースの削減だけでなく障害の元となる入稿ミスやデータの不備を防ぐことにもつながるので、単純な効率化に収まらない大きなメリットがあると思う
  • LIONの事例においても翻訳サポートツールとしての機能に限らず、アプリのビルド環境への組み込みやリリース制御の機能まで含まれているのは、ゲームタイトル運用での翻訳にまつわるコストやリスクを最小限に抑えるための有効な手段だと思った
  • 翻訳に限らずゲームにまつわる各種データ、ファイルについて汎化された編集・入稿ツールがあるか、開発できるかというのは開発組織としての長期的な資産に関わってくるのではないかと思った

DeNAのネイティブアプリにおけるサーバー開発の現在と未来

DeNAのネイティブアプリにおけるサーバ開発の現在と未来

概要

ネイティブアプリ向け内製BaasのSakashoを開発しこれまでどのような戦略でサーバーサイド開発をしてきたのか、そして今後どのように展開していくのかについての紹介

これまで

  • 現在
    • 内製開発6タイトルリリース
    • 多数のタイトルを新規開発中
    • 協業開発でも多数のタイトルを開発・運用中
  • どういう戦略でここまで来たのか?

    • Sakasho
      • 内製Baasであり汎用ゲームサーバ
      • 特徴
        • Sakashoサーバー+クライアントアプリで完結
        • 多数のタイトルのサーバを一手に引き受ける
          • 同一アプリケーション
          • 一つのチーム
        • タイトルチームはクライアントエンジニアだけ
          • サーバー開発は一切していない
        • 一般的なソーシャルゲームの機能をほぼ実装
          • 何故このようなことが可能か
            • 豊富な機能量、一般的なネイティブゲームに必要な機能は大体網羅
            • GoogleのFirebaseに近いイメージ
            • クライアント主導のセーブデータ管理、Stateはクライアント管理
          • 各タイトル開発チームにとっては完全にブラックボックス
          • サーバーでできることはある程度最初に決まっている
          • 最適化の対象外
            • クライアント+サーバのタイトル独自の機能に関しては最適化の対象外となる
  • なぜそうしたか

    • 選択と集中
      • Webブラウザゲームでは単縦な表現力について一定の制限がある
      • その中で様々なゲームシステムやサーバー技術が生まれた
      • ネイティブアプリにおいてはその表現力を存分に発揮しないといけない
      • 強みのある領域に集中するのではなく、強みを生むための領域に集中
    • アーキテクチャの統一
      • サーバーで何をやるかクライアントで何をやるかという設計
        • キリがない話
      • 一度間違うとかなり痛い目を見るポイント
      • 最適かはわからないが間違いではないラインで全体を統一
      • かなりクライアントに主導権を寄せている
    • 運用ポリシーの集中
      • ゲームの外の世界だが、サービス運営には必要な要素群
        • お客様対応
        • 配信プラットフォームに関連する諸々
    • サーバー技術の集約
      • いわゆる大規模サービスを支える技術
      • ネイティブアプリゲーム特有の傾向(やってみてわかったこと)
  • 結果

    • サーバー開発・運用は1チームで同時並行で多数のタイトルを展開できた
    • アーキテクチャはある程度統一され、同じノウハウを適用できた
    • 各タイトルチームはクライアント側の開発に注力できた
    • サービス運用はある程度均質化された
    • サーバー負荷に関連するトラブルはかなり少なかった
      →戦略が結果につながった

これから

  • 現状を振り返り

    • 良い点
      (Sakashoの枠組みを超えなければ)
      • サーバ開発を全くしなくても新規タイトルを開発・リリースできる
      • タイトルの数だけサーバ運用しなくて良い
      • タイトルチームはサーバで用意された機能をそのまま使うだけで良い
    • 課題点
      • タイトルチーム
        • 制約が強く、自由度が小さい
        • 独自のカスタマイズや最適化が困難
        • 意思決定がチーム内で完結しない
      • 共通基盤チーム
        • どんな変更も直接的に全体に影響を与えうる
        • 常に先手を取って全体最適になるような意思決定が必要
          →難しい
          各タイトルの優先順位、状況を知った上で意志決定しなければならない
        • ボトルネックになりがち
        • これらは元々トレードオフとして選択したこと、想定内
  • どうすべきか

    • 良い点:可能な限り残したい
      • 独自のカスタマイズをしないなら開発が不要
      • サーバー運用できるだけ省力化したい
    • 課題点:全て解決したい
      • 独自のカスタマイズや最適化を可能にしたい
        • ホワイトボックス化
      • 意志決定をチーム内で完結させたい
        • 少数の組織が独自に意志決定できるように
  • 具体的にどうすれば良いか

    • 中央集権ではなく地方分権
      • BaaSではなく、シンプルなサバクラ構成
      • 各チームにサーバーエンジニアがいる
        • ホワイトボックス化
      • サーバー運用は出来るだけ省力化したい
        • サーバーインフラはフルマネージドなクラウドに寄せる
          • GCP GAE/SE Go
        • この層ではタイトルごとの最適化はしない
        • ここはブラックボックスと割り切る
  • ネイティブアプリ開発の未来

    • ブラックボックスではなくホワイトボックス
    • 独自のカスタマイズをしないなら開発が不要
      • 基本的な機能はライブラリとして用意
      • 用意はするが、差し替え可能・改変可能
      • 独自の機能を追加しやすいつくり
      • 引き続き、共通基盤チームは作る
      • タイトルを跨いだ最適化や再利用は行う
      • 現在新規開発中のタイトル開発に合わせて取り組み中
  • まとめ

    • 魅力的な面白いゲームを開発し、世界にDelightを届ける
    • そのために
      • より自由度高く、作りたいゲームが作れるように
      • より開発効率よく、作りたいゲームに集中できるように
      • この二つを両立できるような開発・運用体制を整えていく

感想

  • 共通基盤としてネイティブアプリに必要なサーバー機能を網羅するように取り組み積み上げてきたからこそ独自カスタマイズも視野に入れて開発できるようにライブラリとして切り出すことが可能であり、これは当たり外れもあるゲーム開発においても大きく変わらないもの(サーバー機能)を共通で提供できるように固めて資産化してきたことの非常に大きなメリットだと思った
  • 今後独自カスタマイズをするとしてもサーバー機能は一通り実装が揃っている状態でスタートできるのであれば、一から機能開発をするのではなくインフラ面で新しい取り組みをしたりログ収集・分析基盤開発に開発リソースを割くことができるので、より新しい挑戦がしやすいのではないかと思った

全体的な感想

  • 全体を通してビジネス面での必要性に応じた各方面での自動化・効率化・集約化の話が多く、その上でどのような技術を使っているのかどういった設計にしているのかという考え方を学ぶことができた会だったと思う
  • 主にネイティブゲーム開発に関わるセッションを受講したが、どれも大規模化していくネイティブゲーム開発に対して技術とその使い方で勝負しているので、今後より開発リソースに対するアウトプットのコスパが良い(良い意味で)開発ができるようになっていくのではないかと思った