ここに大体書いてあります
https://aktsk-games.notion.site/ATLAS-dcb1550244eb42bf9c7c3ec45362dce2
## プロジェクト概要
### 目的、背景
「課金機能」と「石(ジュエル)の残高管理機能」を基盤として提供することで
- ドメインエキスパートとして一定の信頼性や機能を担保
- 新しいゲームの立ち上げ時に必要な機能を提供
- 仕様変更時に修正部分を基盤としてなるべく吸収
していきゲーム開発担当エンジニアが「面白さ」に費やす時間を増やすことに貢献する
### 規模感、チーム構成、担当した役割
- AppStore セールスランキング1位を取るようなゲームを含んだ複数のゲームから利用され、秒間数千リクエスト
- CTO 直下にて少人数(2~3人)で構成されたチームのリード
- 設計、開発、運用、利用者とのコミュニケーション、アナウンス、採用、インターン受け入れ
- インシデント時の初動調査や原因究明、初期対応と恒久対策の実施、さらにそれらを会社の財産とするためのインシデントレポートの執筆と公開
### 使用技術や開発環境等
- Go : アプリケーションコード
- GCP ( GAE / Datastore / BQ / CloudRun ) : 基盤が動作するインフラ
- Terraform : 上記インフラの IaC
- Unity(C#) : Unity 向けクライアントライブラリ
- Flask -> Vue : 社内向け管理画面
## 取り組んだ課題
### 基盤の Steam への対応
- 課題: Steam の課金時に他のプラットフォームと同様に処理を行えるようにインターフェースの設計を慎重に行う必要があった
- 工夫: integration test を大幅に増加させて end-to-end での振る舞いの再現性の担保を行なった上で内部実装を大きく修正した
- 工夫: Unity のアプリ内課金向けの公式ライブラリを拡張し Steam に対応させ、クライアント側でのデータ構造やフローの違いを吸収した
- 成果: 事故なく無停止で Steam 向けサービスをローンチすることに成功した
### GAE 1st gen -> 2nd Gen へのマイグレーション
- 課題: Google App Engine 1st gen という古いランタイムで動いていたため Go1.11 で動作させる必要がありセキュリティや開発体験に問題を抱えていた。プログラム内のインフラ層(DBアクセス等の機能)が 1st gen に大きく依存していたので移行の難易度が上がっている状況となっていた。
- 工夫: メンテナンスタイムを設けることができないので、前後方互換性を保ってリリースをおこなった
- 成果: 事故なく無停止で Steam 向けサービスをローンチすることに成功した
- 成果: 言語バージョンやランタイムのアップデートにより、レイテンシが 30 % 程度改善した
### 社内向け管理画面の Vue.js への移行
- 課題: Flask で書かれた管理画面から Go のアプリケーションにアクセスしていたが、バックエンドが複数あるため責務が分散してしまいメンテナンシビリティが下がっていた。また Python には型がないため、特に型安全を意識してバリデーションを行いたい社内向け管理画面において実装の難化を招いていた。
- 工夫: Vue.js への移行を提案し実施した。画面数が多かったため、移行用のツールを作成して最小限の作業で Vue.js への移行を行なった。その後、段階的に UI のアップデートを行なった。
- 工夫: Go のバックエンドから OpenAPI 経由で TypeScript の型情報を生成し Vue.js 内部の型安全を意識した実装が行える環境を整備した
- 成果: バリデーションの強化や UI の再設計による UXの向上など
- 成果: メンテナンス性が大きく向上した