Slide 1

Slide 1 text

6年ほど育った iOSプロジェクトを 刷新した話 potatotips #63 2019/07/24 ryokosuge

Slide 2

Slide 2 text

自己紹介 ● 株式会社fluct ○ SSP開発本部 SDKチーム ■ 主にFluctSDK iOSの 開発してます ○ 入社して9ヶ月くらい ○ 前職はマンガアプリ作って ました Twitter: @ryo_kosuge GitHub: ryokosuge

Slide 3

Slide 3 text

アジェンダ ● 6年かけてどう育ったか ● 刷新作業(やったこと) ● 刷新した結果 ● まとめ

Slide 4

Slide 4 text

6年かけてどう育ったか

Slide 5

Slide 5 text

“git log --reverse” (噂ではSVN時代があるからもっと古い説あり)

Slide 6

Slide 6 text

広告SDKの開発について ● 継続的な開発ではない ○ がっつり作るのは新しいフォーマット対応のみ ● テストはしっかり書く ○ ほぼ100%網羅されている ○ 品質は絶対 ● 作る前にしっかり設計して100%作り込んでリリースする ○ 作ったものは容易に捨てられない世界

Slide 7

Slide 7 text

広告SDKのプロジェクト ● 初期はstaticなSDKしか提供できなかったので`lib~.a`を生成する方式 ○ `.framework`へ移行 ○ スクリプトで対応(Makefile) ● すごい古いプロジェクトなのでターゲットがおかしい ○ 1つの実装ファイルにたくさんのtargetが参照している ■ 無謀なテストもかけてしまう

Slide 8

Slide 8 text

広告SDKのプロジェクト ● ターゲットがおかしいからindexがうまくはられない ○ テストを書く時にサジェストが出ない ○ import error ■ Headerファイルが見つからないらしい ● CIも時間がかかる ○ キャッシュなど活用しても根本が解消されない ○ 1つPRのjobに10分以上かかってしまうこともある

Slide 9

Slide 9 text

流石にやばい

Slide 10

Slide 10 text

刷新作業(やったこと) ● 別ディレクトリに1からプロジェクト作成 ○ しっかりターゲット選定をする ■ FluctSDKとXCTestは1つのプロジェクトにして、依存するターゲット は別プロジェクトにする ● 作業はworkspaceでまとめる ● ファイルはコピーして持ってきてプロジェクトに追加していく ○ 命名規則などもこのタイミングで統一する

Slide 11

Slide 11 text

刷新作業(やったこと) ● ターゲットを分けたことで依存しちゃいけない実装をしていた箇所を修正す る ○ これは力技 ○ ターゲット設計をしっかりしてちゃんと閉鎖できるようにした ● テストもmockを使用することで対応可能

Slide 12

Slide 12 text

刷新作業(やったこと) ● プロジェクトが綺麗になったタイミングでドキュメント更新 ○ Makefileの分割 ○ 無駄なファイルを削除 ○ READMEもわかりやすく

Slide 13

Slide 13 text

結果

Slide 14

Slide 14 text

昔のプロジェクト すごい多いターゲット数

Slide 15

Slide 15 text

FluctSDKのプロジェクト

Slide 16

Slide 16 text

SDKに依存するプロジェクト

Slide 17

Slide 17 text

刷新した結果 ● indexがしっかり貼られるようになったのでサジェストでる ● 開発時に無駄なbuildが走らなくなった ● `lib~.a`なファイルではなく、xcode標準の`.framework`をbuildで生成でき るようになった ○ Static + bundleの提供方法は変えてない ■ dynamicにすると導入手法が変わるためやらなかった

Slide 18

Slide 18 text

刷新した結果 ● CIで落ちなくなった ○ Travisで起きる謎のクラッシュがなくなった ■ しっかり実行できるようになったからかな ● キャッシュも効くようになったので2分ほどjobの時間を短縮 ● Warningsがほぼ0 ○ deprecatedしているクラスのwarning以外はない

Slide 19

Slide 19 text

まとめ

Slide 20

Slide 20 text

まとめ ● 6年続いたプロジェクトにまずは敬意を持つ ● 何が依存していてどういう構成になっているか知るいいキッカケになった ○ やる際はタスクをしっかり書き出してどうなると成功なのか示す必要あ る ● outputは変えちゃいけない ○ 要は大規模リファクタリング

Slide 21

Slide 21 text

ご静聴 ありがとうございました