Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
入社から約2年、 Money ForwardのAndroidエンジニア としての活動を振り返る Money Forward Developers’ Stories 2019 2019/08/23 (Fri.) @syarihu
Slide 2
Slide 2 text
Taichi Sato (@syarihu) ● PFM本部 サービス開発部 ○ Androidエンジニア ● 入社歴1年10ヶ月 ● Androidアプリ開発歴9年目
Slide 3
Slide 3 text
syarihuが普段やっていること
Slide 4
Slide 4 text
Money Forward MEのAndroidアプリ開発 ● 機能開発 ● 技術的負債の改善 ● 開発環境整備 ○ 開発・運用フロー ○ アプリ設計 ○ CI / CD ● 新卒育成 ○ 困ったときにフォロー する ○ 厚めのコードレビュー
Slide 5
Slide 5 text
全社的にやっていること ● Androidに関する技術・知 見の共有 ○ SlackのAndroidチャン ネルへの共有 ● Android周りの全社の 方針の整備 ● Androidエンジニア中途採 用 ● 他プロダクトのお手伝い ○ コードレビュー ○ 困ってそうなときにアド バイスしたり
Slide 6
Slide 6 text
2017年10月 〜 2018年01月
Slide 7
Slide 7 text
主にやっていたこと ● MfCoreさようなら大作戦 ● ホームリニューアル ○ 入出金履歴 ○ MY通知
Slide 8
Slide 8 text
MfCoreさようなら大作戦
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
No content
Slide 13
Slide 13 text
ホームリニューアル
Slide 14
Slide 14 text
ホームリニューアル ● ホームのレイアウト変更 ○ MY通知、入出金履歴を全面に ● MY通知のデザイン変更 ● ドロワーのレイアウト変更 ● その他・お知らせの見直し
Slide 15
Slide 15 text
ホームリニューアル ● 入出金履歴 ● MY通知
Slide 16
Slide 16 text
入出金履歴 Before
Slide 17
Slide 17 text
入出金履歴 After
Slide 18
Slide 18 text
MY通知 Before
Slide 19
Slide 19 text
MY通知 After
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
AndroidのSlackチャンネル
Slide 22
Slide 22 text
AndroidのSlackチャンネル ● 以前は座談会というのをやっていたが無く なった ● 当時はAndroidエンジニア間の横のつながり があまり無かった
Slide 23
Slide 23 text
AndroidのSlackチャンネル ● ただ復活させても良くないなと思いAndroid の技術・知見を共有するSlackチャンネルを 作った ○ リリース情報、開発者ブログなどを自動投 稿したり
Slide 24
Slide 24 text
2018年02月 〜 2018年05月
Slide 25
Slide 25 text
主にやっていたこと ● RxJava 2.0へのアップグレード ● パスコードロックの指紋認証対応 ● デバッグメニューの実装
Slide 26
Slide 26 text
主にやっていたこと ● 開発フロー整備 ● 新卒受け入れ準備
Slide 27
Slide 27 text
パスコードロックの指紋認証
Slide 28
Slide 28 text
パスコードロックの指紋認証 ● 指紋認証は個人的にどうしても入れた かった ● レビューなどでも要望があり需要が高そ うだった
Slide 29
Slide 29 text
パスコード Before
Slide 30
Slide 30 text
パスコード After
Slide 31
Slide 31 text
パスコードロックの指紋認証 ● パスコードロック全体のデザインも刷新 し、利便性が向上した
Slide 32
Slide 32 text
マネーフォワードAndroid版の指紋認証デザインプロセス|池内健一| note https://note.mu/kenichiikeuchi/n/nc64e5c06142c
Slide 33
Slide 33 text
デバッグメニューの実装
Slide 34
Slide 34 text
デバッグメニューの実装 ● 2017年の年末に開催されたAndroid勉 強会で紹介されたdebug-alterという OSSの発表を見て、とても良さそうだっ た
Slide 35
Slide 35 text
デバッグメニューの実装 ● RxJava 2.x対応が終わって余裕ができ てきたので実装してみることにした
Slide 36
Slide 36 text
No content
Slide 37
Slide 37 text
No content
Slide 38
Slide 38 text
Androidアプリのデバッグメニューを作ろう | Money Forward Engineers' Blog https://moneyforward.com/engineers_blog/2018/04/11/android-debug-menu/
Slide 39
Slide 39 text
デバッグメニューの実装 ● いまはHyperionAndroidという デバッグツールと併用して使っているが とてもよい
Slide 40
Slide 40 text
デバッグメニューの実装 ● ただdebug-alterは、MEに後から入れ たライブラリと相性が悪く今は動いてな い
Slide 41
Slide 41 text
デバッグメニューの実装 ● debug-alterの開発者は友人なので ときどき相談しつつdebug-alterに 自分でPR出して直しているところ
Slide 42
Slide 42 text
新卒受け入れ準備
Slide 43
Slide 43 text
新卒受け入れ準備 ● 4月に新卒が入社し、MEにも新卒エン ジニアが入ってくることになった ● ドキュメントなどがほぼ無かったため、こ れを機に整えることにした
Slide 44
Slide 44 text
新卒受け入れ準備 ● 開発ツールの導入手順からAndroidア プリ開発における基礎、応用、実践の 資料を作成しつつ、新卒に基礎から教 えた
Slide 45
Slide 45 text
新卒受け入れ準備 ● Androidの基礎を教える前に作った Androidの歴史の話はエンジニアとか 関係なく社内の色々な人に見てもらえ たので良かった
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
新卒受け入れ準備 ● 開発フローやリリースフローも明文化さ れていなかったため、なんとなく運用し ていたものを整理して明文化した
Slide 48
Slide 48 text
2018年06月 〜 2018年12月
Slide 49
Slide 49 text
主にやっていたこと(環境整備) ● アプリ設計見直し ● Dagger2導入 ● テストコードの環境整備 ● CI環境整備
Slide 50
Slide 50 text
主にやっていたこと(環境整備) ● 各環境のアプリをDeployGateに自動デ プロイ ● SonarQubeで静的解析
Slide 51
Slide 51 text
主にやっていたこと(リファクタ) ● 手入力改善(UI刷新・リファクタ) ● 2つの大きなクラスの削除 ● 入出金履歴リファクタ ● 家計簿詳細リファクタ
Slide 52
Slide 52 text
主にやっていたこと(リファクタ) ● レシート項目編集画面のリファクタ ● カテゴリ一括変更
Slide 53
Slide 53 text
アプリ設計見直し
Slide 54
Slide 54 text
アプリ設計見直し ● 6月はまだ新卒エンジニアはIssueを少 しずつやって仕事に慣れてもらっている ころだった
Slide 55
Slide 55 text
アプリ設計見直し ● 新卒が本格的に開発に参加する前に 設計を整えておく必要があるだろうと思 い、設計を整えることにした
Slide 56
Slide 56 text
No content
Slide 57
Slide 57 text
No content
Slide 58
Slide 58 text
手入力改善
Slide 59
Slide 59 text
手入力改善 ● 手入力画面のUIを大幅に刷新すること になった
Slide 60
Slide 60 text
手入力改善 ● 新しい設計を適用する良い機会なの で、新しい設計のための準備をしてから リファクタを行った
Slide 61
Slide 61 text
手入力 Before
Slide 62
Slide 62 text
手入力 After
Slide 63
Slide 63 text
手入力改善 ● 新しい設計により、表示処理とビジネス ロジックが自然にきれいに分かれるよう になった
Slide 64
Slide 64 text
手入力改善 ● テストコードも書きやすくなったのでこの タイミングでやっておいて 正解だった
Slide 65
Slide 65 text
2つの大きなクラスの削除
Slide 66
Slide 66 text
2つの大きなクラスの削除 ● 手入力画面のUI刷新に伴い、電卓のデ ザインが変わった
Slide 67
Slide 67 text
2つの大きなクラスの削除 ● 入出金履歴詳細画面にも電卓機能が あり、刷新した手入力画面の電卓のデ ザインに合わせる必要があった
Slide 68
Slide 68 text
No content
Slide 69
Slide 69 text
2つの大きなクラスの削除 ● 入出金詳細画面では次の2つのクラス があった ○ TransactionDetailFragment.java ○ TransactionEditFragment.java
Slide 70
Slide 70 text
2つの大きなクラスの削除 ● この2つのクラスは互いに依存してお り、どちらも1,400行もあった ● そのため、全体的にリファクタすること にした
Slide 71
Slide 71 text
2つの大きなクラスの削除 ● コードだけでなく仕様も複雑だったた め、コードから仕様を読み取るのが大 変だった
Slide 72
Slide 72 text
2つの大きなクラスの削除 ● この2つのクラスを完全に消し飛ばすた めに4ヶ月ほどかかったが、なんとか無 事に終わった
Slide 73
Slide 73 text
https://speakerdeck.com/syarihu/aactoiuwu-qi-woshou-ni1-400xing-falsefragment2ti-tozhan-tutahua
Slide 74
Slide 74 text
カテゴリ一括変更
Slide 75
Slide 75 text
カテゴリ一括変更 ● いままでカテゴリを変更したい場合には 入出金を1件ずつ変更する必要があり 手間だった
Slide 76
Slide 76 text
カテゴリ一括変更 ● その課題を解決するため、家計簿詳細 画面からカテゴリを一括で変更する機 能を実装することになった
Slide 77
Slide 77 text
カテゴリ 一括変更
Slide 78
Slide 78 text
カテゴリ一括変更 ● 家計簿詳細画面はとても古い画面だっ たため、ただ一括変更機能を 付け加えるのは難しい状態だった
Slide 79
Slide 79 text
カテゴリ一括変更 ● グラフ以外の部分は入出金履歴と同じ レイアウトのため共通化したほうが良い だろうと判断し、関連画面を順番にリ ファクタすることにした
Slide 80
Slide 80 text
カテゴリ一括変更 ● 入出金履歴のリファクタ ● 家計簿詳細画面のリファクタ ● 家計簿詳細画面にカテゴリ一括変更機 能をつける
Slide 81
Slide 81 text
運用の見直し
Slide 82
Slide 82 text
運用の見直し(いままで) ● milestone ● GitHub Projects ○ Project1つでIssueを一括管理
Slide 83
Slide 83 text
運用の見直し(現在) ● GitHub Projects ○ リリースごとにプロジェクトを作成 ○ テンプレでカードを自動で移動
Slide 84
Slide 84 text
運用の見直し(現在) ● レビューの状態やIssueの進捗状況が わかりやすくなった ● iOS側も同じ運用方法に巻き込めたの でプラットフォームでも統一された
Slide 85
Slide 85 text
CI環境整備
Slide 86
Slide 86 text
CI環境整備 ● 新卒が入ってきて徐々に新卒が機能開 発をするケースが増えてきた ○ 明らかにレビューの負担が増えてき た
Slide 87
Slide 87 text
CI環境整備 ● いまでは当たり前の存在になっている CIだが、ここまでCIを回していなかった
Slide 88
Slide 88 text
CI環境整備 ● lintが警告してくれるようなことは自動で 指摘させたいという思いからCI環境を整 えることにした
Slide 89
Slide 89 text
CI環境整備 ● ktlintを新たに導入 ● Dangerというツールを導入し、ktlintと android-lintの警告をGitHubの コメントで指摘させるようにした
Slide 90
Slide 90 text
CI環境整備 ● 人間が何度も指摘すると面倒になった りすることでもDangerが容赦なくコメント で指摘してくれるため、 レビュワーの負担が減った
Slide 91
Slide 91 text
DeployGateに自動デプロイ
Slide 92
Slide 92 text
DeployGateに自動デプロイ ● Money Forward MEでは、Deploy Gate というテスト用のアプリ配布ツールを利 用している
Slide 93
Slide 93 text
DeployGateに自動デプロイ ● Androidエンジニア以外の場合は検証 用にテスト環境向けのアプリを用意して ほしいと言われる場合があり、ビルド待 ちが発生してしまう
Slide 94
Slide 94 text
DeployGateに自動デプロイ ● PRをマージした際にアプリを DeployGateに自動でデプロイできるよ うにした
Slide 95
Slide 95 text
No content
Slide 96
Slide 96 text
DeployGateに自動デプロイ ● READMEにQRコードを載せておくこと で、読み取ってダウンロードすればすぐ に使えるようになった
Slide 97
Slide 97 text
SonarQubeで静的解析
Slide 98
Slide 98 text
SonarQubeで静的解析 ● テストコードが少しずつ増えてきたのと、 CIを導入したのもあってテストコードの カバレッジやコードの品質を見たい気持 ちになった
Slide 99
Slide 99 text
SonarQubeで静的解析 ● 社内の別のプロジェクトでSonarQubeを 使っていたため、それに載せてもらう形 で導入してみた
Slide 100
Slide 100 text
SonarQubeで静的解析 ● カバレッジなどが視覚的に見えるように なってテストを書くモチベーションが上 がった
Slide 101
Slide 101 text
2019年01月 〜 現在
Slide 102
Slide 102 text
主にやっていたこと ● 年額課金 ● AndroidX対応 ● PRへのpush時にDeployGateの Distribution URLをコメント
Slide 103
Slide 103 text
主にやっていたこと ● 自動リリース ● マルチモジュール化の準備 ○ 未使用コードの一括削除 ○ 未使用リソースの一括削除
Slide 104
Slide 104 text
年額課金
Slide 105
Slide 105 text
No content
Slide 106
Slide 106 text
年額課金 ● いままでは月額プランしかなかったが、 2019年の3月に年額プランを リリース
Slide 107
Slide 107 text
年額課金 ● 課金の実装はかなり古い実装がされて おり、複雑な実装になっていたためまず は新しい実装方法に置き換えるための リファクタを行った
Slide 108
Slide 108 text
年額課金 ● 課金周りの知見はネットにあまり共有さ れておらず、Androidも大変だったが iOSも相当実装が大変そうだった
Slide 109
Slide 109 text
年額課金 ● 年額課金でだいぶ知見も溜まってきた ため、課金周りの知見を共有する勉強 会をしたいと思いSlackにつぶやいてみ た
Slide 110
Slide 110 text
No content
Slide 111
Slide 111 text
年額課金 ● 面白そうという話になり、年額課金のリ リースが落ち着いてから勉強会を開催 することになった
Slide 112
Slide 112 text
https://billing-night.connpass.com/event/125510/
Slide 113
Slide 113 text
https://speakerdeck.com/syarihu/androidfalseapurinei-ke-jin-woaacdeshi-zhuang-suru
Slide 114
Slide 114 text
年額課金 ● 集まった人数は少なかったものの、コア な層が集まって濃い話がたくさんできた ので開催してよかった
Slide 115
Slide 115 text
年額課金 ● 技術系の勉強会の開催も新オフィスで の開催実績が少なかったため知見が少 なく非常に苦労した
Slide 116
Slide 116 text
年額課金 ● 次に開催しようと思った人が同じ苦労を しないように、得た知見を社内ドキュメ ントにまとめたり、チェックリストを作った
Slide 117
Slide 117 text
AndroidX対応
Slide 118
Slide 118 text
AndroidX対応 ● Androidでは、Android Frameworkの APIに下位互換性を保つために Support LibraryというGoogle公式のラ イブラリを利用していた
Slide 119
Slide 119 text
AndroidX対応 ● Support Libraryはv28で終了し、今後 はAndroidXに移行する必要がある ● AndroidXのバージョンはv1.0.0から ● パッケージ名もandroidxになる
Slide 120
Slide 120 text
AndroidX対応 ● 年額課金のリリースが落ち着いてきた のでそろそろ対応しないといけないなと 思い、やることにした
Slide 121
Slide 121 text
AndroidX対応 ● AndroidXへのマイグレーションツール が用意されているが、import文以外も パッケージフルでクラス参照されてしま う箇所がたくさんあった
Slide 122
Slide 122 text
AndroidX対応 ● ここでスルーすると見つけたときに都度 修正する手間が発生してしまうため、手 作業で全部直すことにした
Slide 123
Slide 123 text
AndroidX対応 ● 修正はかなり大変だったが、ほぼ import文だけの差分になったので ここで対応しておいてよかった
Slide 124
Slide 124 text
No content
Slide 125
Slide 125 text
https://speakerdeck.com/syarihu/androidxniyi-xing-surutameni
Slide 126
Slide 126 text
PRへのpush時にDeployGateの DistributionURLをコメントする
Slide 127
Slide 127 text
DistributionURLをコメントする ● DroidKaigi 2019の公式アプリでは、push 時にビルドして生成されたアプリを DeployGateにアップロードし、 Distribution URLをコメントしてくれる
Slide 128
Slide 128 text
https://github.com/DroidKaigi/conference-app-2019/pull/437#issuecomment-453829985
Slide 129
Slide 129 text
DistributionURLをコメントする ● 同じ機能が欲しいと思っていたが 時間が取れずにできなかった ● ようやく落ち着いてできる状態になった のでやることにした
Slide 130
Slide 130 text
No content
Slide 131
Slide 131 text
No content
Slide 132
Slide 132 text
自動リリース
Slide 133
Slide 133 text
自動リリース ● アプリの署名をGoogle Play App Signingに移行したのに伴い、アップ ロードキーを使ってGoogle Playに 自動リリースできるようにした
Slide 134
Slide 134 text
自動リリース 1. エンコードしたアップロードキーを CircleCIの環境変数に入れておく 2. releaseブランチのマージ時にrelease のワークフローを開始
Slide 135
Slide 135 text
自動リリース 3. Google Playにリリースして良いかの確 認をSlackに通知 4. CircleCI上で承認
Slide 136
Slide 136 text
自動リリース 5. 承認されたらリリースビルドを走らせる 6. Google Playのベータトラックに自動リ リース
Slide 137
Slide 137 text
自動リリース 7. 生成されたアプリを元にバージョン情報 を取得し、GitHubにreleaseタグを打つ
Slide 138
Slide 138 text
No content
Slide 139
Slide 139 text
自動リリース ● マージ後にそのままGoogle Playにリ リースすることも可能だが、意図しない リリースを防ぐために念のため承認制 に
Slide 140
Slide 140 text
自動リリース ● 同じ理由で製品版への直接のリリース はせず、必ずリリース権限を持つ人間 の承認を経て製品版のリリースを行うこ ととした
Slide 141
Slide 141 text
自動リリース ● 全社的にGoogle Playのアカウント権限 の整理を行ったりなどを先に行ってから リリースの自動化を行った
Slide 142
Slide 142 text
自動リリース ● リリースノートもgit管理下におき、配信 時に一緒にリリースノートも 入れるようにすることで差分がわかりや すくなった
Slide 143
Slide 143 text
自動リリース ● リリースタグもいつも手動で行っていた ため、リリースフローの手動作業をほぼ 自動化できた
Slide 144
Slide 144 text
マルチモジュール化の準備
Slide 145
Slide 145 text
マルチモジュール化の準備 ● 家計簿のマネーフォワードには、 マネーフォワード ME以外に銀行向けの 家計簿がある
Slide 146
Slide 146 text
マルチモジュール化の準備 ● 銀行向けの家計簿は同一リポジトリで ブランチ運用がされており、銀行ごとに 仕様が違うなど非常に大変
Slide 147
Slide 147 text
マルチモジュール化の準備 ● コアな機能と各銀行向けにカスタマイズ された機能をモジュールという単位で分 けてお互いに影響が無いように修正す ることにした
Slide 148
Slide 148 text
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす
Slide 149
Slide 149 text
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす イマココ
Slide 150
Slide 150 text
マルチモジュール化の準備 5. コアな機能をモジュールに切り出す 6. 銀行向けのコアな機能をモジュールに 切り出す
Slide 151
Slide 151 text
マルチモジュール化の準備 7. MEのブランチに入っている2つのアプリ の機能をモジュールに切り出す 8. 各銀行向けの機能をモジュールに切り 出す
Slide 152
Slide 152 text
未使用コードの削除
Slide 153
Slide 153 text
未使用コードの削除 ● Intellijの機能を駆使して未使用 メソッドやクラスなどを片っ端から削除し た
Slide 154
Slide 154 text
未使用コードの削除 ● 使っているように見えて実は互いに参 照していただけなどのファイルがありか なり大変だったが、結構消せた
Slide 155
Slide 155 text
No content
Slide 156
Slide 156 text
未使用リソースの削除
Slide 157
Slide 157 text
未使用リソースの削除 ● gradle-unused-resources-remover-plu ginというGradleプラグインを使って未使 用リソースを削除した
Slide 158
Slide 158 text
No content
Slide 159
Slide 159 text
No content
Slide 160
Slide 160 text
https://moneyforward.com/engineers_blog/2019/07/19/unused-resources-remover/
Slide 161
Slide 161 text
マルチモジュール化の今後
Slide 162
Slide 162 text
マルチモジュール化の準備 1. コードスタイルの統一・整理 2. 不要なリソース・クラスを削除 3. パッケージを整理 4. 循環参照を無くす イマココ
Slide 163
Slide 163 text
マルチモジュール化の今後 ● まだマルチモジュール化をするところま で至っていないので、年内くらいには循 環参照を無くすところくらいまでは進め たい…
Slide 164
Slide 164 text
おまけ: Kotlin率
Slide 165
Slide 165 text
No content
Slide 166
Slide 166 text
まとめ
Slide 167
Slide 167 text
まとめ ● 入社してからたくさんの機能開発や負 債改善、開発環境整備などを行ってき た
Slide 168
Slide 168 text
まとめ ● 新しいメンバーが入ってきてもドキュメン トを見ればすぐに開発が始められるよう になった
Slide 169
Slide 169 text
まとめ ● CIの整備によりアプリの動作がすぐに 確認できるようになったり、設計・仕様 のレビューに集中できるようになった
Slide 170
Slide 170 text
まとめ ● 課題を1つずつ解決していき、改善を続 けていけば開発環境は良くなっていく
Slide 171
Slide 171 text
まとめ ● これからも良いサービスをスピード感を もって提供できるように開発環境改善 や負債改善、機能開発などを頑張って いきたい
Slide 172
Slide 172 text
ありがとうございました