Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
スタサプ ForSCHOOLアプリのシンプルな設計
Search
Recruit
PRO
October 07, 2024
Technology
3
1.2k
スタサプ ForSCHOOLアプリのシンプルな設計
2024/10/08に、Flutter技術構成を紐解く クロスプラットフォーム開発の裏側で発表した、koji-1009の資料です。
Recruit
PRO
October 07, 2024
Tweet
Share
More Decks by Recruit
See All by Recruit
Azure Functions HTTPトリガーにおけるタイムアウトでハマったこと
recruitengineers
PRO
2
150
実務につなげる数理最適化
recruitengineers
PRO
6
690
うちにも入れたいDatadog
recruitengineers
PRO
2
370
リクルートのデータ基盤 Crois 年3倍成長!1日40,000コンテナの実行を支える AWS 活用とプラットフォームエンジニアリング
recruitengineers
PRO
2
330
Splunk Enterpriseで S3のデータを直接検索してみた!
recruitengineers
PRO
2
150
Looker APIを使い倒す ユーザーフィードバックを基にした継続的改善サイクル
recruitengineers
PRO
3
57
Kaggleふりかえり会〜LLM 20 Questions & ISIC 2024
recruitengineers
PRO
2
230
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
2
51
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
390
Other Decks in Technology
See All in Technology
CustomCopを使ってMongoidのコーディングルールを整えてみた
jinoketani
0
220
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
8
3.1k
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
320
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
140
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
2
2.1k
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
150
PHPからGoへのマイグレーション for DMMアフィリエイト
yabakokobayashi
1
160
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
210
5分でわかるDuckDB
chanyou0311
10
3.2k
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
アップデート紹介:AWS Data Transfer Terminal
stknohg
PRO
0
170
Featured
See All Featured
Practical Orchestrator
shlominoach
186
10k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Writing Fast Ruby
sferik
628
61k
Become a Pro
speakerdeck
PRO
26
5k
Why Our Code Smells
bkeepers
PRO
335
57k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Thoughts on Productivity
jonyablonski
67
4.4k
GraphQLとの向き合い方2022年版
quramy
44
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Transcript
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 スタサプ ForSCHOOLアプリの シンプルな設計 @koji-1009/株式会社リクルート Flutterの技術構成を紐解く クロスプラットフォーム開発の裏側
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 Wakamiya Koji (@koji-1009/@D_R_1009) • Flutter歴そろそろ6年目 • Android
(9年)とiOS (6年)のモバイル畑育ち • 6月に息子が生まれました! 可愛い! • SNS ◦ GitHub/Zenn: @koji-1009 ◦ X(Twitter): @D_R_1009
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 スタディサプリ for SCHOOL
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 2020年4月ごろにAndroid、iOSのネイティブアプリとしてリリース • 生徒の進路選択をサポートするアプリ ◦ 適性診断機能 ◦
学校検索、資料請求機能 ◦ オープンキャンパス検索、予約機能 • 進路選択のDX化を支援 スタディサプリ for SCHOOLのこれまで
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Androidは2023年8月、iOSは2023年12月にFlutter化 • 開発と運用の効率化が目的 ◦ “やりたいこと”に対するリソースの不足 ◦
プラットフォーム最適であるが故の“仕様差分” スタディサプリ for SCHOOLのこれまで Blog: https://blog.studysapuri.jp/entry//entry/2024/06/05/for-school-flutter-replace Android、iOSアプリをFlutterでリプレース!
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Add-to-appで一部機能をFlutterで置き換えるところからスタート ◦ Flutterのスキルをつけつつ、開発を止めない ◦ Add-to-appのコードはFlutter化した際に利用 •
1年強の期間を経て、Flutter化を完遂 ◦ Flutter版の機能はネイティブ版相当に スタディサプリ for SCHOOLのこれまで Blog: https://blog.studysapuri.jp/entry//entry/2024/06/05/for-school-flutter-replace
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Vue.jsからFlutter Webに更新 • モバイル版の開発チームがWeb版も対応予定 ◦ モバイルとソースコードを90%以上共通化
• 2024年度末から本格的に運用予定 • 開発チームが全ての利用環境をサポートする ◦ 学校ではWeb版の利用シーンが多い スタディサプリ for SCHOOLのこれから Flutter WebによるWeb版を提供
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 リプレースにあたって
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Android、iOSでUIや仕様差分を作らない ◦ 実装された仕様に差分があったが、リプレースに合わせて解消 ◦ こだわりがある箇所のみOSによる分岐を実装 •
Kotlin、Swiftは書かない ◦ 旧バージョンからのマイグレーション処理 ◦ OSの差分はpluginで解消 リプレース方針
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 端末の機能を使う箇所が少なかった • KotlinとSwift、Dartで書くべき処理を適切に分離できた • “シンプルな設計”を採用し、分岐や考慮するべき箇所を削減できた リプレースの成功要因
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 端末の機能を使う箇所が少なかった • KotlinとSwift、Dartで書くべき処理を適切に分離できた • “シンプルな設計”を採用し、分岐や考慮するべき箇所を削減できた リプレースの成功要因
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 シンプルな設計
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Repository layer • Logic Layer •
Consumer Widget 設計上のシンプルさ レイヤー分割
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Repository layer ◦ Repository Provider •
Logic Layer ◦ Logic Provider ◦ Logic Notifier • Consumer Widget 設計上のシンプルさ レイヤー分割
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 単方向データフロー (UDF) を意識する • App StateとEphemeral
Stateを分割する ◦ Riverpodで管理するのはApp Stateのみ ◦ Widgetの状態はStatefulWidgetで管理する 設計上のシンプルさ
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 共通化するべきUIは共通化する ◦ 全体を通して共通化するべきものを共通化する • StatelessWidgetをできるだけ利用する ◦
“便利”でもStatefulなWidgetは共通化しない ◦ UDFを意識していればConsumerWidgetは(ギリギリ)運用可能 ◦ Tap時の処理などはFunctionにして外部から注入する Widgetのシンプルさ
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 再生成を避けるよりも、意図せず状態が初期化されることを避ける ◦ Widgetの再生成によるfps低下は起こりにくい ◦ 描画の高速さはFlutterに任せる •
Router APIを採用する ◦ 画面遷移、画面の初期値を宣言的に管理する ◦ 画面をリロードしてもOKな状態を目指す Widgetのシンプルさ
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 Riverpod
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • ChangeNotifier & ListenableBuilderと仕組みが同じ ◦ ListenableをProvider /
Notifierに拡張している ◦ “必要な時”に“必要なWidget”が再描画される • Consumer系のWidgetは、全てStatefulWidgetの継承クラス ◦ Riverpodの仕組みとFlutterの仕組みを接続しやすい Riverpodのいいところ
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • Logicの記述に関してはChangeNotifierより優秀 ◦ 別のChangeNotifierを監視するのは難しい ◦ Riverpodは別のProviderを容易に監視できる •
記述力の高さが実装に与える影響が大きい ◦ 複数のApp Stateを参照したProviderを作成できる ◦ あるApp Stateを初期値とし、 ユーザー操作により更新される一時的なNotifierが作成できる Riverpodのいいところ
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • シンプルな構造を目指す ◦ 構造がシンプルであれば、コードが多くても問題になりにくい ◦ コード量が問題になるのであれば、モジュール分割を •
複雑さを隠蔽しない ◦ “複雑なこと”をシンプルな手法で愚直に実現する ◦ Riverpodの標準的な振る舞いをベースにして設計する Riverpodのいいところを活かす
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 一言で言うなら
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 Flutter + Riverpodを信じる
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 • 書きやすく、レビューしやすい構造にする ◦ 開発者の負担を増やさないことが、安定した実装に繋がる ◦ 理解しやすい構造は、新規メンバーにもうれしい •
Flutterは“十二分に”すごい ◦ 普通に書けば、求める速度のアプリができる ◦ Hot Reloadをはじめ、開発の手が止まらない工夫が随所に • OS差分やスマートフォンの機能を使うのは控えめに ◦ pluginがあっても、期待通りとは限らない…… 私たちの知見
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 募集してます https://www.recruit.co.jp/employment/mid-career/technology
#Flutter_findy スタサプ ForSCHOOLアプリのシンプルな設計 Thank you!