この記事は RAKSUL advent calendar 19日目の記事です。
はじめに
2021年9月にラクスル株式会社 ハコベル事業部に入社しFlutterでモバイルアプリ開発やっています。
今まではAndroidをメインで開発しており、Flutterを触るのは入社してからになります。宣言的UIで画面を作成するので少し慣れない部分もありつつ楽しく開発してます。
課題
現在、ハコベルでは3つのアプリをリリースしてます。
- ハコベルカーゴ(軽貨物ドライバー向け)
- ハコベルコネクト(一般貨物ドライバー向け)
- ハコベルコネクト(配車担当向け)
ですが、それぞれReactNativeやJava, Swiftのネイティブで書かれていたり、WebViewメインの側ネイティブなど様々な言語、SDKで作成されています。
また、ドメインや技術スタックが異なるため開発、メンテナンスするメンバーが分かれていました。
それにより、以下のような課題が発生しておりました。(主に属人化ですね)
- 必要な知識のインプットの学習コストが高い
- それぞれのアプリの知見が活かされづらい
- メンテナンスできる人が各アプリ1人のためメンテナンスされず放置されていた
- 属人化している
- 継続的なSDK/ライブラリのバージョンアップができない
- 追加機能を実装できない
- CI/CDにおけるワークフローの自動化がされていないため、ビルドやアプリ配布にコストがかかる
- 継続的にメンテナンスするエンジニア確保も難しい
これらの問題に対して我々はFlutterを選択しました。
なぜFlutterか?
Flutterは既に多くの実績があり、日本でも既に多くの開発実績があります。
弊社においても上記課題に対しての解決になると思い検討を進め、Flutter導入の意思決定をしました。
主な理由は下記になります。(主にReactNativeとの比較になります)
- iOS, Android 両OS対応
- メンテコストが低い
- それぞれのOSにあった表示をサポートしてくれる
- 学習コスト低い
- SDKをアップデートが容易
- 依存関係が少ない
- パフォーマンスがReact Nativeに比べ良い
私も未経験から開発しましたし、Flutter経験1週間のエンジニアが他チームからジョインしてくれ直ぐに戦力となってもらえ、実際に学習コストの低さを実感しました。
また、今までの課題を解決すべく仕様や開発におけるドキュメントを積極的に属人化を防ぐために他のチームに向けて社内のMeetupで技術紹介をするようにチームで動いてます。
どんな実装してるの?💡
現在1つ目のアプリとして最も複雑なアプリである「ハコベルコネクト(一般貨物ドライバー向け)」を来月1月リリースに向けて絶賛Flutterリプレイス中です🚀
現在開発している環境やライブラリを簡単に紹介します。
Flutter
- Flutter: 2.5.2
- Dart: 2.14.3
ライブラリ
- Riverpod
- DI + StateManagement
- hooksは使ってないです
- freezed
- immutable
- auto_route
- Router
- Dio
- HTTP client
CI/CD
- CircleCI
アーキテクチャ
MVVMをベースにRiverpodと合うようにチームで話し合いながら模索中です。
現在の実装はクリーンアーキテクチャを意識した設計にしており、各層のアクセス順は次のようになります。
それぞれの依存関係解決にはRiverpodのProviderを用いております。
UI
↓
ViewModel // ビジネスロジック & 表示用データ保持
↓
Repository // データアクセス隠蔽
↓
Data Source // Firebase DBやAPIアクセス
データを取得し画面を表示する場合は、Riverpodが提供している FutureProvider
や StreamProvider
を用いViewModelを作成しないケースもあります。この場合は、ProviderがRepositoryを参照しデータ取得を行っています。
DatabaseはバックエンドにFirebase Realtime Databaseを使ってることもありアプリ内にデータの保存はしていないので、利用してません。
今後の展望
まずはファーストリリース向け開発を終わらせることが目標ですが、サービスはリリースがゴールではなく、継続的にユーザーに価値をデリバリーできるようにしていきたいと思っています。
そのためにはリプレイス前に出た課題を再発させないためDX(Developer eXperience)改善を合わせて行っていきたいと思っています。
- 属人化しないように、CI/CDの立て付け
- アプリ配布以外のリリースまで自動化
- アーキテクチャの共有, 明文化
- 仕様の明文化 & マネジメント
- 継続的なSDKアップデート仕組みづくり
また、残りの2アプリについてもFlutterでリプレイスを行う予定です💪
最後に
ハコベルチームでは一緒に働くメンバーを募集しています!
興味ある方はぜひこちらからご応募ください!
https://hrmos.co/pages/raksul/jobs/HIU-TECH9
ラクスルのアドベントカレンダー全編はこちらから