SlideShare a Scribd company logo
クリーンアーキテクチャ脱却と
Swift UI導入までの道のり
野瀬田 裕樹
Speaker
- 野瀬田 裕樹(ノセダ ユウキ)
- iOS/Android Engineer
- 経歴
- 2013年4月 ローム株式会社入社
- 2015年10月 株式会社ナビタイムジャパン入社
- 2017年12月 ヤフー株式会社入社
- 2019年11月 株式会社ディー・エヌ・エー入社
サービス紹介
- 保険契約者向けの健康増進サービス
- 楽しみながら、健康に。
- 2019年6月に公開
- プロダクトは若いが、
中身は若くない
kencom×ほけん
- 健康保険組合などのユーザ向けのサービス
- アプリ機能的にはほぼ同じ
- これをforkして開発
前身:kencom
プロダクトの構成
全体の構成
Native
(iOS/Android)
WebView
Native BFF
WebView BFF
マイクロサービス
マイクロサービス
マイクロサービス
マイクロサービス
RESTful API
internet
- 5タブ構成
- ホーム:健康に関する記事の表示
- カラダ:歩数や体重などのデータの管理
- ポイント:ポイントの消費、確認
- お知らせ:サービス側からのお知らせの表示
- メニュー:その他の機能や設定など
アプリの構成
アプリの構成
- アプリ側の主な実装内容
- 画面の状態管理、画面遷移、アニメーションなど
- その他はHealthKitとの連携、Push通知など
- 複雑なロジックはアプリ内で持っていない
アプリの構成
- kencomから設計(と技術負債)を引継ぎ
- MVP, MVVM, Clean Architectureなどの混在設計
- 問題点
- PresenterやViewModelなどがあり表示ロジックがカオス
- 複雑なロジックがない画面での複雑すぎる設計
- kencomとの仕様差分で不要になったコードやリソースの山
開発初期のアーキテクチャ
どのように問題を解決したか
- 現状把握
- 改善の方針決定
- 改善の実施
問題解決のアプローチ
- より良い実装を考える上で必要な観点
- 現状のコードがどうなっているか
- アプリがどのように変化するか
- 開発の体制はどうなっているか
現状把握
- 現状のコード
- kencomから引き継いだ技術的な負債
- カオスで複雑な混在設計
- Deployment Targetが不必要に低いまま
- 2020年9月時点ではまだiOS10をサポートしていた
- (このままではSwift UI導入などは到底できない)
現状把握
- 現状のコード
- kencom×ほけんアプリの変化
- 主にUI面での追加や修正がほとんど
- PresenterやViewModelに相当する領域が肥大化しがち
- 必要になったらリリース(不定期なリリースサイクル)
現状把握
- 現状のコード
- kencom×ほけんアプリの変化
- 開発体制
- 基本的にはほぼ1人での開発体制
- 既に全体を把握している人はいない
- 学習コストが高い複雑な設計を引き継ぐ運用はできない
現状把握
- プロセスの改善
- 継続的なリリースサイクルの確立
- Deployment Targetの変更ルール確立
- 設計の改善
- 修正が必要な画面ごとに設計と実装を見直し
- Cocoa MVCを基本として、画面ごとに最小限の設計に変更
改善の方針
- ほしい設計の特性
- Swift UIへ移行しやすいこと
- UI関連の改修がしやすいこと
- 学習コストが低く、引継ぎやすいこと
今後の変化を見越した設計
- 既存の設計
- Clean Architecture
- Swift UI移行やUI改善のしやすさにあまり寄与しない
- 学習コストも高く、設計意図の引継ぎが難しい
- MVVM
- 複雑な画面になるとVMが肥大化しがち
- VCとVMの責務がそれぞれ曖昧になりがち
- Swift UI移行時にVC/VMの見直しが必要になる
今後の変化を見越した設計
- 今後の設計
- 単純な画面
- Cocoa MVCを採用
- VCが肥大化しない程度の画面であれば、MVCの方が見通しやすい
- 複雑な画面
- StoreパターンやFluxに近い設計を採用
- 画面の状態をState構造体として分離し、Storeに持たせる設計
- Swift UIに移行する際の@Stateに相当するので流用がしやすい
今後の変化を見越した設計
実際の設計変更の例
- 体重を入力する画面
- 既存実装:MVVM + Clean Architecture
- ViewController:200行以上
- ViewModel:100行以上 × 2
- Use Case/Repositoryは単なるAPIのラップ
- UI関連の変更は毎回ViewModelとViewControllerを修正していた
- 責務が曖昧でVMとVCを都度しっかり読み込む必要があった
実際の設計変更の例
- 体重を入力する画面
- 既存実装:MVVM + Clean Architecture
- 新規実装:MVC + Storeパターン
- ViewController:ほぼViewとStateのbindのみ
- UI変更はViewクラス、描画の状態はStateクラスのように責務がわかれ
て修正がしやすくなった
- Stateを切り分けることでSwift UIへの移行がしやすくなった
Swift UI移行の実装例:UIKit版
- このようにStateを切り出すとSwift UI化が容易
Swift UI移行の実装例:Swift UI版
Swift UI時代の設計
View Controller
(UIKit)
View
(Swift UI)
Store
(Observable Object)
- MVC+Storeパターンを採用
- VC:ナビゲーション周りをUIKitで実施
- View:描画全般は可能な限りSwift UIで実装
- Store:各Viewに持たせてobserveする構造
Swift UI時代の設計の理由
- MVC+Storeパターンを採用
- Swift UIのナビゲーションで多くの罠があった
- Viewに画面遷移を任せたくなかった
- UIKitと同じ構造で統一できるようにしたかった
View Controller
(UIKit)
View
(Swift UI)
Store
(Observable Object)
- プロダクト状況に合わせた改善を継続
- 設計の改善のためには、プロセスを含めた周辺環境
の整備や事前の準備が重要
- Swift UIへの移行の上では、Stateを事前に切り出し
ておくと便利
- どうしても流用できない箇所や、Swift UI特有の問題もあるた
め、try&errorを続けている
まとめ
ご清聴ありがとうございました
for Q&A
Q. ビジネス側と開発でドメインを合わせるときにどんなところに気を使っていますか?また、
ユーザーストーリーの共有にどのようなツール使われてますか?
A. ビジネス側は要求を満たせれば良いというスタンスになるため、開発側はその要求をきち
んと理解するということに重きをおいています。ビジネス側は開発における制約や技術的観
点を把握していないため、開発側はそれらの知見とビジネス側の要求をすり合わせすること
が求められているため、そこに気を使っています。ユーザーストーリーの共有という意味では
ビジネス側で使いやすいシステムを使うため、パワポやエクセル資料だったりConfluence
だったりとマチマチです。開発側がビジネス領域に入り込んで意見していく場合は簡易な資料
をもとに一緒に議論し、正式なものをConfluenceに落とし込むイメージですが、ビジネス側か
らかっちりと要件が決まって降りてくるケースでは最初からConfluenceで要件をドキュメント
化した状態で共有が行われます
Q. アジャイル開発の場合、早くリリースすることが求められると思うのですが、アーキテクチャ
設計にはどれくらい時間をかけているのでしょうか?リリースしながらリアーキテクチャするよ
うな形が多いのでしょうか?
A. アーキテクチャ設計は必要最小限のアーキテクチャ(MVA)の考え方や、Apple/Google推
奨のアーキテクチャが既にあるという観点から、アプリ開発で設計に時間をかけるということ
は私のチームでは行っていません。リアーキテクチャという話では、BFFで画面ごとにデータ
をもらってくるという構造になっているため、個々の画面ごとにリアーキテクチャを行うことで影
響範囲を狭めながら改善をするというやり方でリリースに混ぜ込んでいくということをしていま
す。
Q. AndroidのアーキテクチャもiOSで採用されているFluxで構成しているのでしょうか?小規
模なチーム開発する場合、AndroidとiOSで似たアーキテクチャの方がお互いキャッチアップ
しやすいのかな?と思っているのですが、その点ご意見いただければ嬉しいです。
A. いえ、Androidは基本をMVVMにして、Repositoryを用意するような設計になっています。
Androidの設計にあたってはGoogle推奨の設計ドキュメントが公開されていることもあり、そ
れに則って設計・実装する方がキャッチアップやAndroidのアップデートへの追従がしやすい
などのメリットがあると考えています。AndroidとiOSでは表示に関する要素、設計が全く異な
り、例えばAndroidであればxmlとActivity/Fragment+ViewModelで表示周りを実装します
が、iOSであればSwift UI Viewやstoryboard/xibとUIViewController/UIViewで表示周りを実
装するというように、かなりFrameworkに依存する部分なので、共通化が難しいというのもあ
ります。互いにキャッチアップするという観点でいうと、同一機能のクラスの命名を揃えておく
とか、UIからは分離されたモデルクラスをほとんど共通のものを使うとか、Swaggerなどで
APIをドキュメントから生成するという形を取る方が望ましいと思われます。
Q. リアーキテクチャに際して、リスク軽減のためにPoCとかやると思うのですが、実際にプロ
ダクトを作り込まないとわからない課題やフィードバックもあると思います。PoCを切り上げる
判断基準とかってあるでしょうか?
A. (回答になっているかわからないですが)うちのチームではアーキテクチャのプロトという意
味では、実際導入してみたあと、実装した人と違う人がその箇所を改修したときに実装がしや
すいか、コードレビューがしやすいか、などを見た上で判断するので、改修時のコードレビュー
のタイミングなどでこれはないねとなれば切り上げるという感じになっています。
Q. 各開発チームはそれぞれどれくらいの人数で進めていますか?また、新しくジョインするメ
ンバーがいた場合、アーキテクチャをどのようにキャッチアップしてもらっていますか?
A. kencom×ほけんはiOS1人、Android1人体制になっています。増減はしますが、アプリ開
発は自分が経験した限りOSごとに1〜3人で開発することが多い認識です。新しくジョインす
るメンバーがいた場合は、ドキュメントベースのon-boardingを進めるとともに、ペアプロなどを
活用して一緒に開発する中でキャッチアップをしてもらっています。
Q. 実践的なアーキテクチャのスキルを鍛えていくのは簡単ではないかと思うのですが、ご自
身のスキルアップやメンバーの育成でやっていること、オススメのことなどがあれば教えてい
ただけると嬉しいです。
A. 理想を追い求めず、しっかりと自分でメリット/デメリットや目的意識を念頭に置くことが大切
です。事業のフェーズや体制、プロダクトの状況などに応じて必要になってくるアーキテクチャ
やスキルは変わってくるため、全体観を持って目的に必要なものが何かを考える癖をつけて
おくと良いと思います。そのために自分がやっているのは、可能な限りの作業自動化・効率化
を行い、開発効率を上げ、そうした全体観や目的について考えを巡らせる時間を日々少しで
も用意し、そうした思考を習慣化させることです。メンバーの育成という意味では、ペアプロや
1on1を通じて思考や方略について適宜教示するスタンスで行ってます。
Q. サービス長く運用するほど複雑性が増大していくかとおもうのですが、ドメインモデルや
アーキテクチャに手を入れたくなるケースはありますか?根本に手を入れる必要がでてきて、
コスト・期間も増大しがちで、意思決定に踏み切りにくい領域かと考えています。また、そうし
たケースに対応する、戦略・対処はどのように扱われますか?
A. あります。具体的には、ユーザに価値を届けるサイクルが異常に長くなったり、価値を届け
てもバグが起きやすかったりといった現象が生じ、その原因が根本のアーキテクチャ・ドメイン
モデルにあり、容易には手を入れられないというケースは一度だけ経験があります。こういっ
たケースでは、ユーザに届けられる価値が今のままでは直近数年ではこれくらい、根本から
手を入れればこうなる、しかしこういうデメリットがある、かかる工数はおよそこの程度、などの
情報を整理し、意思決定者が判断できる材料を揃えることが開発者の責務であると考えてい
ます。ロードマップを作り、リアーキテクチャのメリットデメリットを表で整理し、人員計画などに
も踏み込んで意思決定者と議論し、対応することが必要になります。

