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
cocone Teck Talk Vol.1 - 大規模リファクタリング
Search
cocone
August 17, 2021
Programming
0
550
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
73
20240301_cocone_EMゆるミートアップvol6_LT資料
cocone
0
840
2024_cocone-avatarservice.pdf
cocone
0
2k
2024_cocone-wellbeing
cocone
0
4.7k
2023夏季合同企業説明会ココネ
cocone
0
340
cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ
cocone
0
580
cocone TECH TALK Vol.6 - ココネグループのブロックチェーン MOOI Network とのバックエンド連携
cocone
0
500
cocone TECH TALK Vol.6 - Kotlin バックエンドアーキテクチャ of アバターサービス
cocone
0
510
ココネ株式会社 会社紹介
cocone
0
130k
Other Decks in Programming
See All in Programming
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
810
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
240
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
230
童醫院敏捷轉型的實踐經驗
cclai999
0
200
High-Level Programming Languages in AI Era -Human Thought and Mind-
hayat01sh1da
PRO
0
530
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
880
Java on Azure で LangGraph!
kohei3110
0
170
XP, Testing and ninja testing
m_seki
3
200
Bytecode Manipulation 으로 생산성 높이기
bigstark
2
380
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
390
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
110
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
460
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
140
7k
Become a Pro
speakerdeck
PRO
28
5.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Designing Experiences People Love
moore
142
24k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
220
Unsuck your backbone
ammeep
671
58k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
The Cult of Friendly URLs
andyhume
79
6.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
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
ご静聴ありがとうございました!!