Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
cocone Teck Talk Vol.1 - 大規模リファクタリング
Search
cocone
August 17, 2021
Programming
0
610
cocone Teck Talk Vol.1 - 大規模リファクタリング
cocos2dx V2 から V3 への道のりとその先のMetalを見据えて
「大規模」リファクタリングでやっておくべきこと
cocone
August 17, 2021
Tweet
Share
More Decks by cocone
See All by cocone
Cocone_Research_Center_2025.pdf
cocone
0
200
20240301_cocone_EMゆるミートアップvol6_LT資料
cocone
0
900
2024_cocone-avatarservice.pdf
cocone
0
2.1k
2024_cocone-wellbeing
cocone
0
4.9k
2023夏季合同企業説明会ココネ
cocone
0
370
cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ
cocone
0
630
cocone TECH TALK Vol.6 - ココネグループのブロックチェーン MOOI Network とのバックエンド連携
cocone
0
540
cocone TECH TALK Vol.6 - Kotlin バックエンドアーキテクチャ of アバターサービス
cocone
0
570
ココネ株式会社 会社紹介
cocone
0
130k
Other Decks in Programming
See All in Programming
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Github Copilotのチャット履歴ビューワーを作りました~WPF、dotnet10もあるよ~ #clrh111
katsuyuzu
0
110
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
160
ゲームの物理 剛体編
fadis
0
340
AIコーディングエージェント(skywork)
kondai24
0
160
AWS CDKの推しポイントN選
akihisaikeda
1
240
dotfiles 式年遷宮 令和最新版
masawada
1
760
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
320
CSC509 Lecture 14
javiergs
PRO
0
220
Go コードベースの構成と AI コンテキスト定義
andpad
0
120
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
チームをチームにするEM
hitode909
0
320
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
54
7.9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
For a Future-Friendly Web
brad_frost
180
10k
How STYLIGHT went responsive
nonsquared
100
6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Embracing the Ebb and Flow
colly
88
4.9k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Transcript
大規模リファクタリング 岡田大介
自己紹介 大規模リファクタリング
職務経歴 ・株式会社リコー (約10年) ・ココネ株式会社 最近の技術経歴 ・cocos2dx,Unity,ReactNative ・C++,C#,TypeScript 最近の趣味 ・卓球 ・ゴーストオブツシマ
・JustDance 岡田大介 クライアント開発/ポケコロ開発リーダー
大規模リファクタリングについて 「やってよかったこと/やるべきこと」 を中心に話します。
は じ ま り/ 背 景 大規模リファクタリング
はじまり ・10年ほど走ってきたスマホアプリで超スパゲッティコード え、100万行?? (ステップ数ではなく行数。。。とはいえ) ・何か機能を作るとすぐにどこか関係ない所でバグが出る。 ・結果開発コストが弊社の他アプリと比べても1.5〜2倍はコストがかかる 今の状況
闇が深い
はじまり ・10年ほど走ってきたスマホアプリで超スパゲッティコード え、100万行?? (ステップ数ではなく行数。。。とはいえ) ・何か機能を作るとすぐにどこか関係ない所でバグが出る。 ・結果開発コストが弊社の他アプリと比べても1.5〜2倍はコストがかかる なんとかしたいと思いつつ、
サービス最優先 直そうとチャレンジしようとした人は なぜかいつも他の部署へ異動。。 今の状況 ビルド時間が長すぎ!! 技術力とは別のほぼ職人芸 影響度読めない 闇 闇が深い
はじまり ・2018/6 Apple、ios/macで グラフィックスAPI「OpenGL」非推奨を宣言 Apple社の「Metal」への対応が必須へ
はじまり cocos2dx version2ベース (cocosの最新は4でMetal対応されている) アイテム、UIに弊社独自のファイル形式を使用、描画処理にダイレクトにOpenGLを使 用 アプリの状況 Metal対応するしかない!
はじまり 開発リーダーしつつ、Metal対応へ向けてリファクタリングも行うことに 「このアプリの開発リーダーとMetalへの対応よろしくね」 「はい。。。(まじか)」
やるべきこと やってよかったこと 大規模リファクタリング
やるべきこと/やってよかったこと 計画について
やるべきこと/やってよかったこと① 関係者へ理解を求めること 関係者 = 事業の責任者(事業部長、社長、各職種リーダーなど)、CTO、サービスへの決定権を持つ人 リファクタリング「する」ことへのリスク リファクタリング「しない」ことへのリスク
計画の共有 このあたりをちゃんと説明すること 開発以外の人からも計画や 人員計画などのアイディアが出る 運用中のサービスの大規模リファクタリングとなると影響度が尋 常じゃない!! が、やらないと将来的にまずい!!!
やるべきこと/やってよかったこと② 計画は絶えず見直す 当初の計画 年末から開発者全員(10人以上)でサービス開発を止めて cocos2dxV2→cocos2dxV4(Metal)へ変更 4ヶ月 大きい
計画変更 cocos2dxV2→V3へ変更 次の計画変更 次の年の4月から 次の次の計画 サービス開発を止めずに対応 次の次の次の計画 対応メンバーは少数精鋭約4人で
やるべきこと/やってよかったこと② 計画は絶えず見直す 目標 期間 チーム体制 全部見直しが必要 見直し項目
特に期間は関係者への共有は必須 (いいづらいけども) 最初にとても見積もりきれない 絶えず見直しと関係者への共有を忘れない 場合によってはゴールの見直しも必要
やるべきこと/やってよかったこと③ 目標をたてていくこと 小さい ex. ・技術課題の管理 ・TableViewの差し替え、37/149 達成など ・Popup画面の対応 50/85
細かくタスクを管理し、達成具合を記載していくこと ・普通のプロジェクト以上に見える化が大事、周りから見ると何やってるか分からない ・モチベーションの持続 正直リファクタリングを長時間ひたらすらやるのはツライ
やるべきこと/やってよかったこと④ チーム体制 リファクタリングということで中々別チームを作るのは難しいですが リファクタリングに集中できる環境を作ること ・チームをサービス側とリファクタリング側で分割 ・互いにリーダーを立てた サービス開発を止めずに対応するということで。。 リファクタリングリーダー(V3)
サービスリーダー(V2)
開発について
やるべきこと/やってよかったこと⑤ Debug機能の充実化/開発環境の充実化 ・ログ機能 ・画面レイヤー構造の確認ツール ・アカウントの切り替え機能 ・アバター確認 ・UI確認機能
・Androidバックキー などなど マシンを差し替え ex.Rizen9マシンにしたらAndroidは2倍 ex.M1Macもビルド時間の向上に ・バグは大量に出るので、原因究明できるようにしておく。今後の役にも立つ ・開発速度を早くする工夫。cocos2dxは。。 ・ビルドマシンは状況によりけりですが、良くできるならすべき
やるべきこと/やってよかったこと⑥ 断捨離 ・機能の削除 ・ソースコード(クラス、関数)の削除 対応箇所をいかに減らすか
ビルド時間の向上にもつながる
やるべきこと/やってよかったこと⑥ 常にマージ/最新の状態を保つこと ・Gitで管理 ・サービス側がリリースされる度にマージ ・一度乖離すると非常に難しい
・ソースコードは意外となんとかなる ・Xcodeのプロジェクトファイルが結構厄介 マージツールとしてmergepbxを使用 XcodeGenも今後検討したいところ
やるべきこと/やってよかったこと⑦ テストできる設計を目指す ・シングルトンの嵐 ・依存関係がすごい ・SOLID原則に反しまくっている ・色々な所でベースのLayerクラスをdynamic_castして処理を判断している ・せめてプラットフォーム部分はinterfaceを分離。
・シングルトンではなくサービスロケータに。 ・DI的にするのは中途半端に終わりさらなるカオスになりそうと判断 ・画面遷移の仕組みも修正 全部は直せない、何年かかるか分からん!!
やるべきこと/やってよかったこと⑦ テストできる設計を目指す とりあえずinterfaceは分離しよう、 具象クラスであるシングルトンも自然に減るだろう。。 その上に変更もしていく CP1AssetManager CP2AssetManager IAssetManager
Locator Singleton
やるべきこと/やってよかったこと⑦ テストできる設計を目指す CP1AssetManager Singleton Client::funciton{ CP1AssetManager::getInstance().download("main_asset"); }
やるべきこと/やってよかったこと⑦ テストできる設計を目指す CP1AssetManager IAssetManager Locator Singleton 注入 Client::funciton{
CPLocator::AssetManager()->donwload("main_asset"); } Init { IAssetManager assetManager = CP1AssetManager::getInstance() CPLocator::provide(assetManager ); } 開発途中ではシングルトン状態とサービスロケータ を同居 Client2::funciton{ CP1AssetManager::getInstance().download("main_asset"); } 開発途中 利用者1 利用者2
やるべきこと/やってよかったこと⑦ テストできる設計を目指す CP1AssetManager IAssetManager Locator Singleton 注入 Client::funciton{
CPLocator::AssetManager()->donwload("main_asset"); } Init { IAssetManager assetManager = new CP1AssetManager() CPLocator::provide(assetManager ); } Client2::funciton{ CPLocator::AssetManager()->donwload("main_asset"); } 全部置き換えたらSingletonなくす 開発途中
やるべきこと/やってよかったこと⑦ テストできる設計を目指す CP2AssetManager IAssetManager Locator 注入 Client::funciton{ CPLocator::AssetManager()->donwload("main_asset");
} Init { IAssetManager assetManager = new CP2AssetManager() CPLocator::provide(assetManager ); } Client2::funciton{ CPLocator::AssetManager()->donwload("main_asset"); } CP1AssetManager(cocosv2用)を CP2AssetManager(cocosV3用)に差し替え CP1AssetManager
やるべきこと/やってよかったこと⑦ テストできる設計を目指す BaseLayer +restoreMyAvatar() +nativeEventReceive() +block() +unblock() +onMovePlanet()
+startAvatarIdleAction() +stopAvatarIdleAction() +show() ・・・ Fatなクラス ベースのクラスの割に色々と機能が 詰め込まれている状態
やるべきこと/やってよかったこと⑦ テストできる設計を目指す BaseLayer +show() ・・・ LayerAvatarInterface +restoreMyAvatar() +startAvatarIdleAction()
+stopAvatarIdleAction() BlockInterface +block() +unblock() PlanetInterface +onMovePlanet まずはとにかく分割
やるべきこと/やってよかったこと⑦ テストできる設計を目指す BaseLayer +show() ・・・ LayerAvatarInterface +restoreMyAvatar() +startAvatarIdleAction()
+stopAvatarIdleAction() BlockInterface +block() +unblock() PlanetInterface +onMovePlanet 一部しか使っていないものは 具象クラスの方へ移動 PlanetLayer ・・・
やるべきこと/やってよかったこと⑦ テストできる設計を目指す BaseLayer +show() ・・・ LayerAvatarInterface +restoreMyAvatar() +startAvatarIdleAction()
+stopAvatarIdleAction() BlockInterface +block() +unblock() PlanetInterface +onMovePlanet 使わなくなったものは削除 PlanetLayer ・・・
やるべきこと/やってよかったこと⑧ いじらせない ・interface分離 いっそのこと ・ライブラリ化 (モジュール化) ソースコードを書く以上だんだんおかしくなっていく
まとめ 大規模リファクタリング
一番重要なこと ・大規模リファクタリングの場合、関係者への理解は必須 痛感したこと ・最初からリファクタリングは定期的にしておくべき ・新規アプリで余裕なくても2年すぎたらやるべき #2年すぎてサービスが続いているならば、まだサービスは続くと思うので
・プラットフォームは定期的にバージョンアップすべき(cocosにしろunityにしろndkでも) まとめ
Q & A
ご静聴ありがとうございました!!