More Related Content

PDF
Human Interface Guidelines(iOS版) まとめ資料
PDF
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
PPTX
【 ヒカ☆ラボ 】LIFULL Home's androidアプリの開発の裏側について
PDF
DevLOVE関西(No.62) 知っておいて損はないエンタープライズiOS導入のいろは
PDF
第2回 近JASA セミナー 「組み込みの世界に影響を与える エンタープライズiOS」
PPTX
スーパーアプリ元年! LINEが提供するデベロッパー向けAPIを 活用してAWS上でLINE内アプリを開発
PDF
エンタープライズにおけるiOSアプリ開発で押さえておくべき7つのこと
PDF
iOSアプリケーションでロボットを制御してみよう
Human Interface Guidelines(iOS版) まとめ資料
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
【 ヒカ☆ラボ 】LIFULL Home's androidアプリの開発の裏側について
DevLOVE関西(No.62) 知っておいて損はないエンタープライズiOS導入のいろは
第2回 近JASA セミナー 「組み込みの世界に影響を与える エンタープライズiOS」
スーパーアプリ元年! LINEが提供するデベロッパー向けAPIを 活用してAWS上でLINE内アプリを開発
エンタープライズにおけるiOSアプリ開発で押さえておくべき7つのこと
iOSアプリケーションでロボットを制御してみよう

