iOSアプリ開発を爆速で内製化した話
はじめに
モバイル開発グループでiOSエンジニアをしている日野森です。
10年以上iOSアプリ開発をしてきた経歴を活かしてシニアエンジニアとして日々業務をこなしています。
今回はそんな日々の業務をやってたらいつの間にか内製化できた話をしたいと思います。
当時の状況
当時の開発の状況は、リリース2ヶ月前。開発はほぼ外部ベンダーさんが請け負っていて、進捗としては7、8割終わっていると言う話でした。また、運営側もスマートフォンアプリの開発も未経験なチームだったので、ベンダーさんにどう指示すれば良いのか困惑している様に感じました。
そんな状況のチームに私を含めた2名のiOSエンジニアが開発メンバーとしてアサインされました。
ちなみに当時は両者とも中途入社したてで、モバイル開発グループという枠組みも出来ていない時期でした。
改善点の洗い出し
最初に渡されたリポジトリの中に見事に出来上がっているスパゲッティコードに軽い眩暈を起こしたのを覚えています。
ジョインしてすぐに外部ベンダーさんと連携をとって大規模なリファクタリングをするのはコミニュケーションコストが高いので、外部ベンダーさんにはそのまま開発を続けてもらって、私たちは仕様理解を進めつつリファクタリングを行う事にしました。
当時のコードは、大きく以下の3つの改善点がありました。
⛔ 活用されていないCI環境
⛔ 統一されていないアーキテクチャ
⛔ 縦横無尽に呼ばれるシングルトンクラス
細かくはまだ色々ありましたが、ひとまずこの3つを大きな改善タスクとして進める事にしました。
大規模リファクタリング
大まかな方針は決まったので、まずはコードに直接手を入れない改修から入り、徐々に内部の深いところまで改修を進める事にしました。
✅ 活用されていないCI環境
当時、CI環境は一応用意はしてる様ですが、ほぼ使われてない状態だったので、以下の2点をCIで定期的に実行できる環境を構築。
- コードの静的解析
- ユニットテスト実行
ユニットテストのカバレッジレートは0%。すぐに数値を上げるのは難しいので、カバレッジレートは表示するだけに止めて、最低限のレビュー環境の整備に努めました。
✅ 統一されていないアーキテクチャ
MVVMがベースになっている形跡はありましたが、Viewから処理を分離できておらず、ViewModelが飾りになっているケースがほとんどで、アーキテクチャとして機能していない状態でした。
そこで、MVVMにClean Architectureの原理を適用し、Input、Outputを活用してViewModelでPublisherの操作を行うという実装を全てのViewControllerとViewModelに行い、Viewから不要な処理部をViewModel、Modelに分離しました。
こちらの小山さんの記事にその辺りの開発手法が書かれているので、こちらも読んでくれるとより理解していただけると思います。
✅ 縦横無尽に呼ばれるシングルトンクラス
シングルトンパターンは簡単に使えるのは利点ですが、誤解して使用されることも多く、共依存化、複雑化しやすく、テストも書きづらくかなり慎重な運用をしないと簡単にブラックボックス化してしまいます。
このパターンはチーム開発では非常に危険なので、このシングルトンで運用しているクラスを除去していきました。
この三つのタスクを1ヶ月程度の間に一気に解消した事で、コード全体の視認性が格段に良くなりました。そうすることで、ようやく実コードに落とし込まれた仕様を追える様になり、機能追加も問題なく処理できる様になりました。
そしてチーム開発へ
大規模リファクタリングが終わった事で、自然とベンダーさんがやるよりもこちらでやった方が早いと言う状態になり、こちらで開発作業を完全に巻き取る事が出来ました。
ただ、このままではチーム開発体制の基盤が出来ただけなので、ここから足りないUnitTestの拡充、データフローの整理、UIのリファクタリング、等々色々とありました。
しかし、再構築した基盤とPRのルール、ブランチ戦略・レビューフローを整えたチームはしっかりとしたコーディング思想が根付いてきていて、メンバーが増えても大きなコードの乱れもなく進める様になり、他のメンバーの指摘も適切な指摘が増えて、自走できるチームになったと思います。
👨💻👩💻
現在は、SwiftUIやモダンなアーキテクチャへのチャレンジをチームで進めることで、チーム全体でモダンな開発手法を取得できる様に日々チームで試行錯誤しています。
さいごに
私たちKINTOテクノロジーズではチャレンジを一緒にしてくれる仲間を絶賛募集中です。
一緒にチームビルディングできる日を楽しみにしています。
関連記事 | Related Posts
We are hiring!
【iOS/Androidエンジニア】モバイルアプリ開発G/東京・大阪
モバイルアプリ開発GについてKINTOテクノロジーズにおける、モバイルアプリ開発のスペシャリストが集まっているグループです。KINTOやmy routeなどのサービスを開発・運用しているグループと協調しながら品質の高いモバイルアプリを開発し、サービスの発展に貢献する事を目標としています。
【部長・部長候補】/プラットフォーム開発部/東京
プラットフォーム開発部 について共通サービス開発GWebサービスやモバイルアプリの開発において、必要となる共通機能=会員プラットフォームや決済プラットフォームの開発を手がけるグループです。KINTOの名前が付くサービスやTFS関連のサービスをひとつのアカウントで利用できるよう、様々な共通機能を構築することを目的としています。