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

ありがとうございました