What's hot (18)

PDF
iPadアプリ選択のベストプラクティス(in 名古屋)
PPTX
Voice interaction api for android m
PDF
iOSアプリケーションの継続的デリバリー
PDF
Windows Phone / iOS / Android アプリ同時開発のススメ
PDF
20140918 i os8イベント_ios-history (公開用)
PDF
エンタープライズにおける iOSアプリ開発・導入のいろは
PDF
フィードテイラー紹介(2014.5.1版)
PDF
B2B2Cアプリ開発で感じたpush通知の勘所とは
PDF
フィードテイラー紹介(2014.11.15版)
PDF
リワード広告におけるリジェクト問題の現状
PPTX
賃貸不動産スマホサイトランキングNo.1への道のり
PPTX
LIFULL HOME'S高速化への道のり
PDF
ソフトウェアエンジニアに知ってほしいAerospike
PPTX
ネット広告のシステム関連の話
PPTX
Firebase update from io'17
PDF
俺の仕事がこんなに楽しいわけが無い・公開版(初出:2010/12/20 株式会社ECナビ会社説明会@IAMAS)
iPadアプリ選択のベストプラクティス(in 名古屋)
Voice interaction api for android m
iOSアプリケーションの継続的デリバリー
Windows Phone / iOS / Android アプリ同時開発のススメ
20140918 i os8イベント_ios-history (公開用)
エンタープライズにおける iOSアプリ開発・導入のいろは
フィードテイラー紹介(2014.5.1版)
B2B2Cアプリ開発で感じたpush通知の勘所とは
フィードテイラー紹介(2014.11.15版)
リワード広告におけるリジェクト問題の現状
賃貸不動産スマホサイトランキングNo.1への道のり
LIFULL HOME'S高速化への道のり
ソフトウェアエンジニアに知ってほしいAerospike
ネット広告のシステム関連の話
Firebase update from io'17
俺の仕事がこんなに楽しいわけが無い・公開版(初出:2010/12/20 株式会社ECナビ会社説明会@IAMAS)
Ad

