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
入社から約2年、 Money ForwardのAndroidエンジニアとしての活動を振り返る...
Search
syarihu
August 23, 2019
Technology
1
2k
入社から約2年、 Money ForwardのAndroidエンジニアとしての活動を振り返る / Looking back of two years as an Android Engineer of Money Forward
Money Forward Developers' Stories で発表した資料です。
https://moneyforward.connpass.com/event/140296/
syarihu
August 23, 2019
Tweet
Share
More Decks by syarihu
See All by syarihu
[DroidKaigi 2024] Android ViewからJetpack Composeへ 〜Jetpack Compose移行のすゝめ〜 / From Android View to Jetpack Compose: A Guide to Migration
syarihu
2
2.4k
[shibuya.apk #46] Composableの枠を超えてアニメーションする / Animation beyond Composable
syarihu
0
14
[shibuya.apk #41] Jetpack Composeでグリッドに柔軟にスペースを入れたい
syarihu
0
2.7k
[DroidKaigi 2022] 詳解Google Playの新しい定期購入 ~オファーの活用や実装例を添えて~
syarihu
0
3.3k
5分で分かるGoogle Playの新しいサブスクリプション / Google Play new subscription 2022
syarihu
1
1.7k
[DroidKaigi 2021] Google Play 定期購入 比例配分モード完全攻略ガイド / Google Play Subscription Proration Mode Complete Guide
syarihu
1
7.5k
[Money Forward Tech Drive] What's new in Google Play [Recap #io21]
syarihu
0
530
[Android 11 Meetups] Google Play Commerce からのアップデート / Android 11 Meetups Google Play Commerce
syarihu
4
2.8k
[potatotips #70] license-list-pluginを使ってOSSライセンス画面を自動生成する / license-list-plugin
syarihu
4
4.5k
Other Decks in Technology
See All in Technology
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
130
Application Development WG Intro at AppDeveloperCon
salaboy
0
190
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
180
Platform Engineering for Software Developers and Architects
syntasso
1
520
The Rise of LLMOps
asei
7
1.6k
RubyのWebアプリケーションを50倍速くする方法 / How to Make a Ruby Web Application 50 Times Faster
hogelog
3
940
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
360
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
180
複雑なState管理からの脱却
sansantech
PRO
1
150
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
380
Featured
See All Featured
Music & Morning Musume
bryan
46
6.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Building an army of robots
kneath
302
43k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
How to train your dragon (web standard)
notwaldorf
88
5.7k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Site-Speed That Sticks
csswizardry
0
27
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Documentation Writing (for coders)
carmenintech
65
4.4k
The Pragmatic Product Professional
lauravandoore
31
6.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Transcript
入社から約2年、 Money ForwardのAndroidエンジニア としての活動を振り返る Money Forward Developers’ Stories 2019 2019/08/23
(Fri.) @syarihu
Taichi Sato (@syarihu) • PFM本部 サービス開発部 ◦ Androidエンジニア • 入社歴1年10ヶ月
• Androidアプリ開発歴9年目
syarihuが普段やっていること
Money Forward MEのAndroidアプリ開発 • 機能開発 • 技術的負債の改善 • 開発環境整備 ◦
開発・運用フロー ◦ アプリ設計 ◦ CI / CD • 新卒育成 ◦ 困ったときにフォロー する ◦ 厚めのコードレビュー
全社的にやっていること • Androidに関する技術・知 見の共有 ◦ SlackのAndroidチャン ネルへの共有 • Android周りの全社の 方針の整備
• Androidエンジニア中途採 用 • 他プロダクトのお手伝い ◦ コードレビュー ◦ 困ってそうなときにアド バイスしたり
2017年10月 〜 2018年01月
主にやっていたこと • MfCoreさようなら大作戦 • ホームリニューアル ◦ 入出金履歴 ◦ MY通知
MfCoreさようなら大作戦
None
None
None
None
ホームリニューアル
ホームリニューアル • ホームのレイアウト変更 ◦ MY通知、入出金履歴を全面に • MY通知のデザイン変更 • ドロワーのレイアウト変更 •
その他・お知らせの見直し
ホームリニューアル • 入出金履歴 • MY通知
入出金履歴 Before
入出金履歴 After
MY通知 Before
MY通知 After
None
AndroidのSlackチャンネル
AndroidのSlackチャンネル • 以前は座談会というのをやっていたが無く なった • 当時はAndroidエンジニア間の横のつながり があまり無かった
AndroidのSlackチャンネル • ただ復活させても良くないなと思いAndroid の技術・知見を共有するSlackチャンネルを 作った ◦ リリース情報、開発者ブログなどを自動投 稿したり
2018年02月 〜 2018年05月
主にやっていたこと • RxJava 2.0へのアップグレード • パスコードロックの指紋認証対応 • デバッグメニューの実装
主にやっていたこと • 開発フロー整備 • 新卒受け入れ準備
パスコードロックの指紋認証
パスコードロックの指紋認証 • 指紋認証は個人的にどうしても入れた かった • レビューなどでも要望があり需要が高そ うだった
パスコード Before
パスコード After
パスコードロックの指紋認証 • パスコードロック全体のデザインも刷新 し、利便性が向上した
マネーフォワードAndroid版の指紋認証デザインプロセス|池内健一| note https://note.mu/kenichiikeuchi/n/nc64e5c06142c
デバッグメニューの実装
デバッグメニューの実装 • 2017年の年末に開催されたAndroid勉 強会で紹介されたdebug-alterという OSSの発表を見て、とても良さそうだっ た
デバッグメニューの実装 • RxJava 2.x対応が終わって余裕ができ てきたので実装してみることにした
None
None
Androidアプリのデバッグメニューを作ろう | Money Forward Engineers' Blog https://moneyforward.com/engineers_blog/2018/04/11/android-debug-menu/
デバッグメニューの実装 • いまはHyperionAndroidという デバッグツールと併用して使っているが とてもよい
デバッグメニューの実装 • ただdebug-alterは、MEに後から入れ たライブラリと相性が悪く今は動いてな い
デバッグメニューの実装 • debug-alterの開発者は友人なので ときどき相談しつつdebug-alterに 自分でPR出して直しているところ
新卒受け入れ準備
新卒受け入れ準備 • 4月に新卒が入社し、MEにも新卒エン ジニアが入ってくることになった • ドキュメントなどがほぼ無かったため、こ れを機に整えることにした
新卒受け入れ準備 • 開発ツールの導入手順からAndroidア プリ開発における基礎、応用、実践の 資料を作成しつつ、新卒に基礎から教 えた
新卒受け入れ準備 • Androidの基礎を教える前に作った Androidの歴史の話はエンジニアとか 関係なく社内の色々な人に見てもらえ たので良かった
None
新卒受け入れ準備 • 開発フローやリリースフローも明文化さ れていなかったため、なんとなく運用し ていたものを整理して明文化した
2018年06月 〜 2018年12月
主にやっていたこと(環境整備) • アプリ設計見直し • Dagger2導入 • テストコードの環境整備 • CI環境整備
主にやっていたこと(環境整備) • 各環境のアプリをDeployGateに自動デ プロイ • SonarQubeで静的解析
主にやっていたこと(リファクタ) • 手入力改善(UI刷新・リファクタ) • 2つの大きなクラスの削除 • 入出金履歴リファクタ • 家計簿詳細リファクタ
主にやっていたこと(リファクタ) • レシート項目編集画面のリファクタ • カテゴリ一括変更
アプリ設計見直し
アプリ設計見直し • 6月はまだ新卒エンジニアはIssueを少 しずつやって仕事に慣れてもらっている ころだった
アプリ設計見直し • 新卒が本格的に開発に参加する前に 設計を整えておく必要があるだろうと思 い、設計を整えることにした
None
None
手入力改善
手入力改善 • 手入力画面のUIを大幅に刷新すること になった
手入力改善 • 新しい設計を適用する良い機会なの で、新しい設計のための準備をしてから リファクタを行った
手入力 Before
手入力 After
手入力改善 • 新しい設計により、表示処理とビジネス ロジックが自然にきれいに分かれるよう になった
手入力改善 • テストコードも書きやすくなったのでこの タイミングでやっておいて 正解だった
2つの大きなクラスの削除
2つの大きなクラスの削除 • 手入力画面のUI刷新に伴い、電卓のデ ザインが変わった
2つの大きなクラスの削除 • 入出金履歴詳細画面にも電卓機能が あり、刷新した手入力画面の電卓のデ ザインに合わせる必要があった
None
2つの大きなクラスの削除 • 入出金詳細画面では次の2つのクラス があった ◦ TransactionDetailFragment.java ◦ TransactionEditFragment.java
2つの大きなクラスの削除 • この2つのクラスは互いに依存してお り、どちらも1,400行もあった • そのため、全体的にリファクタすること にした
2つの大きなクラスの削除 • コードだけでなく仕様も複雑だったた め、コードから仕様を読み取るのが大 変だった
2つの大きなクラスの削除 • この2つのクラスを完全に消し飛ばすた めに4ヶ月ほどかかったが、なんとか無 事に終わった
https://speakerdeck.com/syarihu/aactoiuwu-qi-woshou-ni1-400xing-falsefragment2ti-tozhan-tutahua
カテゴリ一括変更
カテゴリ一括変更 • いままでカテゴリを変更したい場合には 入出金を1件ずつ変更する必要があり 手間だった
カテゴリ一括変更 • その課題を解決するため、家計簿詳細 画面からカテゴリを一括で変更する機 能を実装することになった
カテゴリ 一括変更
カテゴリ一括変更 • 家計簿詳細画面はとても古い画面だっ たため、ただ一括変更機能を 付け加えるのは難しい状態だった
カテゴリ一括変更 • グラフ以外の部分は入出金履歴と同じ レイアウトのため共通化したほうが良い だろうと判断し、関連画面を順番にリ ファクタすることにした
カテゴリ一括変更 • 入出金履歴のリファクタ • 家計簿詳細画面のリファクタ • 家計簿詳細画面にカテゴリ一括変更機 能をつける
運用の見直し
運用の見直し(いままで) • milestone • GitHub Projects ◦ Project1つでIssueを一括管理
運用の見直し(現在) • GitHub Projects ◦ リリースごとにプロジェクトを作成 ◦ テンプレでカードを自動で移動
運用の見直し(現在) • レビューの状態やIssueの進捗状況が わかりやすくなった • iOS側も同じ運用方法に巻き込めたの でプラットフォームでも統一された
CI環境整備
CI環境整備 • 新卒が入ってきて徐々に新卒が機能開 発をするケースが増えてきた ◦ 明らかにレビューの負担が増えてき た
CI環境整備 • いまでは当たり前の存在になっている CIだが、ここまでCIを回していなかった
CI環境整備 • lintが警告してくれるようなことは自動で 指摘させたいという思いからCI環境を整 えることにした
CI環境整備 • ktlintを新たに導入 • Dangerというツールを導入し、ktlintと android-lintの警告をGitHubの コメントで指摘させるようにした
CI環境整備 • 人間が何度も指摘すると面倒になった りすることでもDangerが容赦なくコメント で指摘してくれるため、 レビュワーの負担が減った
DeployGateに自動デプロイ
DeployGateに自動デプロイ • Money Forward MEでは、Deploy Gate というテスト用のアプリ配布ツールを利 用している
DeployGateに自動デプロイ • Androidエンジニア以外の場合は検証 用にテスト環境向けのアプリを用意して ほしいと言われる場合があり、ビルド待 ちが発生してしまう
DeployGateに自動デプロイ • PRをマージした際にアプリを DeployGateに自動でデプロイできるよ うにした
None
DeployGateに自動デプロイ • READMEにQRコードを載せておくこと で、読み取ってダウンロードすればすぐ に使えるようになった
SonarQubeで静的解析
SonarQubeで静的解析 • テストコードが少しずつ増えてきたのと、 CIを導入したのもあってテストコードの カバレッジやコードの品質を見たい気持 ちになった
SonarQubeで静的解析 • 社内の別のプロジェクトでSonarQubeを 使っていたため、それに載せてもらう形 で導入してみた
SonarQubeで静的解析 • カバレッジなどが視覚的に見えるように なってテストを書くモチベーションが上 がった
2019年01月 〜 現在
主にやっていたこと • 年額課金 • AndroidX対応 • PRへのpush時にDeployGateの Distribution URLをコメント
主にやっていたこと • 自動リリース • マルチモジュール化の準備 ◦ 未使用コードの一括削除 ◦ 未使用リソースの一括削除
年額課金
None
年額課金 • いままでは月額プランしかなかったが、 2019年の3月に年額プランを リリース
年額課金 • 課金の実装はかなり古い実装がされて おり、複雑な実装になっていたためまず は新しい実装方法に置き換えるための リファクタを行った
年額課金 • 課金周りの知見はネットにあまり共有さ れておらず、Androidも大変だったが iOSも相当実装が大変そうだった
年額課金 • 年額課金でだいぶ知見も溜まってきた ため、課金周りの知見を共有する勉強 会をしたいと思いSlackにつぶやいてみ た
None
年額課金 • 面白そうという話になり、年額課金のリ リースが落ち着いてから勉強会を開催 することになった
https://billing-night.connpass.com/event/125510/
https://speakerdeck.com/syarihu/androidfalseapurinei-ke-jin-woaacdeshi-zhuang-suru
年額課金 • 集まった人数は少なかったものの、コア な層が集まって濃い話がたくさんできた ので開催してよかった
年額課金 • 技術系の勉強会の開催も新オフィスで の開催実績が少なかったため知見が少 なく非常に苦労した
年額課金 • 次に開催しようと思った人が同じ苦労を しないように、得た知見を社内ドキュメ ントにまとめたり、チェックリストを作った
AndroidX対応
AndroidX対応 • Androidでは、Android Frameworkの APIに下位互換性を保つために Support LibraryというGoogle公式のラ イブラリを利用していた
AndroidX対応 • Support Libraryはv28で終了し、今後 はAndroidXに移行する必要がある • AndroidXのバージョンはv1.0.0から • パッケージ名もandroidxになる
AndroidX対応 • 年額課金のリリースが落ち着いてきた のでそろそろ対応しないといけないなと 思い、やることにした
AndroidX対応 • AndroidXへのマイグレーションツール が用意されているが、import文以外も パッケージフルでクラス参照されてしま う箇所がたくさんあった
AndroidX対応 • ここでスルーすると見つけたときに都度 修正する手間が発生してしまうため、手 作業で全部直すことにした
AndroidX対応 • 修正はかなり大変だったが、ほぼ import文だけの差分になったので ここで対応しておいてよかった
None
https://speakerdeck.com/syarihu/androidxniyi-xing-surutameni
PRへのpush時にDeployGateの DistributionURLをコメントする
DistributionURLをコメントする • DroidKaigi 2019の公式アプリでは、push 時にビルドして生成されたアプリを DeployGateにアップロードし、 Distribution URLをコメントしてくれる
https://github.com/DroidKaigi/conference-app-2019/pull/437#issuecomment-453829985
DistributionURLをコメントする • 同じ機能が欲しいと思っていたが 時間が取れずにできなかった • ようやく落ち着いてできる状態になった のでやることにした
None
None
自動リリース
自動リリース • アプリの署名をGoogle Play App Signingに移行したのに伴い、アップ ロードキーを使ってGoogle Playに 自動リリースできるようにした
自動リリース 1. エンコードしたアップロードキーを CircleCIの環境変数に入れておく 2. releaseブランチのマージ時にrelease のワークフローを開始
自動リリース 3. Google Playにリリースして良いかの確 認をSlackに通知 4. CircleCI上で承認
自動リリース 5. 承認されたらリリースビルドを走らせる 6. Google Playのベータトラックに自動リ リース
自動リリース 7. 生成されたアプリを元にバージョン情報 を取得し、GitHubにreleaseタグを打つ
None
自動リリース • マージ後にそのままGoogle Playにリ リースすることも可能だが、意図しない リリースを防ぐために念のため承認制 に
自動リリース • 同じ理由で製品版への直接のリリース はせず、必ずリリース権限を持つ人間 の承認を経て製品版のリリースを行うこ ととした
自動リリース • 全社的にGoogle Playのアカウント権限 の整理を行ったりなどを先に行ってから リリースの自動化を行った
自動リリース • リリースノートもgit管理下におき、配信 時に一緒にリリースノートも 入れるようにすることで差分がわかりや すくなった
自動リリース • リリースタグもいつも手動で行っていた ため、リリースフローの手動作業をほぼ 自動化できた
マルチモジュール化の準備
マルチモジュール化の準備 • 家計簿のマネーフォワードには、 マネーフォワード ME以外に銀行向けの 家計簿がある
マルチモジュール化の準備 • 銀行向けの家計簿は同一リポジトリで ブランチ運用がされており、銀行ごとに 仕様が違うなど非常に大変
マルチモジュール化の準備 • コアな機能と各銀行向けにカスタマイズ された機能をモジュールという単位で分 けてお互いに影響が無いように修正す ることにした
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす イマココ
マルチモジュール化の準備 5. コアな機能をモジュールに切り出す 6. 銀行向けのコアな機能をモジュールに 切り出す
マルチモジュール化の準備 7. MEのブランチに入っている2つのアプリ の機能をモジュールに切り出す 8. 各銀行向けの機能をモジュールに切り 出す
未使用コードの削除
未使用コードの削除 • Intellijの機能を駆使して未使用 メソッドやクラスなどを片っ端から削除し た
未使用コードの削除 • 使っているように見えて実は互いに参 照していただけなどのファイルがありか なり大変だったが、結構消せた
None
未使用リソースの削除
未使用リソースの削除 • gradle-unused-resources-remover-plu ginというGradleプラグインを使って未使 用リソースを削除した
None
None
https://moneyforward.com/engineers_blog/2019/07/19/unused-resources-remover/
マルチモジュール化の今後
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす イマココ
マルチモジュール化の今後 • まだマルチモジュール化をするところま で至っていないので、年内くらいには循 環参照を無くすところくらいまでは進め たい…
おまけ: Kotlin率
None
まとめ
まとめ • 入社してからたくさんの機能開発や負 債改善、開発環境整備などを行ってき た
まとめ • 新しいメンバーが入ってきてもドキュメン トを見ればすぐに開発が始められるよう になった
まとめ • CIの整備によりアプリの動作がすぐに 確認できるようになったり、設計・仕様 のレビューに集中できるようになった
まとめ • 課題を1つずつ解決していき、改善を続 けていけば開発環境は良くなっていく
まとめ • これからも良いサービスをスピード感を もって提供できるように開発環境改善 や負債改善、機能開発などを頑張って いきたい
ありがとうございました