見出し画像

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のファイルをすべて削除したPull Request

まとめ

Objective-Cの削減はやらねばと思いながらもガッと進めるには難しいタスクだと思います。
具体的には

  • 対応してもユーザー影響がほぼない

  • タスク管理の人への説明が難しい

  • Objective-Cを読める人がいない

  • Objective-C独自挙動をSwift化する際に障壁になる

  • 新機能を作る優先度が高くリソースが割けない

  • etc…

などの問題があると思います。
今回は今期の目標の中にObjective-C 0を掲げたこと、iOSチームに人が増えたことで、新機能を進める人・負債解消を進める人とでリソースを分けられたことによってこのタスクを集中して進めることができました。

ちなみに最近はこれ以外にもPeripheryを利用して使われてないコードを洗い出して削除するなどの対応もしていました。
こういう活動をすることでここ3ヶ月ぐらいはコードの追加よりも削除が多くなっていました。

コードの追加より削除が多い様子

Objective-Cが無くなったからといってこれで終わりではありません。
最近はXcodeでコードを書く際にモタつきを感じることがあるので、プロジェクト構成を綺麗にしたり、マルチターゲット化を進めたりしたいなと考えています。また、Objective-CをとりあえずSwift化しただけのものもあったりするので綺麗にしがいはまただまだあります。
古いコードをきれいにしながら新しい価値を提供し続けるような開発スタイルに興味があれば是非お声掛けください。

この記事が気に入ったらサポートをしてみませんか?