potatotips #63 @スマートニュース株式会社 https://potatotips.connpass.com/event/134616/
6年ほど育ったiOSプロジェクトを刷新した話potatotips #632019/07/24 ryokosuge
View Slide
自己紹介● 株式会社fluct○ SSP開発本部 SDKチーム■ 主にFluctSDK iOSの開発してます○ 入社して9ヶ月くらい○ 前職はマンガアプリ作ってましたTwitter: @ryo_kosugeGitHub: ryokosuge
アジェンダ● 6年かけてどう育ったか● 刷新作業(やったこと)● 刷新した結果● まとめ
6年かけてどう育ったか
“git log --reverse”(噂ではSVN時代があるからもっと古い説あり)
広告SDKの開発について● 継続的な開発ではない○ がっつり作るのは新しいフォーマット対応のみ● テストはしっかり書く○ ほぼ100%網羅されている○ 品質は絶対● 作る前にしっかり設計して100%作り込んでリリースする○ 作ったものは容易に捨てられない世界
広告SDKのプロジェクト● 初期はstaticなSDKしか提供できなかったので`lib~.a`を生成する方式○ `.framework`へ移行○ スクリプトで対応(Makefile)● すごい古いプロジェクトなのでターゲットがおかしい○ 1つの実装ファイルにたくさんのtargetが参照している■ 無謀なテストもかけてしまう
広告SDKのプロジェクト● ターゲットがおかしいからindexがうまくはられない○ テストを書く時にサジェストが出ない○ import error■ Headerファイルが見つからないらしい● CIも時間がかかる○ キャッシュなど活用しても根本が解消されない○ 1つPRのjobに10分以上かかってしまうこともある
流石にやばい
刷新作業(やったこと)● 別ディレクトリに1からプロジェクト作成○ しっかりターゲット選定をする■ FluctSDKとXCTestは1つのプロジェクトにして、依存するターゲットは別プロジェクトにする● 作業はworkspaceでまとめる● ファイルはコピーして持ってきてプロジェクトに追加していく○ 命名規則などもこのタイミングで統一する
刷新作業(やったこと)● ターゲットを分けたことで依存しちゃいけない実装をしていた箇所を修正する○ これは力技○ ターゲット設計をしっかりしてちゃんと閉鎖できるようにした● テストもmockを使用することで対応可能
刷新作業(やったこと)● プロジェクトが綺麗になったタイミングでドキュメント更新○ Makefileの分割○ 無駄なファイルを削除○ READMEもわかりやすく
結果
昔のプロジェクトすごい多いターゲット数
FluctSDKのプロジェクト
SDKに依存するプロジェクト
刷新した結果● indexがしっかり貼られるようになったのでサジェストでる● 開発時に無駄なbuildが走らなくなった● `lib~.a`なファイルではなく、xcode標準の`.framework`をbuildで生成できるようになった○ Static + bundleの提供方法は変えてない■ dynamicにすると導入手法が変わるためやらなかった
刷新した結果● CIで落ちなくなった○ Travisで起きる謎のクラッシュがなくなった■ しっかり実行できるようになったからかな● キャッシュも効くようになったので2分ほどjobの時間を短縮● Warningsがほぼ0○ deprecatedしているクラスのwarning以外はない
まとめ
まとめ● 6年続いたプロジェクトにまずは敬意を持つ● 何が依存していてどういう構成になっているか知るいいキッカケになった○ やる際はタスクをしっかり書き出してどうなると成功なのか示す必要ある● outputは変えちゃいけない○ 要は大規模リファクタリング
ご静聴ありがとうございました