うちの技術負債2021 freee編
by
freee
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
うちの技術負債2021 freee編 2021.09.14 freee 株式会社
Slide 2
Slide 2 text
2 2013年6月 freee株式会社へ入社 freee会計のエンジニア => freee会計のエンジニアマネージャ => 人事労務含めた既存プロダクト全体のマネージャ という変遷を辿っています もともとフロントエンドエンジニアなのでJavaScript関連の 技術を触ったりするのが好きです 今日はプロダクトと会社が大きくなっていく中で対応してき た(せざるを得なかった)技術的負債の話をします! 若原 祥正 freee株式会社 執行役員 プロダクトコア開発本部長 @yo_waka
Slide 3
Slide 3 text
3 01 freeeの紹介 02 freee会計について 03 負債代表作 04 改善の様子 アジェンダ
Slide 4
Slide 4 text
スモールビジネスを、 世界の主役に。
Slide 5
Slide 5 text
5 freee会計 freee開業 freee福利厚生 freeeアプリストア freee人事労務 freee会社設立 freeeスマート受発注 freeeプロジェクト管理 freee資金調達 freee申告 freeeカード プロダクトラインアップ
Slide 6
Slide 6 text
6 2021年前年比 +34.2% 2013年 3月 2014年 3月 2015年 3月 2016年 3月 2018年 3月 2019年 3月 2020年 3月 2021年 3月 2017年 3月 有料課金ユーザー数は28万社を超える
Slide 7
Slide 7 text
7 01 freeeの紹介 02 freee会計について 03 負債代表作 04 改善の様子 アジェンダ
Slide 8
Slide 8 text
8 freee会計 会計といいつつ会計に繋がる業務(申請・承認、受発注、資金繰りetc)もいろいろサポート = 非常に機能数が多い
Slide 9
Slide 9 text
9 ● バックエンド ○ Railsアプリケーション + いくつかのマイクロサービス(後述) ○ freee人事労務など他サービスとだいたい連携 ○ 銀行やクレジットカードの明細を取得するような機能も内包している ■ これ自体はマイクロサービスへの切り出しが進んでいる ● フロントエンド ○ 基本的にReact + hooksなコンポーネント ○ 以前のRailsのデフォルトだったCoffeeScriptが一部残っている ● データストア ○ RDBにAurora MySQL、高速化したい箇所はElasticsearchやDynamoDB等も使っています ● インフラ ○ EKS上で運用 freee会計の基本的な構成
Slide 10
Slide 10 text
10 freee会計のコード規模感 テーブル数 800くらい Ruby ファイル数 12000くらい JavaScript ファイル数 7000くらい エンドポイント数 4000くらい 1ヶ月のコミット数 2000くらい 1ヶ月のプルリクエスト数 1000くらい
Slide 11
Slide 11 text
11 ● 普通のマルチテナント構成 ● 1億レコード以上あるテーブルが23テーブル ○ 最大レコード数は17億レコードくらい ○ auto increment idはbigintにしないともう動きません ○ MySQLはすごい ● 毎年130%くらいのペースでデータが増える ● 読み込みトランザクション以上に書き込みトランザクションが多いのが特徴かもしれません freee会計のデータ規模感
Slide 12
Slide 12 text
12 01 freeeの紹介 02 freee会計について 03 負債代表作 04 改善の様子 アジェンダ
Slide 13
Slide 13 text
13 最初は1つのアプリケーションだったが・・ サービスが増えるとまず共通で持ちたい機能があります。そう、認証/認可ですね 同じ会社のサービスはやはり同一アカウントで入れるようにしたい freee会計 freee会計 freee人事労務 認証/認可サービス
Slide 14
Slide 14 text
14 最初は1つのアプリケーションだったが・・ 期間的に厳しくてデータが残っちゃいました スタートアップ時は早く出さないと会社が死ぬ。実際その後数年はあまり実害はなかった しかしサービスが5つ10つと増えていくとSPOF化が進んでいって死を感じるようになってきます freee会計 freee会計 freee人事労務 認証/認可サービス 会計DB
Slide 15
Slide 15 text
15 サービスが増えるごとに生産性の観点でも共通で持ちたいサービスは増えてきます ミッションクリティカルなものが多く、最初からパフォーマンスが求められるため、柔軟な技術選定を行うため に専門のチームが必要 認証/認可の真切り出しをやるぞ!というタイミングでアプリケーション基盤チームが社内に誕生 アプリケーション基盤チームを作るきっかけに 会計 人事労務 プロジェクト管理 認証/認可 課金 申請/承認
Slide 16
Slide 16 text
16 様々な理由で無茶しやがってという箇所が増えていきます ● サービスクラスに渡すデータが巨大で中身読んでいかないと構造がわからない ● いつの間にかレスポンスの構造が変わってモバイルアプリでエラー ● GETでデータを作っている・・ ● ドメインロジックにしか見えないヘルパーメソッド(ビューから呼ばれる)が散在 ● バリデーションロジックでデータを作っている箇所がある ○ なければ新規レコードを作る、みたいなやつ ● という問題があるため影響範囲を見積もるのが大変 コード量が増えると・・
Slide 17
Slide 17 text
17 モジュラモノリスを志向していく方向に モノリスなアプリケーション内でも、ドメイン単位のモジュールに分解することで、 モジュールごとの独立性を担保するアーキテクチャにしようねというアイデア Rails wayから外れていく覚悟
Slide 18
Slide 18 text
18 ● やりたいこと ○ モジュール境界を明確にして安心独立した開発を可能にしたい ■ 機能のI/Fを明示した上でAPIと切り離す ○ 不必要な結合をなくしたい ■ ドメインで必要なものだけが分かるような実装に ○ DBへの予期しないアクセスをなくしたい ■ 意図しない任意の場所からActiveRecordのクエリが発火されないように ● マイクロサービス化でないの? ○ 将来的にそうなる可能性はありますが、大事なのは境界線を決めていくこと ■ 境界線が変わることもありえるし、組織が不要にサイロ化していくのは避けたい ■ ネットワークとかトランザクションとかCross-cutting concernとか覚悟が必要 ○ もちろんビジネス的にマイクロサービスで継続開発いける!と判断したらいきます freeeのモジュラモノリスに対する考え方
Slide 19
Slide 19 text
19 テックリード中心に去年1年くらいかけて設計を固めた freee会計ではBackend APIというものを新しく定義して導入 ● Backend APIの内側をモジュラモノリスにおけるモジュールと定義して移行していく ● 内部APIはProtobufを採用し、protoファイルで型定義していく いざ長旅へ freee 会計 Rails App Module Model Service Controller API
Slide 20
Slide 20 text
20 ● ActiveRecordの呼び出しが制限されるため、Rails Wayからは外れる ○ Backend APIの外側(controller等)ではActiveRecordを前提としたライブラリは不可に ● クライアントに返す時点でデータが生成されていないとダメなのでpreload前提のコードがダメ ○ DTOのような中間データオブジェクトを用意する必要がある とはいえデメリットよりメリットの方がインパクトが大きいので進めています デメリット
Slide 21
Slide 21 text
21 細かいやつ ● タイピングが難しい単語はある ○ company => comapny, compnay ○ params => parms, parmas ○ walletable => walltable 型があっても無理な問題だったりするので、CIで弾きましょう freeeではdangerを使ってCIチェックかけてます。Rubyで条件書けて便利
Slide 22
Slide 22 text
22 01 freeeの紹介 02 freee会計について 03 負債代表作 04 改善の様子 アジェンダ
Slide 23
Slide 23 text
23 大きな負債の返し方 個人のパワーでは無理なので組織的に工数を取って取り組むしかない 2018年以降は毎年プロダクトごとにテーマを決めて、技術課題の改善に3ヶ月/年くらい使っています 改善とともに保守運用にかかる工数も減少傾向 2017年までは会社のフェーズ的にもとにかく機能開発に振っていました
Slide 24
Slide 24 text
24 小さな負債の返し方 気になったものをシュッと直せる空気、文化が大事
Slide 25
Slide 25 text
スモールビジネスを、世界の主役に。