noteのiOSアプリから40%以上あったObjective-Cのコードが消えた
先日ラクマさんでも同様のツイートがありましたが、実はほぼ同時期にnoteのiOSアプリからもObjective-Cのコードが消えました。
ちなみに僕が入社した頃のコード量を見てみましょう。(2020年4月)
1332 text files.
1161 unique files.
459 files ignored.
github.com/AlDanial/cloc v 1.92 T=0.33 s (3537.3 files/s, 268815.3 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Objective-C 196 8655 2262 28942
Swift 361 3945 3761 21364
XML 109 0 19 8131
JSON 294 0 0 5863
C/C++ Header 201 1478 895 2915
-------------------------------------------------------------------------------
SUM: 1161 14078 6937 67215
-------------------------------------------------------------------------------
次が現在のコード量です。(2022年8月現在)
1191 text files.
1179 unique files.
72 files ignored.
github.com/AlDanial/cloc v 1.92 T=0.35 s (3327.5 files/s, 320593.5 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Swift 1096 13815 6526 87609
XML 49 0 7 4186
JSON 33 0 0 1336
JavaScript 1 13 6 95
-------------------------------------------------------------------------------
SUM: 1179 13828 6539 93226
-------------------------------------------------------------------------------
Swiftの量が圧倒的に増えてObjective-Cが壊滅したということがわかります。この記事ではどのようにしてObjective-Cを駆逐していったかを振り返っていきます。
UIリニューアル期
入社してすぐに取り組んだのが主な画面のリニューアルです。ちょうどアプリとしてもリニューアルを少しずつ進めていたタイミングだったので一気にやろうと声をかけてガッと進めました。
具体的には
記事一覧画面
投稿画面(5種、一番大変だった)
会員登録画面・ログイン画面
クリエイタートップ、マガジントップ
検索結果画面
etc
など挙げ出すとキリが無いですが色々作り直しました。そのタイミングでUIで利用されていたObjective-Cコードの排除も進めていました。
この辺りは記事にもなっていたりするのでよければみてください。
停滞期
UIのリニューアルが済むと停滞期が訪れます。アプリとしてのカイゼンを進める必要もあり、メンバーの減少もあったりで負債解消に割けるリソースが限られてしまいました。
ちょうど1年ぐらい前のコード量を見てみましょう。
1258 text files.
1247 unique files.
73 files ignored.
github.com/AlDanial/cloc v 1.92 T=0.34 s (3693.5 files/s, 338524.7 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Swift 1042 12572 8776 76226
XML 80 0 10 7542
Objective-C 44 1363 265 4858
JSON 33 0 0 1131
C/C++ Header 47 348 158 929
JavaScript 1 13 6 95
-------------------------------------------------------------------------------
SUM: 1247 14296 9215 90781
-------------------------------------------------------------------------------
初期と比べるとSwiftのファイルがかなり増えていることはわかりますが、Objective-Cはしぶとく残っています。たった残り44、されど44という状態でした。
これはどういうことでしょうか?
利用箇所の多いObjective-Cのモデルたち
UIはSwiftに書き換えられても、APIと互換性をもつモデル(Entity)はサクッと書き換えるわけにはいきませんでした。
主に利用されるモデルは以下の4つです。prefixにNTEとついているものがObjective-C勢のモデルです。(ここではSwiftでイメージを書いています)
class NTENote {
var key: String
var title: String
var body: String
var user: NTEUser
var magazines: [NTEMagazine]
var comments: [NTEComment]
}
class NTEComment {
var noteKey: String
var comment: String
var user: NTEUser
var createdAt: Date
}
class NTEMagazine {
var key: String
var name: String
var user: NTEUser
}
class NTEUser {
var slug: String
var nickname: String
var key: String
}
この中で一番消せないものはどれでしようか?NTENoteかと思いました?
実はNTEUserです。NTENote, NTEMagazine, NTECommentから参照されているので剥すことは困難です。
剥がしやすさの基準としては依存の数と深さが影響しています。
依存が浅いものは1つ1つ対応すればいいですが、依存が深いものは依存先が変わらない限り生き続けます。
ただ、依存先自体が差し代わると自然と消えているということがあるので、差し替え対応を進めている中でいつの間にか依存が減っていくものでもあります。
差し替える対応はNTE系のclassと互換性のあるclassをSwiftで作成し、動作を確認しながら差し替えていく感じです。
他のObjective-Cファイル
前述したモデル以外にもなかなか消せずに残っているものもいくつかありました。
それらの大半は古い画面をとりあえずSwift化した場合に古いコンポーネントを使い続けているなどのパターン、将来的にUIのリファクタリングすることが決まっており手がつけられていなかったパターンです。前者はコンポーネントをSwift化することで進めました。後者はUIのリファクタリングが完了したタイミングでガッと消しました。
こうやって進めていくことでObjective-Cのファイルを完全に駆逐することができました。
まとめ
Objective-Cの削減はやらねばと思いながらもガッと進めるには難しいタスクだと思います。
具体的には
対応してもユーザー影響がほぼない
タスク管理の人への説明が難しい
Objective-Cを読める人がいない
Objective-C独自挙動をSwift化する際に障壁になる
新機能を作る優先度が高くリソースが割けない
etc…
などの問題があると思います。
今回は今期の目標の中にObjective-C 0を掲げたこと、iOSチームに人が増えたことで、新機能を進める人・負債解消を進める人とでリソースを分けられたことによってこのタスクを集中して進めることができました。
ちなみに最近はこれ以外にもPeripheryを利用して使われてないコードを洗い出して削除するなどの対応もしていました。
こういう活動をすることでここ3ヶ月ぐらいはコードの追加よりも削除が多くなっていました。
Objective-Cが無くなったからといってこれで終わりではありません。
最近はXcodeでコードを書く際にモタつきを感じることがあるので、プロジェクト構成を綺麗にしたり、マルチターゲット化を進めたりしたいなと考えています。また、Objective-CをとりあえずSwift化しただけのものもあったりするので綺麗にしがいはまただまだあります。
古いコードをきれいにしながら新しい価値を提供し続けるような開発スタイルに興味があれば是非お声掛けください。