Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コトダマンサーバーアプリのリアーキテクチャへの挑戦
Search
Tanaka Kyosuke
July 19, 2023
Programming
3
950
コトダマンサーバーアプリのリアーキテクチャへの挑戦
「技術的負債、どうやって解消した?リアーキテクチャ・リファクタ事例から学ぶLunch LT」の登壇資料です
https://findy.connpass.com/event/288877/
Tanaka Kyosuke
July 19, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
990
効率化に挑戦してみたらモバイル開発が少し快適になった話
ryunakayama
0
140
Apache Hive 4 on Treasure Data
ryukobayashi
1
440
雑に思考を整理する技術と効能
konifar
64
31k
PostmanでAPIの動作確認が楽になった話
h455h1
0
180
Fast JSX: Don't clone props object #28768
yossydev
1
200
大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~
kj455
4
1k
Code Reviews
bkuhlmann
4
900
slow types ってなんだろう?
karad
0
120
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
950
MicrosoftのPlatform Engineeringガイドを読んで実際になにかやってみた
ymd65536
1
520
Goのmultiple errorsについて (2024年4月版)
syumai
4
1.2k
Featured
See All Featured
The Invisible Side of Design
smashingmag
294
49k
Infographics Made Easy
chrislema
238
18k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
The Cost Of JavaScript in 2023
addyosmani
21
3.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
117
18k
Into the Great Unknown - MozCon
thekraken
15
1k
Typedesign – Prime Four
hannesfritz
36
2.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
9
1.3k
Music & Morning Musume
bryan
41
5.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
261
12k
RailsConf 2023
tenderlove
9
560
Transcript
©MIXI コトダマンサーバーアプリの リアーキテクチャへの挑戦 2023/07/19 田中 恭友 デジタルエンターテインメント事業本部 コトダマン事業部 エンジニアグループ
©MIXI 自己紹介 田中恭友 (Kyosuke Tanaka) デジタルエンターテインメント事業本部 コトダマン事業部 エンジニアグループ マネージャー 2018年4月 株式会社ミクシィ(現MIXI)新卒入社
モンストドリームカンパニー サーバーサイドの新規開発・運用 2020年3月 コトダマン事業部に異動 サーバーエンジニアとしてスクラムTで開発・運用 2022年9月 エンジニアマネージャー就任 2
©MIXI 自己紹介 田中恭友 (Kyosuke Tanaka) デジタルエンターテインメント事業本部 コトダマン事業部 エンジニアグループ マネージャー 2018年4月 株式会社ミクシィ(現MIXI)新卒入社
モンストドリームカンパニー サーバーサイドの新規開発・運用 2020年3月 コトダマン事業部に異動 サーバーエンジニアとしてスクラムTで開発・運用 今日のLTはこの頃の話 2022年9月 エンジニアマネージャー就任 3
©MIXI 4 目次 1. 共闘ことばRPG コトダマンの紹介 2. コトダマン開発における課題 3. サーバーアプリケーションの技術負債
4. リアーキテクチャの狙い・戦略 5. 結果のふりかえり 6. まとめ
©MIXI 5 共闘ことばRPG コトダマン
©MIXI 6 共闘ことばRPG コトダマン 「ことば」で闘う、スマートフォン向け新感覚ことば遊びゲーム
©MIXI 7 MIXI移管 2019年10月にミクシィ(現 MIXI)に運営移管 引用元: 2019.08.09 https://www.sega.jp/topics/detail/190809_7/
©MIXI 8 2023年4月にリリース5周年を迎えました タイトル移管以降も継続的に新機能の開発や改善を行い、 5周年を迎えた現在でも多くのユーザーさんにプレイいただいています
©MIXI 9 コトダマンの開発上の課題 なぜリアーキテクチャに至ったのか
©MIXI 10 コトダマンのアーキテクチャ概要 APIサーバー Java 8(Amazon Corretto) tomcat struts2 DB
(Amazon Aurora) チャットサーバー Java 8(Amazon Corretto) tomcat struts2 その他 運用用途サーバー ゲームクライアント (Unity製) マルチプレイサーバー monobit engine APIサーバー : ゲーム上の様々な処理を実現するためのAPIを提供(クエスト開始・ガチャ・etc…) 今回のリアーキテクチャ対象
©MIXI 11 APIサーバーの課題 • APIサーバーの実装は複雑化し、保守が困難に(内部品質の低下) • 既存機能の改修時にエンバグが多発 • 開発速度の低下(既存実装の調査にコストがかかる) •
中には、エンバグを恐れて改修できない機能も...
©MIXI 12 内部品質低下の原因 • ドメインモデルの不在 • 手続き的に書き下されたビジネスロジック • メソッドに渡される大量のプリミティブ型の引数たち •
ユニットテストの存在しない・後からかけないレガシーコード • 責務の分割されていない巨大メソッド • 状態を持つsingletonクラス(マスタデータや時刻の管理クラス)に 依存せざるを得ない構造 • 制御されていない、縦横無尽の依存関係 • viewに依存したビジネスロジックが汎用性を低下 • ほとんど全てのusecaseが public static な メソッドの集合体として書かれている
©MIXI 13 組織的な原因 • 現状が辛いことはわかっていても、どう直せば良いかわからないメンバーも • 機能開発に追われて根本の改善が行えない状況 • バックログに技術負債解決のアイテムが載っていなかった •
10%ルール では手に負えない規模の負債が散在 • 木こりのジレンマ
©MIXI 14 解決策を探る • PRレビューを重ねるだけではなかなか改善しない状況 • 過去実装に合わせた作り方を一新する必要があった • ある程度正しい「型」「指針」を作ることが必要だと感じた
©MIXI 15 解決策を探る • PRレビューを重ねるだけではなかなか改善しない状況 • 過去実装に合わせた作り方を一新する必要があった • ある程度正しい「型」「指針」を作ることが必要だと感じた →
リアーキテクチャに着手することに決定
©MIXI 16 想定した技術負債の改善ロードマップ リアーキテクチャ ビジネスサイドから理解を得る取り組み メンバーのスキルアップ テストを書く文化 モデリングのスキル レガシー実装の 書き直し
新規実装に 負債のない (少ない)状態 読書会の開催
©MIXI 17 サーバーアプリケーションのリアーキテクチャ 具体事例の紹介
©MIXI 18 リアーキテクチャの狙い • ルールに従って実装しているうちに、 オブジェクト指向らしい設計ができるようになること • ドメインモデルを作成・ビジネスロジックをモデルに集約することを強制し ルールに従った実装をしているうちに学習が進むような設計であること •
ルールを元にレビューが行えること • 設計の良し悪しを議論するための土台にできること • レビューコストを低下させること • 自動テストを書く文化を成熟させること • ルールに従って実装すればテスタブルな設計になること • 自動テストを必須とする部分・そうでない部分を分けて 少なくともコアなロジックに自動テストを書くことを当たり前にする • TDDが自然と行われる下地を作る
©MIXI 19 新アーキテクチャ Presentation UseCase DAO Entity Response Request MasterData
Model Service IRepository Repository Action • オニオンアーキテクチャを参考にシンプルなアーキテクチャに設定 • ビジネスロジックをModel層に集約することを狙う • 依存の方向性を制御し、変動しやすいレイヤにコアロジックが依存しないようにする 依存の方向性
©MIXI 20 Modelレイヤ Presentation UseCase DAO Entity Response Request MasterData
Model Service IRepository Repository Action • ビジネスロジックを受け持つ層 ◦ DDDでいう値オブジェクトやエンティティをこのレイヤに置く ◦ 例: User, Character, Gacha, Quest … etc • Modelレイヤのクラス中の公開メソッドには原則単体テストを必須とする ◦ 自動生成された getter は対象外
©MIXI 21 Serviceレイヤ Presentation UseCase DAO Entity Response Request MasterData
Service IRepository Repository Action • 複数のModelを利用してアプリケーションに必要な機能を実装するレイヤ ◦ 複数のコンテキストで利用される、汎用的かつ複数のModelが関連する処理を置く ◦ 例: ItemService(アイテムの付与) • できる限りModelのみで実装を行うが、綺麗にまとまらない場合にはServiceを使う • 旧実装(Tool)との繋ぎ込みを担う、腐敗防止層として利用されることもある Model
©MIXI 22 UseCaseレイヤ Presentation UseCase DAO Entity Response Request MasterData
Service IRepository Repository Action • アプリケーションの機能を実現するために、処理順序を規定するためのレイヤ ◦ 例: ExchangeItemUseCase(アイテムを消費し、別のアイテムを獲得する) • DIされたRepositoryを利用してModel / Serviceを取り出し、ビジネスロジックを順に実行 Model
©MIXI 23 Presentationレイヤ Presentation UseCase DAO Entity Response Request MasterData
Service IRepository Repository Action • ゲームクライアントとのやりとりを担うレイヤ • クライアントからのリクエストに応じて必要なUseCaseを実行し、 実行結果をクライアントの求める形式のレスポンスに変換し、返却する Model
©MIXI 24 Presentation Repository UseCase DAO Entity Response Request MasterData
Service IRepository Repository Action • DB上に永続化されたユーザーデータや、メモリ上にキャッシュされたマスタデータからModelを再構築する • ビジネスロジックは持たず、Modelの永続化に集中する • UseCaseから利用する場合にはインタフェースを介して依存性を逆転する Model
©MIXI 25 移行のフロー 新アーキテクチャの提案・議論 検証期間 新アーキテクチャに則った実装を必須とせず、 有志が新アーキテクチャで開発を進めていく 実装中に出てきた疑問点について議論し、ルールを成長させる 並行してオブジェクト指向設計に関する読書会も実施 本実行:新規実装に関しては基本的に新アーキテクチャに則って開発する
新アーキテクチャへの移行はチームの状況を見ながら緩やかに進めていきました
©MIXI 26 結果のふりかえり
©MIXI 27 Keep • 新機能はアーキテクチャに則って実装されるようになった • レイヤ毎の依存関係が制御されるようになった • チーム内で設計に関する議論が活発に行われるようになった •
GitHub Discussionsに議論の場を用意 • 普段の開発中に気になったことや提案を記録し、週次定例で繰り返し議論の場を設けるようになった • レビューがアーキテクチャを中心に行われるようになった • 共通認識を持てているので議論が捗る • テストを書く文化が生まれた • 新アーキテクチャ導入前のテストカバレッジ(Line) : 0.6% • 新アーキテクチャ導入後のテストカバレッジ(Line): 12% • 新実装に限ると7割程度
©MIXI 28 Problem • ボイラーテンプレートコードによる実装スピードの低下 • 特にRepositoryの実装において頻発 • 曖昧なルールが混乱を呼んでしまった •
特にServiceの用途が理解されづらく、乱用されがちになった • 議論の結果決まったルールの集約が甘く、 新メンバーのオンボーディングにかかるコストが増加した(新たな暗黙知の発生) → デザインドキュメントを常に最新の状態に保つコスト 設計意図をチーム内に浸透させるコストを惜しんではいけない • ユニットテスト自体のメンテナンス性はまだまだ課題が残る状態
©MIXI 29 これからの取り組み
©MIXI 30 これからの取り組み • 組織体制の変更も含めた改善を推進 • 改善を推し進めるチームとしてSREチームを組成 • インフラ・CI/CDを中心に改善を推進中 •
ビジネスサイドの理解を得て、レガシーな過去実装の再実装を検討中
©MIXI 31 技術負債の改善ロードマップ(再掲) リアーキテクチャ ビジネスサイドから理解を得る取り組み メンバーのスキルアップ テストを書く文化 モデリングのスキル レガシー実装の 書き直し
新規実装に 負債のない (少ない)状態 読書会の開催
©MIXI 32 まとめ • サーバーアプリケーションの内部品質向上・チームのスキルアップを目的として 新アーキテクチャの導入を進めました • 新規機能を新アーキテクチャで実装しました • 実装スピードはやや低下したものの、テスタブルな設計になりました
• チームもアプリケーションと共に成長しました • 事業部全体を巻き込んで既存機能の書き直しに動き出しつつあります • より多くの価値をユーザーに届けるために これからも技術負債の解決を進めていきます!
©MIXI