Similar to クリーンアーキテクチャ脱却とSwift UI導入までの道のり@Builders Box 2021.02.09 (20)

PDF

入社4ヶ月 新入りPdMの取り組み
PDF
kintone mobile cloud seminar 20170126
PPTX
UTアンチパターン
PDF
iPadアプリ選択のベストプラクティス
PDF
3分でわかるMobileApps
PPTX
ガチのエンジニア集団に身を置くというキャリアの作り方 ~ド文系の翻訳者がビルドエンジニアっぽくなった話~
PPTX
障害のない社会を作るためのアプリづくりとは? - 発達障害の方向けアプリ開発から学んだこと
PPT
Tapnow資料
PDF
ソフトウェアエンジニアがクルマのコアを創る!? モビリティの価値を最大化するソフトウェア開発の最前線【DENSO Tech Night 第一夜】
PDF
20140320ニフティクラウドmeet-up!セミナー資料1
PDF
Feedtailor portfolio 20141115
PDF
IoTをやるため起業した話
PDF
自動運転に向けた取り組みと安全管理
PDF
iOSアプリケーションの継続的デリバリー 〜エンタープライズ品質のiOSアプリケーションを目指して〜
PDF
【公開用】アプリ向けDSP Tapticaをフル活用して 最大の成果を出す方法 @アド部 イスラエルモバイルアドテクセミナー
PDF
scrum_fest_osaka_2020
PDF
FIDO2導入してみたを考えてみた
PDF
[Japan Tech summit 2017] DAL 008
PDF
Softlayer_summit
PDF
ご紹介、GUIでサクッと自動応答システムを作る方法 ー Slack/LINEとの連携も簡単 ー FrontOps : フロント・オプス

入社4ヶ月 新入りPdMの取り組み
kintone mobile cloud seminar 20170126
UTアンチパターン
iPadアプリ選択のベストプラクティス
3分でわかるMobileApps
ガチのエンジニア集団に身を置くというキャリアの作り方 ~ド文系の翻訳者がビルドエンジニアっぽくなった話~
障害のない社会を作るためのアプリづくりとは? - 発達障害の方向けアプリ開発から学んだこと
Tapnow資料
ソフトウェアエンジニアがクルマのコアを創る!? モビリティの価値を最大化するソフトウェア開発の最前線【DENSO Tech Night 第一夜】
20140320ニフティクラウドmeet-up!セミナー資料1
Feedtailor portfolio 20141115
IoTをやるため起業した話
自動運転に向けた取り組みと安全管理
iOSアプリケーションの継続的デリバリー 〜エンタープライズ品質のiOSアプリケーションを目指して〜
【公開用】アプリ向けDSP Tapticaをフル活用して 最大の成果を出す方法 @アド部 イスラエルモバイルアドテクセミナー
scrum_fest_osaka_2020
FIDO2導入してみたを考えてみた
[Japan Tech summit 2017] DAL 008
Softlayer_summit
ご紹介、GUIでサクッと自動応答システムを作る方法 ー Slack/LINEとの連携も簡単 ー FrontOps : フロント・オプス
Ad

クリーンアーキテクチャ脱却とSwift UI導入までの道のり@Builders Box 2021.